Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Оператор выбора switch



Аналогичный оператор есть и в других языках (case в Pascal). Он используется, если уровень вложенности if достаточно большой.

Пример 4. Вывести целое однозначное число z прописью.

Это можно сделать с помощью if:

int z; cin>>z; if (z==0) cout<<”нуль”;

else if (z==1) cout <<” один”;

else if (z==2) cout <<” два”;

/* и т.д. записываем if для 3, 4, 5, 6, 7, 8 */

else if (z==9) cout <<”девять”;

else cout<<”Ошибка”;

Второй вариант с оператором switch вместо вложенного if нагляднее и легче для понимания и отладки.

int z; cin>>z;

switch (z)

{ case 0: cout<<”нуль”; break;

case 1: cout <<”один”; break;

case 2: cout <<”два”; break;

case 3: cout <<”три”; break;

case 4: cout <<”четыре”; break;

case 5: cout <<”пять”; break;

case 6: cout <<”шесть”; break;

case 7: cout <<”семь”; break;

case 8: cout <<”восемь”; break;

case 9: cout <<”девять”; break;

default: cout<<”Ошибка ”;

} // Конец оператора switch.

// Здесь оператор, следующий после switch.

Работает оператор так. Пусть,например, z =3. Тогда первые две ветви пропускаются, выполняется cout <<”три”; и break передаёт управление на оператор, следующий после switch. Если z не является однозначным числом, например, числом 30, то первые десять ветвей пропускаются, выводится “Ошибка” и выполняется оператор, следующий после switch.

Оператор switch имеет следующий общий вид:

switch (выражение)

{ case константное_выражение1:

последовательность_операторов1; break;

case константное_выражение2:

последовательность_операторов2; break;

case константное_выражениеN:

последовательность_операторовN; break;

default: последовательность_операторов;

}

Выражение, записываемое после ключевого слова switch обязательно в скобках, может быть целого, символьного или перечисляемого типа, который будет рассмотрен позже. В простых задачах может быть переменная. Нельзя использовать выражение вещественного или строкового типа. В константном выражении можно использовать только константы, определённые одним из указанных ранее способов, и нельзя записывать переменные или вызовы функций.

Работает оператор следующим образом. Значения константных выражений вычисляются во время компиляции. Во время выполнения вычисляется значение записанного в круглых скобках после ключевого слова switch выражения и сравнивается с первой константой на строгое равенство. Если значение выражения не совпало с одной из констант, оно же сравнивается со второй константой и т. д. Если, совпало, выполняется соответствующая последовательность операторов, и break передаёт управление на оператор, следующий после switch. Если break отсутствует, то выполняется следующая последовательность операторов, хотя значение выражения и не совпадает со следующей константой. Это основная особенность этого оператора по сравнению с другими языками. В случае отсутствия совпадений выполняются операторы, записанные после default, который необязателен. Если его нет, то в случае отсутствия соответствий ничего не выполняется.

В отличие от языка Pascal нельзя указать диапазон констант. Вместо этого разрешается для нескольких констант указать одну и ту же последовательность операторов.

Пример 5. Анализ оценки z будет выглядеть так:

switch (z)

{ case 1:

case 2:

case 3: cout <<”не удовл.”; break;

case 4: case 5: cout <<”удовл.”; break;

case 6: case 7: case 8: cout <<”хор.”; break;

case 9:

case 10: cout <<”отл.”; break;

default: cout<<”Ошибка ”;

}

При этом ключевые слова case желательно записывать в “столбик”, как это сделано для неудовлетворительной и отличной оценки, а не в строку, как это записано во второй и третьей ветвях.

Допускается вложенность операторов switch, когда в любой последовательности операторов используется другой switch. Константы или значения константных выражений внутреннего и внешнего операторов switch могут совпадать. На одном уровне switch они должны быть различными. Например, допустима следующая часть программы:

char flag1, flag2; ……

switch (flag1)

{ case ‘A’: switch (flag2)

{ case ‘A’: cout<<”AA”; break;

case ‘B’: cout<<”AB”;

} break;

case ‘X’: …

}

Упражнения и тесты

1. Дано x. Вычислить y = x*x, если x > 0, иначе y = 100.

Предлагаются следующие три варианта решения:

a) if (x>0) y=x*x; else y=100; cout<<"y= "<<y;

б) y = x>0?x*x:100; cout<<"y= "<<y;

в) cout<<"y= "<<(x>0?x*x:100);

2. Даны х, y. Вывести “+++” или “– – –” в зависимости от того, x > y или нет.

Решение: а) if (x>y) cout<<”+++”; else cout<< “– – –”;

б) x>y? cout<<" +++ ": cout<< “– – –”;

3. Вывести “ Yes ” или “ No ” в зависимости от того, точка с координатами x, y принадлежит области, ограниченной линиями y = – x, x =0 и y = –1, или нет.

Решение:

if (y<=–x && x>=0 && y>–1) cout<<"Yes"; else cout<<"No";

4. Нарисовать область плоскости, в которой и только в которой следующее логическое выражение истинно:

а) x>y && x<2 && y>-1; б) x>y || x<2 && y>-1; в) x>y && x<2 || y>-1; г) x>y || x<2 || y>-1; д) x>y && (x<2 || y>-1); е) x>y &&!(x<2 || y>-1).

5. Определить результат, то есть значения переменных a, b и r, после выполнения оператора if. Даны, например, следующие начальные значения этих переменных: a) int a=2, b=3, r=4; b) int a=5, b=5, r=4; c) int a=-5, b=5, r=4; d) int a=0, b=3, r=4;. Варианты оператора if:

1) if (a>=1) r=a+b; else if (b>0) r=a-b;

else if (b<-5) r=a*b; else r=a;

