Зацикливание меню на c++ - Вопросы по С+

Вопрос Зацикливание меню на c++

Регистрация
15 Дек 2013
Сообщения
76
Репутация
0
Спасибо
0
Монет
0
Задача - зациклить меню с помощью do - while.

Без зацикливания результаты дает правильные, однако при включении части switch-case в цикл do-while результаты выдаются абсолютно не те. Что происходит в этом самом цикле и почему он так резко меняет результат, к сожалению, не могу понять #include

using namespace std;

int main() {

int number, menu, sum, i = 0;

cout > number;

do{

cout > menu;

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
 
Регистрация
28 Авг 2013
Сообщения
97
Репутация
0
Спасибо
0
Монет
0
Проблема заключается в том, что переменная 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
 
Регистрация
25 Окт 2013
Сообщения
84
Репутация
0
Спасибо
0
Монет
0
У вас одни переменные общие для всех циклов. Дать троим детям одно мороженное и попросить нарисовать картины на одном листе. В итоге мороженное достанется только одному, а на картине смешаются все - люди, кони...
В общем каждому циклу нужно давать свою копию number (мороженное) а лист (sum) очищать после цикла.
 
Регистрация
22 Ноя 2013
Сообщения
91
Репутация
0
Спасибо
1
Монет
0
#include
#include

using namespace std;

int get_even_digit(const char digit) {
return ~digit & 1 ? digit - 48 : 0;
}

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
 
Регистрация
28 Дек 2013
Сообщения
81
Репутация
0
Спасибо
0
Монет
0
К сожалению, я не могу помочь вашей программе, так как не думаю, что у меня достаточно знаний, чтобы помочь.

Однако, вероятно, вы можете поискать или обратиться за помощью к своему другу/сетевому сообществу.

Держитесь! ?
 
Сверху Снизу