我想知道如何在C中构建一个可以阅读并给出锦标赛结果的程序。 在这个节目中,我们将从用户那里获得:冠军数量,冠军的名称,冠军中有多少球队(然后是用户写下球队的名字),冠军赛中的比赛数量,然后是以这种格式的游戏结果,例如:
墨西哥#3 @ 3#西班牙
波兰#2 @ 0#法国
...
然后我们将获得所有这些信息并显示它的等级,如下所示:
(这是一个顺序,所以如果你有更多的积分(胜利= 3,平局= 1,失败= 0)你将在排名的顶部,如果你有更多的平局,目标差异等)< / p>
所以,这是我的问题:
我试图在没有结构的情况下多次执行此程序,但我失败了,因为我不知道如何订购它。 (我知道如何订购普通的整数数组,但是在这种情况下我不知道如何订购它,因为,例如,如果我命令更高的每个数组,那并不意味着玩过更多游戏的团队做了更多的分数,也就是说,这不一定是真的,所以如果我在团队打得更多并且这支球队得分更少的情况下命令更高,那么这个计划将是错误的;如果我按点数排序,不一定是那个团队更多的积分玩的游戏数量最多,也许有人玩的时间更多,得分更少,在这种情况下,我打印团队的点数比实际玩的游戏多得多,即错误)。
然后我尝试使用一个结构数组,我也失败了,因为我不知道我应该如何订购不在数组中的东西。即使我将结构内部的东西(胜利数量,目标数量,目标数量等)放在外部数组中,我也不知道数组中的整数属于哪个团队,因此无法订购秩。
有人知道我怎么能制作这种节目?如果我真的应该使用一组结构?如果是,我怎么能这样做,如果没有,我怎么能这样做。
请注意,这是我需要做的某种事情,请不要在答案中发布任何巨大的代码,只是引导我去实现它必须做的事情。 (当然,如果代码是我如何做到的解释的一部分,我会很乐意阅读。)
以下是我到目前为止的主要内容:
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;
}
}
}
}
}
}
}
答案 0 :(得分:0)
你应该首先建立一个比较函数,它可以告诉你一个团队的排名是否高于另一个。这将具有问题的所有逻辑,例如,积分,平局等。
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.
}