Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Gmails
6 / 6 / 2
Регистрация: 08.04.2014
Сообщений: 248
1

Возникла проблема со switch

16.11.2014, 16:33. Просмотров 435. Ответов 17
Метки нет (Все метки)

возникла проблема.
C++
1
2
3
4
5
есть switch(c){
case "1":cout<<"x";a=b;if(...)
case "2":cout<<"z";if(..) cout<<".."
case "3":cout<<y; if(a==b),то вернуться в case "1" 
}
как можно вернуться в case "1"?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2014, 16:33
Ответы с готовыми решениями:

Реализации МП транслитератора - возникла проблема
При реализации МП транслитератора возникла проблема. После добавления очереди queue&lt;string&gt;...

Я 3 день учу C++, написал маленькую программку чтобы быстро компилировать проекты но возникла проблема:
#include &lt;iostream&gt; int DedugCPP(); int RunCPP(); //------------------------------ int...

Проблема с switch
Добрый вечер. Проблема с switch. Когда пишешь любые буквы/символы( кроме цифр ) , то в switch ,...

Проблема со switch/case
есть функция мэйн: int _tmain(int argc, _TCHAR* argv) { printf(&quot;1- default\n2-user\n&quot;); int...

У меня возникла проблема с программой, окно задерживается на 1 секунду и исчезает, на других версиях Microsoft Express тоже самое
Доброе Время Суток У меня возникла проблема с компилируемым окном , при проверки он...

17
Blagodetel
11 / 11 / 10
Регистрация: 16.12.2013
Сообщений: 66
16.11.2014, 16:49 2
Сомневаюсь в оптимальности своего способа, однако (чуть переделал программу для ясности понимания):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
 
using namespace std;
 
 
int main()
{
    setlocale (LC_ALL,"Russian");
    int a;
    int b;
 
    cout << "a= ";
    cin >> a;
    cout << "b= ";
    cin >> b;
 
    int c;
    cout << "c= ";
    cin >> c;
 
     switch(c)
     {
 
        case 2:
        cout<<"inCase2\n";
        break;
 
        case 3:
            cout << "inCase3\n";
            if(a!=b)
                break;
        case 1:
            cout << "inCase1\n";
            break;
    }
    system("pause");
    return 0;
}
1
Yan12_04
30 / 30 / 35
Регистрация: 05.11.2014
Сообщений: 118
16.11.2014, 16:52 3
Вообще конечно вам обязательно возвращаться в case 1? Если код небольшой просто скопируйте его в case 3. А так есть вариант:
C++
1
2
3
4
5
6
h:
switch(c){
case "1":cout<<"x";a=b;if(...)
case "2":cout<<"z";if(..) cout<<".."
case "3":cout<<y; if(a==b) c=1; goto h; 
}
А еще лучше, попробовать в циклике while это сделать, к примеру!!!
C++
1
2
3
4
5
6
7
8
9
bool Proverka=false;
while(Proverka!=true)
{
switch(c){
case "1":cout<<"x";a=b; Proverka=true;if(...)
case "2":cout<<"z"; Proverka=true; if(..) cout<<".."
case "3":cout<<y;Proverka=true; if(a==b) Proverka=false; c=1;
}
}
1
Evg
Эксперт CАвтор FAQ
20217 / 7777 / 596
Регистрация: 30.03.2009
Сообщений: 21,732
Записей в блоге: 30
16.11.2014, 16:59 4
case "1" - такое недопустимо, т.к. у case могут быть только целочисленные константы

Чтобы вернуться - проще всего использовать goto, т.к. этот вариант будет куда более наглядным, чем цикл с флагом. Ну или можно написать так, но такой код будет читать сложнее, чем вариант с goto (но, скорее всего, проще, чем код с циклом):

C++
switch(c)
{
  case 3:
    cout<<y;
    if(a==b)
    {
      case 1:
        cout<<"x";
        a=b;
        if(...)
    }
    break;
 
  case 2:
    cout<<"z";
    if(..) cout<<"..";
    break;
}
1
16.11.2014, 16:59
hoggy
Эксперт С++
7064 / 3271 / 674
Регистрация: 15.11.2014
Сообщений: 7,475
Завершенные тесты: 1
16.11.2014, 17:02 5
http://rextester.com/IHU11085

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//Title of this code
 
#include <iostream>
 
using namespace std;
 
int main()
{
    std::cout << "Hello, world!\n";
    
    int c=3;
    
    switch(c){
        
        lab10:
        case 1: cout<<"x"; break;
        case 2: cout<<"z"; break;
        case 3: cout<<"jump!\n"; --c; goto lab10;
    }
}
0
Evg
Эксперт CАвтор FAQ
20217 / 7777 / 596
Регистрация: 30.03.2009
Сообщений: 21,732
Записей в блоге: 30
16.11.2014, 17:08 6
hoggy, говоря про goto, я имел в виду совсем не то. Твои махинации с "--c" сильно усложняют понимание, к тому же они и не нужны. Я имел в виду:

C++
switch(c)
{
  case 1:
  lab10:
    cout<<"x";
    break;
 
  case 2:
    cout<<"z";
    break;
 
  case 3:
    cout<<"jump!\n";
    goto lab10;
}
0
Blagodetel
11 / 11 / 10
Регистрация: 16.12.2013
Сообщений: 66
16.11.2014, 17:12 7
Evg, А мой способ имеет право на жизнь, или в нем что-то не так?
0
Yan12_04
30 / 30 / 35
Регистрация: 05.11.2014
Сообщений: 118
16.11.2014, 17:17 8
goto конечно хорош, но если есть возможность избежать его использования, лучше ей воспользоваться. Но, как говориться, хозяин - барин.
0
hoggy
Эксперт С++
7064 / 3271 / 674
Регистрация: 15.11.2014
Сообщений: 7,475
Завершенные тесты: 1
16.11.2014, 17:17 9
Цитата Сообщение от Evg Посмотреть сообщение
hoggy, говоря про goto, я имел в виду совсем не то.
Когда я рисовал этот пример, я ещё не видел вашего сообщения.
И даже не подозревал о его существовании.
Поэтому у меня не было возможности думать о том, что именно вы имели ввиду.

Цитата Сообщение от Evg Посмотреть сообщение
Твои махинации с "--c" сильно усложняют понимание
Свой пример я продемонстрировал в действии при помощи онлайн компилятора.
Махинация понадобилось для того, что бы онлайн компилятор не зациклился.
0
Evg
Эксперт CАвтор FAQ
20217 / 7777 / 596
Регистрация: 30.03.2009
Сообщений: 21,732
Записей в блоге: 30
16.11.2014, 17:31 10
Цитата Сообщение от Blagodetel Посмотреть сообщение
Evg, А мой способ имеет право на жизнь, или в нем что-то не так?
В частном случае - да. Если у ТС в первом case у if'а будет что-то более сложное внутри ветки then (типа сначала сделать что-то, а потом перейти на case 1), то не всегда по простому получится воспользоваться провалом

Цитата Сообщение от hoggy Посмотреть сообщение
Махинация понадобилось для того, что бы онлайн компилятор не зациклился
Убрал махинацию - ничего там (в онлайн-компиляторе) не циклится

Не по теме:

Цитата Сообщение от Yan12_04 Посмотреть сообщение
goto конечно хорош, но если есть возможность избежать его использования, лучше ей воспользоваться
Теоретики обычно считают так, типа лучше превратить программу в бесконечно завёрнутую кишку из вложенных циклов и флагов, лишь бы не использовать goto. Практики обычно считают, что выбирать надо тот вариант, который более понятен для чтения. Но это вопрос сугубо религиозный, к данной теме имеющий мало отношения

1
Yan12_04
30 / 30 / 35
Регистрация: 05.11.2014
Сообщений: 118
16.11.2014, 17:39 11
Ну, в кишку превращать конечно не стоит. Но как по мне, goto как раз и убивает читабельность кода. ИМХО.
0
Blagodetel
11 / 11 / 10
Регистрация: 16.12.2013
Сообщений: 66
16.11.2014, 17:40 12
Yan12_04, http://habrahabr.ru/post/114211/
0
Evg
Эксперт CАвтор FAQ
20217 / 7777 / 596
Регистрация: 30.03.2009
Сообщений: 21,732
Записей в блоге: 30
16.11.2014, 17:42 13
Yan12_04, ты считаешь код

C++
bool Proverka=false;
while(Proverka!=true)
{
  switch(c)
  {
    case "1":cout<<"x";a=b; Proverka=true;if(...)
    case "2":cout<<"z"; Proverka=true; if(..) cout<<".."
    case "3":cout<<y;Proverka=true; if(a==b) Proverka=false; c=1;
  }
}
более читабельным (форматированием уже было лень заниматься), чем

C++
switch(c)
{
  case "1":L:cout<<"x";a=b;if(...)
  case "2":cout<<"z";if(..) cout<<".."
  case "3":cout<<y;if(a==b) goto L;
}
?
1
hoggy
Эксперт С++
7064 / 3271 / 674
Регистрация: 15.11.2014
Сообщений: 7,475
Завершенные тесты: 1
16.11.2014, 17:47 14
Цитата Сообщение от Evg Посмотреть сообщение
Убрал махинацию - ничего там (в онлайн-компиляторе) не циклится
Хм.. спасибо. Действительно затупил.
0
Yan12_04
30 / 30 / 35
Регистрация: 05.11.2014
Сообщений: 118
16.11.2014, 18:02 15
Evg, я считаю что они одинаково читабельны. А значит, я лучше воспользуюсь while, чем goto.

Добавлено через 4 минуты
Blagodetel, я не призываю отказаться от goto. Мне без разницы, чем вы пользуетесь у себя в коде. Я просто высказал свое мнение, ибо научен собственным опытом. Поэтому написан оба способа, пускай человек сам выберет, каким способом решать проблему.
0
Evg
16.11.2014, 18:03
  #16

Не по теме:

Цитата Сообщение от Yan12_04 Посмотреть сообщение
я считаю что они одинаково читабельны. А значит, я лучше воспользуюсь while, чем goto
Пока ты пишешь программы для самого себя - твоё мнение вполне разумно. Когда ты работаешь в команде, где постоянным явлением является чтение чужих кодов - невольно начинаешь понимать, что "лично я считаю" зачастую приводит к возникновению геморроя, а не к его устранению

0
Yan12_04
30 / 30 / 35
Регистрация: 05.11.2014
Сообщений: 118
16.11.2014, 18:08 17
Как раз этот "плохой опыт" с goto, был получен в следствии чтения чужого кода.
0
Gmails
6 / 6 / 2
Регистрация: 08.04.2014
Сообщений: 248
16.11.2014, 22:16  [ТС] 18
спасибо всем!))
0
16.11.2014, 22:16
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2014, 22:16

Возникла проблема с dataGridView
Добрый день, форумчане! Возник вопрос при создании приложения Windows Forms для работы с БД MS...

Возникла проблема с массивами
Нужно удалить из массива все строки, в которых нет цифр. static void RanomDvumerniiArray(ref int...

Возникла проблема с методом Paint()
При поверхностном изучении Java ничего противоречивого и сложного в методе Paint я не обнаружил,...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

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