Моя программа должна перечислять оценки игроков под названиями их команд, но печатает неверные.Как я могу это исправить? - PullRequest
0 голосов
/ 13 октября 2018

Я пишу программу для регистрации бейсбольных команд, игроков и средних показателей.Предполагается прочитать в названиях команд, сколько команд существует, сколько их игроков, а затем взять имена игроков + его команда + его среднее число.После этого должны быть напечатаны команды, первоначально введенные, когда только команды были приглашены, и каждый из игроков от него и их средние значения.Тем не менее, он делает последнюю часть неправильно.Мой код:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct Player {
    char name[50];
    char teamName[50];
    float battingAv;
};

int main(void)
{
    int userNumber;
    printf("Enter the number of teams you wish to record: ");
    scanf("%d", &userNumber);
    int i;
    char teams[userNumber][40];
    for (i = 0; i < userNumber; i++) {
        char name[40];
        printf("Enter the name(s) of the teams: ");
        scanf("%s", &name);
        strcpy(teams[i], name);
    }

    int q;
    for (q = 0; q < userNumber; q++) {
        printf("Team %d is %s\n", q + 1, teams[q]);
    }

    int numOfPlayers;
    printf("Enter the TOTAL number of players for all teams: ");
    scanf("%d", &numOfPlayers);
    int j;
    struct Player playersEntered[numOfPlayers];
    for (j = 0; j < numOfPlayers; j++) {

        printf("Enter the %d Player name, Team name, and batting average: ", j + 1);
        scanf("%s %s %f", &playersEntered[j].name, &playersEntered[j].teamName, &playersEntered[j].battingAv);
    }

    printf("Listing of players and batting average according to team names:: \n");
    int m;
    for (m = 0; m < userNumber; m++) {
        int n;
        printf("%s-\n", teams[m]);
        for (n = 0; n < numOfPlayers; n++) {
            //if(playersEntered[n].teamName == teams[m])
            int result = strcmp(playersEntered[n].teamName, teams[m]);
            if (result == 0)
            {
                printf("\t%s %f\n ", playersEntered[m].name, playersEntered[m].battingAv);
            }
            else {
                continue;
            }
        }
    }

}

Моя логика заключается в том, что последний цикл должен проходить через PlayersEntered и сравнивать имя команды, заданное для этого конкретного игрока, со списком команд, введенных в начале, поэтому он будет печатать толькоих имя под командой, для которой они перечислены.Но мой вывод неверен.

Мой вывод должен быть таким: enter image description here

1 Ответ

0 голосов
/ 13 октября 2018
printf("\t%s %f\n ", playersEntered[m].name, playersEntered[m].battingAv);

->

printf("\t%s %f\n ", playersEntered[n].name, playersEntered[n].battingAv);

Такие ошибки лучше всего предотвратить, если не использовать m и n (или i и l или j) для переменных вложенного цикла.


btw:

strcpy(teams[i], &name);

Вам не нужен оператор адреса для name.Имя массива автоматически является адресом его первого элемента.


Шаблон, видимый несколько раз:

int m;
for(m = 0; m < userNumber; m++) {

Пожалуйста, просто определите переменную внутриfor -статист:

for(int m = 0; m < userNumber; ++m) { // ...

Вы используете int для индексов объектов в памяти.Правильный тип будет size_t (<stddef.h>), который гарантированно будет достаточно большим, чтобы вместить все возможные размеры объектов и индексы.Формат scanf() для него: "%zu".


Разговор scanf():

Никогда!Действительно НИКОГДА!Используйте "%s" без указания WIDTH (= максимальное количество символов для чтения), которое на единицу меньше, чем место в параметре, заданном для scanf():

char name[40];
scanf("%39s", name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...