學生成績管理系統基本C語言編寫匯編_第1頁
學生成績管理系統基本C語言編寫匯編_第2頁
學生成績管理系統基本C語言編寫匯編_第3頁
學生成績管理系統基本C語言編寫匯編_第4頁
學生成績管理系統基本C語言編寫匯編_第5頁
已閱讀5頁,還剩11頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、學習 好資料/代碼版權所有,不要#include "stdio.h" #include "stdlib.h" #include "string.h" #include "conio.h"copy,僅供參考學習。/標準輸入輸出函數庫/標準函數庫/字符串函數庫/屏幕操作函數庫更多精品文檔#defineHEADER1 "*學生成績信息* nn"#defineHEADER2 "學 號姓名計算機數學 英語總分平均分名次 nn"#define FORMAT "%-10s %-1

2、0s %5d %5d %5d %5d%.3f %4d n"DATA#define p->data.num,p->,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.total,p->data.a ve,p->data.mingciint saveflag=0;/是否需要存盤的標志變量/定義與學生有關的數據結構/標記為 student/學號/姓名 /計算機成績 /數學成績 /英語成績/總分/平均分/名次typedef struct student char num1

3、2; char name15; int cgrade; int mgrade; int egrade; int total;float ave; int mingci;sqlist;/定義每條記錄或結點的數據結構,標記為:nodetypedef struct nodestruct student data;/ 數據域struct node *next; /指針域Node,*Link;/Node 為 node 類型的結構變量, *Link 為 node 類型的指針變量void menu()/主菜單system("cls");/調用DOS 命令,清屏.與 clrscr() 功能

4、相同printf("n");printf("學生成績管理信息系統主菜單nn");printf("*n");printf("$1、添加記錄6、 統計記錄$n");printf("$2、刪除記錄7、 排序記錄$n");printf("$3、查找記錄8、保存記錄$n");printf("$4、修改記錄9、顯示記錄$n");printf("$5、插入信息0、退出系統$n");printf("*n");void printhe

5、ader() / 格式化輸出表頭printf(HEADER1);printf(HEADER2);void printdata(Node *pp) / 格式化輸出表中數據Node* p;p=pp;printf(FORMA T,DA TA);void Wrong()/輸出按鍵錯誤信息printf("nnnnn*Error: 輸入錯誤 !請按任意鍵繼續 !*n"); getchar();void Nofind()/輸出未查找此學生的信息 printf("n=> 未查找此學生的信息 !n");void Disp(Link l)/顯示單鏈表 l 中存儲的學生

6、記錄,內容為 student 結構中定義的內容Node *p;p=l->next; /l 存儲的是單鏈表中頭結點的指針,該頭結點沒有存儲學生信 息,指針域指向的后繼結點才有學生信息if(!p) /p=NULL,NUll 在 stdlib 中定義為 0 printf("n=> 無學生的記錄 !n"); getchar();return; printf("nn"); printheader();/輸出表格頭部while(p) /逐條輸出鏈表中存儲的學生信息printdata(p);p=p->next;/ 移動直下一個結點getchar();

7、 getchar();/*作用:用于定位鏈表中符合要求的節點,并返回指向該節點的指針參數: findmess 保存要查找的具體內容 ; nameornum 保存按什么查找 ;在單鏈表 l 中查找 ;*/Node* Locate(Link l,char findmess,char nameornum)Node *r; if(strcmp(nameornum,"num")=0) /按學號查詢r=l->next;while(r) if(strcmp(r->data.num,findmess)=0) /若找到 findmess 值的學號 return r;r=r->

8、;next;else if(strcmp(nameornum,"name")=0) /按姓名查詢r=l->next;while(r) if(strcmp(r->,findmess)=0) / 若找到 findmess 值的學生姓名 return r;r=r->next;return 0; / 若未找到,返回一個空指針/輸入字符串,并進行長度驗證 (長度 <lens) void stringinput(char *t,int lens,char *notice) char n255;do printf(notice);/顯示提示信息s

