c++ - Проверка на возрастающую последовательнoсть


0

Сделал проверку на ввод чисел по возрастанию,вот только хотелось сделать так,чтобы если числа введены не по возрастанию,то ввести числа заново. У меня получилось,только не совсем корректно. Проблема с while

#include <iostream>
#include <deque>          
#include <string> 
#include <windows.h>
#include <cstdlib>
#include <algorithm>
#include <functional>

using namespace std;


int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i = 0;
int u = 0;
const int dequeSize = 10;

//Первый дек   
std::deque<int> myDeque(dequeSize);

cout << "Введите элементы дека" << endl;
for (i = 0; i<dequeSize; i++)
{
    cout << "Введенный дек [" << i << "] = ";
    while(!(cin>>myDeque[i])) 
{
    cout<<"~~~~~~~~~~~~~"<<endl;
    cout<<"ОШИБКА"<<endl;
    cout<<"Введите число:  ";
    cout<<endl<<endl<<endl<<endl;
    cin.clear(); 
    cin.sync();  
}

}



for (i = 0; i < (dequeSize - 1); i++)

    if (myDeque[i] > myDeque[i + 1])
        break;

if (i == (dequeSize - 1)){

    cout << "Sorted";
}else{

    cout << "Not Sorted";

}

//////Проблема Здесь//////


while(!(i == (dequeSize - 1))){

    cout << "Введите элементы дека" << endl;
for (i = 0; i<dequeSize; i++)
{
    cout << "Введенный дек [" << i << "] = ";
    while(!(cin>>myDeque[i])) 
{
    cout<<"~~~~~~~~~~~~~"<<endl;
    cout<<"ОШИБКА"<<endl;
    cout<<"Введите число:  ";
    cout<<endl<<endl<<endl<<endl;
    cin.clear(); 
    cin.sync();  
}
}
}
Источник
  •  43
  •  2
  • 16 янв 2018 2018-01-16 03:46:49
Ну так посмотри на условие прекращение цикла и сравни с тем, что нужно. — 20 янв 20182018-01-20 12:22:34.000000
Смотри,мне нужно так, я ввожу дек,если он не возрастает,то его нужно написать заново.Вот хочу циклом while,у меня не получается.Получается бесконечный цикл — 20 янв 20182018-01-20 12:15:37.000000
Ничего непонятно. %-) — 20 янв 20182018-01-20 12:06:49.000000
Проблема в том,что когда срабатывает while(!(i == (dequeSize - 1))), то выдает ввести заново числа,это ладно,но вот если ввожу по возрастанию ,то все равно выдает ввести дек заново т.е цикл зацикливается,мне нужно ,чтобы если был введен не правильный дек т.е не по возрастанию,то перейти к циклу while(!(i == (dequeSize - 1))) ,и в этом цикле был рабочая проверка на возрастание и если введен не по возрастанию,то ввести дек заново. Надеюсь понял меня) — 20 янв 20182018-01-20 11:59:57.000000
В чем выражается проблема? — 20 янв 20182018-01-20 10:03:05.000000

2 ответа

0

Если рационализировать код, то никакой if и не понадобится. Еще раз: у тебя два абсолютно одинаковых участка кода - зачем их повторять, если просто этот участок можно включить в цикл while (лучше, конечно в do while) и добавить туда проверку условия. Объем кода и операций еще уменьшится, если проверку организовать по ходу ввода, а не отдельным циклом.

Вот как сделал бы я:

int i = 0;
size = 10;
do {
    for (i = 0; i < size; ++i) {
        cin >> arr[i];
        if (i > 0 && arr[i] < arr[i - 1])
            break;
    }
} while (i < size);

Сравните это с вашей конструкцией.

Спасибо,очень сильно выручили меня. — 20 янв 20182018-01-20 17:55:02.000000
Верно)Сейчас попробую — 20 янв 20182018-01-20 17:26:56.000000
А, и так сойдет. — 20 янв 20182018-01-20 17:24:07.000000
Ой, хотел написать коммент, но не туда нажал. — 20 янв 20182018-01-20 17:22:54.000000
0

Во-первых: зачем вам дважды писать один и тот же код? Не проще ли сделать функцию? А еще лучше переписать так, чтобы цикл while не повторялся.

Во-вторых, я так понимаю вы хотите, чтобы, если последовательность введена успешна, то код завершился, так? В этом случае почему у вас условие:

while(!(i == (dequeSize - 1))){

Зачем сдесь while? Сдесь нужен if.

В-третьих, смотрите пунк во-первых.

Я так понял, нужно на if заменить и немного еще подправить сам код,Да? — 20 янв 20182018-01-20 17:13:01.000000
А вот для этого я и писал: смотри пункт во-первых!!! Ну вот хорошо, ты хочешь, чтобы цикл проверял твои цифры и требовал ввод, пока не будет верный результат? Так? Окей, где проверка ввода в теле while? У тебя проверка зажата между двумя ОДИНАКОВЫМИ!! циклами for с предложениями ввода, но не относится ни к одному из них и выполняется ровно 1 раз за программу. Просто рацианализируйте свой код и проблема решится сама собой. — 20 янв 20182018-01-20 17:09:21.000000
Мне нужно ,чтобы он выдавал до тех пор,пока я не введу по возрастанию — 20 янв 20182018-01-20 17:04:12.000000
Ну да, верно. А в чем проблема? — 20 янв 20182018-01-20 17:02:01.000000
C if пробовал, делает проверку 1 раз. — 20 янв 20182018-01-20 16:59:00.000000