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)
当您传递数组时,您只需引用调用站点上的名称:
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)