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

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

Войти
Регистрация
Восстановить пароль
 
 
чайник++
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 8
#1

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

30.07.2012, 21:03. Просмотров 938. Ответов 16
Метки нет (Все метки)

Подскажите пожалуйста, в чём здесь ошибка. Язык С++. Среда 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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2012, 21:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как правильно применять оператор switch (C++):

Как работает оператор switch? - C++
Shape* generator() { switch(rand() % 3) { case 0: return new Triangle; case 1: return new Rectangle; case 2: return new...

Как сделать меню используя оператор switch - C++
Как сделать оператором выбора switch, меню выбора процедуры. Например если есть 3 процедуры, чтобы можно было включить одну из них....

Как через оператор switch производить битовые операции? - C++
Здравствуйте, В общем несколько вопросов.. Вот к примеру, нужно сделать программу, где надо будет с клавиатуры ввести 2а целых числа...

Как правильно перегрузить оператор [] = - C++
вот например в классе хранится массив, и допустим я хочу елементу массива в этом классе присвоить другое значение, тоесть так, class...

как правильно перегружать оператор? - C++
Есть такой класс. class LampaO { private: int svet; int job; int pro; public: LampaO(int voltage=220); int IfJob();

оператор Switch???? - C++
Люди добрые помогите что здесь не так не пойму #include<conio.h> #include<stdio.h> #include<iostream> using namespace std; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
30.07.2012, 21:12 #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;
}
1
чайник++
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 8
30.07.2012, 21:20  [ТС] #3
И так тоже не работает. Суть в следующем. При любом вводимом а всё равно выдаёт надпись "Ошибка" и неправильно считает. Хотя, если убрать оператор switch, то считает правильно.
0
Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
30.07.2012, 21:25 #4
Дай условие задачи
0
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.07.2012, 21:26 #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 написано то, что выше, а в стандарте написано, что ничего не должно выполняться.
1
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
30.07.2012, 21:28 #6
Цитата Сообщение от чайник++ Посмотреть сообщение
ри любом вводимом а всё равно выдаёт надпись "Ошибка
Он выдает надпись "Ошибка" только тогда когда в Edit1 вы водите 1, тогда переменой а присваевается значение 2 и выводится сообщение об ошибке!


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

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

C++
1
case 2:
1
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.07.2012, 21:52 #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 вообще фактически не выполняется и присваивание с выводом ошибки происходит всегда.
1
чайник++
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 8
30.07.2012, 22:08  [ТС] #10
Действительно, если записать
case 24: a = 2;
то оператор switch срабатывает на 24; если же я записываю
case 4: a = 2;
то оператор switch срабатывает на 4;
Но ведь он-то должен срабатывать не на номер запрграммированного случая, а на то, что присвоено переменной! А здесь от переменной, получается, ничего не зависит?
0
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
30.07.2012, 22:15 #11
Цитата Сообщение от чайник++ Посмотреть сообщение
Но ведь он-то должен срабатывать не на номер запрграммированного случая, а на то, что присвоено переменной! А здесь от переменной, получается, ничего не зависит?
ну как это не зависит??

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

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

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

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

в вашем коде a = 2 выполняется тогда когда вы зашли в switch!
1
чайник++
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 8
30.07.2012, 22:37  [ТС] #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. Это как-то не понятно.
0
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
30.07.2012, 22:50 #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();
вот по этому значению у вас и работает свитч.
1
чайник++
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 8
30.07.2012, 23:12  [ТС] #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 и есть эта самая переменная "а"?
0
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
30.07.2012, 23:14 #15
Цитата Сообщение от чайник++ Посмотреть сообщение
case и есть эта самая переменная "а"?
да, ее значение!
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2012, 23:14
Привет! Вот еще темы с ответами:

оператор switch - C++
Задача весьма проста, необходима для тренировки. Я должен использовать оператор свитч таким образом, что после ввода определенного символа...

Оператор switch - C++
Возникла проблема. Не хочет высчитываться "v". Что не так? #include <iostream.h> #include <math.h> main () { int k; double...

Оператор switch - C++
Помогите переправить задачу на оператор switch, пож-та. Я написал с предусловием, но как быть со switch'ом не знаю. Вот код с...

Cи++. Оператор switch. - C++
У меня такой вопрос. Есть задача: с 1 января 1990 года по некоторый день прошло n месяцев, определить название месяца текущего. Ну как...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.07.2012, 23:14
Ответ Создать тему
Опции темы

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