Перезапустить цикл в параллельном массиве - PullRequest
0 голосов
/ 22 февраля 2019

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

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

{
    const int SIZE = 12;
    string months[SIZE] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" };

    string Month[SIZE];
    double Rainfall[SIZE];
    int counter;

    double totalRainfall = 0.0;

    double averageRainfall = 0.0;

    for (counter = 0; counter < SIZE; counter++)
    {
        cout << "Enter the total rainfall for " << months[counter] << ": ";
        cin >> Rainfall[counter];

        if (Rainfall[counter] < 0.0)
        {
            cout << "Sorry, can't be a negative!" << endl;
            do
            {
                for (counter = 0; counter < SIZE; counter++)
                {
                    cout << "Enter the total rainfall for " << months[counter] << ": ";
                    cin >> Rainfall[counter];
                }
            } while (Rainfall[counter] < 0.0);
        }

        averageRainfall = totalRainfall / SIZE;
        cout << "Total rainfall for the whole year was: " << totalRainfall << setprecision(3) << endl;
        cout << "The average inches of rainfall was: " << averageRainfall << setprecision(3) << endl;

        system("pause");
        return 0;
    }
}

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Вот основной рабочий пример того, что вы пытаетесь достичь.Вместо того, чтобы добавлять, а затем проверять, я сначала проверял, прежде чем добавить значение в массив.Я создал простую функцию, чтобы убедиться, что ввод является действительным числом.Если это не так, просто сбросьте счетчик обратно на 0, и цикл for начнется с начала.

Редактирование: добавьте блок try и catch, чтобы убедиться, что ввод правильный двойной *

#include <iostream>
#include <string>

bool is_valid_num(std::string str){

    //check if its a number
    for(char c : str){
        if((c < 48 || c > 57 ) && c != 46) return false;
    }

    //if you want it to also not be equal to 0
    // if(std::stoi(str) < 0) return false;

    return true;
}

int main() {

    const int SIZE = 12;
    std::string months[] = { "January", "February", "March", "April", "May", "June", 
                        "July", "August", "September", "October", "November", "December" };


    std::string temp_input;
    double rainfall[12]; 
    double total_rainfall = 0.0;

    for(int i = 0; i < SIZE; i++){

        std::cout << "enter rainfall for " << months[i] << ": ";
        std::cin >> temp_input;

        //restart back to january
        if(!(is_valid_num(temp_input))) i = -1;

        rainfall[i] = std::stod(temp_input);
        total_rainfall += std::stod(temp_input);

    }

    std::cout << "avg rainfall: " << total_rainfall / 12.0 << "\n";
    std::cout << "total rainfall " << total_rainfall << "\n";
}
0 голосов
/ 22 февраля 2019

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

if (Rainfall[counter] < 0.0)
    {
        cout << "Sorry, can't be a negative!" << endl;
        counter--;// either put zero if you want to restart whole loop else decrement
        continue;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...