1. 程式人生 > >學員成績管理系統

學員成績管理系統

rdquo 信息 head display n) main函數 保持 調用 移動

學員成績管理
問題描述
?用C語言編寫一個程序實現學員成績管理,每個學員包括3門課的成績,從鍵盤輸入學員信息,包括學號、姓名、三門課成績,計算出學員的平均成績,按照學員平均成績由大到小排序
?插入功能:在排序後的學員成績表中插入一個學員的信息,要求插入後仍然保持成績表有序
?刪除功能:要求輸入指定的學號,從學員信息表中刪除該學員,刪除後的成績表保持有序
問題分析
?使用結構保存每個學員的信息,包括學號、姓名、三門課的成績、平均成績;
?使用結構數組保存所有學員的信息;
?需要實現以下函數:
?單個學員信息的錄入;
?顯示學員信息;
?排序;(按照平均成績由大到小)
?插入;(插入後保持有序)
?刪除;(刪除後保持有序)

?在主函數中調用以上函數,分別完成錄入、排序、插入和刪除功能,並顯示排序前後的學員信息,以及插入刪除後的學員信息
難點分析-1
?學員信息用結構表示,包括學號、姓名、三門課成績,平均成績
struct student
{
int no; //學號
char name[15]; //姓名
int score[3]; //三門課程的成績
double avr; //平均成績
};
?信息保存在一個結構數組中,由於學員人數<50,所以結構數組的大小定義為50 struct student stu[50];
難點分析-2
?單個學員信息的錄入函數
?函數的原型:struct student input();
?錄入的同時,計算平均成績,並保存在平均成績字段中;
?在主函數中調用“單個學員信息錄入”函數
?使用循環完成信息錄入功能,由於不確定學員的數量(<50),所以建議使用while循環;
?要求根據用戶的輸入決定是否繼續。比如:
輸出:“是否繼續? (y or n)”,如果輸入y或者Y則繼續錄入,否則結束錄入;
?錄入的同時,記錄錄入學員信息的數量;
難點分析-3
?編寫顯示學員信息的函數
?由於需要多次顯示學員信息,所以將顯示學員信息的功能編寫為函數;
?考慮函數的參數及返回值;
?通過循環依次輸出學員信息;
?註意控制輸出的格式,使得輸出的信息整齊;
階段劃分
?第一階段:實現學員信息錄入
?第二階段:實現排序功能
?第三階段:實現插入和刪除功能
?第四階段:相互討論總結
第一階段
?第一階段:實現學員信息錄入
?定義結構和結構數組;
?編寫“單個學員信息錄入”函數;
?編寫“顯示學員信息”函數,完成學員信息顯示功能;
?在main函數中通過調用“單個學員信息錄入”函數,完成所有學員信息的錄入,調用“顯示學員信息”函數,顯示錄入後的學員信息;
?要求學員自己動手編碼,在編碼的過程中解答學員提出的問題
第二階段
?第二階段:實現排序功能
?考慮函數的參數及返回值,使用冒泡排序算法;
?在主函數中調用排序函數,並輸出排序後的學員信息
?要求學員自己動手編碼,在編碼的過程中解答學員提出的問題
第三階段
?第三階段:實現插入和刪除功能
?編寫插入函數
?考慮函數參數及返回值,調用“單個學員信息錄入”函數錄入要插入的學員信息;
?按照平均成績的大小插入到學員信息數組中(找到合適的位置,先移動、再插入);
?編寫刪除函數
?考慮函數參數及返回值,要求用戶輸入要刪除的學員的學號;
?在學員信息數組中找到該學員,然後將後面元素前移達到刪除該學員信息的目的;
?在主函數中調用插入和刪除函數
第四階段
相互討論總結
總結
?本次項目案例完成了一個學員成績管理的功能:包括錄入、顯示、排序、插入和刪除
?鞏固的知識點:
?結構;
?結構數組;
?不帶參函數和帶參函數,以及有返回值和沒有返回值的情況;

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 int stu_count;///統計學生信息的數量
  4 struct student
  5 {
  6     int no;//學號
  7     char name[15];//姓名
  8     int score[3];//三科成績
  9     double avr;//平均成績
 10 } stu[100];
 11 void load()
 12 {
 13 
 14     printf("****************************************\n");
 15     printf("********歡迎使用學員成績管理系統********\n");
 16     printf("********本程序由計科171王愷鋒原創*******\n");
 17     printf("****************************************\n");
 18 }
 19 
 20 struct student input()///單個學員信息錄入
 21 {
 22     int i;
 23     float sum;
 24     printf("請輸入學號:\n");
 25     scanf("%d",&stu[stu_count].no);
 26     getchar();
 27     printf("請輸入姓名:\n");
 28     gets(stu[stu_count].name);
 29     printf("請輸入三門成績:\n");
 30     sum=0;
 31     for(i=0; i<3; i++)
 32     {
 33         printf("成績%d:\n",i+1);
 34         scanf("%d",&stu[stu_count].score[i]);
 35         sum=sum+stu[stu_count].score[i];
 36     }
 37     stu[stu_count].avr=sum/3.0;
 38     return stu[stu_count];
 39 };
 40 void display(struct student stu[])//顯示學員信息
 41 {
 42 
 43     int i;
 44     for(i=0; i<stu_count; i++)
 45     {
 46         printf("學號: %d\n",stu[i].no);
 47         printf("姓名: %s\n",stu[i].name);
 48         printf("成績1: %d 成績2: %d 成績3: %d \n",stu[i].score[0],stu[i].score[1],stu[i].score[2]);
 49         printf("平均成績: %.2f\n",stu[i].avr);
 50     }
 51 }
 52 void my_sort(struct student stu[])///冒泡排序
 53 {
 54 
 55     int i,j;
 56     struct student t;
 57     for(i=0; i<stu_count; i++)
 58     {
 59         for(j=0; j<stu_count-1-i; j++)
 60         {
 61             if(stu[j].avr<stu[j+1].avr)
 62             {
 63                 t=stu[j];
 64                 stu[j]=stu[j+1];
 65                 stu[j+1]=t;
 66             }
 67         }
 68     }
 69 }
 70 void my_insert(struct student stu[])//插入學員信息
 71 {
 72     int i,j;
 73     struct student t;
 74     printf("請輸入要插入的學員信息:\n");
 75     t=input();
 76     for(i=0; i<stu_count; i++)
 77     {
 78         if(stu[i].avr>t.avr)
 79         {
 80             break;
 81         }
 82     }
 83     for(j=stu_count; j>i; j--)
 84     {
 85         stu[j]=stu[j-1];
 86     }
 87     stu[i]=t;
 88     stu_count++;
 89 }
 90 void my_delete(struct student stu[])//刪除學員信息
 91 {
 92     int i,j;
 93     int x;
 94     printf("請輸入要刪除的學號:\n");
 95     scanf("%d",&x);
 96     for(i=0; i<stu_count; i++)
 97     {
 98         if(stu[i].no==x)
 99             break;
100     }
101     for(j=i; j<stu_count; j++) ///移動後面的數據
102     {
103         stu[j]=stu[j+1];
104     }
105     stu_count--;
106 }
107 int main()
108 {
109     char c;
110     load();
111     stu_count=0;//初始化為0
112     printf("請輸入學員信息:\n");
113     stu[stu_count]=input();
114     stu_count++;
115     while(1)
116     {
117         printf("是否繼續?(y or n)\n");
118         scanf(" %c",&c);
119         if(c==y||c==Y)
120         {
121             stu[stu_count]=input();
122             stu_count++;
123         }
124         else if(c==n||c==N)
125         {
126             break;
127         }
128     }
129     printf("按學員平均成績降序排列:\n");
130     my_sort(stu);
131     display(stu);
132     printf("是否插入新成員?(y or n)\n");
133     scanf(" %c",&c);
134     if(c==y||c==Y)
135     {
136         my_insert(stu);
137         printf("插入新學員後的信息如下:\n");
138         my_sort(stu);
139         display(stu);
140     }
141     printf("是否刪除某一成員?(y or n)\n");
142     scanf(" %c",&c);
143     if(c==y||c==Y)
144     {
145         my_delete(stu);
146         printf("刪除某一學員後的信息如下:\n");
147         my_sort(stu);
148         display(stu);
149     }
150     return 0;
151 }

