我想知道如何用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/