- •Введение
- •План лекции
- •Лекция 1.2. Работа в среде Visual Studio План лекции
- •Практические задания
- •Контрольные вопросы
- •Лекция 2.1. Структура простой программы План лекции
- •Лекция 2.2. Использование функций План лекции
- •Практические задания
- •Контрольные вопросы
- •Тема 3: Переменные и константы Лекция 3.1. Встроенные типы данных. План лекции
- •Лекция 3.2. Константы, перечисления, синонимы типа План лекции
- •Практические задания
- •Контрольные вопросы
- •Тема 4: Операции и выражения Лекция 4.1. Математические операторы и выражения План лекции
- •Лекция 4.2. Логические операторы и выражения. План лекции
- •Практические задания
- •Контрольные вопросы
- •Тема 5: Функции. Лекция 5.1. Личные и встроенные функции. План лекции
- •Основные библиотечные функции c для работы с символьными массивами (string.H)
- •Лекция 5.2. Параметры. Значения по умолчанию. Перегрузка. Рекурсия. План лекции
- •Inline-функции
- •Практические задания
- •Контрольные вопросы
- •Тема 6: Структуры. Классы и объекты. Лекция 6.1. Структуры в языке с. План лекции
- •Лекция 6.2. Классы с открытыми данными. План лекции
- •Лекция 6.3. Конструкторы и деструктор.Cкрытие данных. План лекции
- •Лекция 6.4. Введение в библиотеки классов План лекции
- •Практические задания
- •Контрольные вопросы
- •Тема 7: Циклы, выбор вариантов. Лекция 7.1. Циклы. План лекции
- •Лекция 7.2. Выбор из вариантов. План лекции
- •Практические задания
- •Контрольные вопросы
- •Заключение
- •Литература
- •Содержание
Лекция 7.2. Выбор из вариантов. План лекции
Оператор выбора switch
Правила использование break
Ограничение возможностей оператора switch
Сравнение операторов switch и if-else
Структурное программирование. Примеры
Оператор выбора switch
Позволяет осуществить выбор (ветвление) по множеству значений целочисленного выражения. Выражение вычисляется и если оно совпадает с каким либо значением метки case, то выполняются все операторы, находящиеся за case, пока не встретится break или конец switch. Если выражение не совпадает ни с одной меткой case, то если есть default, то управление передается на операторы при default, в противном случае switch завершается без выполнения действий. Метка case может быть целой константой, символом или элементом перечисления, заданного оператором enum.
// Пример 7.2.1
/ /Использование оператора switch : параметр выбора - целое
#include <iostream>
using namespace std;
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
//double number; // error!
unsigned short int number; //long number;
cout << "Введите число от 1 до 5: ";
cin >> number;
switch (number) {
case 0 : cout << "Очень маленькое число!\n"; break;
case 5 : cout << "Хорошая работа!\n";
case 4 : cout << "Правильный выбор!\n";
case 3 : cout << "Превосходно!\n";
case 2 : cout << "Великолепно!\n";
case 1 : cout << "Неправдоподобно!\n"; break;
default: cout << "Очень большое число\n"; break;
}
cin.get();cin.get();
}
// Пример 7.2.2
// Использование оператора switch : параметр выбора - символ
#include <iostream>
#include <ctype.h>
using namespace std;
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
unsigned char letter;
cout << "Введите букву от a до f: ";
cin >> letter;
letter=tolower(letter);
switch (letter) {
case 'a' : cout << "Неправильно (а)!\n"; break;
case 'b' : cout << "Хорошая работа!\n";
case 'c' : cout << "Правильный выбор!\n";
case 'd' : cout << "Превосходно!\n";
case 'e' : cout << "Великолепно!\n";
case 'f' : cout << " Неправдоподобно!\n"; break;
default : cout << " Неправильно (>f)!\n"; break;
}
cin.get();
}
// Пример 7.2.3
// Использование оператора switch: параметр выбора - символ
#include <iostream>
using namespace std;
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
unsigned char letter;
cout << "Введите букву от a до f: ";
cin >> letter;
switch (letter) {
case 'a' :
case 'A' : cout << " Неправильно (а,A)!\\n"; break;
case 'b' :
case 'B' : cout << "Хорошая работа!\n";
case 'c' :
case 'C' : cout << "Правильный выбор!\n";
case 'd' :
case 'D' : cout << "Превосходно!\n";
case 'e' :
case 'E' : cout << "Великолепно!\n";
case 'f' :
case 'F' : cout << "Неправдоподобно!\n"; break;
default : cout << " Неправильно (>f,F)!\n";
}
cin.get();cin.get();
}
// Пример 7.2.4
// Использование оператора switch : параметр выбора - перечисление
#include <iostream>
using namespace std;
enum Variants { Small, Incredible, Splendidly, Excellent, Nice, Good };
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
unsigned short int number;
cout << "Введите число от 1 до 5: ";
cin >> number;
switch (number) {
case Small : cout << "Очень маленькое число!\n"; break;
case Good : cout << "Хорошая работа!\n";
case Nice : cout << "Правильный выбор!\n";
case Excellent : cout << "Превосходно!\n";
case Splendidly : cout << "Великолепно!\n";
case Incredible : cout << "Неправдоподобно!\n"; break;
default : cout << "Очень большое число\n";
}
cin.get();cin.get();
}
Правила использование break
Наиболее часто на практике применяется вариант оператора switch, каждая из веток которого должна заканчивается его завершением, т.е. оператором break.
// Пример 7.2.5
// Использование оператора switch : параметр выбора - целое
#include <iostream>
using namespace std;
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
unsigned short number;
double kursG=1, kursD=4.9, kursE=7.6,kursR=0.19, kurs;
cout << "Введите номер валюты (1-гривна, 2-доллар, 3-евро, 4-рубль) : ";
cin >> number;
switch (number) {
case 1 : cout << "Гривна! "; kurs=kursG; break;
case 2 : cout << "Доллар! "; kurs=kursD; break;
case 3 : cout << "Евро! "; kurs=kursE; break;
case 4 : cout << "Рубль! "; kurs=kursR; break;
default : cout << "Неправильно выбран номер!\n"; return;
}
cout << "Для вычисления выбран курс = " << kurs << endl;
cin.get();cin.get();
}
// Пример 7.2.6
// Использование оператора switch : параметр выбора - перечисление
#include <iostream>
using namespace std;
enum Valuta {Grivna=1, Dollar, Evro, Rubl};
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
unsigned short number;
double kursG=1, kursD=4.9, kursE=7.6,kursR=0.16, kurs;
cout << "Введите номер валюты (1-гривна, 2-доллар, 3-евро, 4-рубль) : ";
cin >> number;
switch (number) {
case Grivna : cout << "Гривна! "; kurs=kursG; break;
case Dollar : cout << "Доллар! "; kurs=kursD; break;
case Evro : cout << "Евро! "; kurs=kursE; break;
case Rubl : cout << "Рубль! "; kurs=kursR; break;
default : cout << "Неправильно выбран номер!\n"; return;
}
cout << "Для вычисления выбран курс = " << kurs << endl;
cin.get(); cin.get();
}
Ограничение возможностей оператора switch
И оператор switch, и оператор if-else позволяют программе осуществить выбор из списка взаимоисключающих вариантов. Оператор if-else более гибок и может обрабатывать диапазоны и вещественные числа. Оператор switch не предназначен для обработки диапазонов, т.к. метка варианта case оператора switch не может быть вещественным значением.
// Пример 7.2.7
// Использование оператора switch недопустимо для анализа диапазонов
// Нужно использовать if-else
#include <iostream>
using namespace std;
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
unsigned short int age,index;
cout << "Введите возраст от 17 до 65: ";
cin >> age;
if (age >=17 && age < 35)
index=0;
else if (age >=35 && age < 50)
index=1;
else if (age >=50 && age < 65)
index=2;
else
index=3;
cout << "Индекс возраста = " << index << endl;
cin.get();cin.get();
}
Сравнение операторов switch и if-else
Использование switch упрощает запись сложных, многоуровневых операторов if-else, варианты которых могут быть определены целыми величинами, перечислениями или символами. Оператор switch был разработан для обработки именно таких ситуаций. Его использование более эффективно как с точки зрения размера программы так и времени ее выполнения. Если можно использовать как if-else, так и switch, то оператор switch следует использовать при наличии трех и более возможных вариантов.
// Пример 7.2.8
// Совместное использование операторов if-else и switch
#include <iostream>
using namespace std;
enum Level {Rebenok, Molodoy, Sredniy, Pogiloy, Stariy };
Level GetAgeIndex();
void Print(Level);
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
Level index;
index=GetAgeIndex();
Print(index);
cin.get();cin.get();
}
Level GetAgeIndex() {
unsigned short int age;
Level index;
cout << "Введите возраст от 17 до 65 : ";
cin >> age;
//Использование оператора switch недопустимо для анализа диапазонов
if (age < 17)
index=Rebenok;
else if (age >=17 && age < 35)
index=Molodoy;
else if (age >=35 && age < 50)
index=Sredniy;
else if (age >=50 && age < 65)
index=Pogiloy;
else
index=Stariy;
cout << "Индекс возраста = " << index << endl;
return index;
}
void Print(Level index) {
//Использование оператора switch рекомендуется для выбора
//одного из множества целых вариантов
switch (index) {
case Rebenok : cout << "Ребенок!\n"; break;
case Molodoy : cout << "Молодой!\n"; break;
case Sredniy : cout << "Средний!\n"; break;
case Pogiloy : cout << "Пожилой!\n"; break;
case Stariy : cout << "Старый!\n"; break;
}
}
Структурное программирование. Примеры
Таблица значений функции
Цикл while
// Пример 7.2.9
//Вывод таблицы значений функции циклом while
#include <iostream>
#include <math.h>
using namespace std;
double Fx(double x);
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
double a,b,h,x;
cout << "Введите диапазон a,b через пробел >";
cin >> a >> b;
cout << "Введите шаг изменения h > ";
cin >> h;
cout << "Таблица значений" << endl;
cout << "------------------------" << endl;
cout << " X : Y " << endl;
cout << "------------------------" << endl;
x=a; // начальное значение параметра цикла
while ( x<=b ) // условие повторения цикла
{
cout << " " << x << "\t\t"<< Fx(x) << endl;
x+=h; // изменение параметра цикла
}
cin.get();cin.get();
}
double Fx(double x) {
double y;
//y=x*x; //вид вычисляемой функции
y=sqrt(x); //вид вычисляемой функции
return y;
}
Цикл for
// Пример 7.2.10
//Вывод таблицы значений функции циклом for
#include <iostream>
#include <math.h>
using namespace std;
double Fx(double x);
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
double a,b,h,x;
cout << "Введите диапазон a,b через пробел >";
cin >> a >> b;
cout << "Введите шаг изменения h > ";
cin >> h;
cout << "Таблица значений" << endl;
cout << "------------------------" << endl;
cout << " X : Y " << endl;
cout << "------------------------" << endl;
for (x=a; x<=b; x+=h)
cout << " " << x << "\t\t"<< Fx(x) << endl;
// for (x=a; x<=b; cout << " " << x << "\t\t"<< Fx(x) << endl,x+=h);
cin.get();cin.get();
}
double Fx(double x) {
double y;
//y=x*x; //вид вычисляемой функции
y=sqrt(x); //вид вычисляемой функции
return y;
}
Операторы while, do while, for, switch
// Пример 7.2.11
// Повторение выполнения приложения при помощи цикла while
// Повторение ввода при помощи цикла do-while
// Вывод таблицы значений функции циклом for
// Выбор функции оператором switch
#include <iostream>
#include <math.h>
using namespace std;
enum TFunc {Finish, Kvadrat, Kub, Koren, Obratnoe, Sinus};
double Fx(double, TFunc);
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
double a,b,h,x;
int v;
// цикл выполнения приложения
while (true) {
// выбор типа функции - личная функция
do
{
cout << "Введите число\n1-квадрат, 2-куб, \ 3-кв. корень, 4-обратное число, 5-синус, 0-выход >";
cin >> v;
} while (v<Finish || v>Sinus);
// завершение работы приложения
if (v==Finish) {
cout << "Приложение завершено! " ;
cin.get();
break;
}
// ввод границ отрезка - личная функция
do {
cout << "Введите диапазон a,b через пробел >";
cin >> a >> b;
} while (a>=b);
// ввод шага изменения - личная функция
do {
cout << " Введите шаг изменения h (0.1-2.0) > ";
cin >> h;
} while (h<0.1 || h>2);
// печать шапки таблицы
cout << "Таблица значений" << endl;
cout << "------------------------" << endl;
cout << " X : Y " << endl;
cout << "------------------------" << endl;
// вывод таблицы значений функции
for (x=a; x<=b; x+=h) {
cout << " " << x << "\t\t"<< Fx(x,(TFunc)v) << endl;
}
cin.get();
}
}
// функция для вычисления текущего значения х
double Fx(double x, TFunc v) {
double y;
switch (v) {
case 1 : y=x*x; break;
case 2 : y=x*x*x; break;
case 3 : y=sqrt(x); break;
case 4 : y=1/x; break;
case 5 : y=sin(x); break;
}
return y;
}
Числа Фибоначчи ( интересный for )
// Пример 7.2.12
// Нахождение N-го числа Фибоначчи итерацией
#include <iostream>
using namespace std;
//typedef unsigned long int ULONG;
typedef long double ULONG;
ULONG fib(ULONG position);
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
ULONG answer,position;
cout << "Номер числа в последовательности?:";
cin >> position;
cout << "\n";
answer=fib(position);
cout<< "Значение числа Фибоначчи = "<< answer;
cin.get();cin.get();
}
ULONG fib(ULONG n) {
ULONG minusTwo=1, minusOne=1, answer=2;
if (n<3)
return 1;
for (n-=3; n; n--) {// n=0 - ложь - условие завершения цикла
minusTwo=minusOne;
minusOne=answer;
answer=minusOne+minusTwo;
}
return answer;
}
Программа, работающая под управлением меню
// Пример 7.2.13
//Использование бесконечного цикла и выбора в меню
#include <iostream>
using namespace std;
typedef unsigned short int USHORT;
USHORT menu();
void DoTaskOne(); // Заглушки будущих функций - Stub
void DoTaskMany(USHORT);
void DoSomeThing();
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
bool exit=false; // флаг для завершения цикла
while(true) { // бесконечный цикл
USHORT choice=menu();
switch (choice) {
case (1) : DoTaskOne(); break;
case (2) : DoTaskMany(2); break;
case (3) : DoTaskMany(3); break;
case (4) : break;
case (5) : DoSomeThing(); break;
case (6) : DoTaskMany(4); break;
case (7) : exit=true; break;
default: cout << " Выберите снова\n"; cin.get(); break;
}
if (exit==true) break;
}
cin.get();
}
USHORT menu(){
USHORT choice;
cout << "**** Меню ****\n\n";
cout << "(1) Выбор 1.\n";
cout << "(2) Выбор 2.\n";
cout << "(3) Выбор 3.\n";
cout << "(4) Обновление меню.\n";
cout << "(5) Выбор DoSomeThing.\n";
cout << "(6) Выбор 4.\n\n";
cout << "(7) Выход.\n\n";
cout << ": ";
cin >> choice;
return choice;
}
void DoTaskOne() {
cout << "Задача 1! Для продолжения нажмите <Enter>\n";
cin.get(); cin.get();
}
void DoSomeThing() {
cout << "DoSomeThing! Для продолжения нажмите <Enter>\n";
cin.get(); cin.get();
}
void DoTaskMany(USHORT which) {
if (which ==2) cout << "Задача 2!\n";
else if (which == 3) cout << "Задача 3!\n";
else cout << "Задача 4!\n";
cout << " Для продолжения нажмите <Enter>\n";
cin.get(); cin.get();
}
Ввод числа из нужного диапазона
// Пример 7.2.14
// Повторение при вводе чисел с клавиатуры
#include <iostream>
using namespace std;
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
int age, min=20,max=30;
// Ввод возраста от min до max
do {
cout << "Введите возраст (" << min << "-" << max << ") ? " << endl;
cin >> age;
} while(age < min || age > max);
cout << "Возраст: " << age <<endl;
cin.get();
// Ввод возраста < min или > max
do {
cout << "Возраст <" << min << " или > " << max << " ? " << endl;
cin >> age;
} while(age >= min && age <= max);
cout << "Возраст : " << age <<endl;
cin.get();cin.get();
}
// Пример 7.2.15
// Ввод чисeл нужного диапазона
#include <iostream>
#include <ctype.h>
#include <string>
#include <conio.h>
using namespace std;
int GetNumber(int min, int max);
string FormString();
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
int MyInt, Age;
MyInt=GetNumber(1,10);
Age=GetNumber(20,40);
cout << "Введены числа : ";
cout << MyInt << '\t' << Age << endl;
cin.get(); cin.get();
}
int GetNumber(int min, int max) {
string str;
int value;
do {
cout << "Введите целое от " << min << " до " << max << endl;
str=FormString();
value=atoi(str.c_str()); // преобразование строки С++ в целое
} while (value < min || value > max);
cout << "Введено число: " << value << endl;
return value;
}
string FormString() {
int ENTER=13, ch;
string str;
while (1) {
ch=_getch();
if (ch==ENTER) {
cout << endl; break;
}
if (isdigit(ch)) {
str+=(char)ch;
cout << (char)ch;
}
}
return str;
}