Как напечатать сообщение только один раз в цикле - PullRequest
0 голосов
/ 14 февраля 2020

Я использую циклы for в сочетании с операторами if для чтения целых чисел из текстового файла в двумерный массив.

Это мой код:

for (int i = 0; i < MAX_ROWS;i++) {
        for (int j = 0; j < MAX_COLUMNS; j++) {
            inFile >> ArrB[i][j];
            if (ArrB[i][j] == -1) {
                bad = true;
                cout << "The array does not have enough integers" << endl;
                break;
            }
            else {
                if (ArrB[i][j] < 1) {
                    invalidnum = true;
                }
            }

            if (invalidnum = true) {
                cout << *(*(ArrB + i) + j) << " ";
                cout << "There is/are negative number(s) or zero(s) in the array imported from your text file." << endl;

            }
        }
    }

Этот код будет читать первые 6 целых чисел (max_row * max_column) из текстового файла в ArrB.

Если -1 существует в первых 6 целых числах, он выйдет из l oop и выведет «В массиве недостаточно целых чисел».

Если в -1 нет -1 первые 6 целых чисел, затем он проверит все 6 целых чисел, чтобы увидеть, есть ли другие отрицательные числа или ноль.

Если есть отрицательные числа или ноль, я хочу, чтобы он все еще распечатывал массив, а затем распечатывал сообщение об ошибке (В массиве, импортированном из / есть отрицательные числа или нули) ваш текстовый файл) ТОЛЬКО ОДИН РАЗ.

Например, это мой текстовый файл. Как видите, в первых 6 числах нет -1, но есть -7.

enter image description here

Итак, в идеале, результат должно быть что-то вроде:

2 4 5 6 9 -7

There is/are negative number(s) or zero(s) in the array imported from your text file

Но это то, что я получаю, если я запускаю свой код выше:

enter image description here

- ------------------------------------ОБНОВИТЬ------------- -------------------------

Разобрался, основываясь на комментарии @ZedLepplin

Вот код:

for (int i = 0; i < MAX_ROWS;i++) {
        for (int j = 0; j < MAX_COLUMNS; j++) {
            inFile >> ArrB[i][j];
            if (ArrB[i][j] == -1) {
                bad = true;
                cout << "The array does not have enough integers" << endl;
                break;
            }
            else {
                if (ArrB[i][j] < 1) {
                    invalidnum = true;
                }
            }
            cout << *(*(ArrB + i) + j) << " ";
        }
    }
    if (invalidnum == true) {
        cout << "There is/are negative number(s) or zero(s) in the array imported from your text file." << endl;
    }

Ответы [ 4 ]

2 голосов
/ 14 февраля 2020

Вы можете просто установить счетчик и поместить сообщение за пределы l oop. Что-то вроде:

int counter = 0;
for(int i = 0; i < MAX_ROWS ; i++) {
    if(myVector[i] == -1) {
        counter++;
    }
    else {
    // Do normal stuff
    }
}
if(counter > 0) {
    cout << "The array contained " << counter << "negative values" << endl;
}

Хо, и я бы посоветовал избегать сравнений с «истиной». Если myVar - логический альрад, я могу просто сделать if(myVar). Не нужно делать if(myVar == true). И делать if(myVar = true) хуже, так как он устанавливает myVar в true независимо от его начального значения. Это распространенная опечатка, которую трудно обнаружить при корректировке кода.

Отредактированная версия (для адаптации к комментариям):

bool earlyNegativeOneFound = false;
int otherNegativeCounter;

    for(int i = 0; i < MAX_ROWS ; i++) {
        if(i < 6 && myVector[i] == -1) {
            earlyNegativeOneFound = true;
            break;
        }
        else if(myVector[i] < 0) {
            cout << myVector[i] << endl;
            otherNegativeCounter++;
        }
        else {
        // Do normal stuff
        }
    }
    if(!earlyNegativeOneFound  && otherNegativeCounter> 0) {
        cout << "The array contained " << otherNegativeCounter << "negative values" << endl;
    }
1 голос
/ 14 февраля 2020

Поставьте условное сообщение об ошибке после вашей для l oop. Оставьте cout для отображения номера массива внутри для l oop, чтобы он выводился для каждой итерации l oop.

for (int i = 0; i<MAX_ROWS;i++) {
    for (int j = 0; j<MAX_COLUMNS; j++) {
        inFile >> ArrB[i][j];
        if (ArrB[i][j] == -1) {
            bad = true;
            cout << "The array does not have enough integers" << endl;
            break;
        }
        else {
            if (ArrB[i][j] < 1) {
                invalidnum = true;
            }
        }

        cout << * (*(ArrB + i) + j) << " ";
    }
}

if (invalidnum = true) {
        cout << "There is/are negative number(s) or zero(s) in the array imported from your text file." << endl;
}
1 голос
/ 14 февраля 2020

Я не уверен, что это именно то, что вы имели в виду

for (int i = 0; i < MAX_ROWS;i++) {
        for (int j = 0; j < MAX_COLUMNS; j++) {
            flag log = false;
            inFile >> ArrB[i][j];
            if (ArrB[i][j] == -1) {
                bad = true;
                cout << "The array does not have enough integers" << endl;
                break;
            }
            else {
                if (ArrB[i][j] < 1) {
                    invalidnum = true;
                }
            }

            if (invalidnum = true) {
                cout << *(*(ArrB + i) + j) << " ";
                if(!flag)
                {

                     cout << "There is/are negative number(s) or zero(s) in the array 
                              imported from your text file." << endl;
                     flag = true;
                }
            }
        }
    }

Добавление логической переменной flag позволило бы напечатать утверждение "есть отрицательные числа ..." один раз.

0 голосов
/ 14 февраля 2020

Просто сохраните сообщение и распечатайте его где и когда вы хотите. Какой-то псевдо-код:

std::string message;
for (int i = 0; i < N; ++i)
{
    for (int j = 0; j< M; ++j)
    {
        if (smth)
        {
            message {"Your message"};
            break; // note that after break,
                   // you are still in the outer loop
        }
        else if (smth else)
        {
            message {"Your message"};
        }
    }
    // print it here
}
// or here, or wherever you want to
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...