第5組運(yùn)動(dòng)會(huì)分?jǐn)?shù)統(tǒng)計(jì)_第1頁(yè)
第5組運(yùn)動(dòng)會(huì)分?jǐn)?shù)統(tǒng)計(jì)_第2頁(yè)
第5組運(yùn)動(dòng)會(huì)分?jǐn)?shù)統(tǒng)計(jì)_第3頁(yè)
第5組運(yùn)動(dòng)會(huì)分?jǐn)?shù)統(tǒng)計(jì)_第4頁(yè)
第5組運(yùn)動(dòng)會(huì)分?jǐn)?shù)統(tǒng)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、軟 件 學(xué) 院 綜合訓(xùn)練項(xiàng)目報(bào)告書課程名稱 數(shù)據(jù)結(jié)構(gòu) 項(xiàng)目名稱 運(yùn)動(dòng)會(huì)分?jǐn)?shù)統(tǒng)計(jì) 專業(yè)班級(jí) 軟件工程15-1班 組 別 第五組 成 員 石尚 趙德冀 胡雪豐 任課教師 孫寧 目 錄1設(shè)計(jì)時(shí)間-P1 2設(shè)計(jì)任務(wù)-P13設(shè)計(jì)內(nèi)容-P13.1問(wèn)題分析-P13.1.1存儲(chǔ)結(jié)構(gòu)-P13.1.2信息輸入-P13.1.3信息輸出-P23.1.4主菜單-P23.1.5主函數(shù)-P23.2程序設(shè)計(jì)-P23.2.1存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)-P23.2.2程序流程-P33.2.3主要函數(shù)偽碼算法-P33.3測(cè)試與分析-P73.3.1測(cè)試-P73.3.2分析-P113.4代碼-P114 總結(jié)與展望-P161 設(shè)計(jì)時(shí)間 2016年11

2、月6日2 設(shè)計(jì)任務(wù) 參加運(yùn)動(dòng)會(huì)有n個(gè)院系,編號(hào)為1n。比賽分成m個(gè)男子項(xiàng)目,和w個(gè)女子項(xiàng)目。項(xiàng)目編號(hào)為男子1m,女子m+1m+w。不同的項(xiàng)目取前五名或前三名積分;取前五名的積分分別為:7、5、3、2、1,前三名的積分分別為:5、3、2。規(guī)定1m項(xiàng)目取前五名,m+1m+w項(xiàng)目取前三名。3 設(shè)計(jì)內(nèi)容3.1問(wèn)題分析3.1.1存儲(chǔ)結(jié)構(gòu) 經(jīng)過(guò)對(duì)該項(xiàng)目分析后了解到,程序需要做的工作是信息輸入和統(tǒng)計(jì)輸出,沒(méi)有插入刪除操作,所以我們選擇了用順序線性表來(lái)存儲(chǔ)。于是我們將定義了兩個(gè)線性表ItemList,AcaList,ItemList用來(lái)存儲(chǔ)輸入的數(shù)據(jù),AcaList用來(lái)存儲(chǔ)計(jì)算出的各學(xué)院得分信息。 ItemL

3、ist中的*elem是一個(gè)結(jié)構(gòu)體類型,包括項(xiàng)目編號(hào)(int Num)、項(xiàng)目名稱(int Name)、該項(xiàng)目前五名(int Ranking5)、項(xiàng)目前五名的分?jǐn)?shù)(int Marks5)、前五名所屬學(xué)院(int Aca5)、前五名的名字(char Name20)。 AcaList中的*elem也是一個(gè)結(jié)構(gòu)體類型,包括學(xué)院編號(hào)(int Num)、院系名稱(char Name20)、男團(tuán)分?jǐn)?shù)(int MScore)、女團(tuán)分?jǐn)?shù) (int WScore)、總共分?jǐn)?shù) (int Score)。最后是變量定義和表的初始化,我們將變量全部定義為全局變量:n學(xué)院個(gè)數(shù),m男子項(xiàng)目數(shù),w女子項(xiàng)目數(shù),ItemList L

