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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
JAson13
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 36
#1

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

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

Здравствуйте.

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

Например, есть меню из 5 пунктов. Как сделать так, чтобы при вводе числа 6 программа не закрывалась, а снова выводила это меню.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2014, 22:42     Возврат к началу switch
Посмотрите здесь:

Как вернуться к началу функции? - C++
сем доброго времени суток. Подскажите, как сделать так, чтобы при одном из условий функция начиналась с начала. Break прерывает и идет...

Найти ближайшую к началу координат точку - C++
#include<stdio.h> int main(void) { char A,B; int x1,y1,x2,y2; printf("Input A(x1)="); scanf("%i",&x1); ...

какая из точек расположена ближе к началу координат (if) - C++
Даны две точки A(x1,y1) и B(x2,y2). Написать программу, которая определяет, какая из точек расположена ближе к началу координат. Данные...

Найти какая из точек ближе к началу координат - C++
В чем ошибка? #include <iostream> #include <conio.h> #include <math.h> using namespace std; void main() { ...

Определить, принадлежит ли треугольник началу координат или нет - C++
Нужно дописать условие в оператор If такое чтобы, найти принадлежит ли треугольник началу координат или нет. то есть внутренности...

Определить какая из точек ближе всего лежит к началу координаты - C++
Заданы 3 точки р1(х1,у1),р2(х2,у2),р3(х3,у3).Определить какая из точек ближе всего лежит к началу координаты.

Определить которая из заданных точек находится ближе к началу координат - C++
Даны 2 точки:А(x1;y1) и В(x2;y2). Составить алгоритм,определяющий которая из точек находится ближе к началу координат.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cooller
565 / 533 / 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
565 / 533 / 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
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
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
03.05.2014, 00:37     Возврат к началу switch #8
C++
1
    while( std::cin >> x, !accept(x) );
так писать очень плохо! Предыдущий пример будет работать быстрее! Такой стиль программирования ведет к переписыванию кода после про гонки его через профилировщик на наличие hot points
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
03.05.2014, 00:41     Возврат к началу switch #9
Цитата Сообщение от stawerfar Посмотреть сообщение
после про гонки его
пруфы в студию.

Не по теме:

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

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

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

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

Добавлено через 11 минут
Или вы действительно не видите что компилятора заинлайнил функцию? Если нельзя будет просчитать то появиться команда jump и все вытекающие
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
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++
Даны две точки А(х1, у1) и В(х2, у2). Составить алгоритм (ГРАФИЧЕСКОЕ ОПИСАНИЕ !!!!!!!!!!!!!!) для определения, какая из точек находится...

Определить какая из точек ближе всего лежит к началу координат - C++
Помогите решить задачи. 1)Заданы 3 точки р1(х1,у1),р2(х2,у2),р3(х3,у3).Определить какая из точек ближе всего лежит к началу...

Массивы. Удалить из массива все элементы, превосходящие х, а оставшиеся сдвинуть к началу - C++
Введите с клавиатуры число х и удалите из массива все элементы, превосходящие х, а оставшиеся сдвинтек началу массива с сохранением...

Составить программу, определяющую, которая из точек находится ближе к началу координат - C++
Даны две точки А(х1,у1) и В(х2,у2). Составить программу, определяющую, которая из точек находится ближе к началу координат. Реализовать...

Какой элемент массива стоит ближе к началу - крупнейший или маленький? - C++
1) Определить, какой элемент заданного массива A (a , a , ... a ) стоит ближе к началу - крупнейший или маленький? ...


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

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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru