ЛАБОРАТОРНАЯ РАБОТА №3 ПРОГРАММИРОВАНИЕ РАЗВЕТВЛЯЮЩИХСЯ АЛГОРИТМОВ Цель лабораторной работы: Получение практических навыков в работе с условным оператором и разветвленными алгоритмами в языке C++. 1. Операторы if и switch языка C++ Для программирования разветвляющихся алгоритмов в языке C++ используются переменные типа bool, которые могут принимать только два значения - true и false (да, нет), а так же операторы if и switch. Условный оператор if проверяет результат логического выражения или значение переменной типа int либо bool и организует разветвление вычислений. Условный оператор имеет полную и сокращенную форму. if ( <выражение-условие> ) <оператор>; //сокращенная форма В качестве <выражения-условия> могут использоваться арифметическое выражение, отношение и логическое выражение. Если значение <выражения-условия> отлично от нуля (т.е. истинно), то выполняется оператор. Например: if (x<y&&x<z)min=x; if ( <выражение-условие> ) <оператор1>; else <оператор2>; //полная форма Если значение <выражения-условия> отлично от нуля, то выполняется оператор1, при нулевом значении <выражения-условия> выполняется оператор2. Например: if (d>=0) { x1=(-b-sqrt(d))/(2*a); x2=(-b+sqrt(d))/(2*a); cout<< “\nx1=”<<x1<<“x2=”<<x2; } else cout<<“\nРешения нет”; Например, если bool bl; double x,y,u; то фрагмент программы с оператором if может быть таким: bl=x>y; if (bl) u=x-y; else u=x+y; Оператор выбора swith организует разветвления в зависимости от значения некоторой переменной перечисляемого типа. switch (<выражение>) { case <константа1> : <оператор1 >; case <константа2> : <оператор2 >; . . . . . . . . . . . default: <операторы>; } При выполнении оператора switch, вычисляется выражение, записанное после switch, и его значение последовательно сравнивается с константами, которые записаны следом за case. При первом же совпадении выполняются операторы, помеченные данной меткой. Если выполненные операторы не содержат оператора перехода break, то далее выполняются операторы всех следующих вариантов, пока не появится оператор перехода или не закончится переключатель. Если значение выражения, записанного после switch, не совпало ни с одной константой, то 1 выполняются операторы, которые следуют за меткой default. Метка default может отсутствовать. Например, если int in, то после выполнения switсh (in) { case 0: u=x+y; break; case 1: u=x-y; break; case 2: u=x*y; break; default u=0; } В соответствии со значением in вычисляется u. Если in=0, то u=x+y, если in=1, то u=xy, если in=2, то u=x*y и, наконец, u=0 при любых значениях in отличных от 0, 1 или 2. 2. Задание №1 2.1. Пример написания программы Задание: ввести три числа – x, y, z. Вычислить по усмотрению u=sin(x), u=cos(x) или u=tg(x). Найти по выбору максимальное из трех чисел: max(u,y,z), или max(|u|,|y|,|z|). 2.1.1. Разработка алгоритма решения Алгоритм решения задачи состоит из следующих этапов: 1. Выбор функции для вычисления u; Пронумеруем функции 1. u=sin(x), 2. u=cos(x), 3. u=tg(x) и попросим пользователя ввести номер функции. 2. Выбор максимума: max(u,y,z) или max(|u|,|y|,|z|). Спросим пользователя: будем вычислять максимум абсолютных значений или нет и попросим ввести 0 – если «нет», 1 – если «да». 3. Ввод значений переменных x, y и z. 4. Вычисление функции u. 5. Вычисление абсолютных значений |u|,|y|,|z|, если необходимо. 6. Нахождение максимального из трех чисел. 7. Вывод результатов. 2.1.2. Определение переменных программы Для реализации алгоритма нам понадобятся переменные для хранения значений чисел x, y, z, значения функции u и результата решения задачи – max. Данные переменные будут иметь тип double. Для хранения и последующего использования в вычислениях результатов выбора пользователя определим две переменные целого типа int: choice_func – номер функции, choice_abs – да или нет. 2.1.3. Разработка текста программы Программа начинается с включения файлов: #include <iostream.h> #include <conio.h> #include <math.h> в которых находятся описания потоков и функций ввода-вывода и математических функций соответственно. Далее открываем главную функцию: void main() 2 Включаем описания переменных (см. п.2.1.2): double x, y, z, u, max; int choice_func, choice_abs; Организуем диалог с пользователем выбора функции для вычисления переменной U: cout << Rus("Выберите функцию для вычисления значения переменной U: "); cout << "1. U=COS(X)" << endl; cout << "2. U=SIN(X)" << endl; cout << "3. U=TAN(X)" << endl; cout << Rus("Введите номер: "); cin >> choice_func; Спросим у пользователя какой максимум будем вычислять: cout << Rus("Вычислять максимум абсолютных значений (1 - да, 0 - нет)? "); cin >> choice_abs; Далее идет вычисление значения переменной U, в зависимости от выбора пользователя. Для этого используем оператор switch. switch(choice_func) { case 1: u=cos(x); break; case 2: u=sin(x); break; case 3: u=tan(x); break; } Далее организуем вычисление абсолютных значений переменных, если это выбрал пользователь: if (choice_abs) { u=fabs(u); y=fabs(y); z=fabs(z); } Вычислим максимальное значение переменных x, y и u: if (u>y) max=u; else max=y; if (z>max) max=z; и выведем полученный результат: if (choice_abs) cout<< "Максимальное из абсолютных значений переменных = " << max; else cout << "Максимальное значение переменных =" << max; Полный текст программы приводится ниже. /**************************************/ /* Лабораторная работа №3-1 */ /* Условный оператор */ /* Пример выполнения */ /**************************************/ #include <vcl.h> #include <iostream.h> #include <conio.h> #include <math.h> char* Rus(const char* text); void main() { double x, y, z, u, max; int choice_func, choice_abs; // Ввод исходных данных cout << Rus("Выберите функцию для вычисления значения переменной U: ") << endl; cout << "1. U=COS(X)" << endl; cout << "2. U=SIN(X)" << endl; cout << "3. U=TAN(X)" << endl; cout << Rus("Введите номер: "); cin >> choice_func; 3 cout << endl; cout << Rus("Вычислять максимум абсолютных значений (1 - да, 0 - нет)? "); cin >> choice_abs; cout << endl; cout << Rus("Введите значение переменной X: "); cin >> x; cout << Rus("Введите значение переменной Y: "); cin >> y; cout << Rus("Введите значение переменной Z: "); cin >> z; // Выбор и вычисление функции, в соответствии с выбором пользователя switch(choice_func) { case 1: u=cos(x); break; case 2: u=sin(x); break; case 3: u=tan(x); break; } if (choice_abs) // Вычисление абсолютных значений, если необходимо { u=fabs(u); y=fabs(y); z=fabs(z); } // Нахождение максимального из трех чисел if (u>y) max=u; else max=y; if (z>max) max=z; // Вывод результатов if (choice_abs) cout<< "Максимальное из абсолютных значений переменных = " << max; else cout << "Максимальное значение переменных =" << max; getch(); } char bufRus[256]; char* Rus(const char* text) { CharToOem(text,bufRus); return bufRus; } 2.1.4. Результаты работы программы Выберите функцию для вычисления значения переменной U: 1. U=COS(X) 2. U=SIN(X) 3. U=TAN(X) Rus("Введите номер: 1 Вычислять максимум абсолютных значений (1 - да, 0 - нет)? 0 Введите значение переменной X: 0.1 Введите значение переменной Y: 0.356 Введите значение переменной Z: 0 Максимальное значение переменных = 0.995004 4 2.2. Варианты индивидуальных заданий В качестве f(x) использовать по выбору: sh(x), x2, ex. Отредактируйте текст программы в соответствии с полученным заданием. Предусмотрите вывод информации, показывающий, по какой ветви производились вычисления. 5 3. Задание №2 3.1. Пример написания программы Задание: Построить программу, которая вводит координаты точки (x, y) и определяет, попадает ли точка в заштрихованную область на рисунке. Попадание на границу области считать попаданием в область. 3.1.1. Разработка алгоритма решения. Первым шагом алгоритма должен быть ввод координат точки: x и y. Для большего удобства при анализе результатов можно вывести введенные значения на экран. Исследование изображения на рисунке-задании дает нам основание утверждать, что целевая область образуется пересечением: прямой с коэффициентом -1 и смещением +1 и окружности с центром в начале координат и радиусом 1, как показано на рисунке справа Уравнение этой прямой: y= -x+1 Уравнение окружности: x2+y2=1 Для проверки попадания точки в заданную область нужно проверить условия того, что: 1). Точка лежит выше прямой или на ней, т.е.: y>= -x+1 2). Точка лежит внутри окружности или на ней, т.е.: x2+y2<=1 Точка лежит в области, если выполняются оба условия, если же не выполняется хотя бы одно из них, точка лежит вне области. Следовательно, эти условия должны быть объединены логической операцией "И". Схема алгоритма приведена на рисунке 2. 3.1.2. Определение переменных программы Для реализации алгоритма нам будут нужны только переменные для хранения значений координат x и y. В условиях задания не приведены требования к точности вычислений, рисунок представлен с довольно невысокой точностью, поэтому для этих переменных было бы достаточно типа float. Но в соответствии с общим стилем программирования на C выберем для них тип double. 3.1.3. Разработка текста программы Текст программы начинается с включения файла: #include <stdio.h> т.к. нам обязательно понадобятся функции стандартного ввода-вывода, которые описаны в этом файле, а так же подключение библиотеки #include <conio.h> для использования функции getch() и библиотеки #include <vcl.h> для использования функции CharToOem. Далее идет заголовок и открытие главной функции: void main(){ и объявление переменных, определенных в пункте 3.1.2: double x, y; Для каждой координаты выводится приглашение на ее ввод и вводится ее значение: printf("Введите координату x >"); scanf("%lf",&x); printf("Введите координату y >"); scanf("%lf",&y); 6 Введенные значения координат выводятся на экран: printf("x=%6.3lf; y=%6.3lf\n",x,y); Далее идет проверка условий попадания точки в область. Оба условия проверяются одним выражением. Поскольку точка попадает в область, если выполняются оба условия вместе, условия в выражении соединены операцией "логическое И": if ( (y>=1-x)&& (x*x+y*y<=1) ) Если значение логического выражения в условном операторе истинно, то выводится сообщение про попадание: printf("Точка попадает в область\n"); В противном случае выводится сообщение про непопадание: else printf("Точка не попадает в область\n"); Полный текст программы приведен ниже. /**************************************/ /* Лабораторная работа №3-2 */ /* Условный оператор */ /* Пример выполнения. Вариант 19. */ /**************************************/ #include <vcl.h> #include <stdio.h> #include <conio.h> char* Rus(const char* text); void main() { double x, y; /* координаты точки */ /* ввод координат */ printf(Rus("Введите координату x >")); scanf("%lf",&x); printf(Rus("Введите координату y >")); scanf("%lf",&y); /* вывод только что введенных значений */ printf("x=%6.3lf; y=%6.3lf\n",x,y); /* проверка условий */ if ( (y>=1-x) && (x*x+y*y<=1) ) printf(Rus("Точка попадает в область\n")); else printf(Rus("Точка не попадает в область\n")); getch(); } char bufRus[256]; char* Rus(const char* text) { CharToOem(text,bufRus); return bufRus; } 7 Рис. 2 3.1.4. Отладка программы Самое важное в отладке этой программы - убедиться в том, что программа выдает правильные результаты при разных комбинациях входных данных. Следовательно, необходимо подобрать такие комбинации, которые были бы показательными для разных случаев размещения точки. Мы предлагаем такие комбинации: 1) точка лежит ниже области - (0.4, 0.4); 2) точка лежит на нижней границе области - (0.5, 0.5); 3) точка лежит внутри области - (0.7, 0.6); 4) точка лежит на верхней границе области - (0.707, 0.707); 5) точка лежит выше области - (0.8, 0.8); 6) точка лежит на правом краю области - (1.0, 0.0); 7) точка лежит на левом краю области - (0.0, 1.0); 3.1.5. Результаты работы программы Ниже приведены результаты работы программы для входных данных по п.5.4: x=0.400; y=0.400 Точка не попадает в область x= 0.500; y= 0.500 Точка попадает в область x= 0.700; y= 0.600 Точка попадает в область x= 0.707; y= 0.707 Точка попадает в область x= 0.800; y= 0.800 Точка не попадает в область x= 0.100; y= 0.000 Точка попадает в область x= 0.000; y= 1.000 Точка попадает в область 3.2. Варианты индивидуальных заданий Построить программу, которая вводит координаты точки (x, y) и определяет, попадает ли точка в заштрихованную область на рисунке, который соответствует Вашему варианту. Попадание на границу области считать попаданием в область. Вариант 1 Вариант 2 8 Вариант 3 Вариант 4 Вариант 5 Вариант 6 Вариант 7 Вариант 8 9 Вариант 9 Вариант 10 Вариант 11 Вариант 12 Вариант 13 Вариант 14 10 Вариант 15 Вариант 16 Вариант 17 Вариант 18 Вариант 19 11 12