Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
JAson13
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 36
02.05.2014, 22:42     Возврат к началу switch #1
Здравствуйте.

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

Например, есть меню из 5 пунктов. Как сделать так, чтобы при вводе числа 6 программа не закрывалась, а снова выводила это меню.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cooller
 Аватар для cooller
564 / 532 / 120
Регистрация: 25.12.2013
Сообщений: 1,456
02.05.2014, 22:44     Возврат к началу switch #2
JAson13, чем цикл не устраивает?
JAson13
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 36
02.05.2014, 22:54  [ТС]     Возврат к началу switch #3
Ты имеешь ввиду for вначале добавить?
Или while?
cooller
 Аватар для cooller
564 / 532 / 120
Регистрация: 25.12.2013
Сообщений: 1,456
02.05.2014, 22:55     Возврат к началу switch #4
Цитата Сообщение от JAson13 Посмотреть сообщение
Ты имеешь ввиду for вначале добавить?
Или while?
да любой, но обычно для таких целей while или do...while
JAson13
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 36
02.05.2014, 23:00  [ТС]     Возврат к началу switch #5
Хорошо, спасибо, попробую
TrueBit
 Аватар для TrueBit
95 / 95 / 12
Регистрация: 19.11.2012
Сообщений: 195
02.05.2014, 23:04     Возврат к началу switch #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;
}
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
03.05.2014, 00:31     Возврат к началу switch #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;
}
stawerfar
 Аватар для stawerfar
140 / 54 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
03.05.2014, 00:37     Возврат к началу switch #8
C++
1
    while( std::cin >> x, !accept(x) );
так писать очень плохо! Предыдущий пример будет работать быстрее! Такой стиль программирования ведет к переписыванию кода после про гонки его через профилировщик на наличие hot points
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
03.05.2014, 00:41     Возврат к началу switch #9
Цитата Сообщение от stawerfar Посмотреть сообщение
после про гонки его
пруфы в студию.

Не по теме:

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

stawerfar
 Аватар для stawerfar
140 / 54 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
03.05.2014, 00:48     Возврат к началу switch #10
Не по теме:

И словарик бы Вам не помешал. Это бы вам сообразительности не помешало бы,я пишу с планшета а он лезет со своею true орфографией мне просто лень его иногда исправлять
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
03.05.2014, 00:56     Возврат к началу switch #11
Цитата Сообщение от stawerfar Посмотреть сообщение
я пишу с планшета
да хоть с утюга, по теме есть что сказать или тоже планшет виноват?
stawerfar
 Аватар для stawerfar
140 / 54 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
03.05.2014, 01:01     Возврат к началу switch #12
Посмотри свою реплику и задай этот вопрос себе
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
03.05.2014, 01:06     Возврат к началу switch #13
Чего спорить-то, возьмите асмо-код и гляньте чего там быстрее.
Я не глядя предположу, что будет почти одинаково. Или даже полностью одинаково.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
03.05.2014, 01:07     Возврат к началу switch #14
Цитата Сообщение от stawerfar Посмотреть сообщение
Посмотри свою реплику и задай этот вопрос себе
stawerfar, я с Вами в одной песочнице не играл, не надо мне тыкать.
Еще раз: по теме есть что сказать?
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
03.05.2014, 01:18     Возврат к началу switch #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.
stawerfar
 Аватар для stawerfar
140 / 54 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
03.05.2014, 01:29     Возврат к началу switch #16
Компиляторы умны не спорю но и так как программа тривиальна он все просчитал но можно в теле написать так что код будет ужасен и в разы больше не говоря уже о Кеш мисах

Добавлено через 3 минуты
Попробуй в тело switch добавить пару функций да так что бы значения результатов было трудно прогназируемо
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
03.05.2014, 01:34     Возврат к началу switch #17
stawerfar, эквивалентность этого кода строится на том, что была возможность встроить функцию accept. Если мы сохраним эту возможность, то код будет в любом случае одинаков.
Да и раз уж мы заговорили о кеш мисах, то какие-то реальные действия принято предпринимать после профилирования, а не до.
stawerfar
 Аватар для stawerfar
140 / 54 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
03.05.2014, 01:57     Возврат к началу switch #18
Просто вставите во все ветки воз вращаемое значение скомпильте и посмотрите что получиться

Добавлено через 11 минут
Или вы действительно не видите что компилятора заинлайнил функцию? Если нельзя будет просчитать то появиться команда jump и все вытекающие
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
03.05.2014, 02:31     Возврат к началу switch #19
Цитата Сообщение от stawerfar Посмотреть сообщение
компилятора заинлайнил функцию
Я вообще-то об этом выше и написал:
Цитата Сообщение от DrOffset Посмотреть сообщение
эквивалентность этого кода строится на том, что была возможность встроить функцию accept
Теперь еще раз. Я говорю о том, что при сохранении возможности "заинлайнить" accept, совершенно неважно что внутри него вызывается. Код будет эквивалентен варианту без accept. В этом есть сомнения?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2014, 22:42     Возврат к началу switch
Еще ссылки по теме:

C++ Как вернуться к началу функции?
Найти ближайшую к началу координат точку C++
C++ Какая из точек находится ближе к началу координат: составить алгоритм

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

Или воспользуйтесь поиском по форуму:
stawerfar
 Аватар для stawerfar
140 / 54 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
03.05.2014, 22:42     Возврат к началу switch #20
Да есть сомнения. Так как заинлайнить или нет решит сам компилятора если будут соблюдены все для этого условия. (Даже несмотря на команду inline ) следовательно вышесказанное не будет работать. Если вам так лениво проверить я завтра вернусь с дачи и набросаю код для примера. Думаю это будет более чем убедительно.

Добавлено через 4 минуты
На всякий случай если вдруг не знали почитайте в стандарте языка значение оператора inline где вы прочтете что данная команда носит лишь рекомендательный характер в отличие от define. Эти топкости нужно знать. Или просто почаще смотреть понял ли вас компилятор при генерации кода асм
Yandex
Объявления
03.05.2014, 22:42     Возврат к началу switch
Ответ Создать тему
Опции темы

Текущее время: 10:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru