基於鏈表的學生管理系統【C語言版】

  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 }
相關文章
相關標籤/搜索