數據結構題目-運動會分數統計


題目描述
在很多的電視大賽中,通常當選手表演結束后,現場觀眾通過手中的按鍵對參賽選手進行投票,然后對選手獲得的票數進行統計,從高到低進行降序排列,從而自動產生冠軍、亞軍和季軍。現在要求編寫一程序模擬實現上述系統的功能。

(1) 在本例中首先輸入參賽選手的人數(范圍為1-9個);

(2) 將選手的編號和姓名依次存入順序表單元中;

(3) 觀眾通過按鍵進行投票,按“1”為1號選手投票,按“2”為2號選手投票,以此類推,已按零作為投票結束標志;

(4) 投票結束后進行排序,然后為每個選手計算名次,得票相同的名次也相同。

(5) 在主函數中調用菜單函數調試程序。

存儲類型的定義

參賽選手信息存儲類型的定義:

typedef struct node{

  char name[8]; //選手姓名

  int num; //選手編號

  int score; //選手得分

int tax; //選手名次

}Node;
#include <stdlib.h>
#include <string.h>
typedef struct Score
{
    char AthleteName[20];
    char SchoolName[20];
    int SchoolCode;
    int Rank;
    char Achievement[10];
} Score;

typedef struct Match
{
    int MatchCode;
    char MatchName[10];
    int Top;
    Score *RankList;//比賽項目里面包含着分數(儲存結構層面)
} Match, *Event;

typedef struct Record
{
    int MatchCode;
    char MatchName[10];
    int Rank;
    char Achievement[10];
    char AthleteName[20];
    int GetScore;
} Record;

typedef struct School
{
    char SchoolName[20];
    int num;
    int ptr;
    Record *RecordList;
} School, *SchoolSheet;

typedef struct Team
{
    int SchoolCode;
    char SchoolName[20];
    int ManTotal;
    int WomanTotal;
    int TeamTotal;
} Team, *All;

int n, m, w, t;
Event A;
SchoolSheet B;
All C;
int ScoreList[8] = {5, 3, 2, 7, 5, 3, 2, 1};

void Start()
{
    printf("--------------------------\n");
    printf("歡迎使用運動會分數統計系統\n");
    printf("--------------------------\n");
    return;
}

void Function()
{
    printf("-----功能選擇-----\n");
    printf("1.初始化\n");
    printf("2.清零\n");
    printf("3.錄入各項比賽成績\n");
    printf("4.產生學校成績單\n");
    printf("5.產生團體總分報表\n");
    printf("6.結果顯示\n");
    printf("7.返回主界面\n");
    printf("0.退出系統\n");
    return;
}
void login()
{
    printf("參加運動會的學校個數:");
    scanf("%d", &n);
    getchar();
    printf("運動會的男子項目個數:");
    scanf("%d", &m);
    getchar();
    printf("運動會的女子項目個數:");
    scanf("%d", &w);
    getchar();
    A = (Event)malloc((w + m) * sizeof(Match));
    B = (SchoolSheet)malloc(n * sizeof(School));
    C = (All)malloc(n * sizeof(Team));
    if (!A)
        exit(1);
    if (!B)
        exit(1);
    if (!C)
        exit(1);
    return;
}
void Clear()
{
    for (int i = 0; i < n; i++)
    {
        (B + i)->num = 0;
        (B + i)->ptr = 0;
        (B + i)->RecordList = NULL;
        (C + i)->SchoolCode = 0;
        (C + i)->ManTotal = 0;
        (C + i)->WomanTotal = 0;
        (C + i)->TeamTotal = 0;
    }
    for (int j = 0; j < (m + w); j++)
    {
        (A + j)->Top = 0;
        (A + j)->MatchCode = 0;
        (A + j)->RankList = NULL;
    }
    return;
}

