2-й массив в Си - PullRequest
       2

2-й массив в Си

3 голосов
/ 19 ноября 2010

Итак, эта программа должна брать статистику футбольного сезона Оберна, вычислять средние значения для каждой игры и всего сезона и выводить их на экран в виде диаграммы. Я думал, что понял это, но я продолжаю получать ошибки, пытаясь скомпилировать. Я уверен, что мне тоже не хватает некоторых других вещей, но я должен это выяснить, как только я получу программу для компиляции и выдаю результаты. Я бы, наверное, знал, что происходит, если бы мой учитель решил преподавать в классе. Любая помощь будет принята с благодарностью.

Вот некоторые ошибки, которые я получаю:

ошибка: ожидается ')' перед '[' токеном - это отображается во всех моих функциях 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;
}

Ответы [ 2 ]

5 голосов
/ 19 ноября 2010

Когда вы передаете массивы, вы просто цитируете имена на вызывающем сайте:

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() - вам пришлось бы повторяться, чтобы объявить функции в других функциях, из которых они вызваны, в противоречие сAgile dictum: DRY Не повторяйте себя.


Компилирующее решение "I'm A Gullible Mug"

Было много изменений, необходимых для получениякод для компиляции.Код не был выполнен.

Здесь есть хотя бы одна ошибка - функция 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;
}
0 голосов
/ 19 ноября 2010

Быстрый быстрый ответ: почему вы хотите объявить функции внутри главной функции? Объявите их выше основной функции.

Кроме того, я думаю, что все ваши вызовы функций неверны. Большинство ваших функций ожидают массивы, но способ их передачи неверен.

Например:

при вызове функции

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

Вы должны сделать это так:

getStats(date, oppName, inStats)

РЕДАКТИРОВАТЬ: Как правильно отметил Джонатан Леффер, для многомерных массивов, должны быть переданы второе и последующие измерения.

Проверьте ссылки ниже. Это может помочь:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...