使用鏈表改寫程序

  1 #include <stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 using namespace std;
  5 struct student///學生信息存儲結構
  6 {
  7     int no;                              //學號
  8     char name[15];                            //姓名
  9     int score[3];                             //成績
 10     double avr;                            //平均分
 11     struct student *next;
 12 };
 13 void load()
 14 {
 15     printf("****************************************\n");
 16     printf("********歡迎使用學員成績管理系統********\n");
 17     printf("********本程序由計科171王愷鋒原創*******\n");
 18     printf("****************************************\n");
 19 }
 20 struct student *Create(student *head)///創建鏈表
 21 {
 22     student *p,*q;;
 23     head=(student *)malloc(sizeof(student));
 24     head->next=NULL;
 25     q=head;
 26     p=(student*)malloc(sizeof(student));
 27     printf("請輸入學號:");
 28     scanf("%d",&p->no);
 29     getchar();
 30     printf("請輸入姓名:");
 31     scanf("%s",p->name);
 32     printf("請輸入成績1:");
 33     scanf("%d",&p->score[0]);
 34     printf("請輸入成績2:");
 35     scanf("%d",&p->score[1]);
 36     printf("請輸入成績3:");
 37     scanf("%d",&p->score[2]);
 38     p->avr=(p->score[0]+p->score[1]+p->score[2])/3.0;
 39     q->next=p;
 40     q=p;
 41     q->next=NULL;
 42     return head;
 43 }
 44 struct student *Append(student *head)///在鏈表中追加記錄
 45 {
 46     student *p,*q=head,*t;
 47     p=(student*)malloc(sizeof(student));
 48     printf("請輸入學號:");
 49     scanf("%d",&p->no);
 50     getchar();
 51     printf("請輸入姓名:");
 52     scanf("%s",p->name);
 53     printf("請輸入成績1:");
 54     scanf("%d",&p->score[0]);
 55     printf("請輸入成績2:");
 56     scanf("%d",&p->score[1]);
 57     printf("請輸入成績3:");
 58     scanf("%d",&p->score[2]);
 59     p->avr=(p->score[0]+p->score[1]+p->score[2])/3.0;
 60     /*p->order=0;*/
 61     while(q)
 62     {
 63         t=q;
 64         q=q->next;
 65     }
 66     t->next=p;
 67     t=p;
 68     t->next=NULL;
 69     return head;
 70 }
 71 void Print(student *head)///打印記錄中的信息
 72 {
 73     student *p=head;
 74     while(p->next)
 75     {
 76         p=p->next;
 77         printf("學號: %d\n",p->no);
 78         printf("姓名: %s\n",p->name);
 79         printf("成績1: %d 成績2: %d 成績3: %d \n",p->score[0],p->score[1],p->score[2]);
 80         printf("平均成績: %.2f\n",p->avr);
 81     }
 82 }
 83 
 84 struct student *Del(student *head) ///刪除記錄
 85 {
 86     int  number;
 87     student *p=head,*q;
 88     printf("輸入要刪除的學生學號:");
 89     scanf("%d",&number);
 90     while(p->next&&number!=p->no)
 91     {
 92         q=p;
 93         p=p->next;
 94     }
 95     q->next=p->next;
 96     return head;
 97 }
 98 
 99 
