关于搬运CSDN上学生信息管理系统的阅读与二次开发
关于本篇博客内容,我大概分成了三个部分进行讲述:对于源代码的解读、二次重开发后程序的介绍和自己在做完对他人代码的解读和重开发后自己的一些感想。
一、 源代码的解读
在本部分的解读中主要分为三部分:该软件的功能解读、实现该功能所使用的程序方法和我认为的软件存在的缺陷之处。当然先说明源代码的来源,来自代码交流网站——CSDN,该处也放出网页地址:https://blog.csdn.net/gl620321/article/details/106985511
1.功能解读
先放出源代码的程序运行主界面:
从这张图片中,我们很容易的知道,该程序的主要功能有6条:1)增加学生信息 2)显示学生信息 3)删除学生信息 4)学生信息查找 5)修改学生信息 6)系统安全退出
在进入各个功能中进行实际使用体验:
1)增加学生信息
从上图,我们可以看出程序主要对学生的学号、姓名、性别、年龄和系别进行录入。
2)显示学生信息
该功能主要将储存的学生信息全部显示。
3)删除学生信息
该功能主要对学生姓名进行查找后再将存储信息符合的进行删除,然后再将删除后存储的学生信息进行全部输出显示。
4)学生信息查找
此处功能的实现也是通过对学生姓名的查找。从上面截图可以看见,他显示的是请输入要修改的学生的姓名,这是我认为程序存在的缺陷之一,在后面的第三部分会详细讲诉。
5)修改学生信息
该功能主要是对上面进行的操作进行保存。
6)系统安全退出
该功能主要是对上面进行的操作进行保存,然后退出程序。实际退出时的保存只是文字显示,没有代码对文件进行保存。
2.对应功能所使用的方法
在使用完所有的功能之后,我们可以再次总结出该程序所有的功能:文件读写、界面转换、增加、删除、修改、查询、显示和退出。
上面的功能顺序是按程序运行的顺序进行排列的,所以我们按顺序介绍。
首先文件的读写:
用到文件读写功能主要是程序刚启动程序时文件的读入程序以及修改后信息写入文件。
刚启动程序时文件的读入程序:
修改后信息写入文件(对应源程序功能中的修改学生信息):
增加功能:
上方图片显示的是增加功能所使用的代码。
主要的增加功能在AddItem函数,End是所有学生信息的尾指针,所以新增的信息都会通过input函数增加到尾指针中,然后新建一个指针,新建指针变成尾指针。
删除功能:
修改功能:
查询功能:
上面删除和修改功能中的FindItem就对应着查找功能,但是程序中没有单独的查询功能。
显示功能:
退出功能:
借用界面显示的代码图,退出功能的实现主要是依靠while判断为假,从而退出循环,再退出系统。
总结一下该程序主要用的一些技术:类、switch与case、指针、文件的读写。
3.我认为存在的缺陷
1)增加学生信息没有进行限制,可能会输入相同学号的学生信息,如图:
而实际中是不能存在学号相同的情况的。并且性别也没有进行限制,可能会输入“男/女”之外的字符。
2)菜单页中的文字信息与实际功能存在差异,比如查询功能却变成了修改功能。
3)查询的方式是通过姓名进行查找,然而现实中会存在同名的情况,这将使修改信息存在不严谨性,可能出错。
4)程序的保存操作要单独进行,可能会造成操作的丢失
二、 二次重开发后程序的介绍
该部分的内容是对第一部分中提出的缺陷,从而对程序进行的修改和升级。
1) 增加输入学号在存储信息中已存在或输入的性别不为“男/女”,则报错,要求重新输入
2)修改菜单页面中的选项的对应代码,以实现对应功能
3)将查询的方式改成以学号进行查询,并且添加单独查询信息功能(查询方式通过学号、姓名和系别查询)
4)将程序的保存操作进行实时保存
三、 感想
在经过了此次他人程序的二次开发后,我找到了几点在写代码时十分重要的点:
1.在写代码时,一定要加入注释,否则在别人读代码时,会十分的麻烦,而且不仅仅是别人,甚至你自己过了很长一段时间后,再去看自己的代码,你自己都可能看不懂,所以写代码一定要写注释,写注释,写注释(重要的事情说三遍)!!!
2.我认为写代码,不要只是一个人死扣,可以多问问别人一些建议,这样会使你的相同程序好上很多。
最后,希望你们在这篇博客中有收获,也可以对我修改过的源代码进行再次开发,同时也可以在下方留言和我进行交流。
附:修改后源代码:
1 #include<iostream> 2 #include<fstream> 3 #include<iomanip> 4 #include<stdlib.h> 5 #include<Windows.h> 6 #include<conio.h> 7 using namespace std ; 8 9 #define HEADER1 " -------------------------学生信息---------------------- \n" 10 #define HEADER2 " | 学号 | 姓名 | 性别 | 年龄 | 系别 |\n" 11 #define HEADER3 " |----------|----------|----------|----------|----------|\n" 12 13 int num; //学生总数 14 class Student //定义学生类 15 { 16 public: 17 char id[20];//学号 18 char name[20] ;//名字 19 char sex[5] ;//性别 20 int age ;//年龄 21 char xibie[20] ;//系别 22 Student *next ; 23 void ReadFile(istream & in) ;//读取文件 24 void show() ;//显示方法 25 void input(); //修改时的输入学生信息函数 26 } ; 27 void Student::ReadFile(istream & in) //读取文件 28 { 29 in>>id>>name>>sex>>age>>xibie ; 30 } 31 32 void Student::input() //修改时的输入学生信息函数 33 { 34 cout<<"\t\t学号:" ; 35 cin>>id ; 36 cout<<"\t\t姓名:" ; 37 cin>>name ; 38 char a[]="男"; char b[]="女"; 39 cout<<"\t\t性别:" ; 40 y: 41 cin>>sex ; 42 if(strcmp(sex ,a)&&strcmp(sex ,b)) 43 { 44 cout<<"您输入的性别不存在,请重新输入:"; 45 goto y; 46 } 47 cout<<"\t\t年龄:" ; 48 cin>>age ; 49 cout<<"\t\t系别:" ; 50 cin>>xibie ; 51 } 52 53 void Student::show() //输出学生信息 54 { 55 cout<<" |"<<setw(5)<<id<<" |"<<setw(5)<<name<<" |"<<setw(8)<<sex<<" |"<<setw(6)<<age<<" |"<<setw(6)<<xibie<<"|"<<endl ; 56 cout<<" |----------|----------|----------|----------|----------|\n" ; 57 } 58 59 class StudentMassage //定义学生信息类,包含各项处理功能 60 { 61 public: 62 StudentMassage() ; 63 ~StudentMassage() ; 64 void ShowMenu() ; 65 void Display() ; 66 void AddItem() ; 67 void save() ; 68 void ModifyItem() ; 69 void RemoveItem() ; 70 void Sort() ; 71 void shuru(Student *p1); 72 void chazhao(); 73 private: 74 Student *Head , *End ; 75 ifstream in ; 76 ofstream out ; 77 Student *FindId(char *id) ; 78 void FindId_1(char *id) ; 79 void FindName(char *name) ; 80 void Findxibie(char *xibie) ; 81 } ; 82 83 void StudentMassage::shuru(Student *p1) //输入函数 84 { 85 cout<<"\t\t学号:" ; 86 x: 87 cin>>p1->id ; 88 for(Student *p = Head ; p->next != End ; p = p->next) 89 if(!strcmp(p->next->id ,p1->id)) 90 { 91 cout<<"您输入的学号已存在,请重新输入:"; 92 goto x; 93 } 94 cout<<"\t\t姓名:" ; 95 cin>>p1->name ; 96 char a[]="男"; char b[]="女"; 97 cout<<"\t\t性别:" ; 98 y: 99 cin>>p1->sex ; 100 if(strcmp(p1->sex ,a)&&strcmp(p1->sex ,b)) 101 { 102 cout<<"您输入的性别不存在,请重新输入:"; 103 goto y; 104 } 105 cout<<"\t\t年龄:" ; 106 cin>>p1->age ; 107 cout<<"\t\t系别:" ; 108 cin>>p1->xibie ; 109 } 110 111 void StudentMassage::chazhao() 112 { 113 int a; char b[20]; 114 cout<<"请输入你要查找的类型(1.学号 2.姓名 3.系别):"; 115 x: 116 cin>>a; 117 switch(a) 118 { 119 case 1:cout<<"请输入您要查找的学号:" ;cin>>b;cout<<endl<<HEADER1<<HEADER2<<HEADER3 ;FindId_1(b);break; 120 case 2:cout<<"请输入您要查找的姓名:" ;cin>>b;cout<<endl<<HEADER1<<HEADER2<<HEADER3 ;FindName(b);break; 121 case 3:cout<<"请输入您要查找的系别:" ;cin>>b;cout<<endl<<HEADER1<<HEADER2<<HEADER3 ;Findxibie(b);break; 122 default: cout<<"输入错误,请重新输入:" ;goto x; 123 } 124 cout<<"查询结果已显示,按任意键返回..."; 125 getch(); 126 } 127 128 Student *StudentMassage::FindId(char *id) 129 { 130 Student *p ; 131 for(p = Head ; p->next != End ; p = p->next) 132 if(!strcmp(p->next->id ,id)) 133 return p ; 134 return NULL ; 135 } 136 137 void StudentMassage::FindId_1(char *id) 138 { 139 Student *p ;int n=0; 140 for(p = Head ; p->next != End ; p = p->next) 141 if(!strcmp(p->next->id ,id)) 142 {n=1;p->next->show();} 143 if(n==0) cout<<"系统中无该学生!"; 144 } 145 146 void StudentMassage::FindName(char *name) 147 { 148 Student *p ;int n=0; 149 for(p = Head ; p->next != End ; p = p->next) 150 if(!strcmp(p->next->name ,name)) 151 {n=1;p->next->show();} 152 if(n==0) cout<<"系统中无该学生!"; 153 } 154 155 void StudentMassage::Findxibie(char *xibie) 156 { 157 Student *p ;int n=0; 158 for(p = Head ; p->next != End ; p = p->next) 159 if(!strcmp(p->next->xibie ,xibie)) 160 {n=1;p->next->show();} 161 if(n==0) cout<<"系统中无该学生!"; 162 } 163 164 StudentMassage::StudentMassage() //构造函数 165 { 166 Head = new Student ; 167 Head->next = new Student ; 168 End = Head->next ; 169 in.open("学生成绩.txt") ; 170 if(!in) 171 cout<<"\n\t\t这是一个新系统,无学生信息,请先输入。"<<endl ; 172 else 173 { 174 while(!in.eof()) 175 { 176 End->ReadFile(in) ; 177 if(End->name[0]=='\0') 178 break ; 179 End->next = new Student ; 180 End = End->next ; 181 } 182 in.close() ; 183 cout<<"\n\t\t读取学生信息成功!"<<endl ; 184 } 185 } 186 187 StudentMassage::~StudentMassage() //析构函数 188 { 189 Student *temp ; 190 save() ; 191 for(temp ; Head->next != End ; ) 192 { 193 temp = Head->next ; 194 Head -> next = Head ->next->next ; 195 delete temp ; 196 } 197 delete Head , End ; 198 } 199 200 void StudentMassage::ShowMenu() //显示菜单 201 { 202 cout<<"\n\n\t\t\t\t 主菜单"<<endl<<endl<<endl ; 203 cout<<"\t\t****************************************"<<endl<<endl ; 204 cout<<"\t\t1、增加学生信息 2、显示学生信息"<<endl<<endl ; 205 cout<<"\t\t3、删除学生信息 4、修改学生信息"<<endl<<endl ; 206 cout<<"\t\t5、学生信息查找 0、系统安全退出"<<endl<<endl ; 207 cout<<"\t\t****************************************"<<endl<<endl<<endl ; 208 cout<<"\t\t请选择:" ; 209 } 210 211 void StudentMassage::Display() //显示学生信息 212 { 213 Student *p ; 214 cout<<endl<<HEADER1<<HEADER2<<HEADER3 ; 215 for(p = Head->next ; p != End ; p = p->next) 216 p->show() ; 217 cout<<"\n\n输入任意字符,继续......" ; 218 getch() ; 219 } 220 221 void StudentMassage::AddItem() //添加学生信息 222 { 223 shuru(End); 224 End->next = new Student ; 225 End = End->next ; 226 save(); 227 cout<<"\n\t\t添加成功!"<<endl ; 228 cout<<"\n输入任意字符,继续......" ; 229 getch() ; 230 } 231 232 void StudentMassage::ModifyItem() //修改学生信息 233 { 234 char id[20] ; 235 Student *p = NULL ; 236 cout<<"\n\t\t请输入要修改的学生的学号:" ; 237 cin>>id ; 238 if(p = FindId(id)) 239 { 240 cout<<"\n\t\t已找到该学生,请输入新的信息!"<<endl ; 241 p->next->input() ; 242 save(); 243 cout<<"\n\t\t修改成功!"<<endl ; 244 Display() ; 245 } 246 else 247 { 248 cout<<"\n\t\t没有找到!"<<endl ; 249 cout<<"\n输入任意字符!继续......." ; 250 getch() ; 251 } 252 } 253 254 void StudentMassage::RemoveItem() //删除学生信息 255 { 256 char id[20] ; 257 Student *p = NULL , *temp = NULL ; 258 cout<<"\n\t\t请输入要删除的学生的学号:" ; 259 cin>>id ; 260 if(p = FindId(id)) 261 { 262 temp = p->next ; 263 p->next = p->next->next ; 264 delete temp ; 265 save(); 266 cout<<"\n\t\t删除成功!"<<endl ; 267 Display() ; 268 } 269 else 270 { 271 cout<<"\t\t没有找到!"<<endl ; 272 cout<<"输入任意字符!继续......" ; 273 getch() ; 274 } 275 } 276 277 void StudentMassage::save() //存入文件 278 { 279 out.open("学生成绩.txt"); 280 for(Student *p=Head->next;p!=End;p=p->next) 281 out<<p->id<<"\t"<<p->name<<"\t"<<p->sex<<"\t"<<p->age<<"\t"<<p->xibie<<"\t"<<'\n'; 282 out.close(); 283 } 284 int main( 285 ) 286 { 287 int x ; 288 bool quit = false ; 289 cout<<"\n\n\n\n\n\n\n\n" ; 290 cout<<"\t\t********************************************"<<endl ; 291 cout<<"\t\t 欢迎使用学生信息管理系统!"<<endl ; 292 cout<<"\t\t********************************************"<<endl ; 293 StudentMassage Grade ; 294 Sleep(1000) ; 295 while(!quit) 296 { 297 system("cls") ; 298 Grade.ShowMenu() ; 299 cin>>x ; 300 switch(x) 301 { 302 case 0:quit = true ; break ; 303 case 1:Grade.AddItem() ; break ; 304 case 2:Grade.Display() ; break ; 305 case 3:Grade.RemoveItem(); break ; 306 case 4:Grade.ModifyItem(); break ; 307 case 5:Grade.chazhao(); break ; 308 } 309 } 310 return 0; 311 }