Я понял, в чем проблема. На самом деле было две проблемы.
Я избавился от затененной переменной повтора, как упоминалось другими пользователями выше. В основной функции я переключил тип цикла на цикл do ... while. Я инициализировал переменную bool как true, чтобы цикл не завершался немедленно, поэтому он выглядит примерно так:
// FUNCTION
// Asks the user if they want to go again,
// if they say yes the function repeats, if no then the program ends.
bool userWantsToContinue(bool repeat);
int main()
bool repeat = true;
do {
...
// Continue for another iteration of the loop?
repeat = userWantsToContinue(repeat);
cout << endl << endl;
}while(repeat != false); // while repeat is true, keep doing the loop
...
//============================================================================================
// This block of code will determine if the user wants to continue the program or not.
// This will be used in a do while loop, in main() as soon as stop becomes true, we exit the loop.
bool userWantsToContinue(bool repeat) {
char yesNo;
bool repeat1 = 0;
cout << "Would you like to convert another time? ";
cin >> yesNo;
cin.ignore(100, '\n');
yesNo = toupper(yesNo); // Converts letter to uppercase to allow for fewer compairsons
if (yesNo == 'Y')
repeat1 = true;
else if (yesNo == 'N')
repeat1 = false;
return repeat1;
}
//============================================================================================
Кроме того, всякий раз, когда пользователь вводил простую букву Y или N, программа выполнялась бы так, как должна, однако, если бы они вводили полное слово (т. Е. Да или нет), то цикл завершался бы сразу после того, как программа закончила его. итерация. Я решил эту проблему, очистив буфер с помощью команды cin.ignore(NUMBER OF CHARACTERS TO BE IGNORED, 'CHARACTER THAT AUTOMATICALLY CLEARS OUT THE REST OF THE BUFFER IF ENCOUNTERED');
.
Если буфер не был очищен, то он сохраняет неиспользуемые буквы (например, если вы введете yes, программа будет использовать Y и сохранит E и S в буфере для дальнейшего использования). Позже в программе, когда он спрашивает пользователя, хотели бы они продолжить другой цикл, компилятор автоматически вводит следующую букву в буфер (в нашем примере, E из YES). Очистка буфера сразу после использования буквы решает проблему.
Так, например, у меня был блок кода, который спрашивал пользователя, было ли в настоящее время летнее время. Прежде чем у меня был этот блок кода:
bool daylightSavingsTime(bool& DST) {
char yesNo;
cout << "Is it daylight savings time now? ";
cin >> yesNo; // Takes only the first letter of the inputted answer to daylight savings
yesNo = tolower(yesNo); // Converts letter to uppercase to allow for fewer compairsons
if (yesNo == 'y')
DST = true;
else
DST = false;
return DST;
}
После добавления cin.ignore(100, '\n');
я очистил лишние неиспользуемые буквы. В этом случае я сказал, чтобы игнорировать следующие 100 символов или продолжить, когда встречается новая строка (\ n).
Так что теперь мой фиксированный код выглядит так:
bool daylightSavingsTime(bool& DST) {
char yesNo;
cout << "Is it daylight savings time now? ";
cin >> yesNo; // Reads only the first letter of the inputted word to daylight savings time
cin.ignore(100, '\n'); // clears all of the other characters that weren't used (e.g. 'es' in 'yes')
yesNo = toupper(yesNo); // Converts letter to uppercase to allow for fewer compairsons
if (yesNo == 'Y') // if the inputted word/letter begins with a Y do set the value of DST to true
DST = true;
else // if the inputted word/letter does not begin with a Y then set the value of DST to false
DST = false;
return DST;
}
Кстати, оператор else является причиной преждевременного завершения цикла, когда буфер не был очищен заранее. В нашем примере YES, E был следующим символом в буфере. Поскольку E не был использован сразу, он был сохранен на потом. Позже в коде, когда он спрашивает пользователя, хочет ли он сделать еще один цикл, используется та же логика. Если программа встретит Y, она продолжит работу, если она обнаружит что-либо еще, она остановится. Так как E в нашем примере YES был сохранен, и поскольку E не является Y, программа решила, что пора заканчивать.