找到多组数字之间的最大差异

时间:2017-08-07 16:21:02

标签: c arrays

我试图创建一个程序来处理足球比赛的结果列表,同时处理结果。

我的程序的工作方式是输入已经播放的匹配数,然后列出每场比赛的结果。

列表中的每一行都具有HOME_TEAM_ID |的形式AWAY_TEAM_ID | HOME_TEAM_GOALS | AWAY_TEAM_GOALS

因此,例如,如果用户输入(第一行是匹配数):

#include <stdio.h>
#include <dbus/dbus.h>


int main(){
    DBusConnection *conn;
    DBusError err;
    dbus_error_init(&err);
    conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
    if(!conn){
        fprintf(stderr, "DBus error %s: %s\n", err.name, err.message);
        return(1);
    }
    dbus_bus_request_name(conn, "org.test", DBUS_NAME_FLAG_REPLACE_EXISTING, &err);
    if(dbus_error_is_set(&err)){
        fprintf(stderr, "DBus error %s: %s\n", err.name, err.message);
        dbus_connection_close(conn);
        return(1);
    }
    DBusMessage *msg;
    msg = dbus_message_new_signal("org/test/mon/data", "org.test.mon.data", "Data");
    if(msg == NULL){
        fprintf(stderr, "Message is null!\n");
        return(1);
    }
    dbus_message_append_args(msg, DBUS_TYPE_STRING, "My message", DBUS_TYPE_INVALID);
    if(!dbus_connection_send(conn, msg, NULL)) fprintf(stderr, "Error sending message!\n");
    dbus_message_unref(msg);
    dbus_connection_flush(conn);
    dbus_connection_close(conn);
}

我的程序将输出一行,其中包含:团队ID,胜率,主场比赛的胜率,赢得比赛的平均点差(如果没有主场比赛,则为-1)。最大(就点差而言)赢得一场比赛,然后赢得那个对手的身份。

2
0 1 5 0 
2 3 0 5

我已经完成了我的大部分课程,但我在实施最后一部分时遇到了困难。我想找出每支球队在一场比赛中获胜的最大(在球门差异方面),然后在对方差距方面获得最大胜利的对手的身份证。 (如果没有任何胜利,那么它应该只输出-1。)

我的第一个想法就是循环遍历数组,将变量设置为最大的胜利。对于每个元素,检查其点差是否高于变量。如果是,请将变量替换为当前元素的差异。

但是我收到编译错误。

0 1.000 1.000 5.000 
1 0.000 -1 -1 
2 0.000 0.000 -1 
3 1.000 -1 5.000 

任何有关如何在多个游戏中找到针对某个特定对手的最大平均点数差异的帮助,将不胜感激。

这是我的完整代码:

1079.c: In function 'main':
1079.c:153:11: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
   maximum = resultTable[0];
           ^
1079.c:157:24: warning: comparison between pointer and integer
     if (resultTable[n] > maximum)
                        ^
1079.c:159:17: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
        maximum  = resultTable[n];

3 个答案:

答案 0 :(得分:0)

您无法从输入数组的数据中获取所需的信息(最大的等),因为您丢弃了以后需要的信息来计算它。

您需要将输入数据不变地存储到数组中,然后您可以根据需要计算任何内容。

特别是

    //The goal difference for home and away
    resultTable[homeTeamID][GD] = resultTable[homeTeamID][GD] + (homeGoals - awayGoals);
    resultTable[awayTeamID][GD] = resultTable[awayTeamID][GD] + (awayGoals - homeGoals);

你记得不同之处,但这还不足以计算每支球队在单场比赛中获得的最大胜利。相反,请同时存储homeGoalsawayGoals,然后再计算所需的信息。

答案 1 :(得分:0)

math.h包括HUGE_VAL

#include <math.h>

添加两个额外的列。

static const int NUM_COLUMNS = 10;
static const int NUM_TEAMS = 30;
double resultTable[NUM_TEAMS][NUM_COLUMNS];
int BEST_WIN_DIFF = 8, BEST_WIN_OPPONENT = 9;

将它们添加到table功能。

void table()
{
    int i;
    for (n = 0; n < NUM_TEAMS; n++) {
        for (i = 1; i < NUM_COLUMNS; i++) {
            resultTable[n][i] = 0;
        }

        resultTable[n][TEAM_ID] = n;
        resultTable[n][HOME_WIN_RATIO] = -1;
        resultTable[n][BEST_WIN_DIFF] = -HUGE_VAL;
    }
}

将新代码添加到sortData的末尾。

void sortData()
{
    ...

    int goalDiff = homeGoals - awayGoals;

    if (goalDiff > resultTable[homeTeamID][BEST_WIN_DIFF]) {
        resultTable[homeTeamID][BEST_WIN_DIFF] = goalDiff;
        resultTable[homeTeamID][BEST_WIN_OPPONENT] = awayTeamID;
    }
    if (-goalDiff > resultTable[awayTeamID][BEST_WIN_DIFF]) {
        resultTable[awayTeamID][BEST_WIN_DIFF] = -goalDiff;
        resultTable[awayTeamID][BEST_WIN_OPPONENT] = homeTeamID;
    }
}

最后更新printer以包含额外的列。

void printer()
{
    for (n = 0; n < NUM_TEAMS; n++) {
        if (resultTable[n][NUM_OF_GAMES] != 0) {
            if (resultTable[n][HOME_WIN_RATIO] == -1) {
                printf("%d %.3f %.0f %.3f %.0f %.0f\n", n,
                    resultTable[n][WIN_RATIO],
                    resultTable[n][HOME_WIN_RATIO],
                    resultTable[n][GD],
                    resultTable[n][BEST_WIN_DIFF],
                    resultTable[n][BEST_WIN_OPPONENT]);
            }
            else {
                printf("%d %.3f %.3f %.3f %.0f %.0f\n", n,
                    resultTable[n][WIN_RATIO],
                    resultTable[n][HOME_WIN_RATIO],
                    resultTable[n][GD],
                    resultTable[n][BEST_WIN_DIFF],
                    resultTable[n][BEST_WIN_OPPONENT]);
            }    
        }
    }
}

答案 2 :(得分:0)

double resultTable [30] [10];

resultTable[x]是指向double [10]

的指针

resultTable[x]double *

的指针

resultTable[x][y]double

这就是你收到警告的原因

您的代码中存在更多问题

你扫描整数,但是将指针传递给双等等。