摘要:概要設計功能設計該學生成績管理系統(tǒng)可以按功能進行模塊劃分,其模塊圖如圖所示。
歡迎來到
的博客。我是小魏,一名普通的在校大學生。希望大家多多關照,我們一起成長一起進步,也希望大家多多支持我鴨,喜歡我就給我一個關注吧!
題目:學生成績管理系統(tǒng)
學生數(shù)據(jù)由學號、姓名、班級、三門課(數(shù)學、英語、計算機)的成績和平均成績構成。 實現(xiàn)功能包括:
(1)添加學生的記錄
(2)查詢學生(分別按學號和姓名)
(3)對學生數(shù)據(jù)排序(按總成績的降序)
(4)刪除學生記錄
(5)修改學生記錄
(6)班級成績分析(各科平均成績、最高分、最低分、及格率)
(7)輸出學生信息表(全部學生成績信息顯示或按班級顯示學生成績信息)
(1)學生信息包括學號、姓名、班級和所學三門課程(數(shù)學、英語、計算機)的成績 和平均成績(每位學生的平均分和各科平均分)以及各科成績的最低分和最高分、及格 率;
(2)學生信息管理系統(tǒng)以菜單方式工作;
(3)錄入的學生信息用文件形式保存,并可以對其進行添加、查詢、數(shù)據(jù)排序(按總 分)、修改、成績分析、刪除等基本操作;
(4)按學號查詢學生信息,或按姓名查詢;
(5)按學號修改學生信息并保存到文件中;
(6)輸出學生信息表(全部學生成績信息顯示或按班級顯示學生成績信息);
(7)用戶使用過程中能夠要有容錯處理。
設計一個學生成績管理系統(tǒng),使之能提供以下功能:
(1)添加學生信息;
(2)查詢學生信息(分別按學號和姓名);
(3)對學生的成績進行排序(按總分降序);
(4)修改學生信息;
(5)刪除學生信息;
(6)按本專業(yè)學生成績分析和按班級成績分析(各科平均成績、最高分、最低分、及 格率);
(7)輸出學生信息表;
(8)學生信息保存到文件中。
該學生成績管理系統(tǒng)可以按功能進行模塊劃分,其模塊圖如圖1所示。
學號,15個字符;
姓名,10個字符;
班級,正整數(shù);
各科分數(shù),無小數(shù)點;
總分,無小數(shù)點;
各科平均分,小數(shù)點后兩位;
各科及格率,小數(shù)點后兩位;
各科最低分,無小數(shù)點;
各科最高分,無小數(shù)點;
在處理過程中各項可以作為一個學生的不同屬性來進行處理;整體作為一張二維表進行處理,因此,采用結構數(shù)組。
系統(tǒng)的執(zhí)行應從功能菜單的選擇開始,依據(jù)用戶的選擇來進行后續(xù)的處理,直到用戶選擇保存數(shù)據(jù)并退出系統(tǒng)為止,其間應對用戶的選擇做出判斷及異常處理。系統(tǒng)的流程圖如圖2所示。
菜單選擇功能中,通過輸入不同的數(shù)字(1-6)來進行菜單選擇,實現(xiàn)不同的程序結果,直到用戶輸入數(shù)字6時,就直接退出系統(tǒng)。菜單選擇模塊的流程圖如圖3所示。
添加學生信息模塊中,實現(xiàn)添加學生的班級、姓名、學號和三門成績(數(shù)學、英語、計算機)的輸入,直到用戶輸入x為0時,則結束當前輸入,并返回上級主菜單。添加模塊的流程圖如圖4所示。
輸出模塊中,先判斷鏈表大小list->size是否為0,若不為空,進入菜單選擇輸入不同的數(shù)字(1-3),若用戶輸入1,則實現(xiàn)本專業(yè)學生成績的輸出,若輸入2,則按班級輸出學生信息,直到用戶輸入數(shù)字3時,結束當前信息的輸出,并返回上級主菜單。輸出模塊的流程圖如圖5所示。
通過菜單選擇,輸入不同的數(shù)字(1-3)實現(xiàn)不同的方式進行查詢,若輸入數(shù)字1,按學號進行查詢學生信息,輸入數(shù)字2,按姓名查詢學生信息,輸入數(shù)字3,結束信息查詢功能,返回上級主菜單。查詢模塊的流程圖如圖6所示。
先進行判斷鏈表是否為空,若不為空,就能進行輸入學生的學號;然后,再進行判斷是否有用戶輸入的學號,若沒有,則返回學號輸入,再進行重新輸入學號。若在鏈表中的數(shù)據(jù)
存在用戶輸入的學號,則輸出該學生的信息,之后進行菜單選擇,可輸入不同的數(shù)字(1-5),用戶可選擇想修改的的數(shù)據(jù),直到該用戶輸入數(shù)字5時,返回上級主菜單。信息修改模塊流程圖如圖7所示。
進入該程序運行中,需判斷鏈表大小list->size是否為0,若為0,則結束信息刪除操作;若不為0,將進入學號輸入操作;然后判斷鏈表數(shù)據(jù)中是否存在用戶輸入的學號id,若不存在,進入退出選擇操作,用戶可輸入0或其他數(shù)字,若輸入0,則返回上級菜單;若輸入其他數(shù)字,則該學生的信息將在鏈表中清除并釋放該空間。若該用戶繼續(xù)進行刪除操作,可輸入其他數(shù)字鍵;若輸入0,直接退出該程序并返回上級主菜單。信息刪除模塊的流程圖如圖8所示。
在保存數(shù)據(jù)之前,首先需打開文件,然后判斷文件是否為空,若為空就會提示該文件打開失敗,直接結束整個程序運行;若文件不為空,進行判斷鏈表的頭節(jié)點是否為空,若頭節(jié)點為空,則直接關閉該文件并結束程序,若頭節(jié)點不為空,將鏈表數(shù)據(jù)保存到文件中,直到尾節(jié)點為空,就會關閉該文件并退出系統(tǒng)。信息保存模塊的流程圖如圖9所示。
學生信息:
struct Student{ int class_num; //班級 char id[15]; //學號 char name[10]; //姓名 float score[3]; //各科分數(shù) float sum; //總成績float course_av[3]; //各科平均分float course_pass[3]; //各科及格率float course_max[3]; //各科最低分float course_min[3]; //各科最高分};
⑴鋸齒型程序書寫格式
⑵變量說明
⑶函數(shù)功能、入口及出口參數(shù)說明
⑷關鍵處有足夠的注釋
代碼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; //頭節(jié)點設計 int size;};struct List* createList(); //創(chuàng)建鏈表void destoryList(struct List *list); //銷毀鏈表struct Node* createNode(struct Student student); //創(chuàng)建節(jié)點 struct Node* getLastNode(struct List *list); //獲取鏈表最后一個節(jié)點struct Node* getBeforeNode(struct List *list,struct Student student); //獲取上一個節(jié)點void addList(struct List *list, struct Node *node); //將節(jié)點添加到鏈表中 #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); //文件數(shù)據(jù)添加到鏈表中 void listToFile(struct List *list,char *filename); //將鏈表數(shù)據(jù)存儲到文件中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); //修改具體細節(jié) void change(struct List *list); //修改學生信息 void Delete(struct List *list); //刪除void quit(); //退出畫面#endif
//創(chuàng)建鏈表 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);//釋放節(jié)點空間 list->size--; } free(list);//釋放鏈表空間 }//創(chuàng)建節(jié)點 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;}//獲取鏈表最后一個節(jié)點 struct Node* getLastNode(struct List *list){ struct Node *temp=list->head,*last=NULL; while(temp) { last=temp; temp=temp->next; } return last;}//獲取當前節(jié)點的上一個節(jié)點 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;}//將節(jié)點添加到鏈表中 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(); //創(chuàng)建鏈表 fileToList(list,"studentFile.txt");//把數(shù)據(jù)添加到鏈表中 SetConsoleTitle("學生成績管理系統(tǒng)"); void Menu() { printf("******學生成績管理系統(tǒng)****/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("請輸入任意數(shù)字鍵/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");//數(shù)據(jù)保存到文件中 destoryList(list); // 銷毀鏈表 quit(); //退出畫面 exit(0); default: printf("輸入有誤,請重新選擇!/n"); printf("請輸入任意數(shù)字鍵/n返回上級菜單:"); scanf("%d",&num); break; } } return 0;}
void input(struct List *list){ struct Student student; struct Node *node=NULL; //建立新節(jié)點 struct Node *temp; //建立新節(jié)點 int x,i,flag; while(1) { flag=1; printf("-->請輸入該學生信息的班級、學號、姓名<--/n-->"); scanf("%d %s %s",&student.class_num,student.id,student.name); temp=list->head; //當前鏈表的下一個節(jié)點 while(temp) { if(strcmp(temp->student.id,student.id)==0) //限定學號唯一 { printf("您輸入的學號已存在!/n"); flag=0; } temp=temp->next; //鏈表的下一個節(jié)點 } if(flag) { printf("-->請輸入該學生的每門成績<--/n數(shù)學:"); 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); //創(chuàng)建節(jié)點 addList(list,node); //添加到鏈表 } printf("退出請按數(shù)字0,其他數(shù)字鍵繼續(xù)添加:"); 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; //建立新節(jié)點 for(i=0;i<list->size-1;i++) { temp=list->head; //當前鏈表的下一個節(jié)點 for(j=0;j<list->size-i-1;j++) { temp1=temp; temp2=temp->next; //新建鏈表的下一個節(jié)點 if(temp1->student.sum<temp2->student.sum) { s=temp1->student; temp1->student=temp2->student; temp2->student=s; } temp=temp->next; //當前鏈表的下一個節(jié)點 } }}//輸出學生信息 void output(struct List *list){ int cnt=0,num=0,class_num=0,i; float av_math,av_eng,av_se; //數(shù)學、英語、計算機平均分 float pass[3],min[3],max[3]; //及格率、最低分、最高分 struct Node *temp=list->head; //把新節(jié)點作為頭結點 if(list->size==0) //若鏈表空間大小
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/122005.html
摘要:以下題目和解析分別來源于我的新書程序員面試筆試寶典程序員面試筆試真題解析。類通過一個簡單的外部接口與外界發(fā)生關系,對象與對象之間通過消息進行通信。真題獲得實例化對象所屬類名字的函數(shù)是。 以下題目和解析分別來源于我的新書《PHP程序員面試筆試寶典》、《PHP程序員面試筆試真題解析》。 1、PHP??蓟A 1、PHP與ASP、JSP有什么區(qū)別?ASP全名Active Server Page...
摘要:如上海北京等管理員自己創(chuàng)建其他地方的學校管理員創(chuàng)建的課程。包含名字性別年齡等學員查詢可上課程學員選課,選擇學校課程,并付款。課程價格,周期課程價格,周期課程價格,周期創(chuàng)建講師屬于北京校區(qū),屬于上海校區(qū)。 作業(yè)需求 創(chuàng)建北京、上海 2 所學校 創(chuàng)建linux , python , go 3個課程,linuxpy在北京開, go 在上海開 課程包含,周期,價格,通過學校創(chuàng)建課程 通過學校...
摘要:需要對每個用戶的每個內(nèi)容對象維護一個數(shù)據(jù)結構。并沒有直接和相連,所以是將數(shù)據(jù)由暫存的內(nèi)存中取出。采用實現(xiàn)的可用進行數(shù)據(jù)提交。記錄的完成情況,包括未嘗試未學習未完成,已完成。 簡介 SCORM定義了一個網(wǎng)絡化學習的內(nèi)容聚合模型(Content Aggregaion Model)和學習對象的實時運行環(huán)境(Run-time Environment)。簡單說,它是為了滿足對網(wǎng)絡化學習內(nèi)容的高水...
摘要:不過,蘋果實驗室作為計算機學院的學習類組織,撰寫此貼的內(nèi)容集中于本科期間學習路線的宏觀規(guī)劃建議。其中主要問題大概是初入大學的迷茫與美好大學愿景之間的矛盾自主學習能力的欠缺與遠大志向的矛盾。 ...
閱讀 2863·2021-11-25 09:43
閱讀 2510·2021-10-09 09:44
閱讀 2819·2021-09-22 15:49
閱讀 2597·2021-09-01 11:43
閱讀 2561·2019-08-30 14:16
閱讀 483·2019-08-29 17:24
閱讀 3033·2019-08-29 14:00
閱讀 1397·2019-08-29 13:05