В последней функции "large", "Initializing" double "с выражением несовместимого типа" double [10] '" - PullRequest
0 голосов
/ 27 апреля 2020

В последней функции «наибольший» я пытаюсь вывести наибольшее число, сравнивая двойные числа, но он не позволяет мне присвоить его переменной и выдает ошибку «Инициализация« двойного »с выражением несовместимого». введите 'double [10]' ". Я не уверен, в чем проблема и как мне найти игрока с наибольшим количеством очков.

#define MAX 10

// Main struct
struct players{
    char name[20];
    double score[MAX][MAX];
};

// function declaration
int playerName(struct players *test);
int playerScore(struct players *test, int nop);
double largest(struct players *test, int nof, int nop);

int main(void) {
    int i,j;
    int nop, nof;
    struct players mainPlayers[MAX];

    nop = playerName(mainPlayers);
    nof = playerScore(mainPlayers, nop);
    for (i = 0; i < nop; i++) {
        printf("%s ",mainPlayers[i].name);
        for (j = 0; j < nof; j++) {
            printf("%.2lf ",*mainPlayers[i].score[j]);
        }
    }

    return 0;
}

// gets players name
int playerName(struct players *test){

    int i;
    int nop = 0;

    printf("Enter Number of players: ");
    scanf("%d", &nop);

    for (i = 0 ; i<nop; i++) {
        printf("Enter player %d's name: ", i+1);
        scanf("%s", test[i].name);
    }
    return nop;
}

// gets players score
int playerScore(struct players *test, int nop){
    int i,j;
    int nof = 0;

    printf("Enter Number of fields: ");
    scanf("%d", &nof);

    for (i = 0 ; i<nop; i++) {
        for (j = 0; j < nof; j++) {
            printf("Enter player %s's score %d: ", test[i].name, j+1);
            scanf("%lf", test[i].score[j]);
        }
    }
    return nof;
}

// supposed to get the largest score out of all the scores and print that players name and score in the main function.
float largest(struct players *test, int nof, int nop){

    int i,j;
    double largest = test[i].score[j];
    for (i = 0; i < nop; i++) {
        for (j = 0; j < nof; j++) {
            if (test[i].score[j] < test[i].score[j+1]) {
                largest = test[i].score[j];
            }
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 27 апреля 2020

Поэтому лучше ограничить область видимости переменных, поэтому предложите удалить такие выражения, как:

int i,j;

, и в каждом for() l oop заменить выражения, такие как:

for (i = 0; i < nop; i++)

с:

for ( int i = 0; i < nop; i++ )  

и аналогично для каждого из for() циклов

в функции: largest() относительно:

int i,j;
double largest = test[i].score[j];

локальных переменных i и j используются без инициализации какого-либо определенного c значения. Результатом является неопределенное поведение.

относительно:

for (j = 0; j < nof; j++) {
        if (test[i].score[j] < test[i].score[j+1]) 

, поскольку локальная переменная j увеличивается до максимального допустимого индекса для массива, выражение: test[i].score[j+1] будет доступно после конец массива. Помните: допустимые индексы в любом массиве (в C) равны 0 ... (количество элементов в массиве -1)

относительно:

scanf("%s", test[i].name);

это %s будет позволяют пользователю вводить более 19 символов. Результатом такого действия пользователя является переполнение буфера и неопределенное поведение. Также следует проверить возвращаемое значение, чтобы убедиться, что операция прошла успешно. Рекомендовать:

if( scanf("%19s", test[i].name) != 1 )
{
    fprintf( stderr, "scanf for player %d name failed\n", i );
    exit( EXIT_FAILURE );
}

Где 19 означает, что поле name[] имеет длину 20 символов, а %s всегда добавляет к входу байт NUL.

в функции: largest() относительно :

double large = test [i] .score [j];

Поскольку переменные i и j не инициализированы, это неопределенное поведение. предложите использовать:

double largest = 0.0; 

и переместить эту строку сразу после:

for (i = 0; i < nop; i++) {

, чтобы выполнить «сброс» для каждого нового игрока, которого оценивают

сейчас для вашей проблемы:

относительно:

float largest(struct players *test, int nof, int nop){
    ....
double largest = test[i].score[j];

Не используйте имя функции в качестве локальной переменной внутри этой функции. Компилятор видит это как «рекурсивный» вызов, а не как локальную переменную.

Предложите использовать уникальное имя для локальной переменной.

0 голосов
/ 27 апреля 2020
#include <stdio.h>
#define MAX 10

// Main struct
struct players{
    char name[20];
    double score[MAX][MAX];
};

// function declaration
int playerName(struct players *test);
int playerScore(struct players *test, int nop);
double largest(struct players *test, int nof, int nop);
void ppg(struct players *test, int nof, int nop);

int main(void) {
    int nop, nof;
    struct players mainPlayers[MAX] = { 0 };

    nop = playerName(mainPlayers);
    printf("\n");
    nof = playerScore(mainPlayers, nop);
    printf("\n");
    ppg(mainPlayers, nof, nop);

    return 0;
}

// gets players name
int playerName(struct players *test){

    int i;
    int nop = 0;

    printf("Enter Number of players: ");
    scanf("%d", &nop);

    for (i = 0 ; i<nop; i++) {
        printf("Enter player %d's name: ", i+1);
        scanf("%s", test[i].name);
    }
    return nop;
}

// gets players score
int playerScore(struct players *test, int nop){
    int i,j;
    int nof = 0;

    printf("Enter Number of fields: ");
    scanf("%d", &nof);

    for (i = 0 ; i<nop; i++) {
        for (j = 0; j < nof; j++) {
            printf("Enter player %s's score %d: ", test[i].name, j+1);
            scanf("%lf", &test->score[i][j]);
        }
    }
    return nof;
}

// finds the largest number (Did not use)
double largest(struct players *test, int nof, int nop){

    int i = 0,j = 0;
    double largest2 = test->score[i][j];
    for (i = 0; i < nop; i++) {
        for (j = 0; j < nof; j++) {
            if (test->score[i][j] > test->score[i][j+1] && test->score[i][j+1] != '\0') {
                largest2 = test->score[i][j];
            }
        }
    }

    return largest2;
}

// Calculates and prints the player name and their ppg
void ppg(struct players *test, int nof, int nop){

    double sum = 0;
    int div = 0;
    double ppg = 0;
    char *name = NULL;

    for (int i = 0; i<nop; i++) {
        for (int j = 0; j<nof; j++) {
            if (test->score[i][j] == 0) {
                div++;
            }
            sum+= test->score[i][j];
        }
        sum/= (nof-div);
        if (ppg < sum) {
            ppg = sum;
            name = test[i].name;
        }
        sum = 0;
        div = 0;
    }
    printf("%s had the highest ppg with %.2lf points\n", name, ppg);
}
0 голосов
/ 27 апреля 2020

В вашем определении игрока:

struct players{
    char name[20];
    double score[MAX][MAX];
};

У каждого игрока есть имя, а также двумерная сетка из 100 баллов.

Я не знаю, какого рода Игра, которую он должен представлять, но, как правило, один игрок имеет один счет. Почему вы дали каждому игроку большую матрицу из 100 очков?

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