摘要:概要設計功能設計該學生成績管理系統可以按功能進行模塊劃分,其模塊圖如圖所示。
歡迎來到
的博客。我是小魏,一名普通的在校大學生。希望大家多多關照,我們一起成長一起進步,也希望大家多多支持我鴨,喜歡我就給我一個關注吧!
題目:學生成績管理系統
學生數據由學號、姓名、班級、三門課(數學、英語、計算機)的成績和平均成績構成。 實現功能包括:
(1)添加學生的記錄
(2)查詢學生(分別按學號和姓名)
(3)對學生數據排序(按總成績的降序)
(4)刪除學生記錄
(5)修改學生記錄
(6)班級成績分析(各科平均成績、最高分、最低分、及格率)
(7)輸出學生信息表(全部學生成績信息顯示或按班級顯示學生成績信息)
(1)學生信息包括學號、姓名、班級和所學三門課程(數學、英語、計算機)的成績 和平均成績(每位學生的平均分和各科平均分)以及各科成績的最低分和最高分、及格 率;
(2)學生信息管理系統以菜單方式工作;
(3)錄入的學生信息用文件形式保存,并可以對其進行添加、查詢、數據排序(按總 分)、修改、成績分析、刪除等基本操作;
(4)按學號查詢學生信息,或按姓名查詢;
(5)按學號修改學生信息并保存到文件中;
(6)輸出學生信息表(全部學生成績信息顯示或按班級顯示學生成績信息);
(7)用戶使用過程中能夠要有容錯處理。
設計一個學生成績管理系統,使之能提供以下功能:
(1)添加學生信息;
(2)查詢學生信息(分別按學號和姓名);
(3)對學生的成績進行排序(按總分降序);
(4)修改學生信息;
(5)刪除學生信息;
(6)按本專業學生成績分析和按班級成績分析(各科平均成績、最高分、最低分、及 格率);
(7)輸出學生信息表;
(8)學生信息保存到文件中。
該學生成績管理系統可以按功能進行模塊劃分,其模塊圖如圖1所示。
學號,15個字符;
姓名,10個字符;
班級,正整數;
各科分數,無小數點;
總分,無小數點;
各科平均分,小數點后兩位;
各科及格率,小數點后兩位;
各科最低分,無小數點;
各科最高分,無小數點;
在處理過程中各項可以作為一個學生的不同屬性來進行處理;整體作為一張二維表進行處理,因此,采用結構數組。
系統的執行應從功能菜單的選擇開始,依據用戶的選擇來進行后續的處理,直到用戶選擇保存數據并退出系統為止,其間應對用戶的選擇做出判斷及異常處理。系統的流程圖如圖2所示。
菜單選擇功能中,通過輸入不同的數字(1-6)來進行菜單選擇,實現不同的程序結果,直到用戶輸入數字6時,就直接退出系統。菜單選擇模塊的流程圖如圖3所示。
添加學生信息模塊中,實現添加學生的班級、姓名、學號和三門成績(數學、英語、計算機)的輸入,直到用戶輸入x為0時,則結束當前輸入,并返回上級主菜單。添加模塊的流程圖如圖4所示。
輸出模塊中,先判斷鏈表大小list->size是否為0,若不為空,進入菜單選擇輸入不同的數字(1-3),若用戶輸入1,則實現本專業學生成績的輸出,若輸入2,則按班級輸出學生信息,直到用戶輸入數字3時,結束當前信息的輸出,并返回上級主菜單。輸出模塊的流程圖如圖5所示。
通過菜單選擇,輸入不同的數字(1-3)實現不同的方式進行查詢,若輸入數字1,按學號進行查詢學生信息,輸入數字2,按姓名查詢學生信息,輸入數字3,結束信息查詢功能,返回上級主菜單。查詢模塊的流程圖如圖6所示。
先進行判斷鏈表是否為空,若不為空,就能進行輸入學生的學號;然后,再進行判斷是否有用戶輸入的學號,若沒有,則返回學號輸入,再進行重新輸入學號。若在鏈表中的數據
存在用戶輸入的學號,則輸出該學生的信息,之后進行菜單選擇,可輸入不同的數字(1-5),用戶可選擇想修改的的數據,直到該用戶輸入數字5時,返回上級主菜單。信息修改模塊流程圖如圖7所示。
進入該程序運行中,需判斷鏈表大小list->size是否為0,若為0,則結束信息刪除操作;若不為0,將進入學號輸入操作;然后判斷鏈表數據中是否存在用戶輸入的學號id,若不存在,進入退出選擇操作,用戶可輸入0或其他數字,若輸入0,則返回上級菜單;若輸入其他數字,則該學生的信息將在鏈表中清除并釋放該空間。若該用戶繼續進行刪除操作,可輸入其他數字鍵;若輸入0,直接退出該程序并返回上級主菜單。信息刪除模塊的流程圖如圖8所示。
在保存數據之前,首先需打開文件,然后判斷文件是否為空,若為空就會提示該文件打開失敗,直接結束整個程序運行;若文件不為空,進行判斷鏈表的頭節點是否為空,若頭節點為空,則直接關閉該文件并結束程序,若頭節點不為空,將鏈表數據保存到文件中,直到尾節點為空,就會關閉該文件并退出系統。信息保存模塊的流程圖如圖9所示。
學生信息:
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]; //各科最高分};
⑴鋸齒型程序書寫格式
⑵變量說明
⑶函數功能、入口及出口參數說明
⑷關鍵處有足夠的注釋
代碼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(); //退出畫面#endif
//創建鏈表 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++;}
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;}
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; } }
//按總成績排序 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) //若鏈表空間大小
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/122005.html
摘要:以下題目和解析分別來源于我的新書程序員面試筆試寶典程序員面試筆試真題解析。類通過一個簡單的外部接口與外界發生關系,對象與對象之間通過消息進行通信。真題獲得實例化對象所屬類名字的函數是。 以下題目和解析分別來源于我的新書《PHP程序員面試筆試寶典》、《PHP程序員面試筆試真題解析》。 1、PHP常考基礎 1、PHP與ASP、JSP有什么區別?ASP全名Active Server Page...
摘要:如上海北京等管理員自己創建其他地方的學校管理員創建的課程。包含名字性別年齡等學員查詢可上課程學員選課,選擇學校課程,并付款。課程價格,周期課程價格,周期課程價格,周期創建講師屬于北京校區,屬于上海校區。 作業需求 創建北京、上海 2 所學校 創建linux , python , go 3個課程,linuxpy在北京開, go 在上海開 課程包含,周期,價格,通過學校創建課程 通過學校...
摘要:需要對每個用戶的每個內容對象維護一個數據結構。并沒有直接和相連,所以是將數據由暫存的內存中取出。采用實現的可用進行數據提交。記錄的完成情況,包括未嘗試未學習未完成,已完成。 簡介 SCORM定義了一個網絡化學習的內容聚合模型(Content Aggregaion Model)和學習對象的實時運行環境(Run-time Environment)。簡單說,它是為了滿足對網絡化學習內容的高水...
摘要:不過,蘋果實驗室作為計算機學院的學習類組織,撰寫此貼的內容集中于本科期間學習路線的宏觀規劃建議。其中主要問題大概是初入大學的迷茫與美好大學愿景之間的矛盾自主學習能力的欠缺與遠大志向的矛盾。 ...
閱讀 2847·2021-11-25 09:43
閱讀 2499·2021-10-09 09:44
閱讀 2810·2021-09-22 15:49
閱讀 2585·2021-09-01 11:43
閱讀 2552·2019-08-30 14:16
閱讀 473·2019-08-29 17:24
閱讀 3028·2019-08-29 14:00
閱讀 1392·2019-08-29 13:05