9、canf("%s",n);/輸入字符串if(strlen(n)>lens) printf("n 超出長度范圍,重新輸入 ! n"); / 進行長度校驗,超過 lens 值重新輸入while(strlen(n)>lens);strcpy(t,n); / 將輸入的字符串拷貝到字符串 t 中/輸入分數,0< =分數< =100)int numberinput(char *notice)int t=0;do printf(notice);/顯示提示信息scanf("%d",&t);/輸入分數if(t>10

10、0 | t<0) printf("n 分數必須在 0到 100之間! n"); /進行分數校驗while(t>100 | t<0);return t;/增加學生記錄void Add(Link l)Node *p,*r,*s; /實現添加操作的臨時的結構體指針變量char ch,flag=0,num12;r=l;s=l->next;system("cls");Disp(l); /先打印出已有的學生信息 while(r->next!=NULL)r=r->next;/將指針移至于鏈表最末尾,準備添加記錄while(1)/一次

11、可輸入多條記錄,直至輸入學號為 0 的記錄結點添加操作while(1)/輸入學號, 保證該學號沒有被使用, 若輸入學號為 0,則退出添加記錄操作stringinput(num,12,"n輸入學號 (按“0”返回菜單 !):"); /格式化輸入學號并檢驗flag=0; if(strcmp(num,"0")=0)/ 輸入為 0,則退出添加操作,返回主界面return;s=l->next;while(s)/查詢該學號是否已經存在,若存在則要求重新輸入一個未被占用的學號 if(strcmp(s->data.num,num)=0) flag=1; br

