C中的二维数组

Jes*_*sse 3 c multidimensional-array

所以,这个节目应该从Auburn的足球赛季中获取统计数据并计算每场比赛和整个赛季的平均值,并将它们打印在屏幕上的图表中.我以为我已经想到了这一点,但在尝试编译时我一直遇到错误.我确定我也错过了其他一些东西,但是一旦我得到程序编译并给我结果,我应该想出来.如果我的老师决定教课,我可能会知道发生了什么.任何帮助将不胜感激.

以下是我得到的一些错误:

错误:预期')'在'''令牌之前 - 这显示在我的所有compAvg函数上.

错误:在']'标记之前的预期表达式 - 这一个出现在numGames = getStats行.

错误:函数"分析"的参数太少

错误:'numGames'在这里未声明(不在函数中) - 这出现在void分析函数中,我猜它与最后一个错误有关.

错误:下标值既不是数组也不是指针 - 这是我的第一个第二个printf行

#include <stdio.h> 
#include <math.h>

#define MAXGAMES 15
#define AUSTATS "auPass2010.txt"


int main() //main function
{
double date[MAXGAMES][2], oppName[MAXGAMES], inStats[MAXGAMES][4], outStats[MAXGAMES][3];       //declare variables
double avgCmp, avgAtt, avgYds, avgTD, avgPts;                                                                
int numGames=0, n=0,r,c;


int getStats(int date[][2], char oppName[], double inStats[][4]);//prototypes
void analysis( double inStats[][4], double outStats[][3], double numGames);
double compAvgCmp(stat[][], numGames);
double compAvgAtt(stat[][], numGames);
double compAvgYds(stat[][], numGames);
double compAvgTD(stat[][], numGames);
double compAvgPts(stat[][], numGames);

numGames = getStats(date[][2], oppName[], inStats[][4]);

printf("\t\t2010 AUBURN PASSING STATISTICS\nDATE\tOPPONENT\t\tCMP\tATT\tYDS\tTD --\tAVEYDS\t%CMP\tPTS\n-----\t-------------\t----\t----\t----\t"); //prints header  

if(numGames <= 0) printf("%s NO GAMES READ\n", AUSTATS);

else
{
    analysis(double inStats[][4], double outStats[][3], double numGames);

    printf("d\n", numGames);

    for ( r=0;r<numGames;r++ )
    {
        for(c=0;c<=4;c++)
        {
            printf("%2d/%2d\t%s\t\t%5.0d\t%5.0d\t%5.0d\t%5.0d\t   \t%6.1lf\t%6.1lf\t%5.0lf\n", date[r][0], date[r][1], oppName[r][0], inStats[r][0], inStats[r][1], inStats[r][2], inStats[r][3], outStats[r][0], outStats[r][1], outStats[r][2]);
        }
    }           
}

avgCmp = compAvgCmp(inStats[numGames][4], numGames);
avgAtt = compAvgCmp(inStats[numGames][4], numGames);
avgYds = compAvgCmp(inStats[numGames][4], numGames);
avgTD = compAvgCmp(inStats[numGames][4], numGames);
avgPts = compAvgCmp(outStats[numGames][4], numGames);

printf("-----\t------------------\t----\t----\t-----\t---\t\t\t----\n");
printf("Season Averages\t\t\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t\t\t3.1f\n", avgCmp, avgAtt, avgYds, avgTD, avgPts);

return 0;
}


int getStats(int date[][2], char oppName[], double inStats[][4])
{
FILE *infile;
int n=0;

infile = fopen(AUSTATS, "r");

if(infile == NULL) printf("%s FILE OPEN ERROR\n");
while(fscanf(infile, "%d %d %s %lf %lf %lf %lf", 
                date[n][0], date[n][1], oppName[n], inStats[n][0], inStats[n][1], inStats[n][2], inStats[n][3]) !=EOF) n++;

return n;
}

void analysis(double inStats[numGames][4], double outStats[numGames][3], double numGames)
{
int n;

for ( n=0;n<numGames;n++)
{
    outStats[n][0] = inStats[n][2] / inStats[n][0];
    outStats[n][1] = inStats[n][0] / inStats[n][1] * 100;
    outStats[n][2] = inStats[n][3] * 6;
}
}

double compAvgCmp(stat[][], numGames)
{
int n; 
double sum=0;

for (n=0;n<=numGames;n++)
{
    sum += stat[n][0]
}

return sum / numGames;
}

double compAvgAtt(stat[][], numGames)
{
int n; 
double sum=0;

for (n=0;n<=numGames;n++)
{
    sum += stat[n][1]
}

return sum / numGames;
}       

double compAvgYds(stat[][], numGames)
{
int n; 
double sum=0;

for (n=0;n<=numGames;n++)
{
    sum += stat[n][2]
}

return sum / numGames;
}

double compAvgTD(stat[][], numGames)
{
int n; 
double sum=0;

for (n=0;n<=numGames;n++)
{
    sum += stat[n][3]
}

return sum / numGames;
}

double compAvgPts(stat[][], numGames)
{
int n; 
double sum=0;

for (n=0;n<=numGames;n++)
{
    sum += stat[n][2]
}

return sum / numGames;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 5

当您传递数组时,您只需引用调用站点上的名称:

numGames = getStats(date[][2], oppName[], inStats[][4]);
Run Code Online (Sandbox Code Playgroud)

numGames = getStats(date, oppName, inStats);
Run Code Online (Sandbox Code Playgroud)

在您调用的函数中,您使用(或多或少)您显示的符号.

但是,当函数接受多维数组时,必须在函数的参数列表中指定第二维和后续维的大小.

double compAvgTD(stat[][], numGames)
Run Code Online (Sandbox Code Playgroud)

double compAvgTD(double stat[][4], int numGames)
Run Code Online (Sandbox Code Playgroud)

这适用于main()函数内部和函数定义中的声明.请注意,我也添加了类型.


正如另一位回答者所指出的那样,在内部声明这些功能是非常规的(尽管实际上并不是错误的)main().如果声明的函数将从任何其他函数调用,那么在内部声明函数将是不好的main()- 你必须重复自己在其他函数中声明函数,而这些函数与它们的调用相矛盾,这与敏捷格言相矛盾. :不要重复自己.


"我是一个容易受骗的马克杯"编译解决方案

编译代码需要进行许多更改.代码尚未运行.

此处至少还有一个错误 - 该compAvgPts()函数使用相同的统计信息cmpAvgYds(),可能会给出点数的虚增统计信息.修复需要适度大手术; 我认为你在输入中缺少两列数据(每个团队的得分).

但是,代码使用命令行使用GCC 4.2.1在MacOS X 10.6.5上进行干净编译:

gcc -O -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
     -Wold-style-definition   xx.c -o xx
Run Code Online (Sandbox Code Playgroud)

请注意,我必须移出函数声明main(); 否则,编译器警告说范围内没有原型.

#include <stdio.h> 
#include <math.h>

#define MAXGAMES 15
#define AUSTATS "auPass2010.txt"

int getStats(int date[][2], char oppName[][64], double inStats[][4]);
void analysis(double inStats[][4], double outStats[][3], int numGames);
double compAvgCmp(double stat[][4], int numGames);
double compAvgAtt(double stat[][4], int numGames);
double compAvgYds(double stat[][4], int numGames);
double compAvgTD(double stat[][4], int numGames);
double compAvgPts(double stat[][4], int numGames);

int main(void)
{
    int date[MAXGAMES][2];
    char oppName[MAXGAMES][64];
    double inStats[MAXGAMES][4];
    double outStats[MAXGAMES][3];
    double avgCmp, avgAtt, avgYds, avgTD, avgPts;
    int numGames=0, r,c;

    numGames = getStats(date, oppName, inStats);

    printf("\t\t2010 AUBURN PASSING STATISTICS\n"
            "DATE\tOPPONENT\t\tCMP\tATT\tYDS\tTD --\tAVEYDS\t%%CMP\tPTS\n"
            "-----\t-------------\t----\t----\t----\n");

    if (numGames <= 0)
        printf("%s NO GAMES READ\n", AUSTATS);
    else
    {
        analysis(inStats, outStats, numGames);
        printf("%d\n", numGames);

        for (r=0;r<numGames;r++)
        {
            for (c=0;c<=4;c++)
            {
                printf("%2d/%2d\t%s\t\t%5.0f\t%5.0f\t%5.0f\t%5.0f\t   \t%6.1lf\t%6.1lf\t%5.0lf\n",
                        date[r][0], date[r][1], &oppName[r][0], inStats[r][0], inStats[r][1],
                        inStats[r][2], inStats[r][3], outStats[r][0], outStats[r][1], outStats[r][2]);
            }
        }           

        avgCmp = compAvgCmp(inStats, numGames);
        avgAtt = compAvgAtt(inStats, numGames);
        avgYds = compAvgYds(inStats, numGames);
        avgTD  = compAvgTD(inStats, numGames);
        avgPts = compAvgPts(inStats, numGames);

        printf("-----\t------------------\t----\t----\t-----\t---\t\t\t----\n");
        printf("Season Averages\t\t\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t\t\t%3.1f\n", avgCmp, avgAtt, avgYds, avgTD, avgPts);
    }

    return 0;
}

int getStats(int date[][2], char oppName[][64], double inStats[][4])
{
    FILE *infile;
    int n=0;

    infile = fopen(AUSTATS, "r");

    if (infile == NULL)
        printf("%s FILE OPEN ERROR\n", AUSTATS);
    else
    {
        while (fscanf(infile, "%d %d %63s %lf %lf %lf %lf", 
                    &date[n][0], &date[n][1], oppName[n], &inStats[n][0], &inStats[n][1],
                    &inStats[n][2], &inStats[n][3]) == 7)
            n++;
        fclose(infile);
    }

    return n;
}

void analysis(double inStats[][4], double outStats[][3], int numGames)
{
    int n;

    for (n=0;n<numGames;n++)
    {
        outStats[n][0] = inStats[n][2] / inStats[n][0];
        outStats[n][1] = inStats[n][0] / inStats[n][1] * 100;
        outStats[n][2] = inStats[n][3] * 6;
    }
}

double compAvgCmp(double stat[][4], int numGames)
{
    int n; 
    double sum=0;

    for (n=0;n<=numGames;n++)
    {
        sum += stat[n][0];
    }

    return sum / numGames;
}

double compAvgAtt(double stat[][4], int numGames)
{
    int n; 
    double sum=0;

    for (n=0;n<=numGames;n++)
    {
        sum += stat[n][1];
    }

    return sum / numGames;
}       

double compAvgYds(double stat[][4], int numGames)
{
    int n; 
    double sum=0;

    for (n=0;n<=numGames;n++)
    {
        sum += stat[n][2];
    }

    return sum / numGames;
}

double compAvgTD(double stat[][4], int numGames)
{
    int n; 
    double sum=0;

    for (n=0;n<=numGames;n++)
    {
        sum += stat[n][3];
    }

    return sum / numGames;
}

double compAvgPts(double stat[][4], int numGames)
{
    int n; 
    double sum=0;

    for (n=0;n<=numGames;n++)
    {
        sum += stat[n][2];
    }

    return sum / numGames;
}
Run Code Online (Sandbox Code Playgroud)