学生信息管理系统

  1 #include <iostream>
  2 //#include "stu.h"
  3 #include <iomanip>
  4 #include <fstream>
  5 #include <stdio.h>
  6 
  7 using namespace std;
  8 
  9 
 10 int Stu_count = 0;//用于总的学生人数计数
 11 int chushihua = 2010;//学生编号从哪里开始起,依次往上加
 12 
 13 class GStudent
 14 {
 15 public:
 16     //输入数据
 17     void Regester_stu(char[],int,char[],char[],char[],int);
 18     //获取数据
 19     int Getnum(void);
 20     void Getname(char name[]);
 21     int GetGrade(void);
 22     void GetBanji(char banji[]);
 23     void GetLwtittle(char lwtittle[]);
 24     void GetT_name(char t_name[]);
 25     int Getmark(void);
 26     GStudent(){Stu_num = Stu_count+chushihua;Stu_count++;};
 27     ~GStudent(){Stu_count--;};
 28     void dis_stu(void);
 29 private:
 30     int Stu_num;//学生编号
 31     char Name[10];//学生名字
 32     int Grade;//学生年级
 33     char Banji[10];//学生班级
 34     char Lwtittle[20];//学生论文题目
 35     char Teach_name[10];//学生指导老师
 36     int Mark;//学生成绩
 37 };
 38 
 39 int main()
 40 {
 41     int choice_1 = 1;
 42     while(choice_1 != 0)
 43     {
 44         GStudent *STU[100];
 45         cout<<"请输入您想进行的操作:
1.增加新的学生信息
2.修改学生信息
3.删除学生信息
4.保存学生信息
5.显示所有学生信息
6.按照学号查找学生信息
7.按照名字查找信息
8.退出
"<<endl;
 46         cin>>choice_1;
 47         switch(choice_1)
 48         {
 49             //增加学生信息
 50           case 1:
 51               {
 52                   system("cls");
 53                   char name[10],banji[10],lwtittle[20],t_name[10];
 54                   int grade,mark;
 55                   cout<<"请输入学生名称           ";
 56                   cin>>name;
 57                   cout<<"请输入学生年级           ";
 58                   cin>>grade;
 59                   cout<<"请输入学生班级           ";
 60                   cin>>banji;
 61                   cout<<"请输入学生论文题目       ";
 62                   cin>>lwtittle;
 63                   cout<<"请输入论文指导老师名字   ";
 64                   cin>>t_name;
 65                   cout<<"请输入学生论文成绩       ";
 66                   cin>>mark;
 67                   STU[Stu_count-1] = new GStudent;
 68                   (*STU[Stu_count-1]).Regester_stu(name,grade,banji,lwtittle,t_name,mark);
 69                   cout<<"学生信息已录入,";
 70                   system("pause");
 71                   system("cls");
 72                   break;
 73               }
 74             //修改学生信息
 75           case 2:
 76               {
 77                   system("cls");
 78                   if(Stu_count == 0)
 79                   {
 80                       cout<<"无学生,请返回主菜单加入学生信息"<<endl;
 81                       system("pause");
 82                       system("cls");
 83                       break;
 84                   };
 85                   int change;
 86                   cout<<"请输入要修改的学生的学号,"<<chushihua<<""<<chushihua+Stu_count-1<<"之间的数字(包括首尾)"<<endl;
 87                   cin>>change;
 88                   if (change > chushihua+Stu_count-1 || change < chushihua)
 89                   {
 90                       cout<<"无效输入,将返回主菜单"<<endl;
 91                       system("pause");
 92                       system("cls");
 93                       break;
 94                   }
 95                   cout<<"该学生的原始信息为:
";
 96                   (*STU[change-chushihua]).dis_stu();
 97                   char name[10],banji[10],lwtittle[20],t_name[10];
 98                   int grade,mark;
 99                   cout<<"请输入学生名称           ";
100                   cin>>name;
101                   cout<<"请输入学生年级           ";
102                   cin>>grade;
103                   cout<<"请输入学生班级           ";
104                   cin>>banji;
105                   cout<<"请输入学生论文题目       ";
106                   cin>>lwtittle;
107                   cout<<"请输入论文指导老师名字   ";
108                   cin>>t_name;
109                   cout<<"请输入学生论文成绩       ";
110                   cin>>mark;
111                   (*STU[change-chushihua]).Regester_stu(name,grade,banji,lwtittle,t_name,mark);
112                   cout<<"修改完毕,将返回主菜单";
113                   system("pause");
114                   system("cls");
115                   break;
116               }
117               //删除学生信息
118           case 3:
119               {
120                   system("cls");
121                   if(Stu_count == 0)
122                   {
123                       cout<<"无学生,请返回主菜单加入学生信息"<<endl;
124                       system("pause");
125                       system("cls");
126                       break;
127                   };
128                   int change;
129                   cout<<"请输入要删除的学生的学号,"<<chushihua<<""<<chushihua+Stu_count-1<<"之间的数字(包括首尾)"<<endl;
130                   cin>>change;
131                   if (change > chushihua+Stu_count-1 || change < chushihua)
132                   {
133                       cout<<"无效输入,将返回主菜单"<<endl;
134                       system("pause");
135                       system("cls");
136                       break;
137                   }
138                   cout<<"该学生的信息为:
";
139                   (*STU[change-chushihua]).dis_stu();
140                   cout<<"确定要删除?y/n     ";
141                   char temp = 'n';
142                   cin>>temp;
143                   if(temp == 'y')
144                   {
145                       //如果删除的是最后一个元素
146                       if (change == chushihua+Stu_count-1)
147                       {
148                           delete(STU[change-chushihua]);
149                           cout<<"改学生信息已删除,返回主菜单,";
150                           system("pause");
151                           system("cls");
152                           break;
153                       }
154                       //删除的非最后一个元素,先进行元素移动,然后将最后的元素delete掉
155                       for (int i = change;i < chushihua+Stu_count-1;i++)
156                       {
157                           char temp_name[10],temp_banji[10],temp_lw[20],temp_tname[10];
158                           (*STU[i-chushihua+1]).GetBanji(temp_banji);(*STU[i-chushihua+1]).GetLwtittle(temp_lw);
159                           (*STU[i-chushihua+1]).Getname(temp_name);(*STU[i-chushihua+1]).GetT_name(temp_tname);
160                           (*STU[i-chushihua]).Regester_stu(temp_name,(*STU[i-chushihua+1]).GetGrade(),temp_banji,temp_lw,temp_tname,(*STU[i-chushihua+1]).Getmark());
161                       }
162                       delete(STU[Stu_count-1]);
163                       cout<<"改学生信息已删除,返回主菜单,";
164                       system("pause");
165                       system("cls");
166                           break;
167                   }
168                   cout<<"取消删除或者无效输入,将返回主菜单,";
169                   system("pause");
170                   system("cls");
171                   break;
172               }
173               //保存学生信息
174           case 4:
175               {
176                   system("cls");
177                   if(Stu_count == 0)
178                   {
179                       cout<<"无学生,请返回主菜单加入学生信息"<<endl;
180                       system("pause");
181                       system("cls");
182                       break;
183                   };
184                   fstream save;
185                   if (!save)
186                   {
187                       cout<<"文件保存失败,返回主菜单,";
188                       system("pause");
189                       system("cls");
190                       break;
191                   }
192                   save.open("c:\save.txt",ios::out);
193                   save<<"学生信息如下:
分别为:学号,姓名,年级,班级,论文题目,指导老师,论文成绩.
";
194                   for (int i = 0;i < Stu_count;i++)
195                   {
196                       char temp_name[10],temp_banji[10],temp_lw[20],temp_tname[10];
197                       (*STU[i]).GetBanji(temp_banji);(*STU[i]).GetLwtittle(temp_lw);
198                           (*STU[i]).Getname(temp_name);(*STU[i]).GetT_name(temp_tname);
199                       save<<((*STU[i]).Getnum())<<"   "<<temp_name<<"   "<<((*STU[i]).GetGrade())<<"   "<<temp_banji<<"   "<<temp_lw<<"   "<<temp_tname<<((*STU[i]).Getmark())<<"
";
200                   }
201                   save.close();
202                   cout<<"文件保存成功,保存在c盘根目录下,程序将返回主菜单,"<<endl;
203                   //system("explorer /e,c:\,select,save.txt");
204                   system("pause");
205                    system("cls");
206                   break;
207               }
208               //显示所有学生信息
209           case 5:
210               {
211                   system("cls");
212                   if(Stu_count == 0)
213                   {
214                       cout<<"无学生,请返回主菜单加入学生信息"<<endl;
215                       system("pause");
216                       system("cls");
217                       break;
218                   };
219                   cout<<"依次为:
学号,名字,年级,班级,论文题目,指导老师,论文成绩。"<<endl;
220                   for (int i  = 0;i < Stu_count;i++)
221                   {
222                       (*STU[i]).dis_stu();
223                   }
224                   system("pause");
225                   system("cls");
226                   break;
227               }
228               //按照学号查找信息
229           case 6:
230               {
231                   system("cls");
232                   if(Stu_count == 0)
233                   {
234                       cout<<"无学生,请返回主菜单加入学生信息"<<endl;
235                       system("pause");
236                       system("cls");
237                       break;
238                   };
239                   cout<<"请输入"<<chushihua<<""<<chushihua+Stu_count-1<<"之间的数字(包括首尾)"<<endl;
240                   int i = 0;
241                   cin>>i;
242                   if (i > chushihua+Stu_count-1 || i < chushihua)
243                   {
244                       cout<<"无效输入,将返回主菜单"<<endl;
245                       system("pause");
246                       system("cls");
247                       break;
248                   }
249                   cout<<"
该学生信息依次为:
学号,名字,年级,班级,论文题目,指导老师,论文成绩。
"<<endl;
250                   (*STU[i-chushihua]).dis_stu();
251                   cout<<"

将返回主菜单";
252                   system("pause");
253                    system("cls");
254                   break;
255               }
256               //按照名字查找信息
257           case 7:
258               {
259                   system("cls");
260                   if(Stu_count == 0)
261                   {
262                       cout<<"无学生,请返回主菜单加入学生信息"<<endl;
263                       system("pause");
264                       system("cls");
265                       break;
266                   };
267                   cout<<"请输入学生名字      "<<endl;
268                   char cp[10];
269                   int temp = 0;
270                   cin>>cp;
271                   for (int i = 0;i < Stu_count;i++)
272                   {
273                       char c_temp[10];
274                       (*STU[i]).Getname(c_temp);
275                       if (strcmp(c_temp,cp) == 0)
276                       {
277                           temp++;
278                           (*STU[i]).dis_stu();
279                       }
280                   }
281                   if (temp == 0)
282                   {
283                       cout<<"没有查找到该学生的相应信息"<<endl;
284                   }
285                   system("pause");
286                   system("cls");
287                   break;
288               }
289               //退出
290           case 8:
291             return 0;
292             //无效输入
293           default :
294              system("cls");
295             cout<<"无效输入,请输入1-6的数字"<<endl;
296             break;
297         }
298     }
299     return 0;
300 }
301 
302 void GStudent::Regester_stu(char name[10],int grade,char banji[10],char lwtittle[20],char t_name[10],int mark)
303 {
304     Grade = grade;Mark = mark;
305     strcpy(Name,name);strcpy(Banji,banji);strcpy(Lwtittle,lwtittle);strcpy(Teach_name,t_name);
306 }
307 int GStudent::Getnum()
308 {
309     return Stu_num;
310 }
311 
312 void GStudent::Getname(char name[10])
313 {
314     strcpy(name,Name);
315 }
316 
317 int GStudent::GetGrade()
318 {
319     return Grade;
320 }
321 
322 void GStudent::GetBanji(char banji[10])
323 {
324     strcpy(banji,Banji);
325 }
326 void GStudent::GetLwtittle(char lwtittle[20])
327 {
328     strcpy(lwtittle,Lwtittle);
329 }
330 void GStudent::GetT_name(char t_name[10])
331 {
332     strcpy(t_name,Teach_name);
333 }
334 int GStudent::Getmark()
335 {
336     return Mark;
337 }
338 void GStudent::dis_stu()
339 {
340     cout<<Stu_num<<"   "<<Name<<"   "<<Grade<<"   "<<Banji<<"   "<<Lwtittle<<"   "<<Teach_name<<"   "<<Mark<<endl;
341 }
View Code