12、eak; s=s->next;if(flag=1) /提示用戶是否重新輸入 getchar(); printf("=> 學號 %s 存在 ,重試 ?(y/n):",num); scanf("%c",&ch); if(ch='y'|ch='Y') continue;elsereturn;else break;p=(Node *)malloc(sizeof(Node); /申請內存空間 if(!p)printf("n 內存空間申請失敗 ! "); / 如沒有申請到,打印提示信息 retu

13、rn ;/返回主界面 strcpy(p->data.num,num);/將字符串 num 拷貝到 p->data.num 中stringinput(p->,15," 姓名 :");p->data.cgrade=numberinput(" 計算機 0-100:"); / 輸入并檢驗分數,分數必須在0 100 之間p->data.mgrade=numberinput(" 數學 0-100:");/輸入并檢驗分數,分數必須在0100 之間p->data.egrade=numberinpu

14、t(" 英語 0-100:");/輸入并檢驗分數,分數必須在0100 之間p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade; / 計算總分 p->data.ave=(float)(p->data.total/3);/計算平均分p->data.mingci=0;r->next=p;/ 將新建的結點加入鏈表尾部中p->next=NULL;/ 表明這是鏈表的尾部結點r=p;saveflag=1;return ;/按學號或姓名,查詢學生記錄void Qur(Li

15、nk l)int select; /1: 按學號查, 2:按姓名查,其他:返回主界面(菜單)char searchinput20;/保存用戶輸入的查詢內容Node *p;if(!l->next)/若鏈表為空system("cls"); printf("n=> 無此學生的記錄 !n"); getchar();return;system("cls");printf("n=>1 按學號查詢 =>2 按名字查詢 n");printf("請選擇 1,2:");scanf("

16、;%d",&select);if(select=1)/按學號查詢stringinput(searchinput,12," 請輸入現有學生的學號 :"); p=Locate(l,searchinput,"num");/ 在 l 中查找學號為 searchinput 值的節點,并返回節 點的指針if(p) printheader(); printdata(p); printf(" 按任意鍵返回 !");getchar();elseNofind(); getchar();else if(select=2)/按姓名查詢str

17、inginput(searchinput,15," 請輸入現有學生的姓名 :"); p=Locate(l,searchinput,"name");if(p) printheader(); printdata(p);printf(" 按任意鍵返回 !"); getchar();elseNofind(); getchar();elseWrong();getchar();/刪除學生記錄:先找到保存該學生記錄的節點,然后刪除該節點 void Del(Link l)int sel;Node *p,*r;char findmess20; if(!

18、l->next)system("cls");printf("n=> 無此學生記錄 !n");getchar();return; system("cls");Disp(l);printf("n =>1 按學號刪除 =>2 按姓名刪除 n");printf(" 請選擇 1,2:");scanf("%d",&sel);if(sel=1)stringinput(findmess,12," 請輸入現有學生的學號 :"); p=Loca

19、te(l,findmess,"num");if(p)r=l;while(r->next!=p)r=r->next;r->next=p->next;/將 p 所指節點從鏈表中去除free(p);/釋放內存空間printf("n=> 刪除成功 !n");getchar();saveflag=1;elseNofind();getchar();else if(sel=2)/先按姓名查詢到該記錄所在的節點stringinput(findmess,15," 請輸入現有學生的姓名 "); p=Locate(l,find

20、mess,"name");if(p)r=l;while(r->next!=p)r=r->next;r->next=p->next;free(p);printf("n=> 刪除成功 !n");getchar();saveflag=1;elseNofind();getchar();elseWrong();getchar();/修改學生記錄。先按輸入的學號查詢到該記錄,然后提示用戶修改學號之外的值,學號不 能修改void Modify(Link l)Node *p;char findmess20; if(!l->next)s

21、ystem("cls");printf("n=> 無此學生記錄 !n"); getchar();return;system("cls");printf(" 修改學生記錄 !");Disp(l);stringinput(findmess,12," 請輸入現有學生的學號 :"); /輸入并檢驗該學號/查詢到該節點/ 若 p!=NULL, 表明已經找到該p=Locate(l,findmess,"num");if(p)節點printf(" 學號 :%s,n"

22、,p->data.num);printf(" 姓名 :%s,",p->);stringinput(p->,15," 輸入新的姓名 :"); printf(" 計算機 :%d,",p->data.cgrade);p->data.cgrade=numberinput(" 計算機 0-100:"); printf(" 數學 :%d,",p->data.mgrade);p->data.mgrade=numberinput(&q

23、uot; 數學 0-100:"); printf(" 英語 :%d,",p->data.egrade);p->data.egrade=numberinput(" 英語 0-100:");p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade;p->data.ave=(float)(p->data.total/3);p->data.mingci=0;printf("n=> 修改成功 !n");Disp(l)

24、;saveflag=1;elseNofind(); getchar();/插入記錄 :按學號查詢到要插入的節點的位置,然后在該學號之后插入一個新節點。void Insert(Link l)Link p,v,newinfo; /p 指向插入位置, newinfo 指新插入記錄char ch,n um12,s12;s保存插入點位置之前的學號,n um保存輸入的新記錄的學號int flag=0;v=l->next; system("cls");Disp(l);while(1)stringinput(s,12," 按學號查詢到要插入的節點的位置 :");f

25、lag=0;v=l->next;while(v)/查詢該學號是否存在, flag=1 表示該學號存在 if(strcmp(v->data.num,s)=0) flag=1;break; v=v->next;if(flag=1)break;/若學號存在,則進行插入之前的新記錄的輸入操作elsegetchar();printf("n=> 學號 %s 存在,重試 ?(y/n):",s);scanf("%c",&ch);if(ch='y'|ch='Y')continue;elsereturn;/以下

26、新記錄的輸入操作與Add() 相同stringinput(num,12," 請輸入新的學號 ! :"); v=l->next;while(v) if(strcmp(v->data.num,num)=0) printf("=>Sorry, 新學號 :'%s' 已存在 !n",num); printheader();printdata(v); printf("n"); getchar(); return;v=v->next;newinfo=(Node *)malloc(sizeof(Node);if

27、(!newinfo)printf("n 內存申請失敗 ! "); / 如沒有申請到,打印提示信息 return ;/ 返回主界面strcpy(newinfo->data.num,num); stringinput(newinfo->,15," 姓名 :"); newinfo->data.cgrade=numberinput(" 計算機 0-100:"); newinfo->data.mgrade=numberinput(" 數學 0-100:"); newinfo->

28、data.egrade=numberinput(" 英語 0-100:"); newinfo->data.total=newinfo->data.egrade+newinfo->data.cgrade+newinfo->data.mgrade; newinfo->data.ave=(float)(newinfo->data.total/3);newinfo->data.mingci=0; newinfo->next=NULL;saveflag=1; / 在 main() 有對該全局變量的判斷,若為1,則進行存盤操作將指針賦值給

29、 p,因為 l 中的頭節點的下一個節點才實際保存著學生的記錄p=l->next;while(1) if(strcmp(p->data.num,s)=0) / 在鏈表中插入一個節點 newinfo->next=p->next; p->next=newinfo; break;p=p->next;Disp(l);printf("nn");getchar();/統計該班的總分第一名和單科第一 ,和各科不及格人數void Tongji(Link l)Node *pm,*pe,*pc,*pt;/用于指向分數最高的節點Node *r=l->nex

30、t;int countc=0,countm=0,counte=0; / 保存三門成績中不及格的人數 fflush(stdin);if(!r)system("cls");printf("n=> 無此學生記錄 !n");getchar();return ;system("cls");Disp(l);pm=pe=pc=pt=r;while(r)if(r->data.cgrade<60) countc+;if(r->data.mgrade<60) countm+;if(r->data.egrade<6

31、0) counte+; if(r->data.cgrade>=pc->data.cgrade)pc=r;if(r->data.mgrade>=pm->data.mgrade) pm=r; if(r->data.egrade>=pe->data.egrade)pe=r;if(r->data.total>=pt->data.total) pt=r; r=r->next;printf("n 統計結果 n");printf("計算機 不及格:d (人)n",countc);printf

32、("數學 不及格:%d (人)n”,countm);printf("英語 不及格:%d (人)n”,counte);printf("n");printf(" 總分最高分姓名 :%s分數為:%dn",pt->,pt->data.total);printf(" 英語最高分姓名 :%s分數為:%dn",pe->,pe->data.egrade);printf(" 數學最高分姓名 :%s分數為:%dn",pm->,pm-

33、>data.mgrade);printf(" 計算機最高分 姓名 :%s 分數為 :%dn",pc->,pc->data.cgrade);printf("nn 按任意鍵返回 !");getchar();/利用插入排序法實現單鏈表的按總分字段的降序排序,從高到低 void Sort(Link l)Link ll;Node *p,*rr,*s; int i=0; if(l->next=NULL) system("cls"); printf("n=> 無此學生記錄 !n")

34、; getchar(); return ;ll=(Node*)malloc(sizeof(Node); if(!ll)printf("n 內存申請失敗 ! "); return ; ll->next=NULL; system("cls"); Disp(l); p=l->next; while(p) s=(Node*)malloc(sizeof(Node); 信息if(!s) printf("n 內存申請失敗 return ; s->data=p->data; s->next=NULL; rr=ll;/rr 鏈表于存

35、儲插入單個節點后保持排序的鏈表, 插入位置/用于創建新的節點/如沒有申請到,打印提示信息/返回主界面/顯示排序前的所有學生記錄/新建節點用于保存從原鏈表中取出的節點! "); / 如沒有申請到,打印提示信息 /返回主界面/填數據域/指針域為空ll 是這個鏈表的頭指針 ,每次從頭開始查找while(rr->next!=NULL && rr->next->data.total>=p->data.total) rr=rr->next; /指針移至總分比 p 所指的節點的總分小的節點位置if(rr->next=NULL)/ 若新鏈表

36、ll 中的所有節點的總分值都比 p->data.total 大時,就將 p 所指節點加入鏈表尾部rr->next=s;else/否則將該節點插入至第一個總分字段比它小的節點的前面s->next=rr->next;rr->next=s;p=p->next;/原鏈表中的指針下移一個節點l->next=ll->next; /ll 中存儲是的已排序的鏈表的頭指針 p=l-> next;/已排好序的頭指針賦給p,準備填寫名次while(p!=NULL)/當 p 不為空時,進行下列操作i+;/結點序號p->data.mingci=i; / 將名次

37、賦值 p=p->next;/指針后移Disp(l);saveflag=1;printf("n => 排序完成 !n");/數據存盤 ,若用戶沒有專門進行此操作且對數據有修改,在退出系統時,會提示用戶存盤void Save(Link l)FILE* fp;Node *p;int count=0;fp=fopen("c:student","wb"); /以只寫方式打開二進制文件if(fp=NULL)/打開文件失敗printf("n=> 打開文件失敗 !n");getchar();return ;p=l

38、->next;while(p) if(fwrite(p,sizeof(Node),1,fp)=1)/ 每次寫一條記錄或一個節點信息至文件 p=p->next;count+;elsebreak; if(count>0)getchar();printf("nnnnn=> 保存文件完成 , 總體保存的記錄是 :%dn",count); getchar();saveflag=0;elsesystem("cls");printf(" 連接為空,沒有保存學生的記錄 !n"); getchar(); fclose(fp);/關閉此文件void main()Link l;/定義鏈表FILE *fp;/文件指針int select;/ 保存選擇結果變量char ch;/保存 (y,Y,n,N)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論