我想知道如何用C语言编写一个程序,该程序可以读取并给出锦标赛的结果。
在此程序中,我们将从用户那里获得:多少个冠军,冠军的名称,冠军中有多少支球队(然后用户输入球队的名称),冠军中的比赛次数,然后这种格式的游戏结果,例如:

墨西哥#3 @ 3#西班牙

波兰#2 @ 0#法国

...

然后,我们将获取所有这些信息并显示其排名,如下所示:


波兰,3分,1场比赛,1胜,0平局,0失利,2个进球,2个进球,2个进球
墨西哥,1分,1场比赛,0胜,1平,0负,0进球,...


(这是有序的,因此,如果您有更多积分(胜利= 3,平局= 1,失败= 0),您将排在榜首,如果您有更多平局,目标差等)

所以,这是我的问题:

我多次尝试在没有struct的情况下执行此程序,但由于不知道如何订购它而失败了。 (我知道如何对普通整数数组进行排序,但是在这种情况下,我不知道如何对它进行排序,因为例如,如果我要对那里的每个数组进行更高的排序,这并不意味着玩更多游戏的团队做了更多的积分,也就是说,这不一定是正确的,因此,如果我将一支球队打得更多,而我却降低了积分,那么如果我下令更高,则该程序将是错误的;如果我按照积分数进行排序,则不一定是那支球队得分最高的游戏最多,也许有人玩的次数更多,得分更少,在这种情况下,我会为得分最多的团队打印比实际更多的游戏,这是错误的。

然后我尝试使用结构体数组,但我也失败了,因为我不知道应该如何订购不在数组中的东西。即使我将结构内部的内容(胜利数,goals_made,goals_suffered ...)放在外部数组中,我也不知道数组中的哪个整数属于哪个团队,因此无法排序秩。

有人知道我怎么做这种程序吗?我是否真的应该使用结构数组?如果是,我该怎么办,如果不是,我该怎么办。

请注意,这是我需要做的事情,请不要在答案中在此处发布任何庞大的代码,只需将我引向我必须要做的事情即可。 (当然,如果代码是我如何做的解释的一部分,我将很高兴阅读)。

这是到目前为止我获得的主要成果:

typedef struct teams{
    int victories, defeats, draws, goals_made, goals_suffered, games, points;
    char name[30];
}TEAMS;


int ret, ret2, cont, cont2;
char caractere, caractere2;
char line[30], line2[30];
int i, j, k, l = 0, h = 0, n, t = 0, x = 30;  //t = number of teams     n = number of championships
char championship[100];
unsigned int g; //g = number of games already played in the championship
char useless;
int value1, value2, aux;

TEAMS zoera[30];

scanf("%d", &n);
fflush(stdin);

for(i = 0; i < n; i++){
    scanf("%[^\n]", championship);
    scanf("%d", &t);
    for(j = 0; j < t; j++){
        scanf("%s", zoera[j].name);
    }
    for(aux = 0; aux < t; aux++){
        zoera[aux].victories = 0;
        zoera[aux].defeats = 0;
        zoera[aux].draws = 0;
        zoera[aux].goals_made = 0;
        zoera[aux].goals_suffered = 0;
        zoera[aux].games = 0;
        zoera[aux].points = 0;
    }

    scanf("%u", &g);
    for(k = 0; k < g; k++){
        //scanf("%s", azedo2[k]);
        do{
           caractere = getchar();
           line[l] = caractere;
           l++;
        }while(caractere != '#');
        for(cont = 0; cont < t; cont++){
            ret = strcmp(line, zoera[cont].name);
            if(ret == 0){
               scanf("%c", &useless);
               scanf("%d", &value1);
               scanf("%c", &useless);
               scanf("%d", &value2);
               do{
                  caractere2 = getchar();
                  line2[h] = caractere2;
                  h++;
               }while(caractere2 != '\n');
                for(cont2 = 0; cont2 < t; cont2++){
                    ret2 = strcmp(line2, zoera[cont2].name);
                    if(ret2 == 0){
                        zoera[cont].games += 1;
                        zoera[cont2].games += 1;
                        zoera[cont].goals_made += value1;
                        zoera[cont2].goals_made += value2;
                        zoera[cont].goals_suffered += value2;
                        zoera[cont2].goals_suffered += value1;
                        if(value1 > value2){
                            zoera[cont].points += 3;
                            zoera[cont].victories += 1;
                            zoera[cont2].defeats += 1;
                        }
                        if(value1 == value2){
                            zoera[cont].points += 1;
                            zoera[cont2].points += 1;
                            zoera[cont].draws += 1;
                            zoera[cont2].draws += 1;
                        }
                        else{
                            zoera[cont2].points += 3;
                            zoera[cont2].victories += 1;
                            zoera[cont].defeats += 1;
                        }
                    }
                }
            }
        }
    }
}

最佳答案

您首先应该构建一个比较功能,该功能可以告诉您一个团队的排名是否高于另一个团队。这将具有问题的所有逻辑,例如点,平局等

int compare (TEAM *a, TEAM *b)
{
   if (a-> points != b -> points)
   {
      return ((a-> points) - (b-> points));
   }
   else if (a-> draws != b-> draws)
   {
      return ((a-> draws) - (b-> draws));
   }
   // any other logic that determines rank (games played etc)

   return 0;
}


然后,您可以在冒泡排序或任何其他排序算法中使用此功能。

int main(void)
{
   // Code to read the TEAMS from file.
   // total_teams should have the total no of teams read from file.

   for (i=0; i< total_teams -1; i++)
   {
      for (j=0; j< total_teams -1; j++)
      {
         if ((compare(&zoera[j], &zoera[j+1]) > 0)
         {
            // swap zoera[j] and zoera[j+1]
            temp_team = zoera[j];
            zoera[j] = zoera[j+1];
            zoera[j+1] = temp_team;
         }
      }
   }

   // Code to print the teams, if required.
}

关于c - 订购C级冠军,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40210835/

10-11 11:51