4、1, AcaList L2。因?yàn)檫@些變量涉及到每個(gè)函數(shù),每個(gè)函數(shù)都可以對(duì)變量修改,不用傳址,省去了好多代碼。3.1.2信息輸入(Input)首先需要用戶對(duì)參賽學(xué)院進(jìn)行編號(hào),按編號(hào)順序循環(huán)輸入學(xué)院名稱,并把分配到的存儲(chǔ)空間賦值為0,防止該空間有值,對(duì)分?jǐn)?shù)統(tǒng)計(jì)產(chǎn)生影響。其次需要用戶對(duì)比賽項(xiàng)目進(jìn)行編號(hào),按編號(hào)順序循環(huán)輸入項(xiàng)目名稱,并把該項(xiàng)目的比賽成績(jī)輸入(規(guī)定1m項(xiàng)目取前五名,m+1m+w項(xiàng)目取前三名),每輸入一名選手成績(jī),程序會(huì)自動(dòng)按他的名次修改他所在學(xué)院的計(jì)分變量(MScore,WScore,Score)。最后,信息輸入結(jié)束后,程序會(huì)根據(jù)男團(tuán)MScore,女團(tuán)WScore計(jì)算出團(tuán)體總分Score

5、。3.1.3信息輸出該類分為兩部分:輸出院系成績(jī)單和輸出院系總分報(bào)表。輸出院系成績(jī)單(Output1)將表AcaList重置為按學(xué)院編號(hào)排序。通過(guò)訪問(wèn)L2.elem->Num,對(duì)比數(shù)組L1.elem->Acak,若L2.elem->Num=L1.elem->Acak,則將橫向相關(guān)的數(shù)據(jù)一并輸出。輸出院系總分報(bào)表(Output2)有兩種輸出方式,總分排名輸出按1,學(xué)院編號(hào)輸出按0,調(diào)用Rank函數(shù)進(jìn)行排序,然后就輸出就行了,很容易。著重要說(shuō)的是Rank函數(shù),反用冒泡排序法,將值小的沉底,將值大的漂到上面。if(x&&(q->Score>(q+1

6、)->Score)|(x-1)&&q->Num>(q+1)->Num)這條判斷語(yǔ)句會(huì)識(shí)別用戶想總分排名輸出還是學(xué)院編號(hào)輸出,不用編寫兩個(gè)排序了。3.1.4菜單函數(shù)(Menu)主菜單有四個(gè)功能選項(xiàng)1、信息輸入 2、輸出院系成績(jī)單3、輸出院系總分報(bào)表4、退出系統(tǒng)。輸入錯(cuò)誤功能編號(hào)會(huì)進(jìn)行提示,并返回主菜單重新輸入功能選項(xiàng)。通過(guò)switch函數(shù)調(diào)用不同功能的函數(shù),使用完功能函數(shù)自動(dòng)返回主菜單。3.1.5主函數(shù)(main) 主函數(shù)里內(nèi)容較少,輸入學(xué)院個(gè)數(shù)n,男子項(xiàng)目數(shù)m,女子項(xiàng)目數(shù)w(m<=20,n<=20),調(diào)用CreatList創(chuàng)建兩個(gè)表,然后調(diào)用