主要是通过设计一个学生类,然后通过类函数进行操作,设计了两个全局变量,一个用来统计生成的学生对象数,另一个为学号起始数。里面最主要的是加深了对析构函数和构造函数的理解,在下面一段代码中,进行分析。

GStudent(){Stu_num = Stu_count+chushihua;Stu_count++;};
~GStudent(){Stu_count--;};


这段代码我们可以看到是构造函数和析构函数,里面分别对全局变量——学生计数变量进行了操作,每创建(销毁)一个学生对象就会将计数器+1(-1),在调用时我们这样来看

1 GStudent *STU[100];
2 STU[Stu_count-1] = new GStudent;
3 (*STU[Stu_count-1]).Regester_stu(name,grade,banji,lwtittle,t_name,mark);

首先定义了一个学生类的数组指针,用来进行分配内存,便于空间管理。第二句创建了一个学生对象。但是这个时候我们看到sut_count原本为
0的,但是创建了一个学生对象后,变为1,这个时候将数组指针的STU[1],进行了动态内存分配,而不是STU[0]。(原本以为是先执行完了第二句,也就是跟STU[0]分配了空间才+1的,但是调试的时候发现STU[0]没有被分配空间,反倒是从STU[1]开始的.经过思考发现,原来是忽略了构造函数会优先于任何程序执行的特点。)

至于析构函数,就简单多了,只负责将学生计数器-1就行,在执行delete命令进行内存释放后会自动执行,让学生人数-1.

原文地址:https://www.cnblogs.com/color-my-life/p/3161777.html