if else вместе с> = (2 раза) компилируется хорошо, но не работает - PullRequest
2 голосов
/ 15 ноября 2011

Я делаю приложение журнала оценок, и у меня есть этот фрагмент кода, который не работает, так как я намереваюсь, чтобы он работал. (Он отлично компилируется без ошибок, но не работает) (пожалуйста, имейте в виду, что я новичок в C ++, спасибо за ваше время и знания, которые также помогают мне учиться). (Тестовая оценка дается из серии вопросов, где значение получает +1, если оно правильное, и -1, если оно неправильное.

Я думаю, что ошибка в => она конфликтует одно с другим, но я не знаю, как дать значение для ex. если счет <20 cout = не удалось, если его <40 неудовлетворительный, но посмотрите, что 20 <40, так что один переопределяет другой, как я мог бы поставить, если его из 20-40 cout = не удалось, и если от 0 до 20 cout = не удалось. Я надеюсь, вы понимаете, о чем я. </p>

   int testscore;
    string studentmark;

            if ( testscore  == 10 )

            {
                studentmark == ( "failed" );
            }
            else if ( testscore >= 11 && testscore <= 20 )
            {
                studentmark == ( "closebutfailed" );
            }
            else if ( testscore >= 21 && testscore <= 30)
            {
                studentmark == ( "passed" );
                }
            else if ( testscore >= 31 && testscore <= 40 )
            {
                studentmark == ("excelent");
            }
            else if ( testscore >=49 )
            {
                studentmark == ("hasteachersbook");
            }
cout << "Studentmark is:" << studentmark << endl;

Ответы [ 8 ]

14 голосов
/ 15 ноября 2011

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

studentmark   = "failed";
///         ^^^^ Note single =

Во-вторых, вам, вероятно, лучше написать эти операторы if как

if (testscore <= 10) { ... }
else if (testscore <= 20) { ... }
else if (testscore <= 30) { ... }
...

Поскольку его легче читать, а наличие оператора else означает, что вам не нужно проверять, что testscore превышает суммы, которые вы уже покрыли.

5 голосов
/ 15 ноября 2011

== тесты на равенство, = присваивает.

Когда вы пишете studentmark == ( "failed" );, вы проверяете, равна ли строка studentmark "failed", а затем отбрасываете ответ.

2 голосов
/ 15 ноября 2011

Глядя на это, у вас есть случай для 31-40, затем 49 и выше.

Нет случая для 41-48.C ++, но, возможно, посмотрите на использование CASE

2 голосов
/ 15 ноября 2011

Ваш код не работает, потому что вы пытаетесь выполнить назначение с ==. Там нет кода, который действительно изменяет значение оценки ученика.

2 голосов
/ 15 ноября 2011

Вам необходимо присвоить значение studentmark следующим образом:

studentmark = "hasteachersbook";

== проверяет, равно ли значение.= присваивает значение.

Это должно работать.Если нет, то проблема в другом месте.

int testscore;
string studentmark;

if ( testscore  == 10 )
{
    studentmark = "failed";
}
else if ( testscore >= 11 && testscore <= 20 )
{
    studentmark = "closebutfailed";
}
else if ( testscore >= 21 && testscore <= 30)
{
    studentmark = "passed";
    }
else if ( testscore >= 31 && testscore <= 40 )
{
    studentmark = "excelent";
}
else if ( testscore >=41 )
{
    studentmark = "hasteachersbook";
}
else
{
    studentmark = "scoreLessThanTen";
}
1 голос
/ 15 ноября 2011

Похоже, ваш вопрос звучит так: «Что если мое значение будет истинным для более чем одного из тестов в цепочке if-else?»

C ++ оценивает в текстовом порядке, то есть сверху вниз. Таким образом, первый предикат, верный для данного значения, будет выбранной ветвью.

Например:

int a = 2;

if (a > 0) {
  cout << "First branch";
} else if (a > 1) {
  cout << "Second branch";
}

Несмотря на то, что оба теста верны для a = 2, выбирается первый, потому что он идет первым. Таким образом, First branch распечатывается.

1 голос
/ 15 ноября 2011

studentmark == ( "closebutfailed" ); не присваивает значение «closebutfailed» в studentmark - оно выполняет сравнение на равенство между «closebutfailed» и studentmark, что предположительно возвращает false.

Измените их на назначения, а не на сравнение, и попробуйте снова.

0 голосов
/ 15 ноября 2011

Разработка программного обеспечения - это 1% вдохновения и 99% отладки. Если вы не можете отладить, вы не можете написать программное обеспечение.

Один из часто используемых методов отладки - KISS:

Закомментируйте или удалите как можно больше gunge, пытаясь заставить программу действительно что-то сделать. Когда вы дойдете до:

int testscore;
string studentmark;
        {
            studentmark == ( "failed" );
        }
cout << "Studentmark is:" << studentmark << endl;

.. и, тем не менее, вы не получаете результатов по отметкам учеников, наверняка до вас доходит, что ваша попытка назначения не работает и, следовательно, почти наверняка неверна (как уже объяснялось другими авторами, '=='! = '=') .

Потренируйтесь / развивайте свои навыки отладки, прежде чем публиковать здесь - в конечном итоге вам будет лучше, чем просто передать свой простой, но не работающий код группе опытных разработчиков в группе и заставить их исправлять ваши ошибки. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...