7、Menu就ok了。3.2程序設(shè)計(jì)3.2.1存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)輸入n,m,w3.2.2程序流程 Menu輸入x(選擇功能)x=3學(xué)院總分報(bào)表x=2學(xué)院成績(jī)單x=1信息輸入x=其他報(bào)錯(cuò)并返回主菜單x=4退出程序 結(jié)束3.2.3主要函數(shù)偽碼算法Input函數(shù) 用于輸入 學(xué)院名稱、比賽項(xiàng)目名稱、各比賽項(xiàng)目中獲獎(jiǎng)人員的信息(名字、成績(jī)、學(xué)院編號(hào))。void Input()/輸入各學(xué)院的名稱 /輸入各項(xiàng)目的比賽結(jié)果/計(jì)算出各學(xué)院的男團(tuán)、女團(tuán)、和團(tuán)體總分 printf("請(qǐng)為參賽學(xué)院編號(hào),按編號(hào)輸入學(xué)院名稱。n");struct Academy *q; q=L2.elem;for(int i=

8、1;i<=n;i+)q->Num=i;printf("請(qǐng)輸入%d個(gè)學(xué)院名稱:",i);scanf("%s",q->Name);q->MScore=0;q->WScore=0;q->Score=0;/將分配的計(jì)分空間賦值0 q+;L2.length=n;/*/int x=5;struct Item *p;p=L1.elem;for(int i=1;i<=m+w;i+)/比賽項(xiàng)目 printf("=輸入運(yùn)動(dòng)%d比賽結(jié)果=",i);p->Num=i;printf("n");

9、printf("項(xiàng)目名稱:");scanf("%s",p->Name);if(i=m+1) x=3;/從m+1運(yùn)動(dòng)個(gè)開(kāi)始取前三名 for(int j=0;j<x;j+)/該項(xiàng)目的成績(jī) printf("第%d名:n",j+1); p->Rankingj=j+1;printf("姓名:"); scanf("%s",p->Namesj);printf("成績(jī):"); scanf("%d",&p->Marksj);printf

10、("所在院系編號(hào):"); scanf("%d",&p->Acaj);q=L2.elem;for(int k=1;k<=n;k+) if(p->Acaj=q->Num)if(x=5)switch(p->Rankingj)/計(jì)算男團(tuán)總分 case 1: q->MScore+=7;break;case 2:q->MScore+=5;break;case 3:q->MScore+=3;break;case 4:q->MScore+=2;break;case 5:q->MScore+=1;brea

11、k;break;elseswitch(p->Rankingj)/計(jì)算女團(tuán)總分 case 1: q->WScore+=5;break;case 2:q->WScore+=3;break;case 3:q->WScore+=2;break;break;q+;p+;L1.length=m+w; q=L2.elem;/重置q值 for(int i=1;i<=n;i+)/計(jì)算各學(xué)院總分 q->Score=q->MScore+q->WScore;q+; Output1函數(shù) 用于輸出院系成績(jī)單,該院系在哪些項(xiàng)目中獲獎(jiǎng),并將該獲獎(jiǎng)學(xué)生的信息輸出(名字,名次,成績(jī)

12、)。void Output1()Rank(0);/將學(xué)院總分報(bào)表重置為按學(xué)院編號(hào)排序 int x=5,y;struct Item *p;struct Academy *q; q=L2.elem;for(int i=1;i<=n;i+)printf("=學(xué)院:%-10s 編號(hào):%-2d=n",q->Name,i);q+;p=L1.elem;for(int j=1;j<=m+w;j+)y=0;printf("項(xiàng)目:%-10s",p->Name);if(j=m+1) x=3;/從m+1運(yùn)動(dòng)個(gè)開(kāi)始取前三名 for(int k=0;k<

13、;x;k+)if(p->Acak=i)printf("n名次:%-2d 姓名:%-10s 得分:%-2d",p->Rankingk,p->Names0,p->Marksk);y=1;if(y=0) printf("n未在此項(xiàng)目取得名次。"); p+;printf("n");printf("n"); Output2函數(shù) 用于輸出院系總分報(bào)表(學(xué)院編號(hào),學(xué)院名稱,男團(tuán)分?jǐn)?shù),女團(tuán)分?jǐn)?shù),總分),設(shè)置了兩種輸出方式:按總分降序輸出,按學(xué)院編號(hào)升序輸出。通過(guò)調(diào)用Rank函數(shù)即可進(jìn)行排序輸出。void O

14、utput2()int x;printf("總分排名輸出按1,學(xué)院編號(hào)輸出按0:");scanf("%d",&x); Rank(x);struct Academy *q; q=L2.elem;printf("n=院系總分報(bào)表=n");printf("學(xué)院編號(hào) 學(xué)院名稱 男團(tuán) 女團(tuán) 總分n");for(int i=1;i<=n;i+)printf("%-2d %-10s %-2d %-2d %-2dn",q->Num,q->Name,q->MScore,q->

15、WScore,q->Score);q+;printf("n");Rank(int x)函數(shù) 對(duì)學(xué)院總分報(bào)表排序,實(shí)現(xiàn)兩種輸出方式:按總分降序輸出,按學(xué)院編號(hào)升序輸出。通過(guò)調(diào)用該函數(shù)即可進(jìn)行排序輸出。void Rank(int x)/對(duì)學(xué)院總分報(bào)表進(jìn)行排序,實(shí)現(xiàn)兩種輸出方式 /第一種按學(xué)院編號(hào)輸出/第二種按學(xué)院總分輸出int t=0;char Name20;struct Academy *q; q=L2.elem;for(int i=0;i<n-1;i+)for(int j=0;j<n-1-i;j+)if(x&&(q->Score<

16、;(q+1)->Score)|(x-1)&&q->Num>(q+1)->Num)t=q->Num; q->Num=(q+1)->Num; (q+1)->Num=t;t=q->MScore; q->MScore=(q+1)->MScore; (q+1)->MScore=t;t=q->WScore; q->WScore=(q+1)->WScore; (q+1)->WScore=t;t=q->Score; q->Score=(q+1)->Score; (q+1)->

17、Score=t;strcpy(Name,q->Name);strcpy(q->Name,(q+1)->Name);strcpy(q+1)->Name,Name);q+;q=L2.elem;3.3測(cè)試與分析3.3.1測(cè)試錯(cuò)誤輸入示范:選錯(cuò)功能號(hào)會(huì)報(bào)錯(cuò),并返回主菜單重新選擇測(cè)試數(shù)據(jù): 信息輸入(Input)測(cè)試結(jié)果: 各學(xué)院成績(jī)單(Output1) 各學(xué)院總分報(bào)表(Output2)3.3.2分析在整個(gè)的調(diào)試過(guò)程中并沒(méi)有太大障礙,最主要的一個(gè)常犯錯(cuò)誤是在多重循環(huán)里,當(dāng)內(nèi)層循環(huán)結(jié)束后忘記對(duì)循環(huán)的指針重新賦值,導(dǎo)致循環(huán)結(jié)果錯(cuò)誤。經(jīng)過(guò)審查后很快發(fā)現(xiàn)并改正了這個(gè)錯(cuò)誤。由于循環(huán)太多,有

18、的函數(shù)中甚至用到了三重循環(huán),算法的時(shí)間復(fù)雜度偏高。由于存儲(chǔ)解構(gòu)是順序線性表,存儲(chǔ)空間連續(xù),所以空間復(fù)雜度偏低,唯一缺憾就是將取前三名的項(xiàng)目沿用取前五名項(xiàng)目的存儲(chǔ)結(jié)構(gòu),也就造成有一些空間是用不到的,造成浪費(fèi)??梢元?dú)立為取前三名的項(xiàng)目設(shè)計(jì)一個(gè)存儲(chǔ)結(jié)構(gòu),但考慮到代碼量會(huì)增加很多并且電腦內(nèi)存足夠,所以就沒(méi)有這樣做。3.4 代碼#include "stdio.h"#include "malloc.h"#include "stdlib.h" #include "string.h"#define OK 1#define OVER

19、FLOW -1#define ERROR 0typedef int Status;struct Academyint Num;/學(xué)院編號(hào) char Name20;/院系名稱 int MScore;/男團(tuán)分?jǐn)?shù) int WScore;/女團(tuán)分?jǐn)?shù) int Score;/總共分?jǐn)?shù) ;/存儲(chǔ)學(xué)院信息的結(jié)構(gòu)體 struct Itemint Num;/項(xiàng)目編號(hào) char Name20;/項(xiàng)目名稱 int Ranking5;/該項(xiàng)目前五名 int Marks5;/項(xiàng)目前五名的分?jǐn)?shù) int Aca5;/前五名所屬學(xué)院 char Names520;/前五名的名字 ; /存儲(chǔ)項(xiàng)目信息的結(jié)構(gòu)體 typedef str

20、uctstruct Academy *elem;/存儲(chǔ)空間基址 int length;/當(dāng)前長(zhǎng)度 int listsize;/當(dāng)前分配的存儲(chǔ)容量 AcaList;/學(xué)院順序表typedef structstruct Item *elem;int length;int listsize;ItemList; /項(xiàng)目順序表 /*全局變量*/int n,m,w;/n學(xué)院個(gè)數(shù),m男子項(xiàng)目數(shù),w女子項(xiàng)目數(shù)ItemList L1; AcaList L2;/*/Status CreatList()L1.elem = (struct Item *)malloc(m+w)*sizeof(struct Item);

21、if(!L1.elem) exit(OVERFLOW); /存儲(chǔ)分配失敗L1.length=0;/空表長(zhǎng)度為0L1.listsize=m+w; /初始存儲(chǔ)容量L2.elem=(struct Academy *)malloc(n*sizeof(struct Academy);if(!L2.elem) exit(OVERFLOW); /存儲(chǔ)分配失敗L2.length=0;/空表長(zhǎng)度為0L2.listsize=n; /初始存儲(chǔ)容量return OK;void Input()/輸入各學(xué)院的名稱 /輸入各項(xiàng)目的比賽結(jié)果/計(jì)算出各學(xué)院的男團(tuán)、女團(tuán)、和團(tuán)體總分 printf("請(qǐng)為參賽學(xué)院編號(hào),按

22、編號(hào)輸入學(xué)院名稱。n");struct Academy *q; q=L2.elem;for(int i=1;i<=n;i+)q->Num=i;printf("請(qǐng)輸入%d個(gè)學(xué)院名稱:",i);scanf("%s",q->Name);q->MScore=0;q->WScore=0;q->Score=0;/將分配的計(jì)分空間賦值0 q+;L2.length=n;/*/int x=5;struct Item *p;p=L1.elem;for(int i=1;i<=m+w;i+)/比賽項(xiàng)目 printf("

23、;=輸入運(yùn)動(dòng)%d比賽結(jié)果=",i);p->Num=i;printf("n");printf("項(xiàng)目名稱:");scanf("%s",p->Name);if(i=m+1) x=3;/從m+1運(yùn)動(dòng)個(gè)開(kāi)始取前三名 for(int j=0;j<x;j+)/該項(xiàng)目的成績(jī) printf("第%d名:n",j+1); p->Rankingj=j+1;printf("姓名:"); scanf("%s",p->Namesj);printf("成

24、績(jī):"); scanf("%d",&p->Marksj);printf("所在院系編號(hào):"); scanf("%d",&p->Acaj);q=L2.elem;for(int k=1;k<=n;k+) if(p->Acaj=q->Num)if(x=5)switch(p->Rankingj)/計(jì)算男團(tuán)總分 case 1: q->MScore+=7;break;case 2:q->MScore+=5;break;case 3:q->MScore+=3;break

25、;case 4:q->MScore+=2;break;case 5:q->MScore+=1;break;break;elseswitch(p->Rankingj)/計(jì)算女團(tuán)總分 case 1: q->WScore+=5;break;case 2:q->WScore+=3;break;case 3:q->WScore+=2;break;break;q+;p+;L1.length=m+w; q=L2.elem;/重置q值 for(int i=1;i<=n;i+)/計(jì)算各學(xué)院總分 q->Score=q->MScore+q->WScore;

26、q+; void Rank(int x)/對(duì)學(xué)院總分報(bào)表進(jìn)行排序,實(shí)現(xiàn)兩種輸出方式 /第一種按學(xué)院編號(hào)輸出/第二種按學(xué)院總分輸出int t=0;char Name20;struct Academy *q; q=L2.elem;for(int i=0;i<n-1;i+)for(int j=0;j<n-1-i;j+)if(x&&(q->Score<(q+1)->Score)|(x-1)&&q->Num>(q+1)->Num)t=q->Num; q->Num=(q+1)->Num; (q+1)->

27、Num=t;t=q->MScore; q->MScore=(q+1)->MScore; (q+1)->MScore=t;t=q->WScore; q->WScore=(q+1)->WScore; (q+1)->WScore=t;t=q->Score; q->Score=(q+1)->Score; (q+1)->Score=t;strcpy(Name,q->Name);strcpy(q->Name,(q+1)->Name);strcpy(q+1)->Name,Name);q+;q=L2.elem;vo

