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