首页 > 编程语言 >优化程序

优化程序

时间:2023-03-08 16:22:34浏览次数:35  
标签:struct int void 程序 break stu printf 优化

成绩管理系统(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

相关文章