Что я могу использовать, чтобы остановить al oop вместо «return 0»? - PullRequest
0 голосов
/ 17 февраля 2020

поэтому я сделал простой l oop, который выясняет, есть ли в массиве элементы со значениями 0 и 1. Если l oop действительно находит 0 или 1 внутри массива, он скажет "ДА" "иначе" НЕТ ". да, программа работает просто отлично, но в конце программы она выводит «ДА» или «НЕТ» столько раз, сколько я положил cin>>dim. например, если dim, что означает (размер [массива]) 5, он напечатает «YESYESYESYESYES» или «NONONONONO». Я должен использовать return 0, чтобы заставить его распечатать его как один раз, но я чувствую, что это не правильный способ сделать это. Пожалуйста, помогите мне с этим. спасибо!

#include <bits/stdc++.h>
using namespace std;
int main()
{
int i, dim, v[100];
cin>>dim;
for(i=0;i<dim;i++)
    cin>>v[i];
for(i=0;i<dim;i++)
    if(v[i]==0 || v[i]==1){
        cout<<"YES"; return 0;}
    else{
        cout<<"NO"; return 0;}
  return 0;
}

Ответы [ 3 ]

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

но я чувствую, что это не правильный способ сделать это

Возвращение - это совершенно верный способ вырваться изо всех oop.

Другой правильный путь - это оператор break, который переходит после l oop.

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

Более того, вы можете проверить, действительно ли v [i] == 0 или 1 внутри ввода для l oop сразу после ввода, и установить флаг в значение true. В зависимости от требований, вы можете прервать или подождать, пока весь ввод будет прочитан, а затем выйти и проверить флаг == true, а затем вывести «YES» и вывести «NO», если flag == false. Это избавит вас от запуска l oop снова, чтобы проверить 0 или 1.

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

Оператор break может использоваться для выхода из циклов. Пример из cppreference:

for (int j = 0; j < 2; j++) {
    for (int k = 0; k < 5; k++) {         //only this loop is affected by break
        if (k == 2) break;
        std::cout << j << k << " ";
    }
}

Как следует из комментария, break разрушает только самый внутренний l oop.

В вашем коде вы всегда выходите из l oop на самой первой итерации, поэтому вам не нужен l oop на первом месте. Это будет иметь тот же вывод, что и ваш код:

int main() {
    int i, dim, v[100];
    cin >> dim;
    for(i=0; i < dim; i++)
        cin >> v[i];

    if(v[0] == 0 || v[0] == 1) {
        cout << "YES";
    } else {
        cout << "NO";
    }
}

После прочтения вопроса снова ...

Я сделал простой l oop, который узнает, является ли массив имеет элементы со значениями 0 и 1

Если вы выйдете из l oop после проверки первого элемента, то вы проверите только первый элемент. Если вы хотите увидеть, содержит ли массив только 1 или 0 или он содержит хотя бы один элемент, который равен 0 или 1 (не на 100% ясно, какой элемент вы хотите), то вам скорее нужно это:

bool only_zero_or_one = true;
bool one_zero_or_one = false;
for (int i = 0; i < dim; ++i) {
     zero_or_one = ( v[i] == 0 | v[i] == 1);
     only_zero_or_one = zero_or_one && only_zero_or_one;
     one_zero_or_one = zero_or_one || one_zero_or_one;
}

Только для one_zero_or_one вы можете разорвать l oop один раз zero_or_one == true.

Более того, вам лучше использовать std::vector. В вашем коде, если пользователь вводит dim, который больше 100, вы пишете за пределами v. Этого легко избежать:

 size_t dim;
 std::cin >> dim;
 // construct vector with dim elements
 std::vector v(dim);               
 // read elements
 for (size_t i=0; i < v.size(); ++i) std::cin >> v[i];
 // .. or use range based for loop
 for (auto& e : v) std::cin >> e; 
...