




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、目 錄1. 需求分析22. 概要設計2 2.1 學生作業完成情況管理系統2 2.1.1 程序設計說明2 2.1.2 數據結構類型4 2.2 圖的建立及存儲4 2.2.1 程序設計說明4 2.2.2 數據結構類型43.詳細設計5 3.1 算法流程圖5 3.1.1 學生作業完成情況管理系統5 3.1.2 圖的建立及存儲64.調試分析(運行截圖)19 4.1學生作業完成情況管理系統19 4.2圖的建立及存儲305.課程總結326.參考文獻331. 需求分析(1) 學生作業完成情況管理系統假設某門課程一學期要留10次作業,每次老師要進行批改,給出分數后還要進行登記。學期期末要根據每次作業的成績計算出最
2、終的平時成績(滿分100)。該程序應該具有下列功能:(1) 輸入信息;(2) 輸出信息;(3) 給定條件,修改、刪除相應信息; (4) 按條件統計。(2) 圖的建立及存儲建立圖的存儲結構(圖的類型可以是有向圖、無向圖),能夠輸入圖的頂點和邊的信息,并存儲到相應存儲結構中,而后輸出圖的鄰接矩陣。 應用環境設定給定某類圖的頂點和邊的相關信息,要求輸出該圖的鄰接矩陣。用戶界面命令行界面,用戶選擇所要建立的圖的類型,輸入相關頂點和邊的信息,然后輸出該圖的鄰接矩陣。 輸入方式首先輸入所要建立的圖形類型的代碼,然后輸入頂點vexnum和邊的數量arcnum,再輸入頂點信息,邊的2個端點v1和v2,如果建立
3、的是網則還要輸入權值w。輸出方式輸出的是一個鄰接矩陣,采用for循環嵌套,輸出該圖的鄰接矩陣。數據存儲方式全部在內存存放,不使用硬盤上的文件或其他數據源,程序執行過程中和結束后不保存數據。程序功能:1. 輸入圖的類型;2. 輸入相應的圖的頂點和邊的相關信息;3. 得到圖的鄰接矩陣。2.概要設計2.1學生作業完成情況管理系統 2.1.1程序設計說明 程序整體分為登錄部分、獲得數據部分、數據處理及處理信息反饋部分、數據導出保存部分,如下結構圖1、2所示:登錄部分登陸注冊退出圖 1學生作業完成情況管理程序輸入某學生的學號,刪除該學生的個人信息手動輸入學生姓名、學號、班級、各次作業成績從文件中導入上次
4、操作已保存和修改的數據輸入班號,顯示該班所有學生的十次作業完成情況輸入某學生的學號,修改該學生的個人信息通過選擇,顯示各類統計數據顯示本程序的執行主菜單清屏,清除這前所有運行結果,方便之后的運行輸入學號,顯示某位學生的十次作業完成情況圖 2該程序具有下列功能:(1) 輸入信息;(2) 輸出信息;(3) 給定條件,修改、刪除相應信息; (4) 按條件統計。 2.1.2數據結構類型typedef struct student /學生信息鏈表 char name10; int schoolnumber; int classnumber; float score10; struct student *
5、next; stu,*stupt;stupt st=NULL;/學生信息的頭指針stupt qt=NULL;/學生信息的尾指針FILE* fp;/文件指針2.2圖的建立及存儲2.2.1程序設計說明 本程序通過輸入有向圖與無向圖的頂點、邊、權值等信息,存儲至用數組建立的鄰接矩陣,并輸出該鄰接矩陣圖。2.2.2數據結構類型基本操作:typedef enum DG,UDGGraphKind;/有向圖,無向圖typedef struct ArcCell VrType adj; / 頂點關系類型。對無權圖,用1或0表示相鄰否;對帶權圖,則為權值類型。InfoType *info; / 該弧相關信息的指針
6、ArcCell, AdjMatrix2020;typedef struct VertexType vertex20; / 頂點向量AdjMatrix arcs; / 鄰接矩陣 int vexnum, arcnum; / 圖的當前頂點數和弧(邊)數GraphKind kind; / 圖的種類標志MGraph;CreateGraph(MGraph &G) 初始條件:圖G未創建。 操作結果:創建一個圖G。 CreateUDG(MGraph &
7、G); 初始條件:無向圖G未創建。 操作結果:創建一個無向圖并求出其鄰接矩陣。 CreateDG(MGraph &G); 初始條件:有向圖G未創建。 操作結果:創建一個有向圖并求出其鄰接矩陣。D Display(MGraph G)。 初始條件:圖G已創建。 操作結果:
8、輸出圖G的鄰接矩陣。3. 詳細設計3.1算法及流程圖3.1.1 學生作業完成情況管理系統程序算法:手動輸入學生信息:void inpu(stupt p)int n;int m=0;int flag;while(m<10)/成績初始化為0p->scorem=0;m+;printf("請輸入:姓名:");scanf("%s",p->name);clear();printf("請輸入:學號:");scanf("%d",&p->schoolnumber);clear();printf(&qu
9、ot;請輸入:班級(如:101):");scanf("%d",&p->classnumber);clear();doprintf("請輸入:第幾次作業(110):");scanf("%d",&n);clear();printf("請輸入:該次作業成績:");scanf("%f",&p->scoren-1);clear();/清空緩沖區printf("是否繼續輸入該生成績,退出請按q,其他鍵繼續:");flag=getchar();
10、clear();/清空緩沖區堆積while(flag!='q');從文件中導入學生信息:void readfile(stupt &st,FILE* fp)char flag,flag_1;char filename90;printf("如導入前有過手動輸入,請先導出至文件后再進行導入,否則輸入部分的數據將丟失!n");printf("任意鍵繼續,退出請按q:");flag_1=getchar();/等待接收一個字符clear();if(flag_1='q')return;lab_2:printf("請選擇
11、:a.程序默認路徑導入(之前導出時需要是默認導出) b.自定義導入路徑(請確保導入路徑合法):");flag=getchar();clear();if(flag='b')printf("請輸入導入路徑(請確保導入路徑合法!)(如c:.student_homework_infor.txt):");scanf("%s",filename);clear();if(access(filename,0)=1)/確定文件或文件夾的訪問權限即檢查文件的存取方式,如果存取方式有效,則返回0,否則返回1printf("路徑不合法或文件不
12、存在,請重新選擇!n");goto lab_2;fp=fopen(filename,"rb");if(fp=NULL)printf("打開%s文件失敗,請返回主菜單重試!n",filename);return;elsefilep_read_to_st(st,fp);/導入文件fclose(fp);else if(flag='a')fp=fopen("student_homework_infor.txt","r");if(access("student_homework_infor
13、.txt",0)=1)printf("文件不存在!n");if(fp=NULL)printf("打開程序所在目錄下的student_homework_infor.txt文件失敗,請返回上層菜單重試!n");return;else filep_read_to_st(st,fp);fclose(fp);elseprintf("非法輸入!程序將返回上層菜單.n");查詢某學生作業完成情況:void search_1(stupt&st,int snum)stupt p,q;if(st=NULL)printf("未建
14、立學生信息表,請返回上層菜單輸入或導入所有學生的信息n");return;elsep=st;q=p->next;if(p->schoolnumber=snum)printf_score(p); /查找成功輸出并返回上級函數return;while(q!=NULL)if(q->schoolnumber=snum)printf_score(q); /查找成功輸出并返回上級函數return;q=q->next;/下一個printf("查詢失敗,該學號學生信息不存在n");查詢某班級所有學生成績:void search_2(stupt st,int
15、 clnum)stupt p,q;int f=0;if(st=NULL)printf("未建立學生信息表,請返回主菜單輸入所有學生的信息n");return;elsep=st;q=p->next;printf("班級 姓名 學號 成績1 成績2 成績3 成績4 成績5 成績6 成績7 成績8 成績9 成績10n");printf("n");if(p->classnumber=clnum)printf_infor(p);f+;/查找成功輸出while(q!=NULL)if(q->classnumber=clnum)pr
16、intf_infor(q);f+;/查找成功輸出q=q->next;/下一個if(f=0)printf("沒有該班級學生信息n");修改學生信息:void change(stupt&p)char a;printf_help_2();while(a=getchar()!='0')clear();printf("班級 姓名 學號 成績1 成績2 成績3 成績4 成績5 成績6 成績7 成績8 成績9 成績10n");printf("n");printf_infor(p);switch(a)case '
17、1':printf("您選擇了:1.修改姓名n");change_name(p);break;case '2':printf("您選擇了:2.修改班級n");change_class(p);break;case '3':printf("您選擇了:3.修改成績n");change_score(p);break;default:printf("非法輸入,請重新選擇!n");break;printf_help_2();if(a='0')clear();printf(
18、"您選擇了:0.返回n");刪除學生信息:void delete_pt(stupt&st,int snum)stupt p,q;if(st=NULL)printf("未建立學生信息表,請返回主菜單輸入或導入所有學生的信息n");return;elsep=st;q=p->next;if(p->schoolnumber=snum)st=q; /查找成功刪除并返回上級函數printf("班級 姓名 學號 成績1 成績2 成績3 成績4 成績5 成績6 成績7 成績8 成績9 成績10n");printf("n&
19、quot;);printf_infor(p);free(p);printf("上面信息刪除成功!n");return;while(q!=NULL)if(q->schoolnumber=snum)p->next=q->next; /查找,成功刪除并返回上級函數printf("班級 姓名 學號 成績1 成績2 成績3 成績4 成績5 成績6 成績7 成績8 成績9 成績10n");printf("n");printf_infor(q);free(q);printf("上面信息刪除成功!n");retu
20、rn;else/下一個p=q;q=p->next;printf("刪除失敗,該學號學生信息不存在n");顯示各項統計數據:void statistics_result(stupt &st)/統計結果char flag;printf_help_3();while(flag=getchar()!='0')clear();switch(flag)case '1':printf("您選擇了:1.按學號查看學生平均成績n");snum_check_aver(st);break;case '2':prin
21、tf("您選擇了:2.按班級查看學生平均成績n");cnum_check_aver(st);break;case '3':printf("您選擇了:3.查看學生平均成績降序序列n");descending_order_check(st);break;default:printf("非法輸入,請重新選擇!n");clear();break;printf_help_3();if(flag='0')printf("您選擇了:0.返回主菜單n");clear();Printf_help_1(
22、);導出信息至文件:void creat_files(stupt st,FILE* &fp)char flag;char filename90;lab_1:printf("請選擇:a.默認路徑保存(為當前目錄下的student_homework_infor.txt) b.自定義保存路徑:");flag=getchar();clear();/清除緩存中的回車if(flag='b')printf("請輸入文件名及保存路徑(如c:student_homework_infor.txt):");scanf("%s",fi
23、lename);clear();if(access(filename,0)=1)printf("路徑不合法,請重新輸入!n");goto lab_1;fp=fopen(filename,"ab+");if(fp=NULL)printf("創建文件至%s失敗,請返回主菜單重試!n",filename);return;else fileprintf(st,fp);fclose(fp);else if(flag='a')fp=fopen(".student_homework_infor.txt",&quo
24、t;a");if(fp=NULL)printf("創建文件至程序所在目錄下的student_homework_infor.txt文件失敗,請返回主菜單重試!");return;else fileprintf(st,fp);fclose(fp);elseprintf("非法輸入!程序將返回主菜單.n");主菜單開始 選擇操作 注冊返回登錄 輸入用戶名和密碼選擇用戶想要執行的操作 保存修改的數據于txt文件中結束返回上一層主菜單 學生作業完成情況管理程序流程概圖3.1.2 圖的建立及存儲鄰接矩陣表示法:設G=(V,E)是一個圖,其中V=V1,V2,
25、V3,Vn。G的鄰接矩陣是一個具有下述性質的n階方陣:若(Vi,Vj)E或者<Vi,Vj>E,則Ai,j=1反之為0;圖5-2中有向圖G1和無向圖G2的鄰接矩陣分別為 M1和 M2:M1= 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0 0 M2= 0 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 注意無向圖的鄰接是一個對稱矩陣,例如 M2。用鄰接矩陣表示法來表示一個具有n個頂點的圖時,除了用鄰接矩陣中的n*n個元素存儲頂點間相鄰關系外,往往還需要另設一個向量存儲n個頂點的信息。因此其類型定義如下:VertexType vertexMAX_VERTEX_N
26、UM; / 頂點向量 AdjMatrix arcs; / 鄰接矩陣 int vexnum, arcnum; / 圖的當前頂點數和弧(邊)數 GraphKind kind; / 圖的種類標志 若圖中每個頂點只含一個編號i(1ivnum),則只需一個二維數組表示圖的鄰接矩陣。此時存儲結構可簡單說明如下: type adjmatrix=array1.vnum,1.vnumof adj;利用鄰接矩陣很容易判定任意兩個頂點之間是否有邊(或弧)相聯,并容易求得各個頂點的度。對于無向圖,頂點Vi的度是鄰接矩陣中第i行元素之和,即nD(Vi)Ai,j j=1 對于有向圖,頂點Vi的出度OD(Vi)為鄰接矩陣第
27、i行元素之和,頂點Vi的入度ID(Vi)為第i列元素之和。即 nnOD(Vi)Ai,j, ID(Vi)Aj,i) j=1j=1用鄰接矩陣也可以表示帶權圖,只要令 Wij, 若(Vi,Vj)或者<Vi,Vj>E其中Wij為<Vi,Vj>或(Vi,Vj)上的權值Ai,j 0 , 否則1、 無向圖鄰接矩陣的建立算法如下:procedure build-graph;建立無向圖的鄰接矩陣beginfor i:=1 to n do read(G.vertexi); 讀入n個頂點的信息for i:=1 to n dofor j:=1 to e doG.arcsij =0;將鄰接矩陣的
28、每個元素初始化成0for k:=1 to e do e為邊的數目 read(i,j,w) 讀入邊<i,j>和權G.arcsij:=wG.arcsijG.arcsii置對稱弧 end;該算法的執行時間是O(n+n2+e),其中消耗在鄰接矩陣初始化操作上的時間是O(n2),而e<n2,所以上述算法的時間復雜度是O(n2)。2、 有向圖鄰接矩陣的建立算法如下:procedure build-graph; 建立有向圖的鄰接矩陣beginfor i:=1 to n do read(G.vertexi); 讀入n個頂點的信息for i:=1 to n dofor j:=1 to e do
29、G.arcsij =0;將鄰接矩陣的每個元素初始化成0 for k:=1 to e do e為邊的數目 read(i,j,w) 讀入邊<i,j>和權G.arcsij:=wG.arcsijG.arcsii置對稱弧end;該算法的執行時間是O(n+n2+e),其中消耗在鄰接矩陣初始化操作上的時間是O(n2),而e<n2,所以上述算法的時間復雜度是O(n2)。1) 頭文件:#include <stdio.h> /包含了getchar();printf();feof();fopen() FILE 聲明#include <stdlib.h> /包含了malloc
30、e();exit()#include <io.h> /包含access()#include <string.h> /包含strcmp()#include <conio.h> /包含了getch()程序算法:輸出鄰接矩陣:void Display(MGraph G)/輸出圖的鄰接矩陣int i,j;printf("該圖的鄰接矩陣為:n");for(i=0;i<G.vexnum;+i)for(j=0;j<G.vexnum;j+)printf("%5d",G.arcsij.adj);printf("n&
31、quot;);構造有向圖:void CreateDG(MGraph &G) / 采用數組(鄰接矩陣)表示法,構造有向圖/CreateDG int i,j,k; /i,j,k為計數器VertexType v1,v2; /用于放置輸入的弧的兩個頂點printf("請輸入有向圖G的頂點數(不超過20個):n");scanf("%d",&G.vexnum);printf("請輸入有向圖G的邊數:n");scanf("%d",&G.arcnum);printf("請輸入%d個頂點的值:n&q
32、uot;,G.vexnum);for(i=0;i<G.vexnum;+i) / 構造頂點向量scanf("%d",&G.vertexi);if(G.vertexi>G.vexnum|G.vertexi<1)printf("Sorry!您輸入的頂點值錯誤,請重新輸入第%d個頂點的值:n",i+1);scanf("%d",&G.vertexi);for(i=0;i<G.vexnum;+i) / 初始化鄰接矩陣for(j=0;j<G.vexnum;+j) G.arcsij.adj=0;G.arc
33、=NULL; for(k=0;k<G.arcnum;+k)printf("請輸入第%d條邊的始點和終點:n",k+1);/以空格作為間隔scanf("%d %d",&v1,&v2);if(v1>G.vexnum)|(v2>G.vexnum)printf("對不起!您輸入的邊信息錯誤,請重新輸入第%d條邊的始點和終點:n",k+1);scanf("%d %d",&v1,&v2);i=v1-1;j=v2-1;G.arcsij.adj=1; 構造無向圖:v
34、oid CreateUDG(MGraph &G) / 采用數組(鄰接矩陣)表示法,構造無向圖/CreateUDG int i,j,k; /i,j,k為計數器int v1,v2; /用于放置輸入的弧的兩個頂點printf("請輸入無向圖G的頂點數:n");scanf("%d",&G.vexnum);printf("請輸入無向圖G的邊數:n");scanf("%d",&G.arcnum);printf("請輸入%d個頂點的值:n",G.vexnum);for(i=0;i<
35、;G.vexnum;+i) / 構造頂點向量scanf("%d",&G.vertexi);if(G.vertexi>G.vexnum|G.vertexi<1)printf("Sorry!您輸入的頂點值錯誤,請重新輸入第%d個頂點的值:n",i+1);scanf("%d",&G.vertexi);for(i=0;i<G.vexnum;+i) / 初始化鄰接矩陣for(j=0;j<G.vexnum;+j) G.arcsij.adj=0;G.=NULL; for(k=0;k<
36、;G.arcnum;+k)printf("請輸入第%d條邊的2個端點:n",k+1);/以空格作為間隔scanf("%d %d",&v1,&v2);if(v1>G.vexnum)|(v2>G.vexnum)printf("對不起!您輸入的邊信息錯誤,請重新輸入第%d條邊的始點和終點:n",k+1);scanf("%d %d",&v1,&v2);i=v1-1; j=v2-1;G.arcsij.adj=G.arcsji.adj=1; / 置<v1,v2>的對稱弧&
37、lt;v2,v1> 開始輸入vexnum,arcnumIncInfoii+1輸入頂點i<vexnumYjj+1N初始化鄰接矩陣i<vexnumYj<vexnumNYii+1Nk<arcnumkk+1設置鄰接矩陣YN結束圖的構造流程圖4. 調試分析下面分別為學生作業完成情況管理系統和圖的建立與存儲程序的主程序菜單: 選擇1進入學生作業完成情況管理系統 選擇2進入圖的建立及存儲程序 選擇0退出本界面,完成本次調試圖0 運行整個程序的主界面菜單4.1(學生作業完成情況管理系統)操作提示: 登錄部分分為登陸、注冊和退出三部分,本程序采取一次性注冊,即用戶名與密碼不可修改(相對在程序中而言),需要先注冊,否則登錄時程序會提示“未注冊”,第二次注冊程序會提示“賬戶已存在,請返回登錄”,登錄成功后會提示登錄時間,選擇退出時,程序會結束。 第二部分為登錄成功后,進
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現場演藝市場2025年產業鏈研究報告:互動性演出形式產業鏈布局分析
- 消費與零售:2025年綠色消費趨勢研究報告
- 技術報告:2025年無人駕駛技術在物流運輸中的應用與商業模式
- 歡慶兒童節活動總結模版
- 老舊小區改造中居民生活品質提升與滿意度調查報告
- 工業互聯網平臺網絡安全態勢感知技術安全態勢感知與防護策略報告2025
- 直播帶貨在零售業中的產品創新與差異化競爭策略報告
- 北師大版2025年春小學六年級數學工作總結模版
- 職中學校軍訓心得體會模版
- 記者2025年度工作總結模版
- 城市軌道交通項目質量管理體系構建-全面剖析
- 鋼結構工程數字化
- 西南名校聯盟2025屆“3 3 3”高考備考診斷性聯考(二)政治-答案
- 2025-2030中國光學級PMMA行業現狀調查與前景策略分析研究報告
- PLC在洗衣機控制中的應用實訓報告
- 25春國家開放大學《管理英語3》形考任務(綜合測試+寫作+學習表現)參考答案
- 2025年反洗錢法 試題及答案
- 橋梁工程施工方案及技術措施專項方案
- “燕園元培杯”2023-2024學年全國中學生地球科學奧林匹克競賽決賽試題詳解
- 船員安全培訓課件
- Unit1 All about feelings. Language in use(第3課時)(教學設計)-三年級英語下冊同步備課系列(Join in外研劍橋·2024)
評論
0/150
提交評論