成绩管理系统(C语言)优化
目录
- 优化环境
- 程序简介以及源代码
- 发现问题
- 优化代码
- 优化后程序运行
一、优化环境
开发语言:C语言
优化工具:Visual Studio 2022
优化时间:2022.03.02
优化者:葡萄吐不吐皮
二、程序简介以及源代码
1.程序来源
此学生成绩管理系统来源于一个同学(高中同学现就读于西安工业大学计算机科学与工程学院)的大一C语言期末大作业,编写一个学生成绩管理系统,基本信息包括学生姓名、学号、年龄、性别以及三门课程的成绩(语文、数学、英语),实现增删改查的功能。
2.源代码
1 #include <stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #define N 50 5 struct Student{ 6 char name[20]; 7 int sno; 8 int age; 9 char gender; 10 float EnglishScore; 11 float mathScore; 12 float chineseScore; 13 }stu[N]={{"张三",1000,20,'M',98,99,97}, 14 {"李四",1001,21,'F',97,96,95}, 15 {"王五",1002,23,'M',95,96,92}, 16 }; 17 18 19 void add(struct Student stu[],int pos,int nums); 20 21 22 23 void Delete_name(struct Student *stu,char Name[]); 24 25 26 27 void update(struct Student stu[],int Sno,int len); 28 29 30 void menu(struct Student stu[],int m); 31 void search(struct Student stu[],int n,char Name[]); 32 void sort(struct Student stu[],int n); 33 void print(struct Student stu[],int n); 34 void My_print_sum(struct Student stu[],int n); 35 void max_min(struct Student stu[],int n); 36 37 38 void PrintScreen() 39 { 40 printf("------------------\n"); 41 printf("** 1.增加学生记录 **\n"); 42 printf("** 2.删除学生记录 **\n"); 43 printf("** 3.查找学生记录 **\n"); 44 printf("** 4.修改学生记录 **\n"); 45 printf("** 0.退出管理系统 **\n"); 46 printf("------------------\n"); 47 } 48 49 50 void deleteScreen() 51 { 52 printf("------------------\n"); 53 printf("** 0.按姓名删除数据**\n"); 54 printf("** 1.返回主菜单 **\n"); 55 printf("------------------\n"); 56 printf("please select 0-1:"); 57 } 58 59 60 void seekScreen() 61 { 62 printf("-------------------------\n"); 63 printf("****** 1.按姓名查找信息 *\n"); 64 printf("****** 2.查看所有学生成绩 *\n"); 65 printf("****** 3.成绩名次排序(总分)*\n"); 66 printf("****** 4.查看成绩最优最差 *\n"); 67 printf("****** 5.返回主菜单 *\n"); 68 printf("-------------------------\n"); 69 printf("请选择:"); 70 } 71 72 73 static int count = 3; 74 75 76 77 78 //主函数 79 int main(int argc, const char * argv[]) 80 { 81 int nums,temp; 82 int snos; 83 char names[20]; 84 while(1) 85 { 86 PrintScreen(); 87 printf("回车键继续\n"); 88 getchar(); 89 printf("请选择 0-4:"); 90 char c = getchar(); 91 switch(c) 92 { 93 case '1': 94 printf("请输入需要添加学生的人数:"); 95 scanf("%d",&nums); 96 add(stu,count,nums); 97 getchar(); 98 break; 99 case '2': 100 deleteScreen(); 101 scanf("%d",&temp); 102 switch(temp) 103 { 104 case 0: 105 printf("请输入删除学生姓名:"); 106 scanf("%s",names);; 107 Delete_name(stu,names); 108 break; 109 case 1: 110 break; 111 } 112 getchar(); 113 break; 114 case '3': 115 menu(stu,count); 116 getchar(); 117 break; 118 case '4': 119 printf("请输入修改学生学号:"); 120 scanf("%d",&snos); 121 update(stu,snos,count); 122 break; 123 case '0': 124 exit(0); 125 default: 126 printf("错误!\n"); 127 getchar(); 128 break; 129 } 130 } 131 return 0; 132 } 133 134 135 136 //添加数据 137 void add(struct Student stu[],int pos,int nums) 138 { 139 for(int i=pos;i<pos+nums;i++) 140 { 141 printf("请输入姓名:"); 142 scanf("%s",stu[i].name); 143 int flag = 1,sno; 144 while(flag) 145 { 146 printf("请输入学号:"); 147 scanf("%d",&sno); 148 for(int j=0;j<pos;j++) 149 { 150 if(stu[j].sno==sno) 151 { 152 printf("学号已存在!\n"); 153 break; 154 } 155 else 156 { 157 flag = 0; 158 } 159 } 160 stu[i].sno = sno; 161 } 162 printf("请输入年龄:"); 163 scanf("%d",&stu[i].age); 164 printf("请输入性别:(f/m or F/M)"); 165 getchar(); 166 scanf("%c",&stu[i].gender); 167 printf("请输入英语成绩:"); 168 scanf("%f",&stu[i].EnglishScore); 169 printf("请输入数学成绩:"); 170 scanf("%f",&stu[i].mathScore); 171 printf("请输入语文成绩:"); 172 scanf("%f",&stu[i].chineseScore); 173 printf("学生信息添加成功!\n"); 174 } 175 count = count + nums; 176 } 177 178 179 180 void Delete_name(struct Student *stu,char Name[]) 181 { 182 if(count==0) 183 { 184 printf("成员已为空!\n"); 185 return; 186 } 187 int flag=0; 188 int n=count; 189 for(int i=0;i<n;i++) 190 { 191 if(strcmp((stu+i-flag)->name,Name)==0) 192 { 193 for(int j=i-flag;j<count;j++) 194 { 195 *(stu+j)=*(stu+j+1); 196 } 197 printf("\n"); 198 printf("学生:%s 已被删除.\n",Name); 199 printf("\n"); 200 flag=flag+1; 201 count =count -1; 202 } 203 } 204 if(flag==0) 205 printf("学生:%s 不存在.\n",Name); 206 } 207 208 209 void update(struct Student stu[],int sno,int len) 210 { 211 char cs,cs1,cs2,cs3; 212 char p[20]; 213 int grade,i; 214 for(i=0; i<len; i++) 215 { 216 if(sno==stu[i].sno) 217 { 218 printf("确认操作?(y/n):"); 219 getchar(); 220 cs = getchar(); 221 if(cs == 'y') 222 { 223 printf("请输入新的姓名:"); 224 scanf("%s",p); 225 getchar(); 226 strcpy(stu[i].name,p); 227 printf("修改成功!\n"); 228 } 229 230 printf("修改英语成绩?(y/n):"); 231 cs1 = getchar(); 232 if(cs1 == 'y') 233 { 234 printf("修改性别:"); 235 scanf("%d",&grade); 236 stu[i].EnglishScore = grade; 237 printf("修改成功!\n"); 238 } 239 240 printf("修改数学成绩?(y/n):"); 241 getchar(); 242 cs2 = getchar(); 243 if(cs2 == 'y') 244 { 245 printf("请输入性别:"); 246 scanf("%d",&grade); 247 stu[i].mathScore = grade; 248 printf("修改成功!\n"); 249 } 250 251 printf("修改语文成绩?(y/n):"); 252 getchar(); 253 cs3 = getchar(); 254 if(cs3 == 'y') 255 { 256 printf("请输入性别:"); 257 scanf("%d",&grade); 258 stu[i].chineseScore = grade; 259 printf("修改成功!\n"); 260 break; 261 } 262 else 263 { 264 getchar(); 265 break; 266 } 267 } 268 else if(i==len-1) 269 { 270 printf("错误,无此学号!"); 271 break; 272 } 273 else 274 { 275 continue; 276 } 277 } 278 } 279 280 281 void menu(struct Student stu[],int m) 282 { 283 int logel = 1; 284 while(logel) 285 { 286 seekScreen(); 287 int n; 288 scanf("%d",&n); 289 char name[20]; 290 int num; 291 switch(n) 292 { 293 case 1 : 294 printf("请输入同学的姓名: "); 295 scanf("%s",name); 296 search(stu,count,name); 297 break; 298 case 2: 299 print(stu,count); 300 break; 301 case 3: 302 sort(stu,count); 303 print(stu,count); 304 break; 305 case 4: 306 max_min(stu,count); 307 break; 308 case 5: 309 logel = 0; 310 break; 311 default: 312 logel = 0; 313 printf("输入数字有误!\n"); 314 break; 315 } 316 } 317 } 318 void search(struct Student stu[],int n,char Name[]) 319 { 320 char* p= Name; 321 int flag = 0; 322 for(int i=0;i<n;i++) 323 { 324 if(strcmp(stu[i].name,p)==0) 325 { 326 flag = 1; 327 My_print_sum(stu,i); 328 } 329 } 330 if(flag==0) 331 { 332 printf("姓名不存在!\n"); 333 } 334 } 335 void search1(struct Student stu[],int n,int Num) 336 { 337 int flag = 0; 338 for(int i=0;i<n;i++) 339 { 340 if(Num==stu[i].sno) 341 { 342 flag = 1; 343 My_print_sum(stu,i); 344 } 345 } 346 if(flag==0) 347 { 348 printf("学号不存在!\n"); 349 } 350 } 351 void sort(struct Student stu[],int n) 352 { 353 float sum[N]; 354 for(int i=0;i<n;i++) 355 { 356 sum[i]=stu[i].EnglishScore+stu[i].mathScore+stu[i].chineseScore; 357 } 358 for(int i=0;i<n-1;i++) 359 { 360 for(int j=0;j<n-1-i;j++) 361 { 362 if(sum[j]<sum[j+1]) 363 { 364 float temp1 = sum[j]; 365 sum[j] = sum[j+1]; 366 sum[j+1] = temp1; 367 368 struct Student temp; 369 temp=stu[j]; 370 stu[j]=stu[j+1]; 371 stu[j+1]=temp; 372 } 373 } 374 } 375 } 376 void max_min(struct Student stu[],int n) 377 { 378 sort(stu,n); 379 380 printf("成绩最优的同学:"); 381 My_print_sum(stu,0); 382 383 printf("成绩最差的同学:"); 384 My_print_sum(stu,n-1); 385 } 386 387 void print(struct Student stu[],int n) 388 { 389 for(int i=0;i<n;i++) 390 { 391 My_print_sum(stu,i); 392 } 393 } 394 395 void My_print_sum(struct Student stu[],int n) 396 { 397 printf("\n姓名:%s,学号:%d,年龄:%d,性别:%c,英语:%.2f,数学:%.2f,语文: %.2f,总分:%.2f\n", 398 stu[n].name,stu[n].sno,stu[n].age,stu[n].gender, 399 stu[n].EnglishScore,stu[n].mathScore,stu[n].chineseScore,(stu[n].EnglishScore+stu[n].mathScore+stu[n].chineseScore)); 400 }源代码
主菜单
1 void PrintScreen() 2 { 3 printf("------------------\n"); 4 printf("** 1.增加学生记录 **\n"); 5 printf("** 2.删除学生记录 **\n"); 6 printf("** 3.查找学生记录 **\n"); 7 printf("** 4.修改学生记录 **\n"); 8 printf("** 0.退出管理系统 **\n"); 9 printf("------------------\n"); 10 }
主函数
1 int main(int argc, const char * argv[]) 2 { 3 int nums,temp; 4 int snos; 5 char names[20]; 6 while(1) 7 { 8 PrintScreen(); 9 printf("回车键继续\n"); 10 getchar(); 11 printf("请选择 0-4:"); 12 char c = getchar(); 13 switch(c) 14 { 15 case '1': 16 printf("请输入需要添加学生的人数:"); 17 scanf("%d",&nums); 18 add(stu,count,nums); 19 getchar(); 20 break; 21 case '2': 22 deleteScreen(); 23 scanf("%d",&temp); 24 switch(temp) 25 { 26 case 0: 27 printf("请输入删除学生姓名:"); 28 scanf("%s",names);; 29 Delete_name(stu,names); 30 break; 31 case 1: 32 break; 33 } 34 getchar(); 35 break; 36 case '3': 37 menu(stu,count); 38 getchar(); 39 break; 40 case '4': 41 printf("请输入修改学生学号:"); 42 scanf("%d",&snos); 43 update(stu,snos,count); 44 break; 45 case '0': 46 exit(0); 47 default: 48 printf("错误!\n"); 49 getchar(); 50 break; 51 } 52 } 53 return 0; 54 }
添加学生信息
1 void add(struct Student stu[],int pos,int nums)//开始位置、添加人数 2 { 3 for(int i=pos;i<pos+nums;i++) 4 { 5 printf("请输入姓名:"); 6 scanf("%s",stu[i].name); 7 int flag = 1,sno; 8 while(flag) 9 { 10 printf("请输入学号:"); 11 scanf("%d",&sno); 12 for(int j=0;j<pos;j++) 13 { 14 if(stu[j].sno==sno) 15 { 16 printf("学号已存在!\n"); 17 break; 18 } 19 else 20 { 21 flag = 0; 22 } 23 } 24 stu[i].sno = sno; 25 } 26 printf("请输入年龄:"); 27 scanf("%d",&stu[i].age); 28 printf("请输入性别:(f/m or F/M)"); 29 getchar(); 30 scanf("%c",&stu[i].gender); 31 printf("请输入英语成绩:"); 32 scanf("%f",&stu[i].EnglishScore); 33 printf("请输入数学成绩:"); 34 scanf("%f",&stu[i].mathScore); 35 printf("请输入语文成绩:"); 36 scanf("%f",&stu[i].chineseScore); 37 printf("学生信息添加成功!\n"); 38 } 39 count = count + nums; 40 }
删除学生信息
1 void Delete_name(struct Student *stu,char Name[]) 2 { 3 if(count==0) 4 { 5 printf("成员已为空!\n"); 6 return; 7 } 8 int flag=0; 9 int n=count; 10 for(int i=0;i<n;i++) 11 { 12 if(strcmp((stu+i-flag)->name,Name)==0) 13 { 14 for(int j=i-flag;j<count;j++) 15 { 16 *(stu+j)=*(stu+j+1); 17 } 18 printf("\n"); 19 printf("学生:%s 已被删除.\n",Name); 20 printf("\n"); 21 flag=flag+1; 22 count =count -1; 23 } 24 } 25 if(flag==0) 26 printf("学生:%s 不存在.\n",Name); 27 }
修改学生信息
1 void update(struct Student stu[],int sno,int len) 2 { 3 char cs,cs1,cs2,cs3; 4 char p[20]; 5 int grade,i; 6 for(i=0; i<len; i++) 7 { 8 if(sno==stu[i].sno) 9 { 10 printf("确认操作?(y/n):"); 11 getchar(); 12 cs = getchar(); 13 if(cs == 'y') 14 { 15 printf("请输入新的姓名:"); 16 scanf("%s",p); 17 getchar(); 18 strcpy(stu[i].name,p); 19 printf("修改成功!\n"); 20 } 21 22 printf("修改英语成绩?(y/n):"); 23 cs1 = getchar(); 24 if(cs1 == 'y') 25 { 26 printf("修改性别:"); 27 scanf("%d",&grade); 28 stu[i].EnglishScore = grade; 29 printf("修改成功!\n"); 30 } 31 32 printf("修改数学成绩?(y/n):"); 33 getchar(); 34 cs2 = getchar(); 35 if(cs2 == 'y') 36 { 37 printf("请输入性别:"); 38 scanf("%d",&grade); 39 stu[i].mathScore = grade; 40 printf("修改成功!\n"); 41 } 42 43 printf("修改语文成绩?(y/n):"); 44 getchar(); 45 cs3 = getchar(); 46 if(cs3 == 'y') 47 { 48 printf("请输入性别:"); 49 scanf("%d",&grade); 50 stu[i].chineseScore = grade; 51 printf("修改成功!\n"); 52 break; 53 } 54 else 55 { 56 getchar(); 57 break; 58 } 59 } 60 else if(i==len-1) 61 { 62 printf("错误,无此学号!"); 63 break; 64 } 65 else 66 { 67 continue; 68 } 69 } 70 }
查询学生信息
1 void menu(struct Student stu[],int m) 2 { 3 int logel = 1; 4 while(logel) 5 { 6 seekScreen(); 7 int n; 8 scanf("%d",&n); 9 char name[20]; 10 int num; 11 switch(n) 12 { 13 case 1 : 14 printf("请输入同学的姓名: "); 15 scanf("%s",name); 16 search(stu,count,name); 17 break; 18 case 2: 19 print(stu,count); 20 break; 21 case 3: 22 sort(stu,count); 23 print(stu,count); 24 break; 25 case 4: 26 max_min(stu,count); 27 break; 28 case 5: 29 logel = 0; 30 break; 31 default: 32 logel = 0; 33 printf("输入数字有误!\n"); 34 break; 35 } 36 } 37 }
此处只列出了主要函数代码,详细代码在"源代码"中折叠存放。
三、发现问题
1.程序运行过后以及增删改查操作完成之后都会回到主菜单界面,但是需要进行下一步操作之前需要按回车键才能继续,较为繁琐,不符合使用者操作习惯。
解决方法:删除此操作步骤代码
2.删除学生信息和查询学生信息只有按姓名查询及删除,没有考虑到学号才是一个学生的特有属性,忽略了有同名的情况发生。
解决方法:在删除和查询学生信息的函数中添加“按学号删除(或查询)”的代码。
四、优化代码
1.删除“回车键继续”代码
2.添加“按学号删除(或查询)”代码
删除:
1 case 1: 2 printf("请输入删除学生信息学号:"); 3 scanf("%d",&snos); 4 Delete_sno(stu,snos); 5 break;
1 void Delete_sno(struct Student *stu,int Sno) 2 { 3 if(count==0) 4 { 5 printf("成员已为空!\n"); 6 return; 7 } 8 int flag=0; 9 for(int i=0;i<count;i++) 10 { 11 if((stu+i)->sno==Sno) 12 { 13 for(int j=i;j<count;j++) 14 { 15 *(stu+j)=*(stu+j+1); 16 } 17 printf("\n"); 18 printf("学号为%d的学生已被删除\n",Sno); 19 printf("\n"); 20 flag=1; 21 count = count-1; 22 break; 23 } 24 } 25 if(flag==0) 26 printf("学号%d不存在.\n",Sno); 27 }
查询:
1 case 2 : 2 printf("\n请输入同学的学号: "); 3 scanf("%d",&num); 4 search1(stu,count,num); 5 break;
1 void search1(struct Student stu[],int n,int Num) 2 { 3 int flag = 0; 4 for(int i=0;i<n;i++) 5 { 6 if(Num==stu[i].sno) 7 { 8 flag = 1; 9 My_print_sum(stu,i); 10 } 11 } 12 if(flag==0) 13 { 14 printf("the sno is not exist!\n"); 15 } 16 }
五、优化后程序运行
1.可直接操作
2.增加学号查询与删除
优化后源代码:
1 #include <stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #define N 50 5 struct Student{ 6 char name[20]; 7 int sno; 8 int age; 9 char gender; 10 float EnglishScore; 11 float mathScore; 12 float chineseScore; 13 }stu[N]={{"zhao",1000,20,'M',98,99,97}, 14 {"zhao",1001,21,'F',97,96,95}, 15 {"qian",1002,23,'M',95,96,92},}; 16 17 //添加数据 18 void add(struct Student stu[],int pos,int nums); 19 20 21 //删除数据 22 void Delete_name(struct Student *stu,char Name[]);//(按姓名) 23 void Delete_sno(struct Student *stu,int Sno);//(按学号) 24 25 26 //修改数据 27 void update(struct Student stu[],int Sno,int len); 28 29 30 //查询子菜单 31 void menu(struct Student stu[],int m); 32 void search(struct Student stu[],int n,char Name[]); 33 void search1(struct Student stu[],int n,int Num);//学号查询 34 void sort(struct Student stu[],int n); 35 void print(struct Student stu[],int n); 36 void My_print_sum(struct Student stu[],int n); 37 void max_min(struct Student stu[],int n); 38 39 40 //主菜单 41 void PrintScreen() 42 { 43 printf("------------------\n"); 44 printf("** 1.增加学生记录 **\n"); 45 printf("** 2.删除学生记录 **\n"); 46 printf("** 3.查找学生记录 **\n"); 47 printf("** 4.修改学生记录 **\n"); 48 printf("** 0.退出管理系统 **\n"); 49 printf("------------------\n"); 50 } 51 52 //删除子菜单 53 void deleteScreen() 54 { 55 printf("------------------\n"); 56 printf("** 0.按姓名删除数据**\n"); 57 printf("** 1.按学号删除数据**\n"); 58 printf("** 2.返回主菜单 **\n"); 59 printf("------------------\n"); 60 printf("please select 0-1:"); 61 } 62 63 //查找子菜单 64 void seekScreen() 65 { 66 printf("-------------------------\n"); 67 printf("****** 1.按姓名查找信息 *\n"); 68 printf("****** 2.按学号查找信息 *\n"); 69 printf("****** 3.查看所有学生成绩 *\n"); 70 printf("****** 4.成绩名次排序(总分)*\n"); 71 printf("****** 5.查看成绩最优最差 *\n"); 72 printf("****** 6.返回主菜单 *\n"); 73 printf("-------------------------\n"); 74 printf("please you select 1-6:"); 75 } 76 77 static int count = 10; 78 79 80 81 82 //主函数 83 int main(int argc, const char * argv[]) 84 { 85 int nums,temp; 86 int snos; 87 char names[20]; 88 while(1) 89 { 90 PrintScreen(); 91 getchar(); 92 printf("请选择 0-4:"); 93 char c = getchar(); 94 switch(c) 95 { 96 case '1': 97 printf("请输入添加学生数量:"); 98 scanf("%d",&nums); 99 add(stu,count,nums); 100 getchar(); 101 break; 102 case '2': 103 deleteScreen(); 104 scanf("%d",&temp); 105 switch(temp) 106 { 107 case 0: 108 printf("请输入姓名:"); 109 scanf("%s",names);; 110 Delete_name(stu,names); 111 break; 112 case 1: 113 printf("请输入学号:"); 114 scanf("%d",&snos); 115 Delete_sno(stu,snos); //删除(按学号删除) 116 break; 117 case 2: 118 break; 119 } 120 getchar(); 121 break; 122 case '3': 123 menu(stu,count); 124 getchar(); 125 break; 126 case '4': 127 printf("请输入学号:"); 128 scanf("%d",&snos); 129 update(stu,snos,count); 130 break; 131 case '0': 132 exit(0); 133 default: 134 printf("非法操作!\n"); 135 getchar(); 136 break; 137 } 138 } 139 return 0; 140 } 141 142 143 144 //添加学生信息 145 void add(struct Student stu[],int pos,int nums) 146 { 147 for(int i=pos;i<pos+nums;i++) 148 { 149 printf("请输入姓名:"); 150 scanf("%s",stu[i].name); 151 int flag = 1,sno; 152 while(flag) 153 { 154 printf("请输入学号:"); 155 scanf("%d",&sno); 156 for(int j=0;j<pos;j++) 157 { 158 if(stu[j].sno==sno) 159 { 160 printf("学号已存在!\n"); 161 break; 162 } 163 else 164 { 165 flag = 0; 166 } 167 } 168 stu[i].sno = sno; 169 } 170 printf("请输入年龄:"); 171 scanf("%d",&stu[i].age); 172 printf("请输入性别:(f/m or F/M)"); 173 getchar(); 174 scanf("%c",&stu[i].gender); 175 printf("请输入英语成绩:"); 176 scanf("%f",&stu[i].EnglishScore); 177 printf("请输入数学成绩:"); 178 scanf("%f",&stu[i].mathScore); 179 printf("请输入语文成绩:"); 180 scanf("%f",&stu[i].chineseScore); 181 printf("学生信息添加成功!\n"); 182 } 183 count = count + nums; 184 } 185 186 //按学号删除 187 void Delete_sno(struct Student *stu,int Sno) 188 { 189 if(count==0) 190 { 191 printf("成员已为空!\n"); 192 return; 193 } 194 int flag=0; 195 for(int i=0;i<count;i++) 196 { 197 if((stu+i)->sno==Sno) 198 { 199 for(int j=i;j<count;j++) 200 { 201 *(stu+j)=*(stu+j+1); 202 } 203 printf("\n"); 204 printf("学号为%d的学生已被删除\n",Sno); 205 printf("\n"); 206 flag=1; 207 count = count-1; 208 break; 209 } 210 } 211 if(flag==0) 212 printf("学号%d不存在.\n",Sno); 213 } 214 215 //按姓名删除 216 void Delete_name(struct Student *stu,char Name[]) 217 { 218 if(count==0) 219 { 220 printf("成员已为空!\n"); 221 return; 222 } 223 int flag=0; 224 int n=count; 225 for(int i=0;i<n;i++) 226 { 227 if(strcmp((stu+i-flag)->name,Name)==0) 228 { 229 for(int j=i-flag;j<count;j++) 230 { 231 *(stu+j)=*(stu+j+1); 232 } 233 printf("\n"); 234 printf("学生:%s 已被删除.\n",Name); 235 printf("\n"); 236 flag=flag+1; 237 count =count -1; 238 } 239 } 240 if(flag==0) 241 printf("学生:%s 不存在.\n",Name); 242 } 243 244 //修改学生信息 245 void update(struct Student stu[],int sno,int len) 246 { 247 char cs,cs1,cs2,cs3; 248 char p[20]; 249 int grade,i; 250 for(i=0; i<len; i++) 251 { 252 if(sno==stu[i].sno) 253 { 254 printf("修改姓名?(y/n):"); 255 getchar(); 256 cs = getchar(); 257 if(cs == 'y') 258 { 259 printf("请输入姓名:"); 260 scanf("%s",p); 261 getchar(); 262 strcpy(stu[i].name,p); 263 printf("修改成功!\n"); 264 } 265 266 printf("修改英语成绩?(y/n):"); 267 cs1 = getchar(); 268 if(cs1 == 'y') 269 { 270 printf("请输入分数:"); 271 scanf("%d",&grade); 272 stu[i].EnglishScore = grade; 273 printf("修改成功!\n"); 274 } 275 276 printf("修改数学成绩?(y/n):"); 277 getchar(); 278 cs2 = getchar(); 279 if(cs2 == 'y') 280 { 281 printf("请输入分数:"); 282 scanf("%d",&grade); 283 stu[i].mathScore = grade; 284 printf("修改成功!\n"); 285 } 286 287 printf("修改语文成绩?(y/n):"); 288 getchar(); 289 cs3 = getchar(); 290 if(cs3 == 'y') 291 { 292 printf("请输入分数:"); 293 scanf("%d",&grade); 294 stu[i].chineseScore = grade; 295 printf("修改成功!\n"); 296 break; 297 } 298 else 299 { 300 getchar(); 301 break; 302 } 303 } 304 else if(i==len-1) 305 { 306 printf("错误,无此学号!"); 307 break; 308 } 309 else 310 { 311 continue; 312 } 313 } 314 } 315 316 //查询数据 317 void menu(struct Student stu[],int m) 318 { 319 int logel = 1; 320 while(logel) 321 { 322 seekScreen(); 323 int n; 324 scanf("%d",&n); 325 char name[20]; 326 int num; 327 switch(n) 328 { 329 case 1 : 330 printf("请输入同学的姓名: "); 331 scanf("%s",name); 332 search(stu,count,name); 333 break; 334 case 2 : 335 printf("\n请输入同学的学号: "); 336 scanf("%d",&num); 337 search1(stu,count,num); 338 break; 339 case 3: 340 print(stu,count); 341 break; 342 case 4: 343 sort(stu,count); 344 print(stu,count); 345 break; 346 case 5: 347 max_min(stu,count); 348 break; 349 case 6: 350 logel = 0; 351 break; 352 default: 353 logel = 0; 354 printf("输入数字有误!\n"); 355 break; 356 } 357 } 358 } 359 void search(struct Student stu[],int n,char Name[]) 360 { 361 char* p= Name; 362 int flag = 0; 363 for(int i=0;i<n;i++) 364 { 365 if(strcmp(stu[i].name,p)==0) 366 { 367 flag = 1; 368 My_print_sum(stu,i); 369 } 370 } 371 if(flag==0) 372 { 373 printf("the name is not exist!\n"); 374 } 375 } 376 void search1(struct Student stu[],int n,int Num) 377 { 378 int flag = 0; 379 for(int i=0;i<n;i++) 380 { 381 if(Num==stu[i].sno) 382 { 383 flag = 1; 384 My_print_sum(stu,i); 385 } 386 } 387 if(flag==0) 388 { 389 printf("the sno is not exist!\n"); 390 } 391 } 392 void sort(struct Student stu[],int n) 393 { 394 float sum[N]; 395 for(int i=0;i<n;i++) 396 { 397 sum[i]=stu[i].EnglishScore+stu[i].mathScore+stu[i].chineseScore; 398 } 399 for(int i=0;i<n-1;i++) 400 { 401 for(int j=0;j<n-1-i;j++) 402 { 403 if(sum[j]<sum[j+1]) 404 { 405 float temp1 = sum[j]; 406 sum[j] = sum[j+1]; 407 sum[j+1] = temp1; 408 409 struct Student temp; 410 temp=stu[j]; 411 stu[j]=stu[j+1]; 412 stu[j+1]=temp; 413 } 414 } 415 } 416 } 417 void max_min(struct Student stu[],int n) 418 { 419 sort(stu,n); 420 421 printf("成绩最优的同学:"); 422 My_print_sum(stu,0); 423 424 printf("成绩最差的同学:"); 425 My_print_sum(stu,n-1); 426 } 427 428 void print(struct Student stu[],int n) 429 { 430 for(int i=0;i<n;i++) 431 { 432 My_print_sum(stu,i); 433 } 434 } 435 436 void My_print_sum(struct Student stu[],int n) 437 { 438 printf("\n姓名:%s,学号:%d,年龄:%d,性别:%c,英语:%.2f,数学:%.2f,语文: %.2f,总分:%.2f\n", 439 stu[n].name,stu[n].sno,stu[n].age,stu[n].gender, 440 stu[n].EnglishScore,stu[n].mathScore,stu[n].chineseScore,(stu[n].EnglishScore+stu[n].mathScore+stu[n].chineseScore)); 441 }View Code
标签:struct,int,void,程序,break,stu,printf,优化 From: https://www.cnblogs.com/jjs1959137/p/17191683.html