首页 > 技术文章 > 基于链表的学生管理系统【C语言版】

ypha 2020-12-12 15:50 原文

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include <stdlib.h>
  4 #define N 3
  5 struct Student{
  6     int num;
  7     char name[25];
  8     char major[10];
  9     int classNo;
 10     int score[4];
 11 };
 12 typedef struct Student STU;
 13 void Input(STU *p);
 14 void Output(STU *p);
 15 void Save(STU *p);
 16 int Fetch(STU *st,int n,char *filename);
 17 void Max(STU stu[],int m);
 18 double average_person(STU *p);
 19 void sort_select(STU *p);
 20 void Sort_Buble(STU *p);
 21 void Sort_insert(STU *p);
 22 void Search(STU *p);
 23 void Ask();
 24 
 25 
 26 void main()
 27 {
 28     int choose;
 29     int i,j,m,n;
 30     char filename[10];
 31     STU stu[N];
 32     STU *p;
 33     p=stu;
 34 
 35     while(1)
 36     {
 37         printf("\n——————————————————————————————————————————\n");
 38         printf("|/          # 已经进入  大连海事大学--学生信息管理系统 #      //\n");
 39         printf("———————————————————————————————————————————\n\n\n");
 40         printf("|///#No.1  ---- 输入学生个人信息                            ---- \n");
 41         printf("|///#No.2  ---- 输出学生个人信息                            ---- \n");
 42         printf("|///#No.3  ---- 保存学生信息                                ---- \n");
 43         printf("|///#No.4  ---- 读取学生信息                                ---- \n");
 44         printf("|///#No.5  ---- 输出某门课程的最高分和分数最高的学生的姓名  ----\n");
 45         printf("|///#No.6  ---- 对某专业的学生按总平均成绩进行简单选择排序  ---- \n");/*MOU 专业*/
 46         printf("|///#No.7  ---- 按平均成绩对某班学生进行冒泡排序            ---- \n");
 47         printf("|///#No.8  ---- 对某班学生按某门课程成绩进行直接插入排序    ---- \n");/*班级*/
 48         printf("|///#No.9  ---- 按照班级和成绩的查找某位学生信息            ---- \n");
 49         printf("\n **注意:若是输入其他数字直接退出系统//**\n\n\n"); 
 50         printf("———————————————————————————————————————————\n\n\n");
 51         printf("请输入选择的功能编号:");
 52 
 53         scanf("%d",&choose);
 54         switch(choose)
 55         {
 56         case 1:
 57             {
 58 
 59                 for(i=0;i<N;i++)
 60                 {
 61                     Input(stu+i);
 62                 }
 63                 Ask();
 64                 break;
 65 
 66             }
 67         case 2:{    
 68                 printf("请输入想要输出第几个学生的信息:\n");
 69                 scanf("%d",&n);
 70 
 71                 if (n>=0 && n<N)
 72                     Output(stu+n-1);
 73                 else
 74                     printf("没有这名学生!请重新输入!");
 75 
 76                 Ask();
 77                 break;
 78 
 79             }
 80         case 3:{
 81                 getchar();
 82                 Save(stu);
 83                 printf("文件保存成功!\n");
 84                 Ask();
 85                 break;
 86         }
 87         case 4:
 88             {
 89                 printf("请输入读入的文件名:");
 90                 scanf("%s",filename);
 91                 printf("请输入要提取信息的位置号:");
 92                 scanf(" %d",&j);
 93                 if (j>=0 && j<=N)
 94                 {
 95                     if ( Fetch(stu,j,filename)==0)
 96                     printf("提取失败!\n");
 97                 }
 98 
 99                 Ask();
100                 break;
101 
102             }
103         case 5:
104             {
105                 printf("请输入想求最高分的科目代号(1,2,3),总成绩代号:4:\n");
106                 scanf("%d",&m);
107                 Max(p,m);
108                 Ask();
109                 break;
110             }
111 
112         case 6:/*6*/
113             {
114                 getchar();
115                 printf("对某专业的学生,按总平均成绩由低到高排序结果为:\n");
116                 sort_select(stu);
117                 Ask();
118                 break;
119 
120             }
121 
122         case 7:
123             {
124                 Sort_Buble(stu);
125                 Ask();
126                 break;
127 
128             }
129         case 8:
130             {
131                 Sort_insert(stu);
132                 Ask();
133                 break;
134 
135             }
136         case 9:
137             {
138                 getchar();
139                 Search(stu);
140                 Ask();
141                 break;
142             }
143         default:
144             {
145                 break;
146 
147             }
148         }
149     if((choose<1)||(choose>10))
150         break;
151     }   
152 }
153 
154 void Input(STU *p)
155 {
156     int j;
157     printf("请输入学生的学号:\n");
158     scanf("%d",&p->num);
159     getchar();
160     printf("请输入学生的姓名 \n");
161     gets(p->name);
162     printf("请输入学生的专业 软件工程:soft/网络工程:net/计算机科学与技术:computer \n");
163     gets(p->major);
164     printf("请输入学生的班级 1班/2班,:\n");
165     scanf("%d",&p->classNo);
166     getchar();
167     printf("请分别按顺序输入学生的三门成绩:高数/英语/物理 \n");
168     for(j=0;j<3;j++)
169     {
170         printf("请输入第%d门成绩 :\n",j+1);
171         scanf("%d",&p->score[j]);
172         getchar();
173     }
174     p->score[3]=p->score[0]+p->score[1]+p->score[2];
175 }
176 
177 void Output(STU *p)
178 {
179 
180     printf("学号:%d\t| 姓名%s\t| 专业:%s\t| 班级:%d\t| 高数成绩:%d\t| 英语成绩:%d\t| 物理成绩:%d\n",p->num,p->name,p->major,p->classNo,p->score[0],p->score[1],p->score[2]);
181 
182 
183 
184 }
185 double average_person(STU *p){//此函数将会被求平均成绩的函数调用
186 
187     return(((p->score[0])+(p->score[1])+(p->score[2]))/3.0);
188 
189 }
190 
191 void Save(STU *p)
192 {
193     FILE *fp;
194     char filename[20];
195     int i;
196     printf("请输入要保存的文件名称:\n");
197     gets(filename);
198     if((fp=fopen(filename,"wb"))==NULL)
199     {
200         printf("新建文件失败 请重试请重新输入\n");
201         return;
202     }
203     for(i=0;i<N;i++)
204     {
205         if(fwrite(p++,sizeof(STU),1,fp)!=1)
206             printf("文件写入失败 请重新输入\n");
207     }
208     fclose(fp);
209 }
210 
211 
212 int Fetch(STU *p,int n,char *filename)
213 {
214     FILE *fp;
215     if((fp=fopen(filename,"rb"))==NULL)
216     {
217         fclose(fp);
218         return 0;
219     }
220     fseek(fp,(long)sizeof(STU)*n,0);//将位置指针从文件的开始往后移n个STU结构体的长度,n是提取的位置。
221     if ( (fread(p,sizeof(STU),1,fp)) != 1)
222     {
223         printf("文件录入失败 请重新输入:");
224         fclose(fp);
225         return 0;
226     }
227     Output(p);
228     fclose(fp);
229     return 1;
230 }
231 
232 
233 
234 void Max(STU stu[],int m)
235 {
236 
237     int i,index;
238     int y[N];
239     STU *p;
240     p=stu;
241     for(i=1;i<=N;i++)//定义一个长度为N的数组,作为下标。
242         y[i-1]=i-1;
243 
244     switch(m)
245     {
246 
247         case 1:
248         {
249         for(i=1;i<N;i++)
250         if((p+y[0])->score[0]<(p+y[i])->score[0])//让最高分的同学放到第一名的位置上来。
251         {
252             index=y[0];
253             y[0]=y[i];
254             y[i]=index;
255         }
256         p=p+y[0];
257         printf("\t第1门最高分为:");
258         printf("%d\n",p->score[0]);
259         printf("\t得最高分的同学名字是:");
260         puts(p->name);
261         break;
262         }
263         case 2:
264         {
265         for(i=1;i<N;i++)
266         if((p+y[0])->score[1]<(p+y[i])->score[1])
267         {
268             index=y[0];
269             y[0]=y[i];
270             y[i]=index;
271         }
272         p=p+y[0];
273         printf("\t第2门最高分为:");
274         printf("%d\n",p->score[1]);
275         printf("\t得最高分的同学名字是:");
276         puts(p->name);
277         break;
278         }
279         case 3:
280         {
281         for(i=1;i<N;i++)
282         if((p+y[0])->score[2]<(p+y[i])->score[2])
283         {
284             index=y[0];
285             y[0]=y[i];
286             y[i]=index;
287         }
288         p=p+y[0];
289         printf("\t第3门最高分为:");
290         printf("%d\n",p->score[2]);
291         printf("\t得最高分的同学名字是:");
292         puts(p->name);
293         break;
294         }
295         case 4:
296         {
297         for(i=1;i<N;i++)
298         if((p+y[0])->score[3]<(p+y[i])->score[3])
299             {
300             index=y[0];
301             y[0]=y[i];
302             y[i]=index;
303         }
304         p=p+y[0];
305         printf("\t总成绩最高分为:");
306         printf("%d\n",p->score[3]);
307         printf("\t得最高分的同学名字是:");
308         puts(p->name);
309         break;
310         }
311         default:
312         break;
313     }
314 
315 }
316 
317 //对某专业学生,按总平均成绩由低到高进行简单选择排序。
318 void sort_select(STU *p)/*6*/  //STU是学生结构体,stu是学生结构体数组
319 {
320     int i,j,k;
321     char b[15];
322     double t,aver[N];
323     STU a;
324     printf("请选择一个专业(请输入已经录入的专业名称):\n");
325     gets(b);
326     for(i=0;i<N;i++)
327     {
328         aver[i]=average_person(p+i);
329             //((*(p+i)).score[0]+(p+i)->score[1]+(p+i)->score[2])/3.0;
330     }
331     for(i=0;i<N-1;i++)
332     {
333        k=i;       //确定要比较的数,先选择第一个数进行比较。
334        for(j=i+1;j<N;j++)
335           if(aver[k]>aver[j])
336             k=j;  //记下位置,继续让大的数和下一位进行比较。
337             t=aver[i];
338             aver[i]=aver[k];
339             aver[k]=t;//交换,把大的数向后移一位;如果if为假,k=i,相当于不进行交换。
340 
341             a=*(p+i);*(p+i)=*(p+k);*(p+k)=a;//利用结构体指针变量交换结构体
342     }
343     for(i=0;i<N;i++){
344         if(strcmp((p+i)->major,b)==0){
345             printf("专业:%s\t班级:%d\t姓名:%s\t平均成绩:%5.3f\n",(p+i)->major,(p+i)->classNo,(p+i)->name,aver[i]);
346         }
347     }
348 }
349 
350 
351 //对某个班级的学生,按总平均成绩由高到低进行起泡排序。
352 void Sort_Buble(STU *p)/*7*/
353 {
354    int i,j,b;
355    double t,aver[N];
356    STU a;
357    printf("选择一个班级(请输入已经创建的班级):\n");
358    scanf("%d",&b);
359    for(i=0;i<N;i++)
360    {
361         aver[i]=average_person(p+i);
362    }
363 
364    for(i=0;i<N;i++)
365     for(j=0;j<N-1-i;j++)
366         if(aver[j]<aver[j+1])//前面的数比后面的数小的话就交换,直到把最小的数放到最后。
367         {
368             t=aver[j];
369             aver[j]=aver[j+1];
370             aver[j+1]=t;
371             a=*(p+j);
372             *(p+j)=*(p+j+1);
373             *(p+j+1)=a;
374         }
375     for(i=0;i<N;i++)
376     if((p+i)->classNo==b){
377         printf("姓名:%s\t平均分=%5.3f\n",(p+i)->name,aver[i]);
378     }
379 }
380 
381 //对某个班级的学生,按某门课程成绩由低到高进行直接插入排序
382 void Sort_insert(STU *p)/*8*/
383 {
384     int i,j,id,q,tem;
385     int score[N];
386     char b[10];
387     int k=0; //用于计算学生数
388     STU pai[N];
389     STU *m;
390     STU stude[N];
391     getchar(); //吃掉回车键,避免给b赋值
392     printf ("请输入需要查看成绩的班级(请输入已经录入的专业):");
393     gets(b);
394     printf ("请输入需要查看成绩的班级(请输入已经录入的班级):");
395     scanf ("%d",&q);
396     printf ("请输入需要查看分数的课程(1,2,3)\n");
397     scanf ("%d",&id);
398     getchar();
399     for(i=0;i<N;i++,p++){
400         if(strcmp(p->major,b)==0&&p->classNo==q){//找到某个班级的所有同学,并把它们提取出来
401             stude[k]=*p;
402             k++;
403         }
404     }
405     pai[0]=stude[0];
406     for(i=1;i<k;i++){
407         for(j=i;j>=0&&stude[i].score[id-1]>pai[j].score[id-1];j--)
408             pai[j+1]=pai[j];
409             pai[j+1]=stude[i];
410 
411     }
412     for(i=0;i<k;i++,m++){
413         Output(m);
414         printf("\n");
415     }
416 
417    /* for (i=0; i<N; i++,p++)
418     {
419         if(strcmp(p->major,b)==0&&p->classNo==q)
420         {  
421             score[k]=p->score[id-1];
422             k++;  //计算所选出的学生数
423 
424         }
425     }
426 
427     for (i=1; i<k; i++)
428         if (score[i-1]>score[i])
429         {
430             struct Student tmp;
431             tem=score[i];//等于小的那个数字
432             j=i-1;//记录大的数的位置
433             do
434             {
435                 score[j+1]=score[j];//把大的数赋值给小的数,相当于把大的数字向后推了一位,但是原位置的数字不动
436                 j--;
437             }
438             while (j>=0&&tem<score[j]);  //把tem和较大的数的前一位比较,如果比它小,就让大的数在往后推一个
439             score[j+1]=tem;              //把tem插入到j和j+1之间的位置。
440         }
441 
442     printf ("对该班级的学生,按第%d科成绩由低到高进行直接插入排序为:\n",id);
443     for (i=0; i<k; i++)
444     {
445          p=m;
446         for (j=0; j<N; j++,p++)
447         {
448 
449             if (strcmp(p->major,b)==0 && (p->score[id]==score[i]) && (p->classNo==q))//并且该学生成绩的这门成绩等于成绩数组的第i个数字
450             {
451                 Output(p);
452                 printf("\n");
453             }
454         }
455     }
456 }
457 */
458 }
459 
460 //班级和成绩的综合查找
461 void Search(STU *head)
462 {
463     STU *p;
464     int b,k,sum_scores;
465     int limit_score; 
466     k=0 ;             // 如果输入班级或总成绩有误,k的值不变。与后面的if相关联。
467     printf ("请输入该学生的班级号 \n");
468     scanf ("%d",&b);
469     getchar();
470     printf ("请输入总成绩>=**的学生(**为分数)\n");
471     scanf ("%d",&limit_score);
472     printf ("  \t\t\t\t%d班总成绩>=%d的学生信息为:\t\t\t\t  \n",b,limit_score);
473     for (p=head;p<head+N;p++)
474     {
475         sum_scores=(p->score[0])+(p->score[1])+(p->score[2]);
476         if((p->classNo)==b)
477         {
478             if (sum_scores >= limit_score)   //满足班级号和成绩界限的才可以输出,不然k=0;
479             {
480                 printf ("该学生信息为:\n");
481                 Output(p);
482                 printf("\n");
483                 k++;
484             }
485         }
486     }
487     if (k==0)       //此条件是该班级没有符合条件的同学
488         printf ("查找的学生信息不存在:\n");
489 }
490 
491 
492 void Ask()
493 {
494     int c;
495     printf("\n已实现所选功能 输出编号进行下一步操作:\n\n  1: 继续选择其他功能  2: 不再选择直接退出系统\n");
496     scanf("%d",&c);
497     if (c==2)
498     exit(0);
499 }

 

推荐阅读