C ++ простой оператор If, делающий остальную часть программы не выполненной

У меня есть задание, в котором я должен прочитать файл, выполнить различные вычисления и записать ответ в выходной файл. Все шло отлично, пока я не пришел к этому шагу:

«Перечитайте файл и вычислите сумму целых чисел в файле, если сумма не превышает 1000. Используйте управляемую флагом структуру цикла».

Мой фрагмент кода выглядит следующим образом:

dataFile2.close();
dataFile2.clear();
dataFile2.open("J:\\datafile2.txt");

sum = 0;
while(sum < 1000)
{
dataFile2 >> num;
sum = sum + num;
if(sum > 1000)
sum = sum - num;
}

answers << "The sum of the integers not exceeding 1000 is " << sum << endl;
cout << "The sum of the integers not exceeding 1000 is " << sum << endl;
return 0;

Мои переменные уже были объявлены. Когда я вынимаю оператор if, к сумме добавляется последнее число, а затем сумма превышает 1000. Когда оператор If остается в, операторы answers и cout не выполняются, и нет никаких предупреждений или ошибок компилятора.

Любая помощь по этому вопросу будет принята с благодарностью.

-ThePoloHobo

0

Решение

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

В вашем коде есть две проблемы. Первое требование
что вы используете флаг. Как я уже сказал в своем комментарии, идиоматический
Решение не будет использовать флаг, но нет проблем с его использованием.
Флаг — это логическая переменная, которая будет проверена в
while, и будет установлен в условном цикле, когда вы
найти то, что заставляет вас хотеть выйти из цикла.

Вторая проблема заключается в том, что вы используете num без проверки
что ввод выполнен успешно. Вы должны проверить после >>
оператор. Идиоматический способ проверки (и единственное
которые должны быть использованы кем-то, кто не имеет опыта в
язык) должен обрабатывать поток, как если бы он был логическим:

dataFile2 >> num;
if ( dataFile2 ) {
//  Input succeeded...
} else {
//  Input failed for some reason, maybe end of file
}

Поскольку все операции в потоке возвращают ссылку на
поток, обычно объединяют тест и вход:

if ( dataFile2 >> num ) {
//  succeeded
} else {
//  failed
}

(Лично я нахожу идею изменения состояния в условии
из if или while какой ужас. Но эта идиома так
повсеместно, что вы, вероятно, должны использовать его, для простого
причина, что это то, что все ожидают.)

В педагогической среде это, вероятно, приемлемо для
считать любой сбой концом файла и просто перенести тест
в while (кроме, конечно, того, что вас спросили
использовать флаг). В других контекстах вы захотите принять
учитывать тот факт, что сбой может быть связано с синтаксической ошибкой
на входе — кто-то вставил "abc" в файл, где
Вы ожидали число. Есть несколько способов
справиться с этим, все, что выходит за рамки того, что вы
пытаясь сделать, но помните, что после вы обнаружили ошибку,
Вы можете объединить поток, чтобы знать, почему. В частности, если
dataFile2.eof() верно, то сбой был (наверное) из-за
чтобы вы прочитали все данные, и все в порядке. (В
Другими словами, неспособность прочитать данные не обязательно является ошибкой.
Это может быть просто конец файла.)

1

Другие решения

Вы, кажется, не используете переменную flag, которая может помочь в этом случае. Примерно так должно это исправить:

sum = 0;
bool sumUnder1000 = true; //Or the C++ equivalent, I'm a bit rusty
while(sumUnder1000)
{
if(!dataFile2.good()){
sumUnder1000 = false; //We've reached end of file or an error has occurred
return;
}
dataFile2 >> num;
sum = sum + num;
else if(sum > 1000){
sum = sum - num;
sumUnder1000 = false;
}
}
-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector