運動會分數統計(資料結構課程設計)
阿新 • • 發佈:2019-01-30
參加運動會有n個學校,學校編號為1……n。比賽分成m個男子專案,和w個女子專案。專案編號為男子1……m,女子m+1……m+w。不同的專案取前五名或前三名積分;取前五名的積分分別為:7、5、3、2、1,前三名的積分分別為:5、3、2;哪些取前五名或前三名由學生自己設定。(m<=20,n<=20)
經過兩天的艱苦奮戰,我終於完成了這項工作,排錯和輸入等方面做了很多改進,使用者輸入的時候會有很大的容錯和拍錯空間。
第二次選擇1的時候就可以輸入0--X(X=20-【已經錄入的學校個數】)不再是5了
程式碼如下:
注意:文章可能會出現 intint FILE 重複的情況 如果出現了 直接改為 int FILE 即可 這是網頁的問題
有問題QQ 聯絡 2423824433
因個人經濟不行---xian向大家推薦一些程式語言視訊,要的加我QQ-
目錄如下:
2011版SSH框架視訊教學【專案實戰-校內網】附原始碼.關係圖.資料庫 主講-韓順平 完全版 視訊教程 Altium Designer6.9 PCB設計教程 全31講 主講-郭天祥 視訊教程 AutoForm視訊教程及書籍教程大合集 8G檔案 教程資源 C++快速入門視訊教學 全48講 完整版 主講-小甲魚 附課件 視訊教程.rar C語言視訊教學 主講-郝斌 全180講 完整版 附程式碼.筆記.大綱 視訊教程 delphi視訊教學 完整版 主講-小甲魚 視訊教程 Excel實戰技巧精粹:Excel模板大全1000例 Java視訊教學 全107講 完整版 主講-郝斌 附原始碼.課件 視訊教程 Photoshop軟體 超實用修圖調色集合 全172講 視訊教程 PHP從入門到精通掌握網站核心技術 全149講 主講-韓順平 附筆記 視訊教程 PHP培訓第二版完整版視訊教學 大型入口網站核心技術-Mysql優化 主講-韓順平 視訊教程 proteus入門到精通 全29集 視訊教程 spring視訊教學講座 全28講 主講-韓順平 附筆記-圖解-程式碼-開發包 視訊教程 Université de Paris-Sud XI cAMP訊號和興奮收縮耦聯的磷酸二酯酶控制 全3講 主講-Rodolphe 視訊教程 WIN32組合語言視訊教學 全56講 完整版 主講-小甲魚 視訊教程
以上只是程式設計,其他方面的資源,ru~如果你需要其他資源,也加我QQ,我都能給你找到,大學的專業資源都有想加一個---
如果你xian想加個介面,點選此處連結:c語言模擬html登陸 可以將這個一部分程式碼整合進去。這部分程式碼適合win7,如果win10的話maybe得改一下。
# include <stdio.h> # include <stdlib.h> # define N 12 //大學和專案名稱的長度=漢字個數*sizeof(char) # define M 20 //大學的數量 # define Q 20 //專案的數量 # define H 5 //調整每一行輸出的學校或專案數量 現在一行輸出5個 # define MIN(a,b) (a)<(b)?(a):(b) const char wenjian[]="out.bin";//檔名 typedef struct link { int gram[3][Q]; //每一個專案gram[0]存男生,gram[1]存女生,gram[2]存這個學校中男女在此專案上的總分 int sum[3]; } AA,*Aa; typedef struct HEAD { int b[4]; //b[0-3]依次為(學校個數,專案個數,男生專案個數,女生專案個數 char xuexiao[M][N+1]; //M個學校的名稱 int sex[M]; //sex[i]//錄入性別,0為男,1為女 struct link spot[M]; //接上M個學校的資訊 char xiangmu[Q][N+1]; //Q個專案的名稱 int power[Q]; //每一個專案都有選擇前三名或前五名的機會 POW存 3 或者 5 int cun[Q][5]; //M個專案的學校編號排名1--3 或者 1--5 } HEAD; char sex[][3]= {"男","女"}; int power[][5]= {{5,3,2,0,0},{7,5,3,2,1}}; //積分 char ss[][5]= {"男團","女團","學校"}; int gainchar(char A[],int min,int max); //輸入字串的位元組範圍[min,max] int gainint(int *p,int a,int b);//輸入int *p直至滿足[a,b]輸入結束,並返回*p的位數 int BF(char a[],char b[]);//BF演算法 a為主串,b為被檢驗的串`返回b在a中的第一個下標 若無返回0 void record(char school[][N+1],char game[][N+1],int b[],HEAD *temp);//記錄資料最重要的一個函式,a為專案陣列,b為記錄,c為學校,Temp結構體 int jiemian();//使用者顯示介面 int jianyan(char b[],int T);//檢驗b[]是否符合實際,T=0檢驗當前字串是否全為漢字 T=1檢驗學校,T=2檢驗比賽 檢驗符合返回0 void xuanzepai(HEAD *temp,int select);//選擇排序 /*下面是檢查用的陣列 用在jianyan 函式中*/ char key[][3]= {"!","。","?","《","》",",","{","}","(",")","¥","‘","’",":",";","—","”","“","、","·","~","\0"}; char school[][5]= {"大學","學院","華僑","校區","政法","管理","經濟","科學","理工","科技","技術","職業","師範","中國","海洋","石油","分割槽","分校","建築","工業","\0"}; char program[][3]= {"跳","滑","冰","射","騎","跑","拉","球","舉","水","摔","爬","泳","踩","接","劃","體","田","人","\0"}; int DU(HEAD *head) { FILE *fp; if ((fp = fopen(wenjian, "rb")) == NULL) { if ((fp = fopen(wenjian, "wb+")) != NULL) { fclose(fp); if ((fp = fopen(wenjian, "rb")) == NULL) return printf("檔案讀取失敗!\n"); } } fread(head,sizeof(HEAD), 1, fp); fclose(fp); free(fp); return 0; } int XIE(HEAD *head) { FILE *fp; if ((fp = fopen(wenjian, "wb")) == NULL) return printf("檔案開啟失敗!\n"); if(fwrite(head,sizeof(HEAD), 1, fp)!=1) return printf("檔案寫入失敗!\n"); fclose(fp); free(fp); return 0; } int main() { HEAD SG= {0},*head=&SG; int i,j,k,select,choice,now,next; if(DU(head)) { printf("請按任意鍵繼續…\n"); getchar(); } do { system("cls");//清屏 select=jiemian(); if(select==1) record(head->xuexiao,head->xiangmu,head->b,head); //記錄學校和專案 else if(head->b[0]) { if(select>=2&&select<=4) xuanzepai(head,select-2);//選擇排序 else if(select==5) { for(k=0; k<head->b[0]; k++) //輸出學校名稱選項 每五個一行 printf("%d:%-13s%c",k+1,head->xuexiao[k],(k+1)%H?' ':'\n'); printf("\n輸入學校前的編號[1,%d]:",head->b[0]); choice=gainint(&choice,1,head->b[0])-1; next=0; while(next<head->b[1]) { now=next; next=MIN(next+H,head->b[1]); for(i=now; i<next; i++) //輸出專案資訊 printf("(%s-%d>%-8s ",sex[head->sex[i]],head->power[i],head->xiangmu[i]); printf("\n"); for(j=0; j<3; j++) { printf("%-s: ",ss[j]); for(k=now; k<next; k++) { if(j==head->sex[k]||j==2) printf("%02d分 \t",(head->spot+choice)->gram[j][k]); else printf("****** \t"); } printf("\n"); } printf("\n"); } } else if(select==6) { for(i=0; i<head->b[1]; i++) { printf("\t\t第%d個比賽專案: %-13s<%s子> 只錄入前%d名\n",i+1,head->xiangmu[i],sex[head->sex[i]],head->power[i]); for(j=0; j<head->power[i]; j++) { printf("\t第%d名:%-13s%02d分",j+1,head->xuexiao[head->cun[i][j]],power[(head->power[i])/4][j]); } printf("\n\n"); } } else //儲存檔案 { if(select==9) { printf("確認清空請按1 否則請按0:"); if(gainint(&choice,0,1)) for(k=0; k<Q; k++) //對申請出來的結構體中的所有專案初始化 M*2*M次 for(i=0; i<3; i++) { (head->spot+k)->sum[i]=0; //sum[]初始化 for(j=0; j<Q; j++) (head->spot+k)->gram[i][j]=0; //專案初始化 head->b[i]=0; } } if(XIE(head))return 0; DU(head); } } printf("\n請按任意鍵繼續…\n"); getchar(); } while(select!=8); return 0; } int BF(char a[],char b[])//BF演算法 a為主串,b為被檢驗的串`返回b在a中的第一個下標 若無返回0 { int i=0,j=0; while (a[i]&&b[j]) if (a[i++]==b[j])++j; // 繼續比較後繼字 else (i-=j)&&(j=0); return b[j]?0:i-j+1; } int gainint(int *p,int a,int b)//輸入int *p直至滿足[a,b]輸入結束,並返回*p的值 { do { *p=a-1; //此處是為了減少意外情況的發生 雖然那種意外情況不常見 scanf("%d",p); while(getchar()!='\n'); if(*p>b||*p<a) printf("輸入有誤,請重新輸入[%d--%d]:",a,b); }while(*p>b||*p<a); return *p; } int gainchar(char A[],int min,int max)//長度在[min,max] <閉區間> 之間時 函式結束 返回字串A的長度 { int B,C; do { A[max]=B=C=0; while((A[B++]=getchar())!='\n'&&B<max); if(A[B-1]!='\n')while(getchar()!='\n'&&++C); else A[--B]=0; if(C||B&&B<min) printf("您錄入的字串長度:%d位元組\n只錄入(%d--%d)個位元組!\n",B+C,min,max); } while(C||B<min); return B; } int jiemian() { int a; printf("\t\t\t\t運動會分數統計\n"); printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \n"); printf("\t* 1.新增 學校 專案 *三名制(1,2,3)\n"); printf("\t* 2.按 男團體 總分排序輸出 *score--5,3,2\n"); printf("\t* 3.按 女團體 總分排序輸出 *\n"); printf("\t* 4.按 學校 總分排序輸出 *五名制(1,2,3,4,5)\n"); printf("\t* 5.按 編號或名稱 查詢學校情況 *score--7,5,3,2,1\n"); printf("\t* 6.顯示比賽專案各學校名次情況 *\n"); printf("\t* 7.保存錄入資訊 *一個漢字兩個位元組\n"); printf("\t* 8.儲存資訊並退出 *可分多次選擇1\n"); printf("\t* 9.清空+恢復初始化 *錄入專案時預設先男後女\n"); printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t"); printf("輸入您的選擇(1-9):"); return gainint(&a,1,9); //呼叫函式輸入整形(1--6) } void record(char school[][N+1],char game[][N+1],int b[],HEAD *temp)//記錄資料最重要的一個函式,a為專案陣列,b為記錄,c為學校,Temp結構體 { char choose[][13]= {"錄入幾個學校","總共幾個專案","男生多少專案"}; //提示使用者輸入內容 int scope[][3]= {{5,1,0},{M,Q,M}}; //輸入的各個內容的範圍 int i,j,k,pan,cun,choice,man; scope[1][0]=M-b[0];//剩餘錄入的學校的數量 scope[1][1]=Q-b[1];//剩餘錄入的專案的數量 if(b[0])scope[0][0]=scope[0][1]=0;//當用戶已經進入此函式輸入過一次後,改變條件將學校個數專案個數下限改為0 for(i=0; i<3; i++) { printf("\t%s(%d--%d)?\n\t:",choose[i],scope[0][i],scope[1][i]); gainint(&b[i],scope[0][i],scope[1][i]); if(i==1) { scope[1][2]=b[1];//當輸入專案完畢時,改變男生專案的長度 if(!b[0]&&!b[1]) { b[2]=b[1]; i++; } } if(i==2) b[3]=b[1]-b[2]; //男生輸入完畢時,女生的專案=總專案-男生專案 } for(i=M-scope[1][0]; i<b[0]+M-scope[1][0]; i++) //每次要在結構體末尾加入學校 do { k=0; printf("請輸入第%d個學校的名稱(只錄入%d-%d字元):\n",i+1,8,N); gainchar(school[i],8,N); for(j=0; j<i; j++) //對輸入的學校名稱進行判重 if(BF(school[j],school[i])&&BF(school[i],school[j]))//當有之前的學校和當前錄入的學校重複 k++; if(k)printf("學校已經錄入過!"); } while(jianyan(school[i],1)||k); b[0]+=M-scope[1][0];//計算出目前的學校總數 for(i=Q-scope[1][1]; i<b[1]+Q-scope[1][1]; i++) //錄入專案 { temp->sex[i]=(b[1]+Q-scope[1][1]-i)<=b[3];//確定性別,0為男,1為女 do { k=0; printf("請輸入第%d個專案(%s)名稱(只錄入%d-%d字元):\n",i+1,sex[temp->sex[i]],4,N); //輸入專案名稱 gainchar(game[i],4,N); for(j=0; j<i; j++) if(BF(game[j],game[i])) k++; if(k) printf("專案已經錄入過!");//情況同學校 pan=(k||jianyan(game[i],2)); //因為專案還要分錄入前三名還是前五名 if(!pan)//當輸入滿足要求時 繼續詢問專案的錄入名次 do { printf("該專案只錄入: 3:前三名 5:前五名:");//詢問錄入的時前幾名 gainint(&(temp->power[i]),3,5);//將第i+1個專案的分數情況放在頭節點的power[i]數組裡 } while((temp->power[i])==4); //只錄入3和5 } while(pan); //當輸入不滿足要求時重新輸入 system("cls"); for(k=0; k<b[0]; k++) //輸出學校名稱選項 每五個一行 printf("%d:%-13s%c",k+1,school[k],(k+1)%H?' ':'\n'); printf("\n\n獲得 %s:(%s子)的前%d名(填學校前的編號):\n",game[i],sex[temp->sex[i]],temp->power[i]); for(j=0; j<temp->power[i]; j++) //每次錄入的專案個數=temp->power[i] { do { pan=0; printf("第%d名(%d-%d):",j+1,1,b[0]); cun=gainint(&cun,1,b[0])-1;//範圍1-b[0] (temp->cun[i][j])=cun;//temp->cun[i][j]中的數值就是第i個學校,名次為j for(k=0; k<j; k++) //檢驗名次是否錄入重複 if(temp->cun[i][k]==cun) pan=printf("一個學校只有一個名次!\n"); } while(pan); choice=power[(temp->power[i])/4][j]; man=temp->sex[i]; (temp->spot+cun)->gram[man][i]=choice;//把choice積分存入第cun個學校的第i個專案 的gram[man][i]裡 (temp->spot+cun)->gram[2][i]+=choice;//修改第cun個學校的該專案總分 (temp->spot+cun)->sum[man]+=choice;//修改第cun個學校的m男女團體總積分 (temp->spot+cun)->sum[2]+=choice;//修改學校的總積分 } } b[1]+=Q-scope[1][1];//修改錄入的專案的總數量 } int jianyan(char b[],int T)//檢驗b[]是否符合實際,T=1檢驗學校,T=2檢驗比賽 { int d=0,i,LEN=-1,F; while(b[++LEN]);//求b的位元組 for(i=0; i<LEN; i++) //漢字的ascll編碼每一個位元組為負數 if(b[i]>0) return printf("輸入中有含中文以外的字元!"); for(i=0; key[i][0]; i++) { F=BF(b,key[i]);//匹配中文標點符號 if(F&&F%2) return printf("有非漢字的中文字元!"); } if(T==1)//檢驗學校的名稱 { for(i=0; school[i][0]; i++) { F=BF(b,school[i]); if(F&&F%2)d++; } if(!d)return printf("學校名稱太奇葩!"); } if(T==2)//檢驗比賽的名稱 { for(i=0; program[i][0]; i++) { F=BF(b,program[i]); if(F&&F%2)d++; } if(!d)return printf("專案名稱太奇葩!"); } return 0;//沒問題返回0 } void xuanzepai(HEAD *temp,int select)//選擇排序 { int i,j,k,m,a,b,n,school[2][M]= {0}; n=temp->b[0]; printf("升序請按0 降序請按1:"); gainint(&b,0,1); for(i=0; i<n; i++) { school[1][i]=i;//記錄學校當前的位置編號 school[0][i]=(temp->spot+i)->sum[select]; } printf("%s排名如下\t<以第%d列分數為準>:\n\n",ss[select],select+1); for(i=0; i<n-1; i++) { k=i; for(j=i+1; j<n; j++) if(b?school[0][j]>school[0][k]:school[0][j]<school[0][k]) k=j; if(k!=i) for(m=0; m<2; m++) //a[][M]的兩行都交換 { a=school[m][k]; school[m][k]=school[m][i]; school[m][i]=a; } } printf("名次: 學校名稱 男團 女團 學校總分\n"); for(i=0; i<n; i++) { k=(b?i+1:n-i);//計算排名的名次顯示方向 j=school[1][i];//j記錄學校的編號 printf("第%02d:%-13s%02d分\t%02d分\t%02d分\n",k,temp->xuexiao[j],(temp->spot+j)->sum[0],(temp->spot+j)->sum[1],(temp->spot+j)->sum[2]); } }
複製程式碼 直接執行即可:
/*製作者 zhagoodwell*/
/*資料結構結業課程設計*/
/* 參加運動會有n個學校,學校編號為1……n。比賽分成m個男子專案,和w個女子專案。專案編號為男子1……m,女子m+1……m+w。不同的專案取前五名或前三名積分;取前五名的積分分別為:7、5、3、2、1,前三名的積分分別為:5、3、2;哪些取前五名或前三名由學生自己設定。(m<=20,n<=20)
【基本要求】
(1)可以輸入各個專案的前三名或前五名的成績;
(2)能統計各學校總分,
(3)可以按學校編號或名稱、學校總分、男女團體總分排序輸出;
(4)可以按學校編號查詢學校某個專案的情況;可以按專案編號查詢取得前三或前五名的學校。
(5)儲存結構自選,但要求運動會的相關資料存入並能隨時查詢
(6)規定:輸入資料形式和範圍:可以輸入學校的名稱,運動專案的名稱
(7)輸出形式:有中文提示,各學校分數為整形
(8)介面要求:有合理的提示,每個功能可以設立選單,根據提示,可以完成相關的功能要求。*/