學員成績管理系統
阿新 • • 發佈:2018-07-06
rdquo 信息 head display n) main函數 保持 調用 移動 ?在主函數中調用以上函數,分別完成錄入、排序、插入和刪除功能,並顯示排序前後的學員信息,以及插入刪除後的學員信息
難點分析-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函數中通過調用“單個學員信息錄入”函數,完成所有學員信息的錄入,調用“顯示學員信息”函數,顯示錄入後的學員信息;
?要求學員自己動手編碼,在編碼的過程中解答學員提出的問題
第二階段
?第二階段:實現排序功能
?考慮函數的參數及返回值,使用冒泡排序算法;
?在主函數中調用排序函數,並輸出排序後的學員信息
?要求學員自己動手編碼,在編碼的過程中解答學員提出的問題
第三階段
?第三階段:實現插入和刪除功能
?編寫插入函數
?考慮函數參數及返回值,調用“單個學員信息錄入”函數錄入要插入的學員信息;
?按照平均成績的大小插入到學員信息數組中(找到合適的位置,先移動、再插入);
?編寫刪除函數
?考慮函數參數及返回值,要求用戶輸入要刪除的學員的學號;
?在學員信息數組中找到該學員,然後將後面元素前移達到刪除該學員信息的目的;
?在主函數中調用插入和刪除函數
第四階段
相互討論總結
總結
?本次項目案例完成了一個學員成績管理的功能:包括錄入、顯示、排序、插入和刪除
?鞏固的知識點:
?結構;
?結構數組;
?不帶參函數和帶參函數,以及有返回值和沒有返回值的情況;
學員成績管理
問題描述
?用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 }
學員成績管理系統