原理
在一個班級學生成績管理系統中,希望處理每個學生的學習情況資訊,其中包括學生的學號、姓名、各科名稱和成績等
并能使管理人員通過界面完成對學生資訊的錄入及對學生資訊的錄入及對資料的查找、瀏覽、插入、排序、保存,
要求:
1、提供用戶界面
2、每一條記錄包括一個學生的學號、姓名、三門課成績、平均成績
3、輸入功能:可以一次完成若干條記錄的輸入
4、顯示功能:完成全部學生記錄的顯示
5、查找功能:完成按姓名查找學生記錄,并顯示
6、排序功能:按學生平均成績進行排序
7、插入功能:按平均成績高低插入一條學生記錄
8、將學生記錄存在檔案score中
主要資料結構
struct student { char No[10]; //學號 char name[20]; //姓名 int subject1; //成績 int subject2; int subject3; float average; //平均成績 };
演算法分析
代碼開始時定義學生管理系統所需要用到的函式,如輸入、查找、排序、輸出、插入等,然后逐個定義所需函式,輸入函式利用回圈逐個輸入學生資訊,查找函式利用if陳述句和回圈進行查找,排序函式利用選擇法排序將學生按平均成績進行從小到大排序,輸出函式利用檔案把學生資訊保存到檔案中去,顯示選單函式利用system(“cls”)進行清屏然后顯示選單,
測驗結果



原始碼
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #define N 1000 5 struct student 6 { 7 char No[10]; //學號 8 char name[20]; //姓名 9 int subject1; //成績 10 int subject2; 11 int subject3; 12 float average; //平均成績 13 }; 14 int p=1;//判斷是否有資料 15 int n=0; 16 struct student *stu=NULL; 17 void menu(); //選單 18 void input(); //輸入學生資訊 19 void sort(); 20 void fileoutput(); //輸出學生資訊 21 void find(); 22 void show(); 23 void insert(); 24 void fileinput(); 25 int main() 26 { 27 fileinput();//從檔案讀取資料 28 int flag; 29 int first=0; 30 if(p==0) 31 { 32 printf("首先請輸入學生人數\n"); 33 scanf("%d",&n); 34 } 35 if(p==0) 36 printf("\n初次選擇,輸入請選擇 0:"); 37 else 38 printf("已有資料,請選擇其他操作,若要重新輸入,請選擇 0:"); 39 while(1) 40 { 41 menu(); 42 if(first==1) 43 printf("\n請繼續選擇操作的序號:"); 44 else 45 first++; 46 scanf("%d",&flag); 47 if(flag ==-1) 48 break; 49 switch(flag) 50 { 51 case 0:input();break;//輸入n個學生成績 52 case 1:find();break;//輸入學生姓名查找 53 case 2:sort();break;//將學生成績從小到大排序 54 case 3:show();break;//顯示所有學生成績 55 case 4:insert();break;//按平均成績高低插入一條學生記錄 56 case 5:system("cls");break;//調出選單 57 default:printf("本次選擇不成功!\n"); 58 } 59 } 60 fileoutput();//將所有學生成績保存到score檔案中 61 } 62 void menu()//選單 63 { 64 printf("\n"); 65 printf(" 學生管理系統 \n"); 66 printf("***************************************************\n"); 67 printf("* 請選擇操作的序號,如果輸入-1,程式結束 *\n"); 68 printf("* *\n"); 69 printf("* 0 輸入n個學生資訊 1 輸入學生姓名查找 *\n"); 70 printf("* *\n"); 71 printf("* 2 將學生成績從小到大排序 3 顯示所有學生成績 *\n"); 72 printf("* *\n"); 73 printf("* 4 插入一條學生記錄 5 顯示選單 *\n"); 74 printf("* *\n"); 75 printf("***************************************************\n"); 76 } 77 void input()//輸入n個學生成績 78 { 79 system("cls"); //清屏 80 int i,num=1; 81 char a[10]; 82 stu = (struct student*)malloc(sizeof(struct student)*n); 83 for(i=0;i<n;i++) 84 { 85 printf("請輸入第%d個學生的資訊:\n",num); 86 num++; 87 gets(a);//防止回車鍵占用學號位置; 88 printf("學號:"); 89 gets(stu[i].No); 90 printf("姓名:"); 91 gets(stu[i].name); 92 printf("三科成績:\n"); 93 scanf("%d%d%d",&stu[i].subject1,&stu[i].subject2,&stu[i].subject3); 94 stu[i].average=stu[i].subject1+stu[i].subject2+stu[i].subject3; 95 stu[i].average=stu[i].average/3; 96 } 97 printf("一共%d個學生資訊輸入完畢\n",n); 98 } 99 void find()//輸入學生姓名查找并輸出該學生資訊 100 { 101 system("cls"); //清屏 102 printf("請輸入要查找的學生姓名:"); 103 char a[10]; 104 gets(a);//防止回車鍵占用學號位置; 105 char name[20]; 106 gets(name); 107 int i,j=1001; 108 for(i=0;i<n;i++) 109 { 110 if((strcmp(name,stu[i].name))==0) 111 j=i; 112 } 113 if(j==1001) 114 printf("沒有此學生!\n"); 115 else 116 { 117 printf("成功已找到此姓名的學生\n"); 118 printf("學號:"); 119 puts(stu[j].No); 120 printf("姓名:"); 121 puts(stu[j].name); 122 printf("三科成績:%d %d %d\n平均成績:%.2f\n",stu[j].subject1,stu[j].subject2,stu[j].subject3,stu[j].average); 123 } 124 } 125 void sort()//將學生成績從小到大排序 126 { 127 system("cls"); //清屏 128 struct student t; 129 int min; 130 int i,j,num; 131 for(j=0;j<n;j++) 132 { 133 min=stu[j].average; 134 num=j; 135 for(i=j;i<n;i++) 136 { 137 if(stu[i].average<min) 138 { 139 num=i; 140 min=stu[i].average; 141 } 142 } 143 t=stu[j]; 144 stu[j]=stu[num]; 145 stu[num]=t; 146 } 147 show(); 148 printf("已按照平均成績從低到高排序完畢!\n"); 149 } 150 void fileoutput()//將所有學生成績輸出到score檔案中 151 { 152 system("cls"); //清屏 153 char filename[]={"score.txt"}; 154 FILE *in; 155 if((in=fopen(filename,"w"))==NULL) 156 printf("無法打開此檔案\n"); 157 else 158 { 159 int i; 160 fprintf(in,"%d\n",n); 161 for(i=0;i<n;i++) 162 fwrite(&stu[i],sizeof(struct student),1,in); 163 fclose(in); 164 printf("已成功將學生記錄保存于score檔案中\n"); 165 } 166 free(stu); 167 stu = NULL; 168 } 169 void show()//顯示所有學生成績 170 { 171 system("cls"); //清屏 172 printf("以下是所有學生資訊:\n"); 173 int i; 174 for(i=0;i<n;i++) 175 { 176 printf("學號:"); 177 puts(stu[i].No); 178 printf("姓名:"); 179 puts(stu[i].name); 180 printf("三科成績:%d %d %d\n平均成績:%.2f\n",stu[i].subject1,stu[i].subject2,stu[i].subject3,stu[i].average); 181 printf("\n"); 182 } 183 } 184 void insert()//按平均成績高低插入一條學生記錄 185 { 186 system("cls"); //清屏 187 struct student *newbase = (struct student *)realloc(stu,sizeof(struct student)*(n+1)); 188 stu = newbase; 189 190 int *m=&n; 191 printf("請輸入要插入的學生的資訊:\n"); 192 struct student stu1; 193 char a[10]; 194 gets(a);//防止回車鍵占用學號位置; 195 printf("學號:"); 196 gets(stu1.No); 197 printf("姓名:"); 198 gets(stu1.name); 199 printf("三科成績:\n"); 200 scanf("%d%d%d",&stu1.subject1,&stu1.subject2,&stu1.subject3); 201 stu1.average=stu1.subject1+stu1.subject2+stu1.subject3; 202 stu1.average=stu1.average/3; 203 int num; 204 int i; 205 for(i=1;1;i++) 206 { 207 if(stu1.average<stu[0].average) 208 { 209 num=0; 210 break; 211 } 212 else if(stu1.average>stu[*m-1].average) 213 { 214 num=*m; 215 break; 216 } 217 else if(stu[i-1].average<stu1.average&&stu1.average<stu[i].average) 218 { 219 num=i; 220 break; 221 } 222 } 223 struct student t; 224 for(i=*m-1;i>=num;i=i-1)//將num后的向后平移一個 225 { 226 stu[i+1]=stu[i]; 227 } 228 stu[i+1]=stu1; 229 *m=*m+1; 230 231 show(); 232 printf("已成功插入該學生的資訊\n"); 233 } 234 void fileinput()//從檔案中讀取資料 235 { 236 system("cls"); //清屏 237 char filename[]={"score.txt"}; 238 FILE *in; 239 if((in=fopen(filename,"r"))==NULL) 240 { 241 printf("無法讀取資料\n"); 242 p=0; 243 } 244 else 245 { 246 fscanf(in,"%d\n",&n); 247 stu = (struct student*)malloc(sizeof(struct student)*n); 248 int i; 249 for(i=0;i<n;i++) 250 fread(&stu[i],sizeof(struct student),1,in); 251 fclose(in); 252 printf("已成功從score檔案中將學生記錄讀取\n"); 253 } 254 }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/285690.html
標籤:其他
上一篇:經典實驗--檢驗“哥德巴赫”猜想
下一篇:檢驗“哥德巴赫”猜想
