C语言课程设计——学生成绩管理系统(详细报告)
歡迎來到<IT_WEH_coder>的博客。我是小魏,一名普通的在校大學生。希望大家多多關照,我們一起成長一起進步,也希望大家多多支持我鴨,喜歡我就給我一個關注吧!
本課程設計的編程部分所使用的開發軟件是C-Free,可以參考使用教程,滑到底部可以獲取所有源代碼。
題目:學生成績管理系統
學生數據由學號、姓名、班級、三門課(數學、英語、計算機)的成績和平均成績構成。 實現功能包括:
(1)添加學生的記錄
(2)查詢學生(分別按學號和姓名)
(3)對學生數據排序(按總成績的降序)
(4)刪除學生記錄
(5)修改學生記錄
(6)班級成績分析(各科平均成績、最高分、最低分、及格率)
(7)輸出學生信息表(全部學生成績信息顯示或按班級顯示學生成績信息)
目錄
- 1 用戶分析
- 1.1 用戶需求
- 1.2 用戶目的
- 2 概要設計
- 2.1 功能設計
- 2.2 數據結構設計
- 2.3 功能運行流程圖
- 3 系統功能設計
- 3.1 菜單選擇模塊的流程圖
- 3.2 添加模塊的流程圖
- 3.3 排序輸出模塊的流程圖
- 3.4 信息查詢模塊的流程圖
- 3.5 信息修改模塊的流程圖
- 3.6 信息刪除模塊的流程圖
- 3.7 信息保存模塊的流程圖
- 3.8 數據結構的C語言表示
- 4 系統功能代碼設計
- 4.1 自定義頭文件的內容設計
- 4.2 鏈表相關的代碼清單
- 4.3 菜單選擇模塊的代碼清單
- 4.4 添加模塊的代碼清單
- 4.5 排序輸出模塊的代碼清單
- 4.6 信息查詢模塊的代碼清單
- 4.7 信息修改模塊的代碼清單
- 4.8 信息刪除模塊的代碼清單
- 4.9 信息保存模塊的代碼清單
- 4.10 退出畫面的代碼清單
- 5 系統調試
- 5.1 運行結果
- 5.1.1 菜單選擇程序運行截圖
- 5.1.2 信息添加程序運行截圖
- 5.1.3 信息輸出程序運行截圖
- 5.1.4 信息查詢運行截圖
- 5.1.5 信息修改程序運行截圖
- 5.1.6 信息刪除程序運行截圖
- 5.1.7 信息保存到文件截圖
- 5.1.8 系統退出畫面截圖
- 5.2 缺陷現象
- 5.3 缺陷原因
- 5.4 缺陷修改
- 5.5 修改驗證
- 6 報告總結
1 用戶分析
1.1 用戶需求
(1)學生信息包括學號、姓名、班級和所學三門課程(數學、英語、計算機)的成績 和平均成績(每位學生的平均分和各科平均分)以及各科成績的最低分和最高分、及格 率;
(2)學生信息管理系統以菜單方式工作;
(3)錄入的學生信息用文件形式保存,并可以對其進行添加、查詢、數據排序(按總 分)、修改、成績分析、刪除等基本操作;
(4)按學號查詢學生信息,或按姓名查詢;
(5)按學號修改學生信息并保存到文件中;
(6)輸出學生信息表(全部學生成績信息顯示或按班級顯示學生成績信息);
(7)用戶使用過程中能夠要有容錯處理。
1.2 用戶目的
設計一個學生成績管理系統,使之能提供以下功能:
(1)添加學生信息;
(2)查詢學生信息(分別按學號和姓名);
(3)對學生的成績進行排序(按總分降序);
(4)修改學生信息;
(5)刪除學生信息;
(6)按本專業學生成績分析和按班級成績分析(各科平均成績、最高分、最低分、及 格率);
(7)輸出學生信息表;
(8)學生信息保存到文件中。
2 概要設計
2.1 功能設計
該學生成績管理系統可以按功能進行模塊劃分,其模塊圖如圖1所示。
2.2 數據結構設計
學號,15個字符;
姓名,10個字符;
班級,正整數;
各科分數,無小數點;
總分,無小數點;
各科平均分,小數點后兩位;
各科及格率,小數點后兩位;
各科最低分,無小數點;
各科最高分,無小數點;
在處理過程中各項可以作為一個學生的不同屬性來進行處理;
因為數組的長度是有限制的,鏈表的長度是沒有限制的,系統中所存儲的學生信息長度是不固定的,所以學生信息通過鏈表來存儲。
2.3 功能運行流程圖
系統的執行應從功能菜單的選擇開始,依據用戶的選擇來進行后續的處理,直到用戶選擇保存數據并退出系統為止,其間應對用戶的選擇做出判斷及異常處理。系統的流程圖如圖2所示。
3 系統功能設計
3.1 菜單選擇模塊的流程圖
菜單選擇功能中,通過輸入不同的數字(1-6)來進行菜單選擇,實現不同的程序結果,直到用戶輸入數字6時,就直接退出系統。菜單選擇模塊的流程圖如圖3所示。
3.2 添加模塊的流程圖
添加學生信息模塊中,實現添加學生的班級、姓名、學號和三門成績(數學、英語、計算機)的輸入,直到用戶輸入x為0時,則結束當前輸入,并返回上級主菜單。添加模塊的流程圖如圖4所示。
3.3 排序輸出模塊的流程圖
輸出模塊中,先判斷鏈表大小list->size是否為0,若不為空,進入菜單選擇輸入不同的數字(1-3),若用戶輸入1,則實現本專業學生成績的輸出,若輸入2,則按班級輸出學生信息,直到用戶輸入數字3時,結束當前信息的輸出,并返回上級主菜單。輸出模塊的流程圖如圖5所示。
3.4 信息查詢模塊的流程圖
通過菜單選擇,輸入不同的數字(1-3)實現不同的方式進行查詢,若輸入數字1,按學號進行查詢學生信息,輸入數字2,按姓名查詢學生信息,輸入數字3,結束信息查詢功能,返回上級主菜單。查詢模塊的流程圖如圖6所示。
3.5 信息修改模塊的流程圖
先進行判斷鏈表是否為空,若不為空,就能進行輸入學生的學號;然后,再進行判斷是否有用戶輸入的學號,若沒有,則返回學號輸入,再進行重新輸入學號。若在鏈表中的數據
存在用戶輸入的學號,則輸出該學生的信息,之后進行菜單選擇,可輸入不同的數字(1-5),用戶可選擇想修改的的數據,直到該用戶輸入數字5時,返回上級主菜單。信息修改模塊流程圖如圖7所示。
3.6 信息刪除模塊的流程圖
進入該程序運行中,需判斷鏈表大小list->size是否為0,若為0,則結束信息刪除操作;若不為0,將進入學號輸入操作;然后判斷鏈表數據中是否存在用戶輸入的學號id,若不存在,進入退出選擇操作,用戶可輸入0或其他數字,若輸入0,則返回上級菜單;若輸入其他數字,則該學生的信息將在鏈表中清除并釋放該空間。若該用戶繼續進行刪除操作,可輸入其他數字鍵;若輸入0,直接退出該程序并返回上級主菜單。信息刪除模塊的流程圖如圖8所示。
3.7 信息保存模塊的流程圖
在保存數據之前,首先需打開文件,然后判斷文件是否為空,若為空就會提示該文件打開失敗,直接結束整個程序運行;若文件不為空,進行判斷鏈表的頭節點是否為空,若頭節點為空,則直接關閉該文件并結束程序,若頭節點不為空,將鏈表數據保存到文件中,直到尾節點為空,就會關閉該文件并退出系統。信息保存模塊的流程圖如圖9所示。
3.8 數據結構的C語言表示
學生信息:
struct Student {int class_num; //班級char id[15]; //學號char name[10]; //姓名float score[3]; //各科分數float sum; //總成績float course_av[3]; //各科平均分float course_pass[3]; //各科及格率float course_max[3]; //各科最低分float course_min[3]; //各科最高分 };4 系統功能代碼設計
4.1 自定義頭文件的內容設計
代碼1:
/* 文件list.h */ #ifndef _LIST_H_ //防止重復編譯,_LIST_H_為符號常量 #define _LIST_H_ //學生信息結構體定義 struct Student { int class_num; char id[15]; char name[10]; float score[3]; float sum; float course_av[3]; float course_pass[3]; float course_max[3]; float course_min[3]; }; //鏈表節點定義 struct Node { struct Student student;struct Node *next; }; //鏈表定義 struct List { struct Node *head; //鏈表頭節點int size; //鏈表長度 }; struct List* createList(); //創建鏈表 void destoryList(struct List *list); //銷毀鏈表 struct Node* createNode(struct Student student); //創建節點 struct Node* getLastNode(struct List *list); //獲取鏈表最后一個節點 struct Node* getBeforeNode(struct List *list,struct Student student); //獲取上一個節點 void addList(struct List *list, struct Node *node); //將節點添加到鏈表中 #endif代碼2:
/* 文件fun.h */ #ifndef _FUN_H_ //防止重復編譯,_FUN_H_為符號常量 #define _FUN_H_ void Menu(); //菜單欄 FILE* openFile(char *filename,char *type); //打開文件 void fileToList(struct List *list,char *filename); //文件數據添加到鏈表中 void listToFile(struct List *list,char *filename); //將鏈表數據存儲到文件中 void input(struct List *list); //添加學生信息 void sort(struct List *list); //按總成績排序 void output(struct List *list); //輸出學生信息 void find(struct List *list); //查找學生信息 void detail(struct Node *temp); //修改具體細節 void change(struct List *list); //修改學生信息 void Delete(struct List *list); //刪除 void quit(); //退出畫面 #endif4.2 鏈表相關的代碼清單
//創建鏈表 struct List* createList() {struct List *list;list=(struct List*)malloc(sizeof(struct List));list->head=NULL;list->size=0;return list; } //銷毀鏈表 void destoryList(struct List *list) {struct Node *temp=list->head,*del=NULL;while(temp){del=temp;temp=temp->next;free(del);//釋放節點空間 list->size--; }free(list);//釋放鏈表空間 } //創建節點 struct Node* createNode(struct Student student) {struct Node *node=NULL;node=(struct Node*)malloc(sizeof(struct Node));node->student=student;node->next=NULL;return node; } //獲取鏈表最后一個節點 struct Node* getLastNode(struct List *list) {struct Node *temp=list->head,*last=NULL;while(temp){last=temp;temp=temp->next;}return last; } //獲取當前節點的上一個節點 struct Node* getBeforeNode(struct List *list,struct Student student) {struct Node *temp=list->head,*prevNode=NULL;while(temp){if(strcmp(temp->student.id,student.id)==0){break;}prevNode=temp;temp=temp->next;}return prevNode; } //將節點添加到鏈表中 void addList(struct List *list, struct Node *node) {struct Node *last;if(list->head==NULL){list->head=node;}else{last=getLastNode(list);last->next=node; }list->size++; }4.3 菜單選擇模塊的代碼清單
int main() {int num=0;FILE*file=NULL;struct List *list=NULL;list=createList(); //創建鏈表 fileToList(list,"studentFile.txt");//把數據添加到鏈表中 SetConsoleTitle("學生成績管理系統");void Menu(){printf("******學生成績管理系統****\n"); printf("******1.添加學生信息******\n"); printf("******2.輸出學生信息******\n");printf("******3.查詢學生信息******\n");printf("******4.修改學生信息******\n");printf("******5.刪除學生信息******\n");printf("******6.保存后退出********\n");printf("請選擇:");}while(1){system("cls"); //清屏 Menu(); //菜單欄 scanf("%d",&num);switch(num){case 1:system("cls");input(list); //添加 printf("請輸入任意數字鍵\n返回上級菜單:");scanf("%d",&num);break;case 2:system("cls");output(list); //輸出break; case 3:system("cls");find(list); //查詢break; case 4:system("cls");change(list); //修改 break;case 5:system("cls");Delete(list); //刪除 break;case 6: system("cls");listToFile(list,"studentFile.txt");//數據保存到文件中 destoryList(list); // 銷毀鏈表quit(); //退出畫面 exit(0);default:printf("輸入有誤,請重新選擇!\n");printf("請輸入任意數字鍵\n返回上級菜單:");scanf("%d",&num);break;} }return 0; }4.4 添加模塊的代碼清單
void input(struct List *list) {struct Student student; struct Node *node=NULL; //建立新節點struct Node *temp; //建立新節點int x,i,flag;while(1){flag=1;printf("-->請輸入該學生信息的班級、學號、姓名<--\n-->");scanf("%d %s %s",&student.class_num,student.id,student.name);temp=list->head; //當前鏈表的下一個節點while(temp) {if(strcmp(temp->student.id,student.id)==0) //限定學號唯一 {printf("您輸入的學號已存在!\n");flag=0;}temp=temp->next; //鏈表的下一個節點}if(flag){printf("-->請輸入該學生的每門成績<--\n數學:");scanf("%f",&student.score[0]);printf("英語:");scanf("%f",&student.score[1]);printf("計算機:");scanf("%f",&student.score[2]);student.sum=0;for(i=0;i<3;i++){student.sum+=student.score[i];}node=createNode(student); //創建節點 addList(list,node); //添加到鏈表 }printf("退出請按數字0,其他數字鍵繼續添加:");scanf("%d",&x);if(x==0)break; } }4.5 排序輸出模塊的代碼清單
//按總成績排序 void sort(struct List *list) {int i,j; struct Student s; struct Node *temp=NULL,*temp1=NULL,*temp2=NULL; //建立新節點for(i=0;i<list->size-1;i++){temp=list->head; //當前鏈表的下一個節點for(j=0;j<list->size-i-1;j++){temp1=temp;temp2=temp->next; //新建鏈表的下一個節點if(temp1->student.sum<temp2->student.sum) {s=temp1->student;temp1->student=temp2->student;temp2->student=s;}temp=temp->next; //當前鏈表的下一個節點}} } //輸出學生信息 void output(struct List *list) {int cnt=0,num=0,class_num=0,i; float av_math,av_eng,av_se; //數學、英語、計算機平均分float pass[3],min[3],max[3]; //及格率、最低分、最高分struct Node *temp=list->head; //把新節點作為頭結點if(list->size==0) //若鏈表空間大小為0則返回上級{printf("抱歉,暫無學生信息!\n");return; }sort(list); //排序 system("cls"); //清屏while(1){ temp=list->head; //每循環一次該節點重新作為頭節點system("cls");printf("*******1.本專業學生成績分析******\n");printf("*******2.按班級顯示成績分析******\n");printf("*******3.退出********************\n");printf("請選擇:");scanf("%d",&num);cnt=0;system("cls");av_math=av_eng=av_se=0; //清零pass[0]=pass[1]=pass[2]=0; //清零switch(num){case 1:for(i=0;i<35;i++)printf("*");printf("本專業學生成績分析");for(i=0;i<35;i++)printf("*"); printf("\n\n%s\t%s\t%-15s\t%-10s\t%s\t%s\t%s\t%s\t%s\n","序號","班級","學號","姓名","數學","英語","計算機","總成績","平均分");while(temp){ cnt++; printf(" %d\t %d\t%-15s\t%-10s\t%.0f\t%.0f\t %.0f\t %.0f\t %.2f\n", cnt,temp->student.class_num,temp->student.id,temp->student.name,temp->student.score[0],temp->student.score[1],temp->student.score[2],temp->student.sum,temp->student.sum/3);av_math+=temp->student.score[0];av_eng+=temp->student.score[1];av_se+=temp->student.score[2];if(cnt==1){for(i=0;i<3;i++){max[i]=min[i]=temp->student.score[i];}}for(i=0;i<3;i++){if(temp->student.score[i]>=60){pass[i]+=100;}if(temp->student.score[i]>max[i]){max[i]=temp->student.score[i];}if(temp->student.score[i]<min[i]){min[i]=temp->student.score[i];}}temp=temp->next; //當前鏈表的下一個節點} printf("\n數學-->最高分:%.0f\t最低分:%.0f\t平均分:%.2f\t及格 率:%.2f%%\n",max[0],min[0],av_math/cnt,pass[0]/cnt); printf("英語-->最高分:%.0f\t最低分:%.0f\t平均分:%.2f\t及格 率:%.2f%%\n",max[1],min[1],av_eng/cnt,pass[1]/cnt);printf("計算機-->最高分:%.0f\t最低分:%.0f\t平均分:%.2f\t及格 率:%.2f%%\n",max[2],min[2],av_se/cnt,pass[2]/cnt);system("pause");break;case 2:printf("請輸入班級:");scanf("%d",&class_num);for(i=0;i<37;i++)printf("*");printf("%d班學生成績表",class_num);for(i=0;i<37;i++)printf("*"); printf("\n\n%s\t%s\t%-15s\t%-10s\t%s\t%s\t%s\t%s\t%s\n","序號","班級","學號","姓名","數學","英語","計算機","總成績","平均分");while(temp){if(temp->student.class_num==class_num){cnt++; printf(" %d\t %d\t%-15s\t%-10s\t%.0f\t%.0f\t %.0f\t %.0f\t %.2f\n",cnt,temp->student.class_num,temp->student.id,temp->student.name,temp->student.score[0],temp->student.score[1],temp->student.score[2],temp->student.sum,temp->student.sum/3);av_math+=temp->student.score[0];av_eng+=temp->student.score[1];av_se+=temp->student.score[2];if(cnt==1){for(i=0;i<3;i++){max[i]=min[i]=temp->student.score[i];}}for(i=0;i<3;i++){if(temp->student.score[i]>=60){pass[i]+=100;}if(temp->student.score[i]>max[i]){max[i]=temp->student.score[i];}if(temp->student.score[i]<min[i]){min[i]=temp->student.score[i];}}}temp=temp->next; //當前鏈表的下一個節點} if(cnt==0){printf("%d班級,暫無學生信息!\n",class_num);break;}printf("\n數學-->最高分:%.0f\t最低分:%.0f\t平均分:%.2f\t及格率:%.2f%%\n",max[0],min[0],av_math/cnt,pass[0]/cnt);printf("英語-->最高分:%.0f\t最低分:%.0f\t平均分:%.2f\t及格率:%.2f%%\n",max[1],min[1],av_eng/cnt,pass[1]/cnt);printf("計算機-->最高分:%.0f\t最低分:%.0f\t平均分:%.2f\t及格率:%.2f%%\n",max[2],min[2],av_se/cnt,pass[2]/cnt);system("pause");break;case 3:return; default:printf("輸入有誤,請重新輸入!\n");system("pause");break; } } }4.6 信息查詢模塊的代碼清單
void find(struct List *list) {int num,class_num; char id[15],name[10]; //學號、姓名 struct Node *temp; if(list->size==0) //若鏈表空間大小為0,則返回上級{printf("抱歉,暫無學生信息!\n");return;}while(1){system("cls"); //清屏 printf("*******1.按學號查詢******\n");printf("*******2.按姓名查詢******\n");printf("*******3.退出************\n");printf("請選擇:");scanf("%d",&num);system("cls");temp=list->head; //每循環一次該節點重新作為頭節點 switch(num){case 1:printf("請輸入要查找學生信息的學號:"); scanf("%s",id);while(temp){if(strcmp(temp->student.id,id)==0)break; //查找學號 temp=temp->next; //當前鏈表的下一個節點}if(temp){printf("查找到該學生信息為:\n");printf("\n%s\t%-15s\t%-10s\t%s\t%s\t%s\t%s\t%s\n","班級","學號","姓名","數學","英語","計算機","總成績","平均分"); printf(" %d\t%-15s\t%-10s\t%.0f\t%.0f\t %.0f\t %.0f\t %.2f\n",temp->student.class_num,temp->student.id,temp->student.name,temp->student.score[0],temp->student.score[1],temp->student.score[2],temp->student.sum,temp->student.sum/3); } else{printf("抱歉,不存在該學生信息!\n");}system("pause");break;case 2:printf("請輸入要查找學生信息的班級、姓名:");scanf("%d %s",&class_num,name);while(temp){if(temp->student.class_num==class_num&&strcmp(temp->student.name,name)==0) { break;} temp=temp->next;}//輸出該學生信息 if(temp){printf("查找到該學生信息為:\n");printf("\n%s\t%-15s\t%-10s\t%s\t%s\t%s\t%s\t%s\n","班級","學號","姓名","數學","英語","計算機","總成績","平均分"); printf(" %d\t%-15s\t%-10s\t%.0f\t%.0f\t %.0f\t %.0f\t %.2f\n",temp->student.class_n um,temp->student.id,temp->student.name,temp->student.score[0],temp->student.score[1],temp->student.score[2],temp->student.sum,temp->student.sum/3); } else{printf("抱歉,不存在該學生信息!\n");}system("pause");break;case 3:return; default:printf("輸入有誤,請重新輸入!\n");system("pause");break; }} }4.7 信息修改模塊的代碼清單
/*修改具體細節 */ void detail(struct Node *temp) {char id[15]; //學號 int num=0,x;printf("\n******信息修改********");printf("\n******1.班級修改******");printf("\n******2.學號修改******");printf("\n******3.姓名修改******");printf("\n******4.成績修改******");printf("\n******5.退出*********\n");while(1){printf("請選擇:");scanf("%d",&num);switch(num){case 1:printf("請您輸入修改后的班級號為:");scanf("%d",&temp->student.class_num);break;case 2:printf("請您輸入修改后的學號為:");scanf("%s",temp->student.id);break;case 3:printf("請您輸入修改后的姓名為:");scanf("%s",temp->student.name);break;case 4:printf("請您修改該同學的成績為:\n");printf("數學--英語--計算機\n-->");scanf("%f %f %f",&temp->student.score[0],&temp->student.score[1],&temp->student.score[2]);temp->student.sum=temp->student.score[0]+temp->student.score[1]+temp->student.score[2]; //求每位同學的總分system("pause");break;case 5:return;default:printf("您輸入有誤,請重新輸入!");break; } printf("退出請按數字0,其他數字鍵繼續修改:");scanf("%d",&x);if(x==0)break;} } /*修改學生信息 */ void change(struct List *list) {char id[15],flag=1;struct Student student;struct Node *temp=list->head; //把新節點作為頭節點 if(list->size==0) //若鏈表空間大小為0,則返回上級 {printf("抱歉,暫無學生信息!\n");return;}printf("請輸入要修改學生信息的學號:"); scanf("%s",id);while(temp){if(strcmp(temp->student.id,id)==0) //查找學號 {printf("當前該學生信息為:\n"); printf("\n%s\t%-15s\t%-10s\t%s\t%s\t%s\t%s\n","班級","學號","姓名","數學","英語","計算機","總成績"); printf(" %d\t%-15s\t%-10s\t%.0f\t%.0f\t %.0f\t %.0f\n",temp->student.class_num,temp->student.id,temp->student.name,temp->student.score[0],temp->student.score[1],temp->student.score[2],temp->student.sum); detail(temp);printf("修改成功!\n");flag=0; break;}temp=temp->next; //當前鏈表的下一個節點}if(flag){printf("抱歉,不存在該學生信息,無法修改!\n");} }4.8 信息刪除模塊的代碼清單
void Delete(struct List *list) {char id[15];int flag,x;struct Node *temp,*prevNode=NULL; //建立新頭結點prevNode while(1){ temp=list->head; //每循環一次該節點重新作為頭節點if(list->size==0) //若鏈表空間大小為0,則結束循環 {printf("\n抱歉,暫無學生信息!\n");break;}flag=1;printf("請輸入要刪除學生信息的學號:"); scanf("%s",id); while(temp){if(strcmp(temp->student.id,id)==0){printf("刪除的該學生信息為:\n");printf("\n%s\t%-15s\t%-10s\t%s\t%s\t%s\t%s\n","班級","學號","姓名","數學","英語","計算機","總成績");printf(" %d\t%-15s\t%-10s\t%.0f\t%.0f\t %.0f\t %.0f\n",temp->student.class_num,temp->student.id,temp->student.name,temp->student.score[0],temp->student.score[1],temp->student.score[2],temp->student.sum);/*找到前一個節點,再與后一個節點連接 */prevNode=getBeforeNode(list,temp->student); if(prevNode==NULL) //刪除的是頭節點 { list->head=temp->next; }else{prevNode->next=temp->next; //刪除的是普通節點 }flag=0; free(temp); //釋放temp所指的空間內存 temp=NULL; //將該節點的指針域為空 list->size--; //將該節點 printf("\n該學生信息刪除成功!\n");break;}temp=temp->next; //當前鏈表的下一個節點}if(flag){printf("\n抱歉,不存在該學生信息,無法刪除!\n\n");} printf("\n退出請按數字0,其他數字鍵繼續刪除操作:");scanf("%d",&x);if(x==0)break; }system("pause"); }4.9 信息保存模塊的代碼清單
FILE* openFile(char *filename,char *type) //打開文件 {FILE*file=fopen(filename,type);if(file==NULL){printf("打開%s文件失敗!\n",filename);return NULL; }return file; } void fileToList(struct List *list,char *filename) //文件數據添加到鏈表中 {int count=0;struct Student student;struct Node *node=NULL; FILE*file=openFile(filename,"r"); //以寫的方式打開文件if(file==NULL)return; while(1) { count=fscanf(file,"%d%s%s%f%f%f%f\n",&student.class_num,student.id,student.name,&student.score[0],&student.score[1],&student.score[2],&student.sum);student.sum=student.score[0]+student.score[1]+student.score[2]; //求總分 if(count<=0)break;node=createNode(student); //創建節點 addList(list,node); //添加到鏈表 }fclose(file); } void listToFile(struct List *list,char *filename) //將鏈表數據存儲到文件中 {struct Node *temp=list->head;FILE*file=openFile(filename,"w"); //以寫的方式打開文件if(file==NULL)return;while(temp){fprintf(file,"%d\t%s\t%s\t%.0f\t%.0f\t%.0f\t%.0f\n",temp->student.class_num,temp->student.id,temp->student.name,temp->student.score[0],temp->student.score[1],temp->student.score[2],temp->student.sum);temp=temp->next;}fclose(file); //關閉文件并釋放文件緩沖區 }4.10 退出畫面的代碼清單
void quit() {int i,j,k;for(k=0;k<5;k++)printf("\n");for(i=0;i<21;i++) //控制21行{for(k=0;k<i;k++){printf(" ");}for(j=0;j<80;j++) //每行輸出80個字符*{if(i==10) {for(k=0;k<29;k++) printf("*");printf("—> 感謝您的使用! <—");for(k=0;k<29;k++)printf("*");break;}printf("*");}printf("\n"); }for(k=0;k<5;k++)printf("\n"); }5 系統調試
5.1 運行結果
5.1.1 菜單選擇程序運行截圖
5.1.2 信息添加程序運行截圖
5.1.3 信息輸出程序運行截圖
菜單選擇顯示
本專業學生成績輸出結果
按班級輸出學生成績顯示
5.1.4 信息查詢運行截圖
菜單選擇顯示
按學號查詢學生信息顯示
按姓名查詢學生信息顯示
5.1.5 信息修改程序運行截圖
修改學生信息后查詢顯示
5.1.6 信息刪除程序運行截圖
刪除該學生信息后查詢顯示
5.1.7 信息保存到文件截圖
5.1.8 系統退出畫面截圖
5.2 缺陷現象
添加程序運行結果
5.3 缺陷原因
在添加程序中輸入文件中已存在的學號時,沒有進行判斷學號是否唯一,使得輸入文件已存在的學號仍能繼續后續操作,這樣就不符合實際。
5.4 缺陷修改
修改添加程序部分代碼如下:
void input(struct List *list) {struct Student student; struct Node *node=NULL;struct Node *temp;int x,i,flag;while(1){flag=1;printf("請輸入該學生信息的班級、學號、姓名\n-->");scanf("%d %s %s",&student.class_num,student.id,student.name);temp=list->head;while(temp){/*判斷當前輸入的學號在鏈表中是否存在*/if(strcmp(temp->student.id,student.id)==0) {printf("您輸入的學號已存在!\n");flag=0;} temp=temp->next; //當前鏈表的下一個節點}if(flag){printf("請輸入該學生的每門成績\n數學:");scanf("%f",&student.score[0]);printf("英語:");scanf("%f",&student.score[1]);printf("計算機:");scanf("%f",&student.score[2]);student.sum=0;for(i=0;i<3;i++)student.sum+=student.score[i];node=createNode(student); //創建節點 addList(list,node); //添加到鏈表 }printf("退出請按數字0,其他數字鍵繼續添加:");scanf("%d",&x);if(x==0)break; } }5.5 修改驗證
添加程序代碼修改后運行結果顯示如下:
6 報告總結
在我看來,課程設計是培養學生綜合運用所學知識,發現,提出,分析和解決實際問題,鍛煉實踐能力的重要環節,是對學生實際工作能力的具體訓練和考察過程。隨著科學技術發展的日新月異,當今計算機的應用在生活中可以說得是無處不在。
“鍥而不舍,金石可鏤”。很多題目需要靠堅持才能有結果。一次次編寫的程序無法運行,一次次的改正無法獲得”編譯成功“的認可。此時倘若將其放掉,那這個題目可能就永遠被埋掉了,那些錯誤之處也就再無機會得到修正,那個知識點也可能從此漏了。因此,用實際行動去解決每一個問題,才能發現問題。
C語言是計算機程序設計的重要理論基礎,在我們以后的學習和工作中都有著十分重要的地位。要學好這種語言,僅僅學習課本上的知識是不夠的,還要經常自己動手,有較強的實踐能力。只有多動手,經常編寫程序,才能發現我們學習上的漏洞和自己的不足,并在實踐中解決這些問題,不斷提高自己轉化知識的能力?;仡櫰鸫舜握n程設計,至今我仍感慨頗多,的確,從拿到題目到完成整個編程,從理論到實踐,在本學期的日子里,可以學到很多實用的東西,同時不僅可以鞏固以前所學過的知識,而且學到很多在書本上所沒有學到過的知識。通過這次課程設計使我懂得了理論與實際相結合是很重要的,單純理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服務,從而提高自己的實際動手能力和獨立思考的能力。
最后,感謝曹老師的辛勤指導,在您的身上我學到很多實用的知識。同時,在理論課和實訓授課過程中,同學之間的相互探討,老師的循循善誘,最終讓我們達到了舉一反三的效果,在學知識的同時,也增加了同學老師之間的感情。
今后,我期待自己能變得堅強和勇敢,讓學習更上一層樓;我相信,只要有信心,人永遠不會挫敗!
博主后記:
希望看到此篇博文的網友,如果發現有什么不對的地方,歡迎在下方留言指正!博主一定虛心接受并改正!大家一起共同進步。如果對你有所幫助,可以給博主一個贊👍。
想要獲取源代碼,可以直接訪問我的Gitee倉庫https://gitee.com/weh_coder/student_manage_system ,記得給個star哦!
總結
以上是生活随笔為你收集整理的C语言课程设计——学生成绩管理系统(详细报告)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金属箔式应变片性能—单臂电桥
- 下一篇: 电机与matlab突然,电机与MATLA