C 中的二维数组

发布于 2024-10-03 10:35:46 字数 3828 浏览 0 评论 0原文

因此,该程序应该获取奥本足球赛季的统计数据,计算每场比赛和整个赛季的平均值,并将它们以图表的形式打印在屏幕上。我以为我已经弄清楚了这一点,但在尝试编译时我不断收到错误。我确信我还遗漏了一些其他东西,但是一旦我让程序编译并给我结果,我就应该弄清楚这一点。如果我的老师决定教这门课,我可能会知道发生了什么。任何帮助将不胜感激。

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

错误:在“[”标记之前预期有“)” - 这会显示在我的所有 compAvg 函数中。

错误:“]”标记之前的预期表达式 - 该表达式出现在 numGames=getStats 行。

错误:函数“分析”的参数太少

错误:'numGames'未在此处声明(不在函数中) - 这出现在无效分析函数中,我猜测它与最后一个错误有关。

错误:下标值既不是数组也不是指针 - 这出现在我的第二个 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;
}

So, this program is supposed to take stats from Auburn's football season and compute averages for each game and the whole season and print them on the screen in a chart. I thought I had figured this out, but I keep getting errors while trying to compile. I'm sure I'm missing some other stuff too, but I should figure that out once I get the program to compile and give me results. I would probably know what was going on if my teacher decided to teach the class. Any help would be greatly appreciated.

Here are some of the errors I'm getting:

error: expected ')' before '[' token - this shows up on all of my compAvg functions.

error: expected expression before ']' token - this one shows up at the numGames=getStats line.

error: too few arguments to function 'analysis'

error: 'numGames' undeclared here (not in a function) - this appears at the void analysis function and I'm guessing it has to do with the last error.

error: subscripted value is neither array nor pointer - this is coming up on my first second printf line

#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;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

妥活 2024-10-10 10:35:46

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

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

numGames = getStats(date, oppName, inStats);

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

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

double compAvgTD(stat[][], numGames)

double compAvgTD(double stat[][4], int numGames)

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


正如另一位回答者指出的那样,在 main() 中声明函数是一种传统做法(尽管实际上并没有错)。如果声明的函数将从任何其他函数调用,那么在 main() 中声明函数会很糟糕 - 您必须重复自己在其他函数中声明函数它们的名称与敏捷格言相矛盾:DRY 不要重复自己。


“我是个容易上当受骗的人”编译解决方案

为了编译代码,需要进行许多更改。该代码尚未运行。

这里至少还存在一个错误 - compAvgPts() 函数使用与 cmpAvgYds() 相同的统计数据,这可能会提供夸大的点统计数据。修复这个问题需要进行中等程度的大手术;我认为您在输入中缺少两列数据(每个团队的得分)。

然而,代码确实可以在 MacOS X 10.6.5 上使用 GCC 4.2.1 和命令行进行干净地编译:

gcc -O -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
     -Wold-style-definition   xx.c -o xx

请注意,我必须将函数声明移出 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;
}

When you're passing the arrays, you just cite the names at the calling site:

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

numGames = getStats(date, oppName, inStats);

It is in the called functions that you use (more or less) the notation you showed.

However, when your function accepts a multi-dimensional array, you must specify the sizes of the second and subsequent dimensions in the function's argument list.

double compAvgTD(stat[][], numGames)

double compAvgTD(double stat[][4], int numGames)

This applies both in the declarations inside main() and in the definitions of the functions. Note that I added the types, too.


As another answerer pointed out, it is aconventional (though not actually wrong) to declare the functions inside main(). If the declared functions would be called from any other function, then it would be bad to declare the functions inside main() - you'd have to repeat yourself to declare the functions in the other functions from which they are called, in contradiction of the Agile dictum: DRY Don't Repeat Yourself.


The "I'm A Gullible Mug" Compiling Solution

There were many changes necessary to get the code to compile. The code has not been run.

There is at least one bug left in here - the compAvgPts() function uses the same statistic as cmpAvgYds() which is likely to give inflated statistics on the points. Fixing that requires moderately major surgery; I think you're missing two columns of data in the input (the score for each team).

However, the code does compile cleanly on MacOS X 10.6.5 using GCC 4.2.1 with the command line:

gcc -O -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
     -Wold-style-definition   xx.c -o xx

Note that I had to move the function declarations out of main(); otherwise, the compiler warned that there was no prototype in scope.

#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;
}
甜尕妞 2024-10-10 10:35:46

快速浏览一下答案:为什么要在 main 函数中声明函数?在主函数上方声明它们。

另外,我认为你所有的函数调用都是不正确的。大多数函数都需要数组,但传递它们的方式是不正确的。

例如:

当您调用该函数时,

int getStats(int date[][2], char oppName[], double inStats[][4]);

您必须这样做:

getStats(date, oppName, inStats)

编辑:正如 Jonathan Leffer 正确提到的那样,对于多维数组,必须传递第二个和后续维度。

检查以下链接。这些可能会有所帮助:

http://bytes.com/topic/c/insights/772412 -arrays-revealed

http:// /cboard.cprogramming.com/c-programming/97898-passing-2-Dimension-array-function.html

A quick glance answer: Why do you want to declare the functions inside the main function? Declare them above the main function.

Also, I think all your function calls are incorrect. Most of your functions expect arrays, but the way you are passing them are incorrect.

For Ex:

when you call the function

int getStats(int date[][2], char oppName[], double inStats[][4]);

You must do it like:

getStats(date, oppName, inStats)

EDIT: As correctly mentioned by Jonathan Leffer, for multi-dimensional arrays, second and subsequent dimensions must be passed.

Check the below links. These might help:

http://bytes.com/topic/c/insights/772412-arrays-revealed

http://cboard.cprogramming.com/c-programming/97898-passing-2-dimensional-array-function.html

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文