Почему bool isFull не обновляется до false? - PullRequest
0 голосов
/ 25 октября 2019

Предисловие: Этот вопрос относится к проекту для моего вступления в класс C в колледжеЯ новичок в Stack Overflow и прошу прощения, если форматирование и детализация не подходят. Эта программа написана на C и используется для редактирования списка футболистов. Мне не разрешено использовать структуры. Эффективность не оценивается. Код, не связанный с вопросом, не приводится.

В этом проекте перечислены меню входных значений, которые пользователь может ввести для выполнения определенной задачи. Программа имеет три параллельных массива: имена, числа и рейтинги. Если пользователь вводит «а», когда его просят выбрать опцию, программа предложит ему ввести имя, номер майки и рейтинг для добавления в массивы соответственно.

Я использую логическое значение для проверки, имеет ли nums [] какие-либо значения, равные -1. Если это так, bool isFull примет значение false. Если нет, программа выдаст «Список заполнен. \ N». При запуске программы информация 1 игрока может быть добавлена ​​в соответствующие массивы. Однако, хотя массивы имеют длину 10 индексов, когда пользователь выбирает «a» второго типа, программа isFull примет значение true и программа выведет сообщение об ошибке. Почему это так и как я могу решить эту проблему?

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

int findPlayer(int whichPlayer, const int jerseyNumbers[], int maxJersyCount);

int main(void) {
    int numToAdd;
    double ratingToAdd;
    char nameToAdd[100];

    int playerFound;
    char menuOp = 'x';
    bool isFull;

    int nums[10] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
    double ratings[10] = {-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0};
    char names[10][100] = {"~", "~", "~", "~", "~", "~", "~", "~", "~", "~"};

    while (menuOp != 'q') {

        printf("\nMENU\n");
        printf("a - Add a new player\n");
        printf("u - Update player information\n");
        printf("r - Remove a player from the roster\n");
        printf("d - Display player information\n");
        printf("p - Print the full roster\n");
        printf("s - Print \"Star\" players\n");
        printf("q - Quit\n");

        printf("\nChoose an option: ") ;
        scanf(" %c", &menuOp);

        switch (menuOp) {
            case 'a':
                printf("Enter player jersey number: ");
                scanf("%d", &numToAdd);

                playerFound = findPlayer(numToAdd, nums, 10);

                if (playerFound != -1) {
                    printf("Jersey # already in use.\n");
                    break;
                }

                printf("Enter player first or nick name: ");
                scanf("%s", nameToAdd);

                printf("Enter player rating: ");
                scanf("%lf", &ratingToAdd);

                isFull = true;
                for (int i = 0; i < 10; i++) {
                    if (nums[i] == -1) {
                        isFull = false;
                        break;
                    }
                }

                if (isFull) {
                    printf("The Roster is full.\n");
                }
                else {
                    for (int i = 0; i < 10; i++) {
                        if (nums[i] == -1) {
                            for (int j = 0; j < strlen(nameToAdd); j++) {
                                names[i][j] = nameToAdd[j];
                            }

                            nums[i] = numToAdd;
                            ratings[i] = ratingToAdd;
                        }
                    }
                }

                break;
    }

    return 0;
}

int findPlayer(int whichPlayer, const int jerseyNumbers[], int maxJersyCount) {
    for (int i = 0; i < maxJersyCount; i++) {
        if (jerseyNumbers[i] == whichPlayer) {
            return i;
        }
    }

    return -1;
}

Program Output

1 Ответ

1 голос
/ 25 октября 2019
int nums[10] = {-1};

Это только инициализирует первый элемент массива -1, но не все из них. Вам нужно будет явно инициализировать все значения -1:

int nums[10] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};

Также убедитесь, что ваш компилятор настроен на высокий уровень предупреждения. Во внешнем цикле вы читаете из переменной menuOp, прежде чем ей будет присвоено значение, что является неопределенным поведением.

Всегда полезно проверить возвращаемое значение scanf(), чтобы убедиться, чтозначение было успешно прочитано. Он вернет количество элементов, которые были успешно отсканированы. В вашем случае каждый вызов должен возвращать 1, если он успешен (потому что в каждом случае вы сканируете только один элемент). Если он возвращает 0, это означает, что он не смог проанализировать входные данные в запрошенном вами формате, а отрицательное возвращаемое значение означает, что при чтении входных данных возникла проблема.

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

for (int i = 0; i < 10; i++) {
    if (nums[i] == -1) {
        for (int j = 0; j < strlen(nameToAdd); j++) {
            names[i][j] = nameToAdd[j];
        }

        nums[i] = numToAdd;
        ratings[i] = ratingToAdd;
        break; // need to exit here!
    }
}
...