基于CSDN项目二次开发
本篇博客基于CSDN项目,C++学生成绩管理系统,所做的项目展示及二次开发以及过程感悟
CSDN原文链接:https://blog.csdn.net/sdliujiangbo/article/details/7693269
一、源码运行展示与解读
项目采用C++与文件方式储存管理学生信息,原博主用心设计了欢迎与管理两个界面,在程序运行时调用文件信息(图为系统第一次运行无文件信息)
从主页面中,我们很容易的知道,该程序的主要功能有:1)增加学生成绩 2)显示学生成绩 3)排序统计成绩 4)查找学生成绩 5)删除学生成绩 6)修改学生成绩 0)安全退出系统
在进入各个功能中进行实际使用体验:
1)增加学生成绩
从上图,我们可以看出程序主要对学生的学号、姓名和各科成绩进行录入
2)显示学生成绩
该功能主要将储存的学生信息全部显示,但采用了逐一列举的方法,信息多时显示十分不方便
3)排序统计成绩
该功能将三门课程成绩进行累加后以从小到大的顺序重新排序
4)查找学生成绩
该功能可从学生姓名、学号两个方式查找文件中已有的学生信息
5)删除学生成绩
该功能可删除文件中已有的学生信息
6)修改学生成绩
该功能用于修改已有学生信息(就是找到已有的删掉用新的替换)
0)安全退出系统
该功能可直接退出系统并保存文件信息
二、项目不足与二次开发
对于C++项目来说该程序在功能与完成度上十分出彩,并且在基础的增删改查添加了排序功能,为了使该项目更加可观,借此机会提出建议并进行二次开发
1)学生信息显示逐一列举,可观性较低,可改成横向输出
1 2 3 4 | void Show() { cout<< " |姓名:" <<setw(5)<<name<< " |学号:" <<setw(5)<<Id<< " |C++:" <<setw(8)<<Cnum<< " |汇编:" <<setw(6)<<Mnum<< " |嵌入式操作系统:" <<setw(8)<<Enum<< " |总成绩:" <<setw(6)<<sum<< " |" <<endl ; } |
前后对比效果,可观性提高,总成绩排序更明显
2)出现学号姓名相同的情况时查找只能输出第一个,二次开发后相同情况可全部输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Student *FindItem( char * name) { for (Student * p=Head;p->Next!=End;p=p->Next) //匹配成功则返回上一个指针,不成功就返回空 if (! strcmp (p->Next->name,name)) p->Next->Show(); return NULL; } Student *FindID( char * Id) { for (Student * p=Head;p->Next!=End;p=p->Next) //匹配成功则返回上一个指针,不成功就返回空 if (! strcmp (p->Next->Id,Id)) p->Next->Show(); return NULL; } |
3)成绩范围无限制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | x: cout<< "\t\t请输入C++课程的成绩:" ; cin>>Cnum; if (Cnum>100||Cnum<0){ cout<< "\t\t输入格式有误!!请重新输入:\n" ; goto x; } y: cout<< "\t\t请输入汇编课程的成绩:" ; cin>>Mnum; if (Mnum>100||Mnum<0){ cout<< "\t\t输入格式有误!!请重新输入:\n" ; goto y; } z: cout<< "\t\t请输入嵌入式操作系统课程的成绩:" ; cin>>Enum; if (Enum>100||Enum<0){ cout<< "\t\t输入格式有误!!请重新输入:\n" ; goto z; } |
将成绩输入范围控制到0~100,避免无效输出
三、二次开发感悟(附源码)
通过此次二次开发的体验,发现了开发项目时几点问题:
1.代码规范和注释要写好,不然自己回头看或者别人看的时候十分困难
2.运用文件读写时文件名尽量简洁通俗,否则一个程序拿到手要花费不少时间在改文件路径上
3.目前很多项目都有其完整的架构和功能,二次开发更多的是测试和增加功能,使原项目更完整
二次开发源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 | # include <iostream> # include <fstream> # include <string.h> # include <iomanip> # include<stdlib.h> # include<Windows.h> # include <conio.h>//用getch(); using namespace std; //﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌Student类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ class Student { public : char name[20]; char Id[20]; int Cnum; //C++课程得分 int Mnum; //汇编课程得分 int Enum; //嵌入式操作系统课程得分 int sum; //总分 Student * Next; void Input() { cout<< "\t\t请输入学生的姓名:" ; cin>>name; cout<< "\t\t请输入学生的学号:" ; cin>>Id; x: cout<< "\t\t请输入C++课程的成绩:" ; cin>>Cnum; if (Cnum>100||Cnum<0){ cout<< "\t\t输入格式有误!!请重新输入:\n" ; goto x; } y: cout<< "\t\t请输入汇编课程的成绩:" ; cin>>Mnum; if (Mnum>100||Mnum<0){ cout<< "\t\t输入格式有误!!请重新输入:\n" ; goto y; } z: cout<< "\t\t请输入嵌入式操作系统课程的成绩:" ; cin>>Enum; if (Enum>100||Enum<0){ cout<< "\t\t输入格式有误!!请重新输入:\n" ; goto z; } sum=Cnum+Mnum+Enum; } void ReadFile(istream & in) { in>>name>>Id>>Cnum>>Mnum>>Enum>>sum; } void Show() { cout<< " |姓名:" <<setw(5)<<name<< " |学号:" <<setw(5)<<Id<< " |C++:" <<setw(8)<<Cnum<< " |汇编:" <<setw(6)<<Mnum<< " |嵌入式操作系统:" <<setw(8)<<Enum<< " |总成绩:" <<setw(6)<<sum<< " |" <<endl ; } }; //﹌﹌﹌﹌﹌﹌﹌﹌﹌Studentmassage类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ class Studentmassage { public : Studentmassage(); ~Studentmassage(); void ShowMenu(); void Find(); void Save(); void ModifyItem(); void RemoveItem(); void Swap(Student *,Student *); void Sort(); //void Unpass(); int ListCount(); //void Average(); void Display() { for (Student * p=Head->Next;p!=End;p=p->Next) p->Show(); cout<< "输入任意字符!继续……" ; getch(); } void AddItem() { End->Input(); End->Next= new Student; End=End->Next; cout<< "添加成功!" <<endl; cout<< "输入任意字符!继续……" ; getch(); } private : Student * Head,* End; ifstream in; ofstream out; Student *FindItem( char * name) { for (Student * p=Head;p->Next!=End;p=p->Next) //匹配成功则返回上一个指针,不成功就返回空 if (! strcmp (p->Next->name,name)) p->Next->Show(); return NULL; } Student *FindID( char * Id) { for (Student * p=Head;p->Next!=End;p=p->Next) //匹配成功则返回上一个指针,不成功就返回空 if (! strcmp (p->Next->Id,Id)) p->Next->Show(); return NULL; } }; //﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌构造函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ Studentmassage::Studentmassage() { Head= new Student; Head->Next= new Student; End=Head->Next; in.open( "sort.txt" ); if (!in) cout<< "这是一个新系统,无学生信息。请先输入。" <<endl; else { while (!in.eof()) { End->ReadFile(in); if (End->name[0]== '\0' ) break ; End->Next= new Student; End=End->Next; } in.close(); cout<< "\t\t读取学生信息成功!" <<endl; } } //﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌析构函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ Studentmassage::~Studentmassage() { Save(); for (Student * temp;Head->Next!=End;) { temp=Head->Next; Head->Next=Head->Next->Next; delete temp; } delete Head,End; } //﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌菜单﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ void Studentmassage::ShowMenu() { cout<< "********************************************************************************" <<endl; cout<< "〓〓〓〓〓〓〓〓〓〓 ☆ 学 生 成 绩 管 理 系 统 ☆ 〓〓〓〓〓〓〓〓〓〓" <<endl; cout<< "〓〓〓〓〓〓〓★★★★★ ★★★★★★★ ★★★★★〓〓〓〓〓〓〓" <<endl; cout<< "〓〓〓〓〓〓〓〓〓★ ☆ 1.增加学生成绩 ☆ ★〓〓〓〓〓〓〓〓〓" <<endl; cout<< "〓〓〓〓〓〓〓〓〓★ ☆ 2.显示学生成绩 ☆ ★〓〓〓〓〓〓〓〓〓" <<endl; cout<< "〓〓〓〓〓〓〓〓〓★ ☆ 3.排序统计成绩 ☆ ★〓〓〓〓〓〓〓〓〓" <<endl; cout<< "〓〓〓〓〓〓〓〓〓★ ☆ 4.查找学生成绩 ☆ ★〓〓〓〓〓〓〓〓〓" <<endl; cout<< "〓〓〓〓〓〓〓〓〓★ ☆ 5.删除学生成绩 ☆ ★〓〓〓〓〓〓〓〓〓" <<endl; cout<< "〓〓〓〓〓〓〓〓〓★ ☆ 6.修改学生信息 ☆ ★〓〓〓〓〓〓〓〓〓" <<endl; cout<< "〓〓〓〓〓〓〓〓〓★ ☆ 0.安全退出系统 ☆ ★〓〓〓〓〓〓〓〓〓" <<endl; cout<< "\n\t\t\n\t\t请选择:" ; } //﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌查找函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ void Studentmassage::Find() { char name[20] ,Id[10]; int x; Student * p=NULL; cout<< "\n\t\t*********************************\n" ; cout<< "\t\t※ 1.按学生的姓名查找\n\t\t※ 2.按学生学号查找" ; cout<< "\n\t\t*********************************\n请选择:" ; cin>>x; switch (x) { case 1:{cout<< "\t\t请输入要查找的学生的姓名:" ;cin>>name; if (p=FindItem(name)) { p->Next->Show(); cout<< "输入任意字符!继续……" ; getch(); } else { cout<< "\t\t没有找到该姓名的学生!" << '\n' <<endl; cout<< "输入任意字符!继续……" ; getch(); } } break ; case 2: { cout<< "\t\t请输入要查找的学生的学号:" ;cin>>Id; if (p=FindID(Id)) { p->Next->Show(); cout<< "输入任意字符!继续……" ; getch(); } else { cout<< "\t\t没有找到该学号的学生!" << '\n' <<endl; cout<< "输入任意字符!继续……" ; getch(); } } break ; } } //﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌修改信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ void Studentmassage::ModifyItem() //修改信息 { char name[20]; Student * p=NULL; cout<< "\t\t请输入要修改的人的姓名:" ;cin>>name; if (p=FindItem(name)) { cout<< "\t\t已找到学生的信息,请输入新的信息!" <<endl; p->Next->Input(); cout<< "修改成功!" <<endl; cout<< "输入任意字符!继续……" ; getch(); } else { cout<< "\t\t没有找到!" <<endl; cout<< "输入任意字符!继续……" ; getch(); } } //﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌删除信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ void Studentmassage::RemoveItem() // 删除信息 { char name[20]; Student * p=NULL,*temp=NULL; cout<< "\t\t请输入要删除的学生的姓名:" <<endl;cin>>name; if (p=FindItem(name)) { temp=p->Next; p->Next=p->Next->Next; delete temp; cout<< "\t\t删除成功!" <<endl; cout<< "输入任意字符!继续……" ; getch(); } else { cout<< "\t\t没有找到!" <<endl; cout<< "输入任意字符!继续……" ; getch(); } } //﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ void Studentmassage::Swap(Student *p1, Student *p2) //交换两个combox变量的数据域 { Student *temp= new Student; strcpy (temp->name,p1->name); strcpy (temp->Id,p1->Id); temp->Cnum=p1->Cnum; temp->Mnum=p1->Mnum; temp->Enum=p1->Enum; temp->sum=p1->sum; strcpy (p1->name,p2->name); strcpy (p1->Id,p2->Id); p1->Cnum=p2->Cnum; p1->Mnum=p2->Mnum; p1->Enum=p2->Enum; p1->sum=p2->sum; strcpy (p2->name,temp->name); strcpy (p2->Id,temp->Id); p2->Cnum=temp->Cnum; p2->Mnum=temp->Mnum; p2->Enum=temp->Enum; p2->sum=temp->sum; } //﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ int Studentmassage::ListCount() //统计当前链表的记录总数,返回一个整数 { if (! Head) return 0; int n=0; for (Student * p=Head->Next;p!=End;p=p->Next) { n++; } return n; } //﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ void Studentmassage::Sort() //对当前链表进行排序 { cout << "Sorting..." <<endl; Student *p=NULL,*p1=NULL,*k=NULL; int n=Studentmassage::ListCount(); if (n<2) return ; for (p=Head->Next;p!=End;p=p->Next) for (k=p->Next;k!=End;k=k->Next) { if (p->sum>k->sum) { Studentmassage::Swap(p,k); } } cout << "排序完成!" <<endl; getch(); return ; } //﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌保存函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ void Studentmassage::Save() { out.open( "sort.txt" ); for (Student *p=Head->Next;p!=End;p=p->Next) out<<p->name<< "\t" <<p->Id<< "\t" <<p->Cnum<< "\t" <<p->Mnum<< "\t" <<p->Enum<< "\t" <<p->sum<< '\n' ; out.close(); } //﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌主函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ int main() { int x,i=0; bool quit= false ; cout<< "\t\t§§§§§§§§§§§§§§§§§§§§§§§§§§" <<endl; for (i=0;i<3;i++) cout<< "\t\t◎\t\t\t\t\t\t ◎" <<endl; cout<< "\t\t◎★★★★【 欢迎进入学生成绩管理系统 】★★★★◎" <<endl; for (i=0;i<3;i++) cout<< "\t\t◎\t\t\t\t\t\t ◎" <<endl; cout<< "\t\t§§§§§§§§§§§§§§§§§§§§§§§§§§\n" <<endl;; Studentmassage Grade; cout<< "按任意键开始……" ; getch(); while (!quit) { system ( "cls" ); Grade.ShowMenu(); cin>>x; switch (x) { case 0:quit= true ; break ; case 1:Grade.AddItem(); break ; case 2:Grade.Display(); break ; case 3:Grade.Sort(); break ; case 4:Grade.Find(); break ; case 5:Grade.RemoveItem(); break ; case 6:Grade.ModifyItem(); break ; } } return 0; |
感谢观看!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~