void Input()
{
    int num = 0;
    for (int i = 0; i < (m + w); i++)
    {
        (A + i)->MatchCode = i + 1;
        printf("請輸入取前幾名(int),以及項目名稱(char)");
        scanf("%d %s", &(A + i)->Top, (A + i)->MatchName);
        getchar();
        num = (A + i)->Top;
        (A + i)->RankList = (Score *)malloc(num * sizeof(Score));
        Score *R = (A + i)->RankList;
        for (int j = 0; j < num; j++)
        {
            (R + j)->Rank = j + 1;
            printf("請輸入運動員名字");
            scanf("%s", (R + j)->AthleteName);
            printf("請輸入學校名稱");
            scanf("%s", (R + j)->SchoolName);
            printf("請輸入學校編號");
            scanf("%d", &(R + j)->SchoolCode);
            (B + (R + j)->SchoolCode - 1)->num++;
            printf("請輸入名次");
            scanf("%s", (R + j)->Achievement);
        }
    }
    return;
}
void SchoolScoreSheet()
{
    for (int j = 0; j < n; j++)
    {
        int c = (B + j)->num;
        (B + j)->RecordList = (Record *)malloc(c * sizeof(Record));
    }
    int num = 0;
    for (int i = 0; i < (m + w); i++)
    {
        Score *R = (A + i)->RankList;
        num = (A + i)->Top;
        for (int j = 0; j < num; j++)
        {
            int k = 0, h = 0;
            k = (R + j)->SchoolCode - 1;
            strcpy((B + k)->SchoolName, (R + j)->SchoolName);
            h = (B + k)->ptr;
            Record *L = (B + k)->RecordList;
            (L + h)->MatchCode = i + 1;
            (L + h)->Rank = (R + j)->Rank;
            strcpy((L + h)->MatchName, (A + i)->MatchName);
            strcpy((L + h)->AthleteName, (R + j)->AthleteName);
            strcpy((L + h)->Achievement, (R + j)->Achievement);
            if ((A + i)->Top != 3)
                (L + h)->GetScore = ScoreList[(R + j)->Rank + 2];
            else
                (L + h)->GetScore = ScoreList[(R + j)->Rank - 1];
            (B + k)->ptr++;
        }
    }
    return;
}

void TeamScoreSheet()
{
    for (int i = 0; i < n; i++)
    {
        (C + i)->SchoolCode = i + 1;
        strcpy((C + i)->SchoolName, (B + i)->SchoolName);
        Record *L = (B + i)->RecordList;
        for (int j = 0; j < (B + i)->num; j++)
        {
            if ((L + j)->MatchCode <= m)
                (C + i)->ManTotal = (C + i)->ManTotal + (L + j)->GetScore;
            else
                (C + i)->WomanTotal = (C + i)->WomanTotal + (L + j)->GetScore;
        }
        (C + i)->TeamTotal = (C + i)->ManTotal + (C + i)->WomanTotal;
    }
    return;
}

void Show()
{
    for (int i = 0; i < n; i++)
    {
        printf("\n%s的成績單:\n", (B + i)->SchoolName);
        printf("項目名\t姓名\t名次\t得分\n");
        int k = (B + i)->num;
        Record *L = (B + i)->RecordList;
        for (int j = 0; j < k; j++)
        {
            printf("%s\t%s\t%d\t%d\n", (L + j)->MatchName, (L + j)->AthleteName, (L + j)->Rank, (L + j)->GetScore);
        }
    }
    printf("團體總分報表:\n");
    printf("校號\t學校名稱\t男子團體總分\t女子團體總分\t團體總分\n");
    for (int i = 0; i < n; i++)
    {
        printf("%d\t%-20s%d\t\t%d\t\t%d\n", (C + i)->SchoolCode, (C + i)->SchoolName, (C + i)->ManTotal, (C + i)->WomanTotal, (C + i)->TeamTotal);
    }
    return;
}
void logoff() //退出系統
{
    printf("退出\n");
    exit(0);
}

void Home()
{
    Function();
    while (1)
    {
        printf("請輸入選擇的功能:");
        scanf("%d", &t);
        getchar();
        switch (t)
        {
        case 1:
            login();//初始化
            break;
        case 2:
            Clear();//清零
            break;
        case 3:
            Input();//錄入各項比賽成績
            break;
        case 4:
            SchoolScoreSheet();//產生學校成績單
            break;
        case 5:
            TeamScoreSheet();//產生團體總分報表
            break;
        case 6:
            Show();//結果顯示
            break;
        case 7:
            Home();//返回主界面
            break;
        case 0:
            logoff();//退出系統
            break;
        }
    }
    return;
}
int main()
{
    Start();//打印歡迎菜單
    Home();//打印選項菜單
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM