函数中的数组无法正确显示

时间:2017-12-01 04:56:27

标签: c arrays function

该程序用于显示获胜团队,该团队在3x4阵列的3个团队中获得最高分。

inputteamscore功能有问题。我无法找到错误,input函数中的输入无法在teamscore功能中存储和计算。

void input(int a[NROW][NCOL])
{
    int x,y;
    double team;

        for(x=0;x<NROW;x++)
        {
            printf("\nEnter your team: ");
            scanf("%i",&team);

            for(y=0;y<NCOL;y++)
            {
                printf("\nEnter the score: ");
                scanf("%lf",&a[x][y]);
            }

        }
}


int teamscore(int a[NROW][NCOL])
{
    int x,y,highest,team;
    double sum;

        for(x=0;x<NROW;x++)
        {
            for(y=0;y<NCOL;y++)
            {
                sum = sum + a[x][y];
            }
        }

        for(x=0;x<NROW;x++)
                for(y=0;y<NCOL;y++)
                        if (a[x][y]>highest)
                        {
                            highest=a[x][y];
                        }

        return highest;
}

我的所有输出都是0。

这是我的全部代码。

#include <stdio.h>
#define NROW 3
#define NCOL 4

void initialize(int a[NROW][NCOL])
{
    int x,y;
        for(x=0;x<NROW;x++)
        {
            for(y=0;y<NCOL;y++)
            {
                a[x][y]=0;
            }
        }

}

/* Display array in a matrix form*/
void disp_arr(int a[NROW][NCOL])
{
    int x,y;
        for(x=0;x<NROW;x++)
        {
            for(y=0;y<NCOL;y++)
            {
                printf("%i ",a[x][y]);
            }
        printf("\n");
    }
}

/* Input the invidual score for 3 team*/
void input(int a[NROW][NCOL])
{
    int x,y;
    double team;

        for(x=0;x<NROW;x++)
        {
            printf("\nEnter your team: ");
            scanf("%i",&team);

            for(y=0;y<NCOL;y++)
            {
                printf("\nEnter the score: ");
                scanf("%lf",&a[x][y]);
            }

        }
}

/* Calculate the total of score for each team and return the index for the 
row with the highest team score */
int teamscore(int a[NROW][NCOL])
{
    int x,y,highest,team;
    double sum;

        for(x=0;x<NROW;x++)
        {
            for(y=0;y<NCOL;y++)
            {
                sum = sum + a[x][y];
            }
        }

        for(x=0;x<NROW;x++)
                for(y=0;y<NCOL;y++)
                        if (a[x][y]>highest)
                        {
                            highest=a[x][y];
                        }

        return highest;
}

int main()
{
    int ar[NROW][NCOL];
    int team;
    initialize(ar);

    disp_arr(ar);

    input(ar);

    disp_arr(ar);

    team=teamscore(ar);


    printf("\nThe winniing team is Team %i",&team);

    return 0;
}

我会感激一些帮助。

谢谢!

2 个答案:

答案 0 :(得分:2)

您的代码对于team的意图是不明确的。您提示用户输入,然后尝试将team存储为double?除非您希望自己的团队编号是,例如123.456,只需让您的团队成为int,例如团队1,团队10等。

您遇到的下一个问题是为团队编号提供输入,但不允许该条目可用于input以外的任何其他功能。如果您没有传递另一个参数来捕获team的用户输入,那么您的团队只是a的索引,并且没有必要提示输入。要在main中重新提供用户输入,只需传递另一个参数(或只添加+1到NCOL并使用col 0作为团队编号)。以下是捕获团队编号的用户输入的方法(例如团队125, 190, ...),并在调用者中将其提供回来:

int main (void) {

    int hi_index = 0,
        teams[NROW] = {0},      /* note array of NROW for teams */
        ar[NROW][NCOL] = {{0}};
    ...
    input (ar, teams);

然后您可以通过将input数组作为参数传递来使teams捕获该信息,例如

/* Input the individual score for 3 team*/
void input (int a[NROW][NCOL], int teams[NROW])

您必须 验证 所有用户输入。使用scanf表示验证返回时,实际上会发生转化次数(在格式字符串中指定)。您还必须检查用户是否在windoze上生成了手​​册EOF Ctrl + d Ctrl + z )。如果用户取消输入,您的代码应该优雅地处理该条件。如果用户刚刚提供无效输入并且由于匹配输入失败导致转换失败,则需要确定是否通知用户并提示用户&#34; 再试一次&#34;或者您是否将其视为取消。

要以这种方式接近用户输入,一种方法就是循环,直到您收到有效输入或用户取消,例如,在input功能中,您可以执行以下操作:

        for (;;) {      /* loop until valid input or user canceled */
            int rtn;

            printf ("\nEnter your team: ");
            rtn = scanf ("%d", &teams[x]);

            if (rtn == 1)
                break;
            else if (rtn == EOF) {
                fprintf (stderr, "user canceled input.\n");
                exit (EXIT_FAILURE);
            }
            fprintf (stderr, "error: invalid input.\n");
            /* (you should empty stdin here) */
            empty_stdin();
        }

注意以清空stdin,您只需阅读getchar(),直至遇到'\n'EOF,例如

/* function to empty stdin */
void empty_stdin()
{
    int c = getchar();

    while (c != '\n' && c != EOF)
        c = getchar();
}

评论中已涵盖您的printfscanf 格式说明符不匹配。

将所有这些部分组合在一起,并假设您实际上想要整数作为团队编号而不是像123.456那样奇怪的团队编号,您可以执行类似以下操作:

#include <stdio.h>
#include <stdlib.h> /* for exit, EXIT_FAILURE */

#define NROW 3
#define NCOL 4

/* Display array in a matrix form*/
void disp_arr (int a[NROW][NCOL], int teams[NROW])
{
    int x, y;

    putchar ('\n');
    for ( x = 0; x < NROW; x++)
    {
        printf ("team %3d : ", teams[x]);
        for (y = 0; y < NCOL; y++)
            printf (" %4d", a[x][y]);
        putchar ('\n');
    }
}

/* function to empty stdin */
void empty_stdin()
{
    int c = getchar();

    while (c != '\n' && c != EOF)
        c = getchar();
}

/* Input the individual score for 3 team*/
void input (int a[NROW][NCOL], int teams[NROW])
{
    int x, y;

    for (x = 0; x < NROW; x++)
    {
        for (;;) {      /* loop until valid input or user canceled */
            int rtn;

            printf ("\nEnter your team: ");
            rtn = scanf ("%d", &teams[x]);

            if (rtn == 1)
                break;
            else if (rtn == EOF) {
                fprintf (stderr, "user canceled input.\n");
                exit (EXIT_FAILURE);
            }
            fprintf (stderr, "error: invalid input.\n");
            empty_stdin();
        }
        for (y = 0; y < NCOL; y++)
        {
            for (;;) {  /* same loop until valid or canceled */
                int rtn;

                printf ("Enter team[%d] score[%d]: ", teams[x], y + 1);
                rtn = scanf ("%d", &a[x][y]);

                if (rtn == 1)
                    break;
                else if (rtn == EOF) {
                    fprintf (stderr, "user canceled input.\n");
                    exit (EXIT_FAILURE);
                }
                fprintf (stderr, "error: invalid input.\n");
                empty_stdin();
            }
        }
    }
}

/* Calculate the total of score for each team.
* return the index for the row with the highest team score 
*/
int teamscore (int a[NROW][NCOL])
{
    int x, y, 
        highest = 0,
        hi_index = 0, 
        sum[NROW] = {0};

    for (x = 0; x < NROW; x++) {
        for (y = 0; y < NCOL; y++)
            sum[x] += a[x][y];
        if (sum[x] > highest) {
            highest = sum[x];
            hi_index = x;
        }
    }

    return hi_index;
}

int main (void) {

    int hi_index = 0,
        teams[NROW] = {0},
        ar[NROW][NCOL] = {{0}};

    // initialize (ar); /* ar is not a VLA, initialize at declaration */

    disp_arr (ar, teams);

    input (ar, teams);

    disp_arr (ar, teams);

    hi_index = teamscore (ar);

    printf ("\nThe winning team is Team %d\n", teams[hi_index]);

    return 0;
}

示例使用/输出

$ ./bin/team

team   0 :     0    0    0    0
team   0 :     0    0    0    0
team   0 :     0    0    0    0

Enter your team: 123
Enter team[123] score[1]: 10
Enter team[123] score[2]: 12
Enter team[123] score[3]: 14
Enter team[123] score[4]: 16

Enter your team: 138
Enter team[138] score[1]: 12
Enter team[138] score[2]: 14
Enter team[138] score[3]: 16
Enter team[138] score[4]: 18

Enter your team: 187
Enter team[187] score[1]: 11
Enter team[187] score[2]: 13
Enter team[187] score[3]: 15
Enter team[187] score[4]: 17

team 123 :    10   12   14   16
team 138 :    12   14   16   18
team 187 :    11   13   15   17

The winning team is Team 138

无效&amp;的示例取消输入

$ ./bin/team

team   0 :     0    0    0    0
team   0 :     0    0    0    0
team   0 :     0    0    0    0

Enter your team: The Mighty Ducks
error: invalid input.

Enter your team: user canceled input.

仔细看看,如果我对您的团队类型的假设有任何错误,请告诉我。如果您有其他问题,请告诉我。

答案 1 :(得分:0)

  1. 将%d用于整数而不是%lf。 %lf表示双倍 void输入(int [NROW] [NCOL]) { int x,y; 双重团队;

    for(x=0;x<NROW;x++)
    {
        printf("\nEnter your team: ");
        scanf("%i",&team);
    
        for(y=0;y<NCOL;y++)
        {
            printf("\nEnter the score: ");
            scanf("%d",&a[x][y]);// use %d for integer instead of %lf. %lf for double
        }
    
    }
    

    }

  2. 团队分数功能有很多错误。示例代码:

    int teamscore(int a[NROW][NCOL])
    {
    int x,y,highest,team;
    double sum;
    
    for(x=0;x<NROW;x++)
    {
        sum =0;
        for(y=0;y<NCOL;y++)
        {
            sum = sum + a[x][y];
        }
        a[x][0] = sum;
    }
    highest = a[0][0];
    team = 0;
    
    for(x=0;x<NROW;x++)
        if (a[x][0]>highest)
        {
            highest = a[x][0];
            team=x;
        }
    return team;// return row number
    

    }

  3. 在打印时仅在main中使用团队变量而不是&team。 &amp; team =团队变量的地址。

    printf("\nThe winniing team is Team %d",team);