學生成績管理系統[共28頁]
《學生成績管理系統[共28頁]》由會員分享,可在線閱讀,更多相關《學生成績管理系統[共28頁](28頁珍藏版)》請在裝配圖網上搜索。
1、成績評定 教師簽名 嘉應學院 計算機學院 《數據結構》實驗報告 課程名稱: 數據結構 開課學期: 2016-2017學年第1學期 班 級: 1401 指導老師: 鐘治初 實驗題目: 學生成績管理系統 學 號: 141110043 姓 名: 蘇永達 提交時間: 2016年10月27日 一、 實驗要求: (1) 設計一個學生成績管理系統,模擬高考成績的管理。功能至少包括數據輸入,輸出,查找,插入,刪除,修改,排序,統計各成績段的人數,考生成績的排位,報考志愿的檢索等。
2、(2) 所有輸入輸出數據均使用文本文件進行讀寫。 (3) 所有過渡性數據使用二進制文件進行讀寫和保存。 (4) 設計使用平行志愿進行出檔。 (5) 設計使用非平行志愿行進出檔。 (6) 設計志愿時,可以設計12個志愿,如果平行志愿,則前后各6個分別為第一組和第二組平行志愿處理。 (7) 設計考生記錄的字段時,可以預留補錄志愿的字段?;蛘邔⑽翠浫】忌臄祿M行備份,然后將志愿清空后再增加補錄志愿。 28 二、功能: (1) 按學號順序輸入學生信息,包括學號、姓名、性別、課程單科成績(單科成績包括C語言、高數、大學語文、匯編、中近史),并存入文件中。 (2) 從文件讀取數據
3、 (3) 刪除學生信息 (4) 查詢學生信息(查詢可分為精確查詢和模糊查詢) (5) 修改學生信息(要求修改后,數據依然是按學號順序排列) (6) 插入學生信息(要求插入后,數據依然是按學號順序排列) (7) 附加功能,學生可自由發(fā)揮,如:排名、求各門課程平均分等。 三、實驗目的 1、掌握和鞏固C語言編寫的相關知識和技巧,特別是函數、指針、結構體。 2、能夠采用模塊化思想調試程序。 3、通過該課程設計的操作與實踐,能夠根據數據對象的特性,學會數據組織的方法,把現實世界中的實際問題在計算機內部表示出來,并培養(yǎng)基本的、良好的程序設計技能,全面提高學生的程序設計、開發(fā)能力。 四、
4、系統分析 4.1 相關基礎知識 選擇、循環(huán)、函數、指針、結構體、鏈表 4.2 總體方案 架構圖: 方案描述: 菜單:運用switch case選擇功能,在每個case中有相對應的調用語句,調用相對應的函數。 刪除功能:調用刪除函數,判斷是否保存,如果保存寫入文件。 插入功能:運用鏈表插入。 修改功能:調用刪除函數跟插入函數,先刪除再插入,從而實現修改功能。 查詢功能:調用菜單中的查詢函數,用循環(huán)實現查詢功能。 排名功能:調用菜單中的排名函數,通過冒泡排序法實現功能。 保存功能:運用寫入文件。 五、系統設計 定義
5、一個student類型的結構體,里面包含學生信息,包括學號、姓名、性別、課程單科成績(單科成績包括C語言、高數、大學語文、匯編、中近史)、總分、平均成績。 5.1 新建功能 從鍵盤輸入N個學生基本信息,包括學號、姓名、性別、課程單科成績(單科成績包括C語言、高數、大學語文、匯編、中近史),編程根據輸入信息計算各學生總分和平均分。 創(chuàng)建動態(tài)鏈表,將學生信息存入鏈表中。在DOS屏幕上打印鏈表內所有學生信息。 新建一個文件,將動態(tài)鏈表中的數據(即輸入的學生信息)存入文件中。 5.2 打開功能 打開一個文件,從文件中讀取學生信息,并新建鏈表,將數據存入動態(tài)鏈表。 在DOS屏幕上打印鏈表
6、內所有學生信息。 5.3 修改功能 在DOS屏幕上打印出當前的所有學生信息。 輸入待修改的學生學號,若不存在,輸出“查無此人”;若存在,則輸入修改的信息,并存回學生信息鏈表中,存回后學生信息鏈表依然是按學號順序排列。 最后在DOS屏幕上打印出新的所有學生信息。 5.4 插入功能 在DOS屏幕上打印出當前的所有學生信息。 輸入插入信息的條數,從第一條開始到最后一條,依次輸入每條學生信息,包括學號、姓名、性別、課程單科成績(單科成績包括C語言、高數、大學語文、匯編、中近史),根據輸入信息計算各學生總分和平均分。 若輸入的學生學號已經存在,則輸出“該學號已存在,無法操作!”,
7、否則將學生信息插入到鏈表中,插入后鏈表中的數據依然按照學號排列。 最后在DOS屏幕上打印出新的所有學生信息。 5.5 查詢功能 查詢分為:精確查詢、模糊查詢 精確查詢: (1) 按姓名查詢 輸入待查詢的姓名; 根據順序查詢的方法,對學生的姓名依次查詢,直到查詢到與輸入的信息相匹配的信息,并在DOS屏幕上顯示出來。若需要查詢的信息不存在,系統則會提示找不到此人??芍貜筒樵?。 (2) 按學號查詢 輸入待查詢的學號; 根據順序查詢的方法,對學生的學號依次查詢,直到查詢到與輸入的信息相匹配的信息,并在DOS屏幕顯示出來。若需要查詢的信息不存在,系統則會提示找不
8、到此人。可重復查詢。 模糊查詢: (1) 按姓氏查詢 輸入待查詢的姓氏; 根據順序查詢的方法,對學生的姓依次查詢,當查詢到與輸入的信息相匹配的信息,則在DOS屏幕顯示出來,直到鏈表結束。若需要查詢的信息不存在,系統則會提示找不到相關信息??芍貜筒樵?。 (2) 按性別查詢 輸入待查詢的性別; 根據順序查詢的方法,對學生的性別依次查詢,當查詢到與輸入的信息相匹配的信息,則在DOS屏幕顯示出來,直到鏈表結束。可重復查詢。 5.6 刪除功能 在DOS屏幕上打印出當前的所有學生信息。 (1)按姓名刪除 輸入需要刪除的學生姓名; 根據順序查詢
9、的方法,對學生的姓名依次查詢,當查詢到與輸入的信息相匹配的信息,則刪除該生信息,并在DOS屏幕顯示出新的所有學生信息。若需要刪除的信息不存在,系統則會提示刪除失敗。 (2)按學號刪除 輸入需要刪除的學生學號; 根據順序查詢的方法,對學生的學號依次查詢,當查詢到與輸入的信息相匹配的信息,則刪除該生信息,并在DOS屏幕顯示出新的所有學生信息。若需要刪除的信息不存在,系統則會提示刪除失敗。 5.7排名功能 可根據學生的總分進行排名,并在DOS屏幕上輸出排名結果。 5.8 關于我們 在DOS屏幕上輸出系統相關信息。 5.9 軟件說明 5.10 退出保存 選擇
10、‘0’退出系統,保存功能在每段函數結束后實現。 5.10運行結果 5.10.0 主界面 5.10.1 新建文件(輸入一組數據,存入文件中) 5.10.2 打開文件(打開文件,讀取文件數據存入鏈表) 5.10.3 修改功能 5.10.4 插入功能 5.10.5 查詢功能 精確查詢-按姓名查詢 精確查詢-按學號查詢 模糊查詢-按姓氏查詢 模糊查詢-按性別查詢 5.10.6 刪除功能 按姓名刪除 按學號刪除 5.10.7 總分排名功能 5.10.9 軟件說明
11、5.10.10 退出保存
保存功能在每段函數結束后實現。
六、心得體會
通過這次實驗我們更好的掌握和鞏固C語言編寫的相關知識和技巧,特別是函數、指針、結構體、鏈表等功能。通過該課程設計的操作與實踐,能夠根據數據對象的特性,學會數據組織的方法,把現實世界中的實際問題在計算機內部表示出來,并培養(yǎng)基本的、良好的程序設計技能,雖然在設計過程中遇到了不少問題麻煩,在教材數據的幫助下,完成了這次程序設計。
七、源代碼
#include
12、----------------------------------------*/ #define LEN sizeof(struct student)//結構體長度 /*---------------------------------------------------------*/ #define NEW (struct student *)malloc(LEN) /*---------------------------------------------------------*/ FILE *fp;/*文件指針*/ /*---------------------
13、------------------------------------*/ struct student { int num; char name[20]; int score1,score2,score3,score4,score5; char sex; double aver; float sum; struct student *next; }; char filename[100]; struct student *creat( ) { struct student *h; struct student *p,*q;
14、 printf("需要輸入幾條信息:"); int i,n; scanf("%d",&n); printf("\n----------請按學號順序依次輸入學生信息----------\n"); char c=getchar(); h=NULL; for(i=1;i<=n;i++) { p=NEW; if (p==NULL) { printf("Allocation failure\n"); exi
15、t(0);
}
printf("\n");
printf("輸入姓名<如:zhangsan>: ");
gets(p->name);
printf("輸入學號<如:1>: ");
scanf("%d",&p->num);
c=getchar();
printf("輸入性別
16、ntf("輸入高數成績: "); scanf("%d",&p->score2); printf("輸入大學語文成績: "); scanf("%d",&p->score3); printf("輸入匯編語言成績: "); scanf("%d",&p->score4); printf("輸入中近史成績: "); scanf("%d",&p->score5); c=getchar(); p->sum=p->score1+p->score2+p->score3+p->score4+p->score5; p->aver=(p->score1+p-
17、>score2+p->score3+p->score4+p->score5)/5.0; p->next=NULL; if (h==NULL) /* h為空,表示新結點為第一個結點 */ h=p; /* 頭指針指向第一個結點 */ else /* h不為空 */ q->next=p; /* 新結點與尾結點相連接 */ q=p;/* 使q指向新的尾結點 */ } return
18、 h; } struct student *paixu (struct student *head) /* 總分排名 */ { system("cls"); printf("總分排名如下:\n"); struct student *op; struct student *p; struct student *p1,*p2; p1 = (struct student *) malloc (LEN); p1->next = head; head = p1;
19、 for (op = NULL; op != head; op = p) { for (p = p1 = head; p1->next->next!=op; p1 = p1->next) { if (p1->next->sum < p1->next->next->sum) { p2 = p1->next->next; p1->next->next
20、= p2->next; p2->next = p1->next; p1->next = p2; p = p1->next->next; } } } p1 = head; head = head->next; free (p1); p1 = NULL; return
21、head; } void prlist(struct student *head)/*輸出函數*/ { struct student *p; p=head; printf("\n學號 姓名 性別 c語言 高數 大學語文 匯編語言 中近史 總分 平均分\n"); while (p!=NULL) { printf("%d %s %c %d %d %d %d %d %.1f %.2f\n",p->num,p->name,p->sex,p-
22、>score1,p->score2,p->score3,p->score4,p->score5,p->sum,p->aver); p=p->next; } system("pause"); } /*-------------------------------------write將數據存入文件-------------------------------------------*/ void write(struct student *head) { struct student *p; p=head; if(he
23、ad!=NULL) { while(p!=NULL) { fwrite(p,LEN,1,fp); p=p->next; } } printf("文件更新成功!\n"); fclose(fp); system("pause"); system("cls"); } /*-------------------------------------read將文件數據讀入一個新鏈表中-------------------------------------------*/ struct student *read
24、(void) { struct student *head; struct student *p1,*p2; head=NULL; p1=NEW; rewind(fp);//指向文件頭 fread(p1,LEN,1,fp); while(!feof(fp)) { if(head==NULL) head=p1; else p2->next=p1; p2=p1; p1=NEW; fread(p1,LEN,1,f
25、p); } p2->next=NULL; fclose(fp); return(head); } void find(struct student *head)/* 查詢功能 */ { int t,s,i,j; struct student *p,*q; char x[10],y[2]={"0"},c[2]; char k,f; p=head; printf("精確查找:\n *1 按姓名查找\n *2 按學號查找\n 模糊查找\n *3 按姓氏查找:\n *4 按性別查找\n");
26、 scanf("%d",&s); k=getchar(); if(s==1) {printf("請輸入姓名:"); gets(x); while (p!=NULL) { if (strcmp(x,p->name)==0) { printf("\n學號 姓名 性別 c語言 高數 大學語文 匯編語言 中近史 總分 平均分\n"); printf("%d %s %c %d %d %d %d %d %.1f
27、 %.2f\n",p->num,p->name,p->sex,p->score1,p->score2,p->score3,p->score4,p->score5,p->sum,p->aver); j=1;} else i=1; q=p;p=p->next; } } else if(s==2) {printf("按學號查找:\n"); scanf("%d",&t); while (p!=NULL) { if (t==p->num) { printf("\n學號 姓名 性別 c語言 高數 大學
28、語文 匯編語言 中近史 總分 平均分\n"); printf("%d %s %c %d %d %d %d %d %.1f %.2f\n",p->num,p->name,p->sex,p->score1,p->score2,p->score3,p->score4,p->score5,p->sum,p->aver); j=1;} else i=1; q=p;p=p->next; } } else if(s==3) { printf("按姓氏查詢:\n")
29、; gets(c); while ( p!=NULL) { if (strncmp(c,p->name,1)==0) { printf("\n學號 姓名 性別 c語言 高數 大學語文 匯編語言 中近史 總分 平均分\n"); printf("%d %s %c %d %d %d %d %d %.1f %.2f\n",p->num,p->name,p->sex,p->score1,p->score2,p->sc
30、ore3,p->score4,p->score5,p->sum,p->aver); j=1;} else i=1; q=p;p=p->next; } } else if(s==4) { printf("按性別查詢:\n"); f=getchar(); while(p!=NULL) { if(f==p->sex) { printf("\n學號 姓名 性別 c語言 高數 大學語文 匯編語言 中近史 總分 平均分\n"); printf("%d %s %c
31、 %d %d %d %d %d %.1f %.2f\n",p->num,p->name,p->sex,p->score1,p->score2,p->score3,p->score4,p->score5,p->sum,p->aver); j=1;} else i=1; q=p;p=p->next; } } if(i=1&&j!=1) printf("Not found.輸入錯誤\n"); system("pause"); system("cls"); }
32、 struct student *delstudent(struct student *head)/* 刪除功能 */ { int s,n,m=1; char c; struct student *p,*q; char x[10]; while(m) {printf(" *1 按學號刪除\n *2 按姓名刪除\n"); scanf("%d",&s); c=getchar(); printf("已有信息如下:\n"); prlist(head); if (head==NULL
33、) { printf("This is a empty list."); return head; } p=head; switch(s) { case 2: { printf("請輸入姓名:"); gets(x); while (strcmp(x,p->name)!=0 && p->next!=NULL) { q=p;p=p->next;} if (strcmp(x,p->name)==0) { if (p==head) head=p->nex
34、t; else q->next=p->next; free(p); } else {printf("Not found.\n");continue; } };m=0;break; case 1: { printf("請輸入學號:"); scanf("%d",&n); c=getchar(); while (n!=p->num && p->next!=NULL)
35、 { q=p;p=p->next;} if (n==p->num) { if (p==head) head=p->next; else q->next=p->next; free(p); } else {printf("Not found.\n");continue; } };m=0;break; default: print
36、f("輸入錯誤\n");break; } } return head; } void about()/* 關于我們 */ { system("cls"); printf(" ∩_∞ , ∩_ ∩\n\n"); printf(" (●. ●) (●﹏●)\n\n"); printf(" /▓\ /█\ Hi\n\n"); pri
37、ntf(" 成員介紹\n\n"); printf(" 1.組長:\n\n"); printf(" 2.組員:\n\n"); printf(" 3.組員:\n\n"); printf(" 4.組員:\n\n"); printf(" 產品
38、信息\n\n"); printf(" 一.產品用途:主要用于學生成績管理與查詢.\n\n"); printf(" 二.班級成績管理系統主要包括:數據的錄入 \n\n"); printf(" 讀取 顯示 刪除 插入 查找 修改 排名.\n\n"); system("pause"); system("cls"); } void end() /*退出系統*/ { char s; printf("是否
39、退出系統Y/N?\n"); scanf("%c",&s); if(s==Y || s==y) exit(0); else if(s==N || s==n) return; else { printf("輸入錯誤,請重新輸入\n\n");system("pause");return; } } struct student *insert(struct student *head, struct student *op)/* 插入功能 */ { struct student *p,*q; if (head=
40、=NULL)
{ head=op; /* 空表時,插入結點 */
op->next=NULL;
}
else
{ p=head;
while (op->num > p->num && p->next!=NULL)
{ q=p;p=q->next; }
if (op->num==p->num)
{ printf("\n該學號已存在,無法插入!\n");
return head;
}
else if(op->num
41、{ if (p==head) head=op; /* 在表頭插入結點 */ else q->next=op; /* 在表中間插入結點 */ op->next=p; } else { p->next=op; /* 在表尾插入結點 */ op->next=NULL; } } return head; } struct studen
42、t *xiugai(struct student *head)/*修改功能*/ { struct student *op=NEW; int c; head=delstudent(head); printf("請輸入新名字:"); gets(op->name); printf("請輸入新學號:"); scanf("%d",&op->num); c=getchar(); printf("請輸入新性別:"); scanf("%c",&op->sex); printf("請輸入新C語言成績:"); scanf("%d",&op->sc
43、ore1); printf("請輸入新高數成績:"); scanf("%d",&op->score2); printf("請輸入新大學語文成績:"); scanf("%d",&op->score3); printf("請輸入新匯編成績:"); scanf("%d",&op->score4); printf("請輸入新中近史成績:"); scanf("%d",&op->score5); c=getchar(); op->sum=op->score1+op->score2+op->score3+op->score4+op-
44、>score5; op->aver=(op->score1+op->score2+op->score3+op->score4+op->score5)/5.0; op->next=NULL; head=insert(head,op); return head; } struct student *ca(struct student *head)/*插入功能*/ { struct student *op=NEW; char c; printf("請輸入名字:"); gets(op->name); printf("請輸
45、入學號:"); scanf("%d",&op->num); c=getchar(); printf("請輸入性別:"); scanf("%c",&op->sex); printf("請輸入C語言成績:"); scanf("%d",&op->score1); printf("請輸入高數成績:"); scanf("%d",&op->score2); printf("請輸入大學語文成績:"); scanf("%d",&op->score3); printf("請輸入匯編成績:"); scanf("%d",
46、&op->score4); printf("請輸入中近史成績:"); scanf("%d",&op->score5); c=getchar(); op->next=NULL; head=insert(head,op); op->sum=op->score1+op->score2+op->score3+op->score4+op->score5; op->aver=(op->score1+op->score2+op->score3+op->score4+op->score5)/5.0; return head; } void help()/* 軟件說明
47、*/ { system("cls"); printf("\n 說明 \n\n\n"); printf(" 運行本軟件需先使用新建文件或打開文件功能,否則運行出錯。\n"); printf(" 每次使用修改 插入 刪除等功能后需重新打開文件讀取數據,\n"); printf(" 否則得到的數據是未保存的。每運行完一個功能會自動返回到 \n"); printf(" 主界面。
48、 \n\n\n"); printf("\n\n 純屬原創(chuàng) 禁止抄襲 \n\n"); system("pause"); system("cls"); } /*-------------------主函數 菜單--------------------------------------*/ int main() { system("color 9f"); char c,r; struct student *head; int
49、z; while(1) { printf("\n"); printf(" ╔------------------------╗ \n\n"); printf(" 歡迎使用學生成績管理系統 \n\n"); printf(" ╚------------------------╝ \n\n"); printf("***********************************菜單***********************************\n\n"); p
50、rintf("==========================================================================\n\n"); printf("******* 1.新建文件 ***** 2.打開文件 *******"); printf("\n\n"); printf("******* 3.修改功能 ***** 4.插入功能 *******"); printf("\n\n"); printf("*****
51、** 5.查詢功能 ***** 6.刪除功能 *******"); printf("\n\n"); printf("******* 7.排名功能 ***** 8.關于我們 *******"); printf("\n\n"); printf("******* 9.軟件說明 ***** 0.退出系統 *******"); printf("\n\n"); printf("請輸入
52、指令:"); scanf("%d",&z); c=getchar(); switch(z) { case 1: printf("請輸入文件路徑和新建文件名(如:d://123):"); scanf("%s",filename);//---輸入文件名,如d://123 if((fp=fopen(filename,"w+"))==NULL)//W+先新建文件在寫入數據 { printf("新建文件失?。n"); } else { printf("新建文件成功!\n"); head=cre
53、at();write(head); };break; case 2:printf("\n\n讀取文件數據\n"); printf("請輸入讀取的文件路徑和文件名(如:d://123):"); scanf("%s",filename);/*---輸入文件名,如d://123----*/ c=getchar(); if((fp=fopen(filename,"r+"))==NULL)//r+讀文件 { printf("打開文件失敗\n"); } else { printf("打開文件成功\n");
54、 head=read();system("pause");printf("信息如下:\n"); prlist(head);system("cls"); };break; case 3:head=xiugai(head);prlist(head); printf("是否保存Y/N?\n");scanf("%c",&r); if(r==y||r==Y) {fp=fopen(filename,"w+");write(head);} else {printf("未保存\n");system("pause"
55、);system("cls");};break; case 4:head=ca(head);prlist(head); printf("是否保存Y/N?");scanf("%c",&r); if(r==y||r==Y) {fp=fopen(filename,"w+");write(head);}break; case 5:find(head);break; case 6:head=delstudent(head);prlist(head);printf("是否保存Y/N?\n");scanf("%c",&r)
56、; if(r==y||r==Y) {fp=fopen(filename,"w+");write(head);} else {printf("未保存\n");system("pause");system("cls");};break; case 7:head=paixu(head);prlist(head);system("cls");break; case 8:about();break; case 9:help();break; case 0:end();break; default:printf("輸入錯誤,請重新輸入\n");break; } } return 0; }
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。