100 struct student *Sort(student *head)///根據平均分對記錄進行排序
101 {
102     int i=1;
103     student *q, *s, *pre,*p,*a;
104     p=head->next;
105     q=p->next;
106     p->next=NULL;
107     while(q)
108     {
109         s=q;
110         q=q->next;
111         pre=head;
112         p=head->next;
113         while(p!=NULL && p->avr > s->avr)
114         {
115             pre=p;
116             p=p->next;
117         }
118         s->next=p;
119         pre->next=s;
120     }
121     a=head->next;
122     while(a)
123     {
124         /*a->order=i++;*/
125         a=a->next;
126     }
127     return head;
128 }
129 int main()
130 {
131     char c;
132     student *head=NULL;
133     load();
134     printf("請輸入學員信息:\n");
135     head=Create(head);///輸入第一條信息並創建鏈表
136     while(1)
137     {
138         printf("是否繼續?(y or n)\n");
139         scanf(" %c",&c);
140         if(c==y||c==Y)
141         {
142             head=Append(head);///追加信息
143         }
144         else if(c==n||c==N)
145         {
146             break;
147         }
148     }
149     printf("按學員平均成績降序排列:\n");
150     head=Sort(head);
151     Print(head);
152     printf("是否插入新成員?(y or n)\n");
153     scanf(" %c",&c);
154     if(c==y||c==Y)
155     {
156         printf("請輸入要增加的學生信息:\n");
157         head=Append(head);///追加信息
158         printf("插入新學員後的信息如下:\n");
159         head=Sort(head);
160         Print(head);
161     }
162     printf("是否刪除某一成員?(y or n)\n");
163     scanf(" %c",&c);
164     if(c==y||c==Y)
165     {
166         head=Del(head);
167         printf("刪除某一學員後的信息如下:\n");
168         head=Sort(head);
169         Print(head);
170     }
171     return 0;
172 }

學員成績管理系統