У меня есть задание, в котором я должен прочитать файл, выполнить различные вычисления и записать ответ в выходной файл. Все шло отлично, пока я не пришел к этому шагу:
«Перечитайте файл и вычислите сумму целых чисел в файле, если сумма не превышает 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
Поскольку, кажется, никто не хочет дать вам правильный ответ … (и
честно говоря, трудно дать правильный ответ без
делаю свою работу за вас).
В вашем коде есть две проблемы. Первое требование
что вы используете флаг. Как я уже сказал в своем комментарии, идиоматический
Решение не будет использовать флаг, но нет проблем с его использованием.
Флаг — это логическая переменная, которая будет проверена в
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()
верно, то сбой был (наверное) из-за
чтобы вы прочитали все данные, и все в порядке. (В
Другими словами, неспособность прочитать данные не обязательно является ошибкой.
Это может быть просто конец файла.)
Вы, кажется, не используете переменную 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;
}
}