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

Как правильно применять оператор switch - C++

Восстановить пароль Регистрация
 
чайник++
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 8
30.07.2012, 21:03     Как правильно применять оператор switch #1
Подскажите пожалуйста, в чём здесь ошибка. Язык С++. Среда C++ Builder 6.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void __fastcall TForm1::Button1Click(TObject *Sender)
{
       int a,a1,b,e1;
    a=Edit1->Text.ToInt();
    b=Edit2->Text.ToInt();
       switch (a) {
         case 1: a==2;
                Label3->Caption="Ошибка"; break;
                   }
       a1=a*60;
       e1=a1+b;
       Label7->Caption=e1;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2012, 21:03     Как правильно применять оператор switch
Посмотрите здесь:

Cи++. Оператор switch. C++
C++ Оператор switch
C++ как правильно перегружать оператор?
C++ Оператор switch
C++ Как через оператор switch производить битовые операции?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
30.07.2012, 21:12     Как правильно применять оператор switch #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        int a,a1,b,e1;
        a=Edit1->Text.ToInt();
        b=Edit2->Text.ToInt();
        switch (a)
        {
        case 1:
                a = 2;
                Label3->Caption="Ошибка"; break;
        }
        a1 = a*60;
        e1 = a1 + b;
        Label7->Caption=e1;
}
чайник++
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 8
30.07.2012, 21:20  [ТС]     Как правильно применять оператор switch #3
И так тоже не работает. Суть в следующем. При любом вводимом а всё равно выдаёт надпись "Ошибка" и неправильно считает. Хотя, если убрать оператор switch, то считает правильно.
Holsteng
 Аватар для Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
30.07.2012, 21:25     Как правильно применять оператор switch #4
Дай условие задачи
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.07.2012, 21:26     Как правильно применять оператор switch #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        int a,a1,b,e1;
        a=Edit1->Text.ToInt();
        b=Edit2->Text.ToInt();
        switch (a)
        {
        case 1:
                a = 2;
                Label3->Caption="Ошибка"; break;
        default:
        }
        a1 = a*60;
        e1 = a1 + b;
        Label7->Caption=e1;
}
Вот так. У switch есть не совсем логичная особенность: если нет default-ветки и проверяемое выражение не совпадает ни с одним из case, то управление передаётся в начало switch.

Это, правда, по видимому, Microsoft-специфичная особенность. Потому что у них в MSDN написано то, что выше, а в стандарте написано, что ничего не должно выполняться.
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
30.07.2012, 21:28     Как правильно применять оператор switch #6
Цитата Сообщение от чайник++ Посмотреть сообщение
ри любом вводимом а всё равно выдаёт надпись "Ошибка
Он выдает надпись "Ошибка" только тогда когда в Edit1 вы водите 1, тогда переменой а присваевается значение 2 и выводится сообщение об ошибке!


Цитата Сообщение от чайник++ Посмотреть сообщение
и неправильно считает
по приведенным формулам в коде все правильно считает! Будьте внимательны!
чайник++
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 8
30.07.2012, 21:47  [ТС]     Как правильно применять оператор switch #7
Действительно, если ввожу единицу, то результат получается такой, как если бы я ввёл 2. Но, тогда я вообще получается ничего не понимаю. Ведь по условию оператора switch, срабатывать должно именно то значение переменной а, которое именно я ввёл (т.е. 2). А здесь почему-то switch срабатывает на единицу. Почему же так?
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
30.07.2012, 21:50     Как правильно применять оператор switch #8
потому что

C++
1
case 1:
что бы с рабатывал на 2

C++
1
case 2:
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.07.2012, 21:52     Как правильно применять оператор switch #9
Цитата Сообщение от чайник++ Посмотреть сообщение
Почему же так?
Потому что надо внимательнее читать учебники. Вот эти два куска кода эквивалентны:
C++
1
2
3
4
5
switch (a) {
case 1:
    a = 2;
    /* вывод ошибки */
}
C++
1
2
3
4
if (a == 1) {
    a = 2;
    /* вывод ошибки */
}
Но ладно бы это, к нему ещё добавляется специфичное поведение switch, из-за которого, если не написать default-ветку, проверка a == 1 вообще фактически не выполняется и присваивание с выводом ошибки происходит всегда.
чайник++
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 8
30.07.2012, 22:08  [ТС]     Как правильно применять оператор switch #10
Действительно, если записать
case 24: a = 2;
то оператор switch срабатывает на 24; если же я записываю
case 4: a = 2;
то оператор switch срабатывает на 4;
Но ведь он-то должен срабатывать не на номер запрграммированного случая, а на то, что присвоено переменной! А здесь от переменной, получается, ничего не зависит?
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
30.07.2012, 22:15     Как правильно применять оператор switch #11
Цитата Сообщение от чайник++ Посмотреть сообщение
Но ведь он-то должен срабатывать не на номер запрграммированного случая, а на то, что присвоено переменной! А здесь от переменной, получается, ничего не зависит?
ну как это не зависит??

