
- Форум
- По малко от всичко
- Информационни технологии
- Уроци по С++
4.4.3. Оператор switch
Често се налага да се избере за изпълнение един измежду множество от варианти. Пример за това дава следната задача.
Задача 25. Да се напише програма, която въвежда цифра, след което я извежда с думи.
За решаването на задачата трябва да се реализира следната неелементарна функция:
Последното може да стане чрез следната програма:
#include <iostream.h>
int main()
{cout << "i= ";
int i;
cin >> i;
if (!cin)
{cout << "Error, bad input!\n";
return 1;
}
if (i < 0 || i > 9)
{cout << "Bad input \n";
return 1;
}
else
if (i == 0) cout << "zero \n";
else if (i == 1) cout << "one \n";
else if (i == 2) cout << "two \n";
else if (i == 3) cout << "three \n";
else if (i == 4) cout << "four \n";
else if (i == 5) cout << "five \n";
else if (i == 6) cout << "six \n";
else if (i == 7) cout << "seven \n";
else if (i ==cout << "eight \n";
else if (i == 9) cout << "nine \n";
return 0;
}
В нея са използвани вложени if и if/else оператори, условията на които сравняват променливата i с цифрите 0, 1, 2, …, 9.
Има по-удобна форма за реализиране на това влагане. Постига се чрез оператора за избор на вариант switch.
Програма Zad25.cpp е друго решение на задачата.
Program Zad25.cpp
#include <iostream.h>
int main()
{cout << "i= ";
int i;
cin >> i;
if (!cin)
{cout << "Error, bad input!\n";
return 1;
}
if (i < 0 || i > 9)
{cout << "Bad input \n";
return 1;
}
else
switch (i)
{case 0 : cout << "zero \n"; break;
case 1 : cout << "one \n"; break;
case 2 : cout << "two \n"; break;
case 3 : cout << "three \n"; break;
case 4 : cout << "four \n"; break;
case 5 : cout << "five \n"; break;
case 6 : cout << "six \n"; break;
case 7 : cout << "seven \n"; break;
case 8 : cout << "eight \n"; break;
case 9 : cout << "nine \n"; break;
}
return 0;
}
Операторът switch започва със запазената дума switch (ключ), следван от, ограден в кръгли скобки, цял израз. Между фигурните скобки са изброени вариантите на оператора. Описанието им започва със запазената дума case (случай, вариант), следвана в случая от цифра, наречена етикет, двоеточие и редица от оператори.
Изпълнение на програмата
След въвеждането на стойност на променливата i се извършва проверка за коректност на въведеното. Нека въведената стойност е 7. Изпълнението на оператора switch причинява да бъде пресметната стойността на израза i – в случая 7. След това последователно сравнява тази стойност със стойностите на етикетите до намиране на етикета 7 и изпълнява редицата от оператори след него. В резултат върху екрана се извежда
seven
курсурът се премества на нов ред и се прекъсва изпълнението на оператора switch. Последното е причинено от оператора break в края на редицата от оператори за варианта с етикет 7.
Операторът switch реализира избор на вариант от множество варианти (възможности). Синтаксисът и семантиката му са дадени на Фиг. 7.
Синтаксис
switch (<израз>)
{ case <израз1> : <редица_от_оператори1>
case <израз2> : <редица_от_оператори2>
…
case <изразn-1> : <редица_от_операториn-1>
[default : <редица_от_операториn>]
}
където
- switch (ключ), case (случай, избор или вариант) и default (по премълчаване) са запазени думи на езика;
- <израз> е израз от допустим тип (Типовете bool, int и char са допустими, реалните типове double и float не са допустими). Ще го наричаме още switch-израз.
- <израз1>, <израз2>, …, <изразn-1> са константни изрази, задължително с различни стойности.
- <редица_от_операториi> (i = 1, 2, …, n) се дефинира по следния начин:
<редица_от_оператори> ::= <празно>|
<оператор>|
<оператор><редица_от_операт ри>
Семантика
Намира се стойността на switch-израза. Получената константа се сравнява последователно със стойностите на етикетите <израз1>, <израз2>, … При съвпадение, се изпълняват операторите на съответния вариант и операторите на всички варианти, разположени след него, до срещане на оператор break. В противен случай, ако участва default-вариант, се изпълнява редицата от оператори, която му съответства и в случай, че не участва такъв – не следват никакви действия от оператора switch.
Фиг. 7.
Между фигурните скобки са изброени вариантите на оператора. Всеки вариант (без евентуално един) започва със запазената дума case, следвана от израз (нарича се още case–израз или етикет), който се пресмята по време на компилация. Такива изрази се наричат константни. Те не зависят от входните данни. След константния израз се поставя знакът двоеточие, следван от редица от оператори (оператори на варианта), която може да е празна. Сред вариантите може да има един (не е задължителен), който няма case-израз и започва със запазената дума default. Той се изпълнява в случай, че никой от останалите варианти не е бил изпълнен.
Съществува възможност програмистът да съобщи на компилатора, че желае да се изпълни само редицата от оператори на варианта с етикет, съвпадащ със стойността на switch-израза, а не и всички следващи го. Това се реализира чрез използване на оператор break в края на редицата от оператори на варианта. Този оператор предизвиква прекъсване на изпълнението на оператора switch и предаване на управлението на първия оператор след него (Фиг. 8.).
Операторът break принадлежи към групата на т. нар. оператори за преход. Тези оператори предават управлението безусловно в някаква точка на програмата.
Синтаксис
break;
Семантика
Прекратява изпълнеието на най-вътрешния съдържащ го оператор switch или оператор за цикъл. Изпълнението на програмата продължава от оператора, следващ (съдържащ) прекъснатия.
Фиг. 8.
Програмистът съзнателно пропуска оператора break, когато за няколко различни стойности от множеството от стойности, трябва да се извършат еднакви действия.
Забележка: Ако в оператора switch не е използван операторът break, ще бъдe изпълнена редицата от оператори на варианта, чийто case-израз съвпада със стойността на switch-израза и също всички след него.
Използването на оператора switch има едно единствено предимство пред операторите if и if/else – прави реализацията по-ясна. Основен негов недостатък е, че може да се прилага при много специални обстоятелства, произтичащи от наложените ограничения на типа на switch-израза, а именно, той трябва да е цял, булев или символен. Освен това, използването на оператора break, затруднява доказването на важни математически свойства на програмите, използващи break.
Задачи върху оператора switch
Задача 26. Да се напише програма, която по зададено реално число x намира стойността на един от следните изрази:
y = x - 5
y = sin(x)
y = cos(x)
y = exp(x).
Изборът на желания израз да става по следния начин: при въвеждане на цифрата 1 се избира първият, на 2 – вторият, на 3 – третият и на 4 – четвъртия израз.
Програма Zad25.cpp решава задачата.
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
int main()
{cout << "=================================\n";
cout << "| y = x-5 -> 1 |\n";
cout << "| y = sin(x) -> 2 |\n ";
cout << "| y = cos(x) -> 3 |\n";
cout << "| y = exp(x) -> 4 |\n";
cout << "=================================\n";
cout << " 1, 2, 3 or 4? \n";
int i;
cin >> i;
if (!cin)
{cout << "Error, Bad input!!! \n";
return 1;
}
if (i == 1 || i == 2 || i == 3 || i == 4)
{cout << "x= ";
double x;
cin >> x;
if (!cin)
{cout << "Error, Bad input!! \n";
return 1;
}
double y;
switch (i)
{case 1: y = x - 5; break;
case 2: y = sin(x); break;
case 3: y = cos(x); break;
case 4: y = exp(x); break;
}
cout << "y= " << y << "\n";
}
else
{cout << "Error, Bad choise!!\n";
return 1;
}
return 0;
}
Задачи
Задача 1. Явява ли се условен оператор редицата от символи:
а) if (x < y) x = 0; else y = 0;
б) if (x > y) x = 0; else cin >> y;
в) if (x >= y) x = 0; y = 0; else cout << z;
г) if (x < y) ; else z = 5;
д) if (x < y < z) then z = z + 1;
е) if (x != y) z = z+1; x = x + y;
Задача 2. Кое условие е в сила след запазената дума else на условния оператор:
а) if (a > 1 && a < 5) b = 5; else b = 10;
б) if (a < 1 || a > 5) b = a; else a = b;
в) if (a = b || a = c || b = c) c = a + b; else c = a – b;
Задача 3. Да се намерят грешките в следните оператори:
а) if (1 < x < 2) x = x + 1; y = 0;
else x = 0; y = y + 1;
б) if (1 < x) && (x < 2)
{x = x + 1;
y = 0;
};
else
{x = 0;
y = y + 1;
};
Задача 4. Да се напише програма, която по дадено реално число x намира стойността на y, където
Задача 5. Да се напише програма, която по зададени стойности на реалните променливи a, b и c намира:
а) min{a+b+c, a.b.c} + 15.2
б) max{a2 - b3 + c, a – 17.3 b, 3.1 a + 3.5 b – 8 c} - 17.9.
Задача 6. Да се напише програма, която увеличава по-малкото от две дадени цели неравни числа пет пъти, а по-голямото число намалява 8 пъти.
Задача 7. Да се напише програма, която въвежда четири реални числа и ги извежда във възходящ (низходящ) ред върху екрана.
Задача 8. Дадени са три числа a, b и c. Да се напише програма, в резултат от изпълнението на която, ако е в сила релацията a ≥ b ≥ c, числата се удвояват, в противен случай числата се заменят с техните абсолютни стойности.
Задача 9. Да се намери стойността на z след изпълнението на операторите
z = 0;
if (x > 0) if (y > 0) z = 1; else z = 2;
ако:
а) x = y = 1 б) x = 1, y = -1 в) x = -1, y = 1
Задача 10. Да се запише указаното действие чрез един условен оператор:
б) d = max(a, b, c)
Задача 11. Да се напише условен оператор, който е еквивалентен на оператора за присвояване
x = a || b && c;
където всички променливи са булеви и в който не се използват логически операции (Например, операторът x = not a; е еквивалентен на оператора if (a) x = false; else x = true.
Задача 12. Да се напише оператор за присвояване, еквивалентен на условния оператор
if (a) x = b; else x = c;
(всички променливи са булеви).
Задача 13. Да се напише програма, която по зададено число a, намира корена на уравнението f(x) = 0, където
Аз съм МОМЧЕ R.I.P. липсваш ми боже колко ми липсваш защо трябваше да става така мамкаму