Хотя цикл, кажется, ничего не делает? - PullRequest
3 голосов
/ 27 сентября 2010

Привет, я пытаюсь создать в C ++ функцию, которая принимает число i и решает, простое это число или нет, выполняя цикл, чтобы найти его кратные, а затем проверяет, не премьер через серию испытаний. Тем не менее, кажется, что цикл даже не проходит. Я сказал ему выводить независимо от того, где он находится в цикле, но я не получаю выводов. Вот код:

#include <iostream>

using namespace std;

int main()
{
    int j =1;
    int z = 0;
    int i = 10;
    bool p = false;
    while (p = false){
        cout << "not starting ifs";
        z=i%j;
        if (z==0 && j>2){
        p=true;
        cout << "not prime" << endl << "loops to if";
        }
        else if (j==1){
            j++;
            cout <<"loops to else if 1";
            }
        else if ( i==2 || j==i ){
          p = true;
          cout << "prime" << endl << "loops to else if 2";
            }
            else {
            j++;
            cout << "loops to else";
                }
        }
            return 0;
}

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

Ответы [ 6 ]

10 голосов
/ 27 сентября 2010

Вы используете = вместо == в

while (p = false){

Когда вы делаете это, вы присваиваете false p, и результат выражения равен false, которыйпроверено в цикле while, что приводит к выходу из цикла.

8 голосов
/ 27 сентября 2010

Еще лучше,

while(!p)

В конце концов, для этого и нужен оператор.

3 голосов
/ 27 сентября 2010

Вам нужно изменить while (p = false) на while (p == false).

Объяснение: В C / C ++ = назначает свойство, тогда как == сравнивает значения. Что вы в основном делаете здесь, так это присваиваете false на p. Затем цикл while проверяет значение выражения, которое равно p, что равно false, поэтому не запускается.

3 голосов
/ 27 сентября 2010

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

3 голосов
/ 27 сентября 2010

изменить на время (false == p)

В основном вот что происходит по порядку:

  1. p назначается ложным
  2. p преобразуется в bool

Когда вы говорите (p = false), 'p' присваивается значение 'false'. После этого логическое условие цикла while проверяет значение 'p', которое теперь равно false, и цикл никогда не вводится.

3 голосов
/ 27 сентября 2010
while (p = false) // obvious error ...

Если вы его не найдете: вам нужно ==, а не =

...