Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
new_Лекции_1-7.docx
Скачиваний:
117
Добавлен:
05.03.2016
Размер:
1.49 Mб
Скачать

Лекция 7.2. Выбор из вариантов. План лекции

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

  2. Правила использование break

  3. Ограничение возможностей оператора switch

  4. Сравнение операторов switch и if-else

  5. Структурное программирование. Примеры

  1. Оператор выбора 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();

}

  1. Правила использование 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();

}

  1. Ограничение возможностей оператора 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();

}

  1. Сравнение операторов 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;

}

}

  1. Структурное программирование. Примеры

    1. Таблица значений функции

      1. Цикл 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;

}

      1. Цикл 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;

}

      1. Операторы 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;

}

    1. Числа Фибоначчи ( интересный 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;

}

    1. Программа, работающая под управлением меню

// Пример 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();

}

    1. Ввод числа из нужного диапазона

// Пример 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;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]