1. 程式人生 > >運動會分數統計(資料結構課程設計)

運動會分數統計(資料結構課程設計)

參加運動會有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)介面要求:有合理的提示,每個功能可以設立選單,根據提示,可以完成相關的功能要求。*/