·一、實驗目的
實驗目的:數組,結構體,指針,文件,動態分配內存等知識的綜合應用
·二、實驗原理
在一個班級學生成績管理系統中,希望處理每個學生的學習情況信息,其中包括學生的學號、姓名、各科名稱和成績等並能使管理人員通過界面完成對學生信息的錄入及對學生信息的錄入及對數據的查找、瀏覽、插入、排序、保存。
要求:
1、提供用戶界面
2、每一條記錄包括一個學生的學號、姓名、三門課成績、平均成績
3、輸入功能:可以一次完成若干條記錄的輸入
4、顯示功能:完成全部學生記錄的顯示
5、查找功能:完成按姓名查找學生記錄,並顯示
6、排序功能:按學生平均成績進行排序
7、插入功能:按平均成績高低插入一條學生記錄
8、將學生記錄存在文件score中
·三、主要數據結構
1、數據結構的設計(寫出構造的數據類型,即自己定義的結構體)
struct student
{
char No[10];
char name[20];
int subject1;
int subject2;
int subject3;
float average;
};
2、算法分析(寫出所定義的函數的原型及函數的功能,寫出每個函數功能的實現過程或者畫出流程圖)
·四、實驗結果及分析
1、測試結果截圖
·五、心得體會
首先要先弄清楚目的需求,需要實現什么,然后再去設計思路,經需要什么功能,之后在縷順思路,編寫代碼,設計界面,最后進行試驗測試。
對實驗不能糊弄,努力把代碼摩納哥清楚,不能模棱兩可。
··六、源文件
(1)主函數
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 1000 struct student //結構體設計 { char No[10]; char name[20]; int subject1; int subject2; int subject3; float average; }; int p=1;//判斷是否有數據 int n=0; struct student *stu=NULL;// void menu(); void input(); void sort(); void fileoutput(); void find(); void show(); void insert(); void fileinput(); int main() { fileinput();//從文件讀取數據 int flag; int first=0; menu(); if(p==0) { printf("首先請輸入學生人數,最多人數為1000位!\n"); scanf("%d",&n); } if(p==0) printf("\n初次選擇,輸入請選擇 0:"); else printf("已有數據,請選擇其他操作,若要重新輸入,請選擇 0:"); while(1) { if(first==1) printf("\n請繼續選擇操作的序號:"); else first++; scanf("%d",&flag); if(flag ==-1) break; switch(flag) { case 0:input();break;//輸入n個學生成績 case 1:find();break;//輸入學生姓名查找 case 2:sort();break;//將學生成績從小到大排序 case 3:show();break;//顯示所有學生成績 case 4:insert();break;//按平均成績高低插入一條學生記錄 case 5:menu();break;//調出菜單 default:printf("本次選擇不成功!\n"); } } fileoutput();//將所有學生成績保存到score文件中 }
(2)菜單
void menu()//菜單 { printf(" 學生成績管理系統 \n"); printf("***************************************************\n"); printf("* 請選擇操作的序號,如果輸入-1,程序結束 *\n"); printf("* *\n"); printf("* 0 輸入n個學生信息 1 輸入學生姓名查找 *\n"); printf("* *\n"); printf("* 2 將學生成績從小到大排序 3 顯示所有學生成績 *\n"); printf("* *\n"); printf("* 4 插入一條學生記錄 5 顯示菜單 *\n"); printf("* *\n"); printf("***************************************************\n"); }
(3)輸入函數
void input()//輸入n個學生成績 { int i,j,num=1; char a[10]; stu = (struct student*)malloc(sizeof(struct student)*n); for(i=0;i<n;i++) { printf("請輸入第%d個學生的信息:\n",num); num++; gets(a);//防止回車鍵占用學號位置; printf("學號:"); gets(stu[i].No); printf("姓名:"); gets(stu[i].name); printf("三科成績:\n"); scanf("%d%d%d",&stu[i].subject1,&stu[i].subject2,&stu[i].subject3); stu[i].average=stu[i].subject1+stu[i].subject2+stu[i].subject3; stu[i].average=stu[i].average/3; } printf("一共%d個學生信息輸入完畢\n",n); printf("輸入5返回主菜單"); scanf("%d",&j); if(j==5) {system("cls");//清屏 menu(); } }
(4)查詢函數
void find()//輸入學生姓名查找並輸出該學生信息 { int k; printf("請輸入要查找的學生姓名:"); char a[10]; gets(a);//防止回車鍵占用學號位置; char name[20]; gets(name); int i,j=1001; for(i=0;i<n;i++) { if((strcmp(name,stu[i].name))==0) j=i; } if(j==1001) printf("沒有此學生!\n"); else { printf("成功已找到此姓名的學生\n"); printf("學號:"); puts(stu[j].No); printf("姓名:"); puts(stu[j].name); printf("三科成績:%d %d %d\n平均成績:%.2f\n",stu[j].subject1,stu[j].subject2,stu[j].subject3,stu[j].average); } printf("輸入5返回主菜單"); scanf("%d",&k); if(k==5) {system("cls");//清屏 menu(); } }
(5)排序函數
void sort()//將學生成績從小到大排序 { struct student t; int min; int i,j,k,num; for(j=0;j<n;j++) { min=stu[j].average; num=j; for(i=j;i<n;i++) { if(stu[i].average<min) { num=i; min=stu[i].average; } } t=stu[j]; stu[j]=stu[num]; stu[num]=t; } show(); printf("已按照平均成績從低到高排序完畢!\n"); printf("輸入5返回主菜單"); scanf("%d",&k); if(k==5) {system("cls");//清屏 menu(); } }
(6)輸出文件函數
void fileoutput()//將所有學生成績輸出到score文件中 { int k; char filename[]={"score.txt"}; FILE *in; if((in=fopen(filename,"w"))==NULL) printf("無法打開此文件\n"); else { int i; fprintf(in,"%d\n",n); for(i=0;i<n;i++) fwrite(&stu[i],sizeof(struct student),1,in); fclose(in); printf("已成功將學生記錄保存於score文件中\n"); } free(stu); stu = NULL; if(k==5) {system("cls");//清屏 menu(); } }
(7)show函數
void show()//顯示所有學生成績 { printf("以下是所有學生信息:\n"); int i,j; for(i=0;i<n;i++) { printf("學號:"); puts(stu[i].No); printf("姓名:"); puts(stu[i].name); printf("三科成績:%d %d %d\n平均成績:%.2f\n",stu[i].subject1,stu[i].subject2,stu[i].subject3,stu[i].average); printf("\n"); } printf("輸入5返回主菜單"); scanf("%d",&j); if(j==5) {system("cls");//清屏 menu(); } }
(8)插入函數
void insert()//按平均成績高低插入一條學生記錄 { int j; struct student *newbase = (struct student *)realloc(stu,sizeof(struct student)*(n+1)); stu = newbase; int *m=&n; printf("請輸入要插入的學生的信息:\n"); struct student stu1; char a[10]; gets(a);//防止回車鍵占用學號位置; printf("學號:"); gets(stu1.No); printf("姓名:"); gets(stu1.name); printf("三科成績:\n"); scanf("%d%d%d",&stu1.subject1,&stu1.subject2,&stu1.subject3); stu1.average=stu1.subject1+stu1.subject2+stu1.subject3; stu1.average=stu1.average/3; int num; int i; for(i=1;1;i++) { if(stu1.average<stu[0].average) { num=0; break; } else if(stu1.average>stu[*m-1].average) { num=*m; break; } else if(stu[i-1].average<stu1.average&&stu1.average<stu[i].average) { num=i; break; } } struct student t; for(i=*m-1;i>=num;i=i-1)//將num后的向后平移一個 { stu[i+1]=stu[i]; } stu[i+1]=stu1; *m=*m+1; show(); printf("已成功插入該學生的信息\n"); printf("輸入5返回主菜單"); scanf("%d",&j); if(j==5) {system("cls");//清屏 menu(); } }
(9)讀文件函數
void fileinput()//從文件中讀取數據 { char filename[]={"score.txt"}; FILE *in; if((in=fopen(filename,"r"))==NULL) { printf("無法讀取數據\n"); p=0; } else { fscanf(in,"%d\n",&n); stu = (struct student*)malloc(sizeof(struct student)*n); int i; for(i=0;i<n;i++) fread(&stu[i],sizeof(struct student),1,in); fclose(in); printf("已成功從score文件中將學生記錄讀取\n"); } }