Без зацикливания результаты дает правильные, однако при включении части switch-case в цикл do-while результаты выдаются абсолютно не те. Что происходит в этом самом цикле и почему он так резко меняет результат, к сожалению, не могу понять #include
Проблема заключается в том, что переменная sum не инициализирована перед использованием в цикле do-while. Это приводит к тому, что значение sum сохраняется между итерациями цикла, и при повторном выполнении цикла sum увеличивается на предыдущее значение. Чтобы исправить эту проблему, необходимо инициализировать sum перед циклом do-while. Вот исправленный код: #include
using namespace std;
int main() {
int number, menu, sum, i = 0;
cout > number;
do{
cout > menu;
sum = 0; // инициализация sum
switch (menu)
//первый кейс
{case 1:
for(i = 0; number > 0
{
int ldig = number%10;
number /=10;
if(ldig%2==0)
sum+=ldig;
}
cout 0)
{int ldig = number%10;
number /=10;
if(ldig%2==0)
sum+=ldig;
}
cout 0);
cout
У вас одни переменные общие для всех циклов. Дать троим детям одно мороженное и попросить нарисовать картины на одном листе. В итоге мороженное достанется только одному, а на картине смешаются все - люди, кони...
В общем каждому циклу нужно давать свою копию number (мороженное) а лист (sum) очищать после цикла.
int loop_for(const string& number) {
auto sum = 0;
for (size_t i = 0; i < number.length(); ++i) {
sum += get_even_digit(number);
}
return sum;
}
int loop_while(const string& number) {
auto sum = 0;
size_t i = 0;
while (i < number.length()) {
sum += get_even_digit(number);
++i;
}
return sum;
}
int loop_do_while(const string& number) {
auto sum = 0;
size_t i = 0;
do {
sum += get_even_digit(number);
} while (++i < number.length());
return sum;
}
bool is_number(const string& str) {
if (str.empty()) {
return false;
}
for (auto ch : str) if (ch < 0 || !isdigit(ch)) {
return false;
}
return true;
}
string parse(const char* msg) {
string number;
auto minus = false;
while (number.empty()) {
cout > number;
cin.ignore(0x1000, '\n');
if (number.front() == '+') {
number.erase(0, 1);
}
else if (number.front() == '-') {
number.erase(0, 1);
minus = true;
}
while (!number.empty() && number.front() == '0') {
number.erase(0, 1);
}
if (!is_number(number) && !number.empty()) {
number.clear();
}
if (!number.empty() && minus) {
number = '-' + number;
}
}
return number;
}
void menu() {
puts("1. for");
puts("2. while");
puts("3. do while");
puts("4. new number");
puts("0. exit");
cout > select;
switch (select) {
case 0:
return 0;
case 1:
sum = loop_for(number);
break;
case 2:
sum = loop_while(number);
break;
case 3:
sum = loop_do_while(number);
break;
case 4:
input = true;
break;
default:
puts("Selection error!");
err = true;
}
if (input) {
break;
}
if (!err) {
cout