




已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
課程設(shè)計 計算機學(xué)院班 課程設(shè)計實驗報告課程管理系統(tǒng)計算機科學(xué)與工程學(xué)院班董永博 陳佳興 田晨光 趙炳舒 歐 靜 目錄題目-3分析過程與思路-3算法-5函數(shù)模塊介紹-9源程序-10運行結(jié)果-36課程設(shè)計總結(jié)-42一 題目課程管理系統(tǒng)二 分析過程與思路課程管理系統(tǒng)首先要能夠分別實現(xiàn)課程信息的增加、刪除、查詢、修改。為了增加程序的實用性,應(yīng)當(dāng)能夠?qū)⑤斎氲恼n程信息通過存文件的方式將課程信息存入硬盤。而使用系統(tǒng)的可能是學(xué)生和管理員兩類,因此要實現(xiàn)根據(jù)登錄類型來開放應(yīng)有的功能。由于課程信息包含很多成員,例如課程編碼、課程名等。因此應(yīng)該用鏈表對信息進行記錄,由于不清楚課程總數(shù),因此需要用動態(tài)鏈表。動態(tài)鏈表的使用需要聲明合適的結(jié)構(gòu)體,數(shù)據(jù)域中應(yīng)包含課程所包含的各個成員、指針域用來指向下一個結(jié)點。動態(tài)鏈表的建立需要用到malloc函數(shù)。對已經(jīng)建立的鏈表需要存入文件,需要用到fwrite、fread、feof等文件處理函數(shù),保存文件要多次用到,因此應(yīng)該獨立做一個函數(shù)。刪除函數(shù)要用到諸如free函數(shù),為了防止刪除的結(jié)點為首結(jié)點,刪除后找不到頭結(jié)點,因此刪除函數(shù)應(yīng)該是一個指針函數(shù),用以返回刪除后的新的頭結(jié)點。登錄函數(shù)要返回一個值用以在其他函數(shù)中判斷登錄類型,以便針對用戶開放相應(yīng)的功能。課程管理系統(tǒng)登錄key學(xué)生登錄mainpage()管理員登陸mainpage()查詢serch()查詢serch()輸入inpt()添加add()刪除dele()修改alter()程序功能結(jié)構(gòu)示意圖三 算法NY21開始輸入登錄類型oO=?學(xué)生登錄管理員登錄mainpage()key函數(shù)簡單算法字符串相等1輸入mm=?serch()退出inpt()結(jié)束O=?mainpage函數(shù)算法簡單示意Save函數(shù)21!17&!2開辟新節(jié)點輸入新節(jié)點數(shù)據(jù)輸入zz=?inpt函數(shù)算法簡單示意開辟新節(jié)點結(jié)點相連YNYNYNYserch函數(shù)查看方式n=0?打開文件文件為空開辟結(jié)點讀取文件數(shù)據(jù)已讀完文件為空Mainpage函數(shù)輸出一個結(jié)點完畢?查詢方式結(jié)點遍歷查找輸出重新?操作?添加add修改alter刪除deleSerch函數(shù)算法簡單示意NY輸入數(shù)據(jù)滿足條件異常處理示意p1-前一結(jié)點p2-當(dāng)前結(jié)點p1-next=p2刪除首結(jié)點head=p1-nextfree(p2)return(head)free(p1)刪除函數(shù)簡單示意四 函數(shù)模塊介紹void inpt();/輸入函數(shù):用以輸入一系列數(shù)據(jù),在文件中沒有課程信息數(shù)據(jù)或者需要全部更新時使用該函數(shù)模塊。void serch();/查詢函數(shù),用以查詢已經(jīng)存儲的課程信息。并通過調(diào)用其他函數(shù),來對課程信息進行一系列操作。void alter(int all,int b,lesson *head);/修改函數(shù),用以小規(guī)模的修改已經(jīng)存儲的課程信息。lesson *dele(int all,int b,lesson *head);/刪除函數(shù),用以刪除一些已經(jīng)失效了的課程信息。通過返回新鏈表的頭指針,以便對新鏈表進行一系列操作。void save(int n,lesson *p);/保存函數(shù),用以將已經(jīng)建立的鏈表存入硬盤,便于隨時使用。void output(struct lesson *q2);/輸出函數(shù),用以將課程信息輸出到屏幕上顯示出來。void add(int all,lesson *head);/添加,用以在原課程信息的基礎(chǔ)上添加新的課程信息。void mainpage();/主界面函數(shù)int key();/登錄函數(shù),通過返回值來判斷用戶類型,以開放不同的功能。五 源程序#include#include#include#define len sizeof(struct lesson)#define print printf(輸入數(shù)據(jù)有誤,請重新輸入!n);int n,temp,o;struct lessonchar num5;/課程編碼char proj10;/課程名char crdt4;/學(xué)分char hour3;/學(xué)時char term2;/學(xué)期char week5;/周次char date5;/周日期(周幾)char period5;/節(jié)次char room6;/教室struct lesson *next;/結(jié)構(gòu)體指針;void inpt();/輸入函數(shù)void serch();/查詢函數(shù)void alter(int all,int b,lesson *head);/修改函數(shù)lesson *dele(int all,int b,lesson *head);/刪除函數(shù)void save(int n,lesson *p);/保存函數(shù)void output(struct lesson *q2);/輸出函數(shù)void add(int all,lesson *head);/添加void mainpage();/主界面函數(shù)int key();/登錄函數(shù)int main()/ 田晨光o=key();/調(diào)用登錄函數(shù)mainpage();/調(diào)用主界面 return 0;void mainpage()/主界面函數(shù) 董永博int m=1;while(m=1)printf(*n);/ printf(* 輸入1增加課程 *n); printf(* 輸入2查詢課程 *n); printf(* 輸入3退出程序 *n); printf(*nn);doscanf(%d,&m);if(m3) print;/該循環(huán)體使用戶輸入選項代碼并判斷代碼是否合理while(m3); system(CLS);/清除屏幕內(nèi)容 switch(m)/通過switch語句轉(zhuǎn)向用戶選擇的功能函數(shù) case 1:inpt();break;/調(diào)用輸入函數(shù) case 2:serch();break;/調(diào)用查詢函數(shù) case 3:exit(0);break;/退出void inpt()/輸入函數(shù) 田晨光if(o=1)system(CLS);/清屏printf(沒有權(quán)限,請聯(lián)系管理員!n);mainpage();int k=1,z,x,i;struct lesson *head;/聲明一個lesson類型的結(jié)構(gòu)體指針,作為頭指針。struct lesson *p1,*p2;/聲明兩個lesson類型的結(jié)構(gòu)體指針,建造鏈表。p1=p2=(struct lesson *)malloc(len);/使兩個結(jié)構(gòu)體指針都指向第一個節(jié)點n=0;/n用來從零開始記錄當(dāng)前為第幾節(jié)點 while(k=1)/循環(huán)輸入n=n+1;/循環(huán)體每執(zhí)行一次使n加1printf(請輸入課程編碼(1-4位字符串 例:001)n);/輸入數(shù)據(jù)doscanf(%s,&p1-num);if(strlen(p1-num)4) print;while(strlen(p1-num)4);printf(請輸入課程名(1-10位字符串 例:math)n);doscanf(%s,&p1-proj);if(strlen(p1-proj)10) print; while(strlen(p1-proj)10);printf(請輸入學(xué)分(兩位實數(shù),整數(shù)部分1位,小數(shù)部分1位,例:1.5)n);dox=0;scanf(%s,&p1-crdt);if(strlen(p1-crdt)4) print;elsefor(i=0;icrdt)i57|(p1-crdt)icrdt)4|x=1);printf(請輸入學(xué)時(兩位整數(shù) 例:32)n);dox=0;scanf(%s,&p1-hour);if(strlen(p1-hour)3) print;elsefor(i=0;ihour)i57|(p1-hour)ihour)3|x=1);printf(請輸入學(xué)期(以為整數(shù) 例:2)n);dox=0;scanf(%s,&p1-term);if(strlen(p1-term)2) print;elsefor(i=0;iterm)i57|(p1-term)iterm)2|x=1);printf(請輸入周次(例1-17)n);doscanf(%s,&p1-week);if(strlen(p1-week)5) print; while(strlen(p1-week)5); printf(請輸入日期(三位周日期 例:mon、sat)n);doscanf(%s,&p1-date);if(strlen(p1-date)3) print; while(strlen(p1-date)3); printf(請輸入節(jié)次(例:5-6)n);doscanf(%s,&p1-period);if(strlen(p1-period)5) print; while(strlen(p1-period)5);printf(請輸入教室(例:2-201)n);doscanf(%s,&p1-room);if(strlen(p1-room)6) print; while(strlen(p1-room)6);if(n=1) head=p1;/如果n=1,(即當(dāng)前為第一個節(jié)點),就使head指向頭結(jié)點,作為頭指針。system(CLS);/輸入完畢,清屏printf(*n);/輸出提示信息printf(* 輸入1繼續(xù)添加 *n); printf(* 輸入2保存并退出 *n); printf(*n);doscanf(%d,&z);if(z2) print;/該循環(huán)體使用戶輸入選項代碼并判斷代碼是否合理while(z2); if(z=1)/如果用戶選擇繼續(xù)添加,進入該分支p1=(struct lesson *)malloc(len);/利用malloc函數(shù),開辟一個新節(jié)點 (p2-next)=p1;/令前一個結(jié)構(gòu)體的next指針指向后一個節(jié)點,將兩個結(jié)構(gòu)體鏈接起來p2=p1;/令另一個指針也指向下一個節(jié)點,便于下次使用else/如果用戶選擇保存并退出選項,進入該分支。 (p2-next)=NULL;/令最后一個節(jié)點的next指針指向NULL; break;/跳出循環(huán)n=0-1;save(n,head);/調(diào)用save函數(shù),將已經(jīng)建立的鏈表存入文件mainpage();/返回主界面void save(int m,lesson *p)/save函數(shù),將數(shù)據(jù)保存到硬盤的文件中 歐靜FILE *fp;/聲明一個文件指針lesson *p1=p;/聲明一個結(jié)構(gòu)體指針fp=fopen(D:data.txt,wb);/以寫為目的打開D:data.txt路徑下的二進制文件while(p-next!=NULL)/當(dāng)指針p指向的節(jié)點中的next指針不為空時(證明沒有保存完畢),進入循環(huán)體 if(fwrite(p,len,1,fp)!=1) printf(保存文件失??!n);/用fwrite函數(shù)的返回值來反映是否成功保存每一個節(jié)點 else printf(保存文件成功!n);p=p1-next;/使結(jié)構(gòu)體指針指向下一個節(jié)點;p1=p;if(p-next=NULL&n=-1)if(fwrite(p,len,1,fp)!=1) printf(保存文件失敗!n);/用fwrite函數(shù)的返回值來反映是否成功保存每一個節(jié)點 else printf(保存文件成功!n); fclose(fp);/關(guān)閉文件void serch()/查詢函數(shù)(包含節(jié)點的刪除與修改) 董永博int i,k,m,j=1;/聲明一些需要用到的變量char p10;/聲明一個字符型數(shù)組,用以存放用戶輸入的需要查詢的相關(guān)信息struct lesson *q1,*q2,*head=NULL;/聲明讀取鏈表所需要的三個結(jié)構(gòu)體指針FILE *fp;/聲明一個文件指針do fp=fopen(D:data.txt,rb);/以讀取為目的打開D:data.txt路徑下的二進制文件 if(ferror(fp) clearerr(fp);/如果打開文件錯誤,立即清除錯誤后產(chǎn)生的標記,便于文件下次正常打開 if(fp=NULL)/如果文件指針指向NULL(代表該文件不存在)則進入該分支 printf(無法打開文件!n); exit(0); q1=q2=(struct lesson *)malloc(len);/文件打開后,在內(nèi)存中開辟空間,存放文件讀取到的數(shù)據(jù) fread(q1,len,1,fp);/讀取第一個節(jié)點 if(feof(fp)/用feof函數(shù)的返回值來判斷該文件是否為空文件 printf(沒有存儲課程信息!n); mainpage(); q2=q1;/兩個指針同時指向第一個節(jié)點 m=0;/將m 清零,便于接下來記錄節(jié)點總數(shù) while(!feof(fp)/利用feof函數(shù)的返回值來判斷文件是否讀取完畢 m=m+1;/記錄節(jié)點數(shù) if(m=1)head=q1;/如果為第一個節(jié)點,使head指針指向該節(jié)點 q1=(struct lesson *)malloc(len);/繼續(xù)開辟下一個節(jié)點 q2-next=q1;/將新節(jié)點與上一個節(jié)點鏈接起來 q2=q1; fread(q1,len,1,fp);/讀取文件內(nèi)容,存入新節(jié)點 q2-next=NULL;/文件讀取完畢后,令鏈表的最后一個節(jié)點的next指針指向NULL q1=q2=head;/兩個結(jié)構(gòu)體指針重新指向頭結(jié)點printf(*n);/輸出提示信息 printf(* 輸入0查看全部課程 *n); printf(* 輸入1按課程名查詢 *n); printf(* 輸入2按課程編碼查詢 *n); printf(* 輸入3按周日期查詢 *n); printf(* 輸入4按起始周查詢 *n);printf(* 輸入5返回主界面 *n); printf(*nn); do scanf(%d,&k); if(k5) print; while(k5); switch(k) case 0:/當(dāng)用戶選擇查看全部課程信息時,進入該分支printf(課程編碼 課程名 學(xué)分 學(xué)時 學(xué)期 周次 日期 節(jié)次 教室n); for(i=1;inext;/指針指向下一個結(jié)點 q2=q1;q2-next=NULL; break; case 1:/當(dāng)用戶選擇按課程名查詢時,進入該分支 printf(請輸入課程名!(1-10位字符串 例:math)n); do scanf(%s,&p); if(strlen(q1-proj)10) print; while(strlen(q1-proj)10);/輸入要查詢的課程名 temp=0;/將temp歸零,便于記錄所查詢到的節(jié)點為第幾節(jié)點,便于下面修改函數(shù)和刪除函數(shù)的查找 do if(!strcmp(q2-proj,p)/通過字符串比較來查找需要查找的信息 temp=temp+1;/記錄節(jié)點數(shù) printf(查詢到%s相關(guān)的課程信息為:nn,p);printf(課程編碼 課程名 學(xué)分 學(xué)時 學(xué)期 周次 日期 節(jié)次 教室n); output(q2);/調(diào)用輸出函數(shù) break;/跳出循環(huán) else/如果內(nèi)容與用戶輸入字符串不相等,查找下一個節(jié)點j=j+1; q1=q2-next; q2=q1; while(q2-next!=NULL); if(temp=0) printf(未查詢到相關(guān)課程!n);/如果temp等于零,則代表沒有查詢到相關(guān)信息elseprintf(*n);/如果查詢到相關(guān)課程 printf(* 輸入0修改課程信息 *n); printf(* 輸入1刪除課程信息 *n);printf(* 輸入2添加課程信息 *n);printf(*n);do scanf(%d,&k); if(k2) print; while(k2);if(o=1) printf(對不起,您沒有權(quán)限!請聯(lián)系管理員!n);/如果學(xué)生登錄,由于key函數(shù)返回值為1,就不開放刪除修改功能else/如果是管理員登錄,則可以使用刪除,修改,添加等功能switch(k)/通過管理員的選擇代碼,分別調(diào)用不同的函數(shù) case 0:alter(m,j,head);break;/調(diào)用修改函數(shù),將查詢到的課程的位置,鏈表的總節(jié)點數(shù)。鏈表的頭指針傳給函數(shù) case 1:head=dele(m,j,head);break;/調(diào)用刪除函數(shù),將返回的指針作為下一次打開的頭指針 case 2:add(m,head);break;/調(diào)用添加函數(shù),在鏈表的后面繼續(xù)添加 break; case 2: printf(請輸入課程編碼(1-4位字符串 例:001)n);/輸入數(shù)據(jù) do scanf(%s,&p); if(strlen(q1-num)4) print; while(strlen(q1-num)4); temp=0; do if(!strcmp(q2-num,p) temp=temp+1; printf(查詢到編碼為%s的課程信息為:nn,p);printf(課程編碼 課程名 學(xué)分 學(xué)時 學(xué)期 周次 日期 節(jié)次 教室n); output(q2); break; elsej=j+1; q1=q2-next; q2=q1; while(q2-next!=NULL); if(temp=0) printf(未查詢到相關(guān)課程!n);elseprintf(*n); printf(* 輸入0修改課程信息 *n); printf(* 輸入1刪除課程信息 *n); printf(* 輸入2添加課程信息 *n);printf(*n);do scanf(%d,&k); if(k2) print; while(k2);if(o=1) printf(對不起,您沒有權(quán)限!請聯(lián)系管理員!n);elseswitch(k) case 0:alter(m,j,head);break; case 1:head=dele(m,j,head);break; case 2:add(m,head);break; break; case 3: printf(請輸入周日期!(三位周日期 例:mon、sat)n); do scanf(%s,&p); if(strlen(q1-date)3) print; while(strlen(q1-date)3); temp=0; do if(!strcmp(q2-date,p)temp=temp+1; printf(查詢到%s的課程信息為:nn,p);printf(課程編碼 課程名 學(xué)分 學(xué)時 學(xué)期 周次 日期 節(jié)次 教室n); output(q2); break; elsej=j+1; q1=q2-next; q2=q1; while(q2-next!=NULL); if(temp=0) printf(未查詢到相關(guān)課程!nn);elseprintf(*n); printf(* 輸入0修改課程信息 *n); printf(* 輸入1刪除課程信息 *n);printf(* 輸入2添加課程信息 *n);printf(*n);do scanf(%d,&k); if(k2) print; while(k2);if(o=1) printf(對不起,您沒有權(quán)限!請聯(lián)系管理員!n);elseswitch(k) case 0:alter(m,j,head);break; case 1:head=dele(m,j,head);break; case 2:add(m,head);break; break; case 4: printf(請輸入起始周(例1-17)!n); do scanf(%s,&p); if(strlen(q1-week)5) print; while(strlen(q1-week)5); temp=0; do if(!strcmp(q2-week,p)temp=temp+1; printf(查詢到%s周的課程信息為:nn,p);printf(課程編碼 課程名 學(xué)分 學(xué)時 學(xué)期 周次 日期 節(jié)次 教室n); output(q2); break; elsej=j+1; q1=q2-next; q2=q1; while(q2-next!=NULL); if(temp=0) printf(未查詢到相關(guān)課程!n);elseprintf(*n); printf(* 輸入0修改課程信息 *n); printf(* 輸入1刪除課程信息 *n);printf(* 輸入2添加課程信息 *n);printf(*n);do scanf(%d,&k); if(k2) print; while(k2);if(o=1) printf(對不起,您沒有權(quán)限!請聯(lián)系管理員!n);elseswitch(k) case 0:alter(m,j,head);break; case 1:head=dele(m,j,head);break; case 2:add(m,head);break; break;case 5:mainpage();break;/返回主界面 printf(*n); printf(* 輸入0終止查詢并返回主界面 *n); printf(* 輸入1重新查詢 *n);printf(*n);scanf(%d,&j);system(CLS); while(j);if(j=0) mainpage();void alter(int all,int b,lesson *head)/修改課程函數(shù) 趙炳舒lesson *q1,*q2;int k,i,x;q1=q2=head;for(i=2;inext;q2=q1;printf(您要修改的課程為:n);printf(課程編碼 課程名 學(xué)分 學(xué)時 學(xué)期 周次 日期 節(jié)次 教室n);output(q2);printf(*n);/輸出提示信息 printf(* 輸入0修改課程編碼 *n); printf(* 輸入1修改課程名 *n);printf(* 輸入2修改學(xué)分 *n); printf(* 輸入3修改學(xué)時 *n);printf(* 輸入4修改學(xué)期 *n); printf(* 輸入5修改周次 *n);printf(* 輸入6修改日期 *n); printf(* 輸入7修改節(jié)次 *n);printf(* 輸入8修改教室 *n);printf(*nn); do scanf(%d,&k); if(k8) print; while(k8);switch(k)case 0:printf(您要修改的原編碼為%sn,q1-num);/提示修改的內(nèi)容printf(請輸入新編碼(1-4位字符串 例:001):n); do scanf(%s,&q1-num); if(strlen(q1-num)4) print; while(strlen(q1-num)4);printf(修改成功,結(jié)果為:n);printf(課程編碼 課程名 學(xué)分 學(xué)時 學(xué)期 周次 日期 節(jié)次 教室n);output(q1);/輸出修改后本結(jié)點內(nèi)所有數(shù)據(jù)save(all,head);/保存修改break;/跳出case 1:printf(您要修改的原課程名為%sn,q1-proj);printf(請輸入新課程名(1-10位字符串 例:math):n);do scanf(%s,&q1-proj); if(strlen(q1-proj)10) print; while(strlen(q1-proj)10);printf(修改成功,結(jié)果為:n);printf(課程編碼 課程名 學(xué)分 學(xué)時 學(xué)期 周次 日期 節(jié)次 教室n);output(q1);save(all,head);break;case 2:printf(您要修改的原學(xué)分為%fn,q1-crdt);printf(請輸入新學(xué)分:n); do x=0; scanf(%s,&q1-crdt); if(strlen(q1-crdt)4) print; else for(i=0;icrdt)i57|(q1-crdt)icrdt)4|x=1);printf(修改成功,結(jié)果為:n);printf(課程編碼 課程名 學(xué)分 學(xué)時 學(xué)期 周次 日
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 油田鉆井用APF可行性報告
- 2025年污水流量計行業(yè)市場調(diào)查報告
- 中國硼酰化鈷項目商業(yè)計劃書
- 運動康復(fù)培訓(xùn)計劃書
- 業(yè)務(wù)承攬合同轉(zhuǎn)讓協(xié)議書
- 板材購銷合同協(xié)議書范本
- 家紡加盟合同協(xié)議書
- 淡墨軒學(xué)生文化用具連鎖股份有限公司的創(chuàng)業(yè)企劃書
- 2025年特種線纜材料項目可行性分析報告
- 2025年電動平板車市場分析報告
- 國際財務(wù)管理教學(xué)ppt課件(完整版)
- DB33∕T 715-2018 公路泡沫瀝青冷再生路面設(shè)計與施工技術(shù)規(guī)范
- 彩色簡約魚骨圖PPT圖表模板
- 光引發(fā)劑的性能與應(yīng)用
- PID控制經(jīng)典PPT
- 圖像處理和分析(上冊)課后習(xí)題答案(章毓晉)
- 油田注入水細菌分析方法+絕跡稀釋法
- 醫(yī)師處方權(quán)申請
- 簡易充電器課程設(shè)計
- 部編版語文三年級下冊課外閱讀
- 門診疾病診斷證明書模板
評論
0/150
提交評論