2) if (a>=1) r=a+b; else if (b>0) r=a-b;

else if (b<-5) r=a*b;

3) if (a=b) if (b) r=a+b; else r=a-b;

4) if (a>=1) { if (b>0) r=a+b; } else r=a-b;

5) if (a>=1) if (b>0) r=a+b; else r=a-b;

6) if (a+b) if (a-b) {a*=b; b*=a++; }

else { a*=(--b); b*=(a--); }

else { a--; b=a; ++b; }

7) if (a+b) if (a-b) {a*=b; b*=a++; }

else { a*=(--b); b*=(a--); }

else a--; b=a; ++b;

8) if (a=b) { if (b) r=a+b; } else r=a-b;

9) if (a==b) if (b) r=a+b; else r=a-10;

10) if (a==b) { if (b) r=a+b; } else r=a-10;

11) if (a+b) if (a-b) {a*=b; b*=a++; } else { a*=(--b); b*=(a--); }

else { a--; b=a; ++b; }

12) if (a+b) if (a-b) {a*=b; b*=a++; } else { a*=(--b); b*=(a--); }

else a--; b=a; ++b;

6. Пусть float x=…, y=…, a=…, b=…, где a>0, b>0 (на месте многоточия конкретные числовые константы). Определить результат (true или false) для каждого логического выражения

1) y>fabs(x) && fabs(x)<a && y<b; 2) y>fabs(x) || fabs(x)<a && y<b;

3) y>fabs(x) && fabs(x)<a || y<b; 4) y>fabs(x) || fabs(x)<a || y<b;

5) (y>fabs(x) || fabs(x)<a) && y<b; 6) y>fabs(x) || (fabs(x)<a && y<b);

7)! (y>fabs(x) || fabs(x)<a) && y<b;

В следующих вариантах (8), 9) и т.д.) которые можно записать самостоятельно, по-разному расставлены скобки, меняются логические операции, операции сравнения и место логического отрицания.

7. Записать номера логических выражений, для которых получим true, если int x=…, y=…;(на месте многоточия конкретные числа).

Уровень А. Используются логические выражения, составленные по образцу предыдущего типа теста.

Уровень B. Используются логические выражения, в которых логические величины сравниваются по следующим правилам:

true = = true; false = = false; true > false.

Примеры таких логических выражений:

1) (y>x) = = (x>0); 2) (y>x)! = (x>0); 3) (y>x) > (x>0);

4) (y>x) < (x>0); 5) (y>x) >= (x>0); 6) (y>x) <= (x>0);

7) (y > x) >!(x > 0) и т. п.

8. Пусть float x=…, y=…, r; (x и y проинициализированы конкретными значениями).Записать в указанном порядке значения x, y, r, которые получатся после выполнения операции присваивания и тернарной операции

1) r= x>1 || y<=0?++x:y- -; 2) r=!(x>1 || y<=0)? x++: - -y;

3) r= x>1 &&|| y<=0? x+1: y+1-; 4) !(x>1 && y<=0)? r=++x: r=--y;

9. Сравнить оператор switch с оператором case языка Pascal.

10. Что будет выведено, если введём

1) 1 2) 5 3) 8 4) 0 5) 22?

int m; cin>>m;

switch (m)

{case 1:case 2: case 3: cout<<2; break;

case 4: case 5: cout<<3; break;

case 6: case 7: case 8: cout<< 4;

case 9: case 10: cout<< 5; break;

default: cout<<"Error";

}

Оператор break может отсутствовать в одной или нескольких других ветвях.

11. В каких строках (//1 -- //6) есть ошибки компиляции?

#define ONE 1

int m; const n=4, float k=1; cin>>m;

switch (m+k) //1

{ case ONE: //2

case т: cout<< 2; break; //3

case ONE+2: cout<<3; //4

case n: cout<<4; //5

case k+n: cout<<"Five"; break; //6

}

12. В каких строках (//1 — //7) есть ошибки компиляции?

char C, B='B'; C=getch();

switch (C) //1

{ case 'A': cout<<"А"; //2

case “B”: switch (B) //3

{ case 'A': cout<< " BA "; break; //4

case B: cout << " BB "; break; //5

case ‘C’: cout<< " BC "; break; //6

}

case С: cout<<" C "; } //7

Задачи

1. Ввести число. Вывести 0 или 1 в зависимости от того, положительное число или неположительное. Выполнить это двумя способами:

#include <iostream.h>

#include <conio.h>

int main() { float x; int result;

cout<<"The number "; cin>>x;

cout<<"The first variant "; cout<<(x>0)<<endl;

cout<<"The second variant ";

if (x>0) result=1; else result=0;

cout<<result<<endl; getch(); return 0; }

2. Найти наибольшее из трех введенных чисел:

main() { int x, y, z, res1, res2, res3;

cout<<"The first number "; cin>>x;

cout<<"The second number "; cin>>y;

cout<<"The third number "; cin>>z;

cout<<"Max of numbers (" <<x<<", "<<y<<", "<<z<<") ";

// Полная форма оператора if:

if (x>y) res1=x; else res1=y;

if (z>res1) res1=z;

cout<<”\nVariant 1 “<<res1<<endl;

// Сокращённая форма оператора if:

res2= x; if (y > res2) res2= y;

if (z > res2) res2= z;

cout<<" Variant 2 "<< res2<<endl;

// Тернарная операция:

res3=x>y?x:y; res3=z>res3?z:res3;

cout<<" Variant 3 "<<res3;

getch(); return 0; }

Указания. Одну и ту же задачу по возможности решить несколькими способами, используя, например, сокращенную и полную формы if, if и switch, if и тернарную операцию.





Дата публикования: 2015-02-18; Прочитано: 490 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.027 с)...