C++
1
switch (a)
вот Ваша переменная в скобках после switch, вот это и

номер запрграммированного случая,
как вы выразились!

Теперь смотрим что вы записываете в переменную а.

C++
1
a = Edit1->Text.ToInt();
получается что в "a" это заносится то что вы вели в Edit1.

в вашем коде a = 2 выполняется тогда когда вы зашли в switch!
чайник++
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 8
30.07.2012, 22:37  [ТС]     Как правильно применять оператор switch #12
Я именно так и думал. Однако, на практике получается следующее:
case 1: a=2; // switch реагирует не на 2, а на единицу;
case 4: a=2; // switch реагирует не на 2, а на четвёрку;
case 6: a=2; // switch реагирует не на 2, а на шестёрку;
case 9: a=2; // switch реагирует не на 2, а на девятку;
Но ведь 1, 4, 6 и 9 - это всего лишь номера case (правильно?), а переменной "а" везде присвоено значение 2. И я, присвоив переменной "а" значение 2, ожидаю (планирую), что switch сработает именно тогда, когда я введу 2. А switch, вместо этого срабатывает на те же 1, 4, 6 и 9. Это как-то не понятно.
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
30.07.2012, 22:50     Как правильно применять оператор switch #13
давайте сначала


поехали!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        int a,a1,b,e1;
        a = Edit1->Text.ToInt(); //тут Вы записали в переменную a какоето значение например 1;
        b = Edit2->Text.ToInt(); //
        switch (a) //switch смотрит что находится в переменной a, ага в ней 1, ищет где case 1:
        {
        case 1: //вот же он, и выполнет все что ижет до break;
                a = 2; //то что вы тут присваиваете a = 2 не как не влияет на case 1:
                Label3->Caption="Ошибка"; 
         break;// все вішли из switch
            case 3: //это не будет выполнять
                a = 23445;
                Label3->Caption="Не будет выполнятся"; 
         break; 
        }
        a1 = a*60;
        e1 = a1 + b;
        Label7->Caption=e1;
}
Вы изгачально присваиваете переменной а значение
C++
1
a = Edit1->Text.ToInt();
вот по этому значению у вас и работает свитч.
чайник++
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 8
30.07.2012, 23:12  [ТС]     Как правильно применять оператор switch #14
Действительно, если из моей первичной записи убрать а = 2; то всё работает правильно.
Т.е.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int a,a1,b,e1;
a=Edit1->Text.ToInt();
b=Edit2->Text.ToInt();
switch (a) {
case 1: Label3->Caption="Ошибка"; break;
}
a1=a*60;
e1=a1+b;
Label7->Caption=e1;
}

Получается что в этой записи то, что следует непосредственно за case и есть эта самая переменная "а"?
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
30.07.2012, 23:14     Как правильно применять оператор switch #15
Цитата Сообщение от чайник++ Посмотреть сообщение
case и есть эта самая переменная "а"?
да, ее значение!
чайник++
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 8
30.07.2012, 23:26  [ТС]     Как правильно применять оператор switch #16
Большое спасибо за помощь. Прежде чем выйти на форум я перерыл всё, что смог. Но из тупика сам так и не вышел. Ещё раз, большое спасибо Вам за помощь. Вопросы, конечно некоторые остались. Но с ними я ещё раз попробую справиться сам. Спокойной ночи.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2012, 23:38     Как правильно применять оператор switch
Еще ссылки по теме:

C++ Как работает оператор switch?
C++ Как правильно перегрузить оператор [] =
Оператор switch и while C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
30.07.2012, 23:38     Как правильно применять оператор switch #17
со свитчем ты разобрался а с программой
что она должна делать ????
сейчас она делает так
если a==1 то a будет равна 2 напишет ошибку и далее идут вычисления
ты этого хотел???
если нет
то нужно писать так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TForm1::Button1Click(TObject *Sender)
{
       int a,a1,b,e1;
    a=Edit1->Text.ToInt();
    b=Edit2->Text.ToInt();
       switch (a) {
         case 1:  // здесь если 1 то напишет Ошибка
                Label3->Caption="Ошибка"; break;
         default:          // здесь при всех других цифрах будет вычисление
       a1=a*60;
       e1=a1+b;
       Label7->Caption=e1;
     }
}
Это же самое проще сделать if
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TForm1::Button1Click(TObject *Sender)
{
       int a,a1,b,e1;
    a=Edit1->Text.ToInt();
    b=Edit2->Text.ToInt();
       if (a==1) {
           // здесь если 1 то напишет Ошибка
                Label3->Caption="Ошибка"; break;
        }
     else {          // здесь при всех других цифрах будет вычисление
       a1=a*60;
       e1=a1+b;
       Label7->Caption=e1;
     }
}
я так понял ты время создаешь и одна секунда тебе не нравится
Yandex
Объявления
30.07.2012, 23:38     Как правильно применять оператор switch
Ответ Создать тему
Опции темы

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