28、id Output1()Rank(0);/將學(xué)院總分報(bào)表重置為按學(xué)院編號(hào)排序 int x=5,y;struct Item *p;struct Academy *q; q=L2.elem;for(int i=1;i<=n;i+)printf("=學(xué)院:%-10s 編號(hào):%-2d=n",q->Name,i);q+;p=L1.elem;for(int j=1;j<=m+w;j+)y=0;printf("項(xiàng)目:%-10s",p->Name);if(j=m+1) x=3;/從m+1運(yùn)動(dòng)個(gè)開(kāi)始取前三名 for(int k=0;k<x;k

29、+)if(p->Acak=i)printf("n名次:%-2d 姓名:%-10s 得分:%-2d",p->Rankingk,p->Names0,p->Marksk);y=1;if(y=0) printf("n未在此項(xiàng)目取得名次。"); p+;printf("n");printf("n"); void Output2()int x;printf("總分排名輸出按1,學(xué)院編號(hào)輸出按0:");scanf("%d",&x); Rank(x);struc

30、t Academy *q; q=L2.elem;printf("n=院系總分報(bào)表=n");printf("學(xué)院編號(hào) 學(xué)院名稱 男團(tuán) 女團(tuán) 總分n");for(int i=1;i<=n;i+)printf("%-2d %-10s %-2d %-2d %-2dn",q->Num,q->Name,q->MScore,q->WScore,q->Score);q+;printf("n");void Menu()printf(" n");printf(" *1、信息輸入*n");printf(" *2、輸出院系成績(jī)單*n");printf(" *3、輸出院系總分報(bào)表*n")

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論