关于本篇博客内容,我大概分成了三个部分进行讲述:对于源代码的解读、二次重开发后程序的介绍和自己在做完对他人代码的解读和重开发后自己的一些感想。

一、  源代码的解读

在本部分的解读中主要分为三部分:该软件的功能解读、实现该功能所使用的程序方法和我认为的软件存在的缺陷之处。当然先说明源代码的来源,来自代码交流网站——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 }

关于搬运CSDN上学生信息管理系统的阅读与二次开发的更多相关文章

  1. 学生信息管理系统.cpp(大二上)

      #include<iostream> #include<fstream> #include<string> #include<iomanip> #i ...

  2. PHP实现简单的学生信息管理系统(web版)

    (∩_∩) 1.概述 学了php的一些基础,包括HTML,php,pdo,mysql操作等,一直都没有将它们有机结合.最近写了一个简单的网页版学生信息管理系统,前台用HTML,脚本用到了JavaScr ...

  3. Android(java)学习笔记195:学生信息管理系统案例(SQLite + ListView)

    1.首先说明一个知识点,通常我们显示布局文件xml都是如下: setContentView(R.layout.activity_main): 其实每一个xml布局文件就好像一个气球,我们可以使用Vie ...

  4. Java课设(学生信息管理系统)

    1.团队课程设计博客链接 http://www.cnblogs.com/Min21/p/7064093.html 2.个人负责模板或任务说明 设计登陆界面和学生信息界面的设计,学生信息的显示.退出等功 ...

  5. 【Python3.6+Django2.0+Xadmin2.0系列教程之二】学生信息管理系统(入门篇)

    上一篇我们已经创建好了一个Xadmin的基础项目,现在我们将在此基础上构建一个同样很基础的学生信息管理系统. 一.创建模型 模型是表示我们的数据库表或集合类,并且其中所述类的每个属性是表或集合的字段, ...

  6. 【Python3.6+Django2.0+Xadmin2.0系列教程之三(入门篇-下)】学生信息管理系统

    上一篇我们已经初步的构建起了一个学生管理系统的模型,现在接着来继续完善它吧. 1.上传图片/文件等资源 有时候需要添加一些附件,例如,新生刚入学,大家相互之间还不熟悉,希望能通过照片来加深印象,并且方 ...

  7. Py学生信息管理系统 案例(优化版)

    # 第一题:设计一个全局变量,来保存很多个学生信息:学生(学号, 姓名,年龄):思考要用怎样的结构来保存:# 第二题:在第一题基础上,完成:让用户输入一个新的学生信息(学号,姓名,年龄):你将其保存在 ...

  8. Python学生信息管理系统的开发

    # 第一题:设计一个全局变量,来保存很多个学生信息:学生(学号, 姓名,年龄):思考要用怎样的结构来保存:# 第二题:在第一题基础上,完成:让用户输入一个新的学生信息(学号,姓名,年龄):你将其保存在 ...

  9. 学生信息管理系统(C语言)

    #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct student ...

随机推荐

  1. solidity的函数修改器(modifier)

    内容:modifier的定义.modifier对函数参数的操作.modifier执行的顺序 modifier的定义 官方文档:modifier可以改变函数的行为.可以被继承和重写. 其实modifie ...

  2. centos 7下设置.net core项目开机自启动

    1.在etc/systemd/system下创建xxx.service文件 例如:vi /etc/systemd/system/ubif.service2.编辑 ubif.service内容如下: [ ...

  3. Explain 索引优化分析

    Explain 语法 # 语法 explain + DQL语句 mysql> explain select * from city where countrycode ='CHN' or cou ...

  4. kubernetes进阶(六)k8s平滑升级

    当我们遇到K8S有漏洞的时候,或者为了满足需求,有时候可能会需要升级或者降级版本, 为了减少对业务的影响,尽量选择在业务低谷的时候来升级: 首先准备好文件:我这里选择的是内网文件服务器上下载的,请自行 ...

  5. Hexo准备---Node.js、Vue

    Hexo准备---Node.js.Vue 安装node.js 1.下载node 配置node.js环境官网下载,一直next就好,非常方便. 下载官网: http://nodejs.cn/downlo ...

  6. codeforces 876B

    B. Divisiblity of Differences time limit per test 1 second memory limit per test 512 megabytes input ...

  7. C# Dictionaries

    Dictionaries 字典 在C# 里是用接口 IDictionary来实现的,最常用的字典就是Dicrtionary<tkey,tvalue>,键值对的形式,和index,item ...

  8. Linux 驱动框架---驱动中的中断

    在单片机开发中中断就是执行过程中发生了一些事件需要及时处理,所以需要停止当前正在运行的处理的事情转而去执行中断服务函数,已完成必要的事件的处理.在Linux中断一样是如此使用但是基于常见的中断控制器的 ...

  9. const,volatile,static,typdef,几个关键字辨析和理解

    1.const类型修饰符 const它限定一个变量初始化后就不允许被改变的修饰符.使用const在一定程度上可以提高程序的安全性和可靠性.它即有预编译命令的优点也有预编译没有的优点.const修饰的变 ...

  10. TypeScript Errors All In One

    TypeScript Errors All In One 1. Property 'name' has no initializer and is not definitely assigned in ...