Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/65: Рейтинг темы: голосов - 65, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 36
1

Возврат к началу switch

02.05.2014, 22:42. Показов 13029. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.

Есть программа, включающая в себя
C++
1
2
3
4
5
6
7
8
...
switch(x)
{
case 1: {};
case 2: {};
case n: {};
default: {};
}
Как сделать так, чтобы этот switch выполнялся до тех пор, пока не выберется один из case.

Например, есть меню из 5 пунктов. Как сделать так, чтобы при вводе числа 6 программа не закрывалась, а снова выводила это меню.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.05.2014, 22:42
Ответы с готовыми решениями:

Возврат к началу цикла
Всем добрый вечер. Имеется цикл, в котором записано 2 условия, по которым выполняется то или иное...

Возврат к началу при открытии новых ссылок
Доброго времени суток! На ноутбуке столкнулся с проблемой - при открытии новой ссылки(папки в...

Возврат обратно в меню, в операторе switch
Я написал программу, которая выводит на экран меню блюд, при нажатии клавишы выводится название...

Возврат в начало функции из блока Switch
Можно ли вернуться как-то из switch(deystvie)/(deystvie2) или из любого его case в самое начало...

22
571 / 539 / 280
Регистрация: 25.12.2013
Сообщений: 1,456
02.05.2014, 22:44 2
JAson13, чем цикл не устраивает?
0
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 36
02.05.2014, 22:54  [ТС] 3
Ты имеешь ввиду for вначале добавить?
Или while?
0
571 / 539 / 280
Регистрация: 25.12.2013
Сообщений: 1,456
02.05.2014, 22:55 4
Цитата Сообщение от JAson13 Посмотреть сообщение
Ты имеешь ввиду for вначале добавить?
Или while?
да любой, но обычно для таких целей while или do...while
1
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 36
02.05.2014, 23:00  [ТС] 5
Хорошо, спасибо, попробую
0
100 / 100 / 47
Регистрация: 19.11.2012
Сообщений: 195
02.05.2014, 23:04 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
int main () {
    int x=0;
    bool run=true;
 
    while(run) {
        run=false;
        std::cin >> x;
 
        switch(x) {
            case 1: { break; };
            case 2: { break; };
            case 3: { break; };
            default: { run=true; };
        }
    }
 
    return 0;
}
2
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.05.2014, 00:31 7
Цитата Сообщение от JAson13 Посмотреть сообщение
до тех пор, пока не
это и называет "цикл".
TrueBit, я бы выделил проверку в отдельную функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
bool accept(int x)
{
    switch(x) 
    {
        case 1: 
        case 2: 
        case 3: return true;
        default: return false;
    }
}
 
int main() 
{
    int x = 0;  
    while( std::cin >> x, !accept(x) );
    return 0;
}
0
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
03.05.2014, 00:37 8
C++
1
    while( std::cin >> x, !accept(x) );
так писать очень плохо! Предыдущий пример будет работать быстрее! Такой стиль программирования ведет к переписыванию кода после про гонки его через профилировщик на наличие hot points
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.05.2014, 00:41 9
Цитата Сообщение от stawerfar Посмотреть сообщение
после про гонки его
пруфы в студию.

Не по теме:

И словарик бы Вам не помешал.

0
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
03.05.2014, 00:48 10
Не по теме:

И словарик бы Вам не помешал. Это бы вам сообразительности не помешало бы,я пишу с планшета а он лезет со своею true орфографией мне просто лень его иногда исправлять
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.05.2014, 00:56 11
Цитата Сообщение от stawerfar Посмотреть сообщение
я пишу с планшета
да хоть с утюга, по теме есть что сказать или тоже планшет виноват?
0
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
03.05.2014, 01:01 12
Посмотри свою реплику и задай этот вопрос себе
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
03.05.2014, 01:06 13
Чего спорить-то, возьмите асмо-код и гляньте чего там быстрее.
Я не глядя предположу, что будет почти одинаково. Или даже полностью одинаково.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.05.2014, 01:07 14
Цитата Сообщение от stawerfar Посмотреть сообщение
Посмотри свою реплику и задай этот вопрос себе
stawerfar, я с Вами в одной песочнице не играл, не надо мне тыкать.
Еще раз: по теме есть что сказать?
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
03.05.2014, 01:18 15
Цитата Сообщение от Tulosba Посмотреть сообщение
по теме есть что сказать?
Можно я скажу?
Я щас проверил (mingw 4.7.2), код полностью эквивалентный:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    push    ebx
    sub esp, 40
    mov DWORD PTR [esp+28], 0
    lea ebx, [esp+28]
L3:
    mov DWORD PTR [esp], ebx
    mov ecx, OFFSET FLAT:__ZSt3cin
    call    __ZNSirsERi
    push    eax
    mov eax, DWORD PTR [esp+28]
    dec eax
    cmp eax, 2
    ja  L3
    xor eax, eax
    add esp, 40
    pop ebx
    ret
и
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    push    ebx
    sub esp, 40
    mov DWORD PTR [esp+28], 0
    lea ebx, [esp+28]
L9:
    mov DWORD PTR [esp], ebx
    mov ecx, OFFSET FLAT:__ZSt3cin
    call    __ZNSirsERi
    push    edx
    mov eax, DWORD PTR [esp+28]
    dec eax
    cmp eax, 2
    ja  L9
    xor eax, eax
    add esp, 40
    pop ebx
    ret
Так что вариант Tulosba ничем не хуже. А на мой взгляд даже лучше, ибо divide et impera.
1
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
03.05.2014, 01:29 16
Компиляторы умны не спорю но и так как программа тривиальна он все просчитал но можно в теле написать так что код будет ужасен и в разы больше не говоря уже о Кеш мисах

Добавлено через 3 минуты
Попробуй в тело switch добавить пару функций да так что бы значения результатов было трудно прогназируемо
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
03.05.2014, 01:34 17
stawerfar, эквивалентность этого кода строится на том, что была возможность встроить функцию accept. Если мы сохраним эту возможность, то код будет в любом случае одинаков.
Да и раз уж мы заговорили о кеш мисах, то какие-то реальные действия принято предпринимать после профилирования, а не до.
0
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
03.05.2014, 01:57 18
Просто вставите во все ветки воз вращаемое значение скомпильте и посмотрите что получиться

Добавлено через 11 минут
Или вы действительно не видите что компилятора заинлайнил функцию? Если нельзя будет просчитать то появиться команда jump и все вытекающие
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
03.05.2014, 02:31 19
Цитата Сообщение от stawerfar Посмотреть сообщение
компилятора заинлайнил функцию
Я вообще-то об этом выше и написал:
Цитата Сообщение от DrOffset Посмотреть сообщение
эквивалентность этого кода строится на том, что была возможность встроить функцию accept
Теперь еще раз. Я говорю о том, что при сохранении возможности "заинлайнить" accept, совершенно неважно что внутри него вызывается. Код будет эквивалентен варианту без accept. В этом есть сомнения?
0
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
03.05.2014, 22:42 20
Да есть сомнения. Так как заинлайнить или нет решит сам компилятора если будут соблюдены все для этого условия. (Даже несмотря на команду inline ) следовательно вышесказанное не будет работать. Если вам так лениво проверить я завтра вернусь с дачи и набросаю код для примера. Думаю это будет более чем убедительно.

Добавлено через 4 минуты
На всякий случай если вдруг не знали почитайте в стандарте языка значение оператора inline где вы прочтете что данная команда носит лишь рекомендательный характер в отличие от define. Эти топкости нужно знать. Или просто почаще смотреть понял ли вас компилятор при генерации кода асм
0
03.05.2014, 22:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2014, 22:42
Помогаю со студенческими работами здесь

Как сделать чтобы Switch работал в другом Switch'e?
Как сделать что бы Switch работал в другом Switch'e? Вот допустим выбираем один пункт и в...

Switch . Как присвоить переменной значение из Switch в default
Добрый день подскажите как реализуется данный код . Как взять значение switch если выпал default ? ...

Рефакторинг switch внутри switch в static классе
Добрый день. Подскажите, как корректно обойти конструкцию switch case внутри switch case в...

Power Switch и Reset Switch
Здравствуйте. Покажите мне пожалуйста на этой материнской плате где находится power switch пин и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru