Операнд_1 ? операнд_2 : операнд_3 3 глава




9. Найти координаты точки пересечения прямых заданных уравнениями a1x + b1y + c1 = 0 и a2x + b2y + c2 = 0, либо сообщить совпадают, параллельны или не существуют.

10. Вывести на экран большее из трёх заданных чисел.

11. Определить, есть ли среди трёх заданных чисел чётные.

12. Две окружности заданы координатами центра и радиусами. Сколько точек пересечения имеют эти окружности?

13. Составить программу, выясняющую делится ли натуральное число х нацело на натуральное число у.

14. Составить программу нахождения из трех чисел наибольшего и наименьшего.

15. Составить программу решения квадратного уравнения.

16. Даны три действительных числа. Составить программу, выбирающую из них те, которые принадлежат интервалу (0,1).

17. Определить, есть ли среди трёх заданных чисел нечётные.

18. Даны произвольные действительные числа a, b и с. Вывести на экран сообщения: треугольник с данными длинами сторон построить можно (указать равнобедренный, равносторонний или разносторонний получится треугольник), либо треугольник с данными длинами сторон построить нельзя.

19. Какая из точек A(a1, a2) или B(b1,b2) находится дальше от начала координат?

20. Попадёт ли точка А(a1, a2) в окружность заданного радиуса с центром в начале координат?

21. Симметричны ли точки M1(x1, y1) и M2(x2, y2) относительно начала координат?

22. Треугольник задан координатами своих вершин. Определить принадлежит ли данная точка треугольнику. Координаты вершин треугольника и координаты точки задать самостоятельно.

23. Симметричны ли точки M1(x1, y1) и M2(x2, y2) относительно оси Ох или относительно оси Оу?

Содержание отчета и его форма. Отчет по лабораторной работе должен состоять из:

1. Названия лабораторной работы.

2. Цели и содержания лабораторной работы.

3. Ответов на контрольные вопросы лабораторной работы.

4. UML-диаграмму деятельности для программы примера 2 лабораторной работы.

5. Формулировки индивидуальных заданий и порядка их выполнения.

Отчет о выполнении лабораторной работы в письменном виде сдается преподавателю.

Вопросы для защиты работы

1. Для чего нужны диаграммы деятельности UML?

2. Что такое состояние действия и состояние деятельности?

3. Какие нотации существуют для обозначения переходов и ветвлений в диаграммах деятельности?

4. Какой алгоритм является алгоритмом разветвляющейся структуры?

5. Чем отличается разветвляющийся алгоритм от линейного?

6. Что такое условный оператор? Какие существуют его формы?

7. Что такое составной оператор? Каков формат его записи?

8. Какие операторы сравнения используются в Си?

9. Что называется простым условием? Приведите примеры.

10. Что такое составное условие? Приведите примеры.

11. Какие логические операторы допускаются при составлении сложных условий?

12. Может ли оператор ветвления содержать внутри себя другие ветвления?

13. Что такое множественный выбор?

14. В каких случаях применяется переключатель?

15. Зачем ставится в переключателе оператор break?

16. Зачем в переключателе употребляется зарезервированное слово default?

17. Какие UML-диаграммы показывают работу переключателя?

 

Пример выполнения лабораторной работы №2:

1. Индивидуальное задание №1:

1.1. Постановка задачи:

Составить UML-диаграмму деятельности и программу с использованием конструкции ветвления и вычислить значение функции

1.2. UML-диаграмма:

1.3. Листинг программы:

// // Лабораторная работа №2

 

#include "stdafx.h"

#include <iostream>

#include "conio.h"

#include "math.h"

#include "windows.h"

 

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])

{

double x, y;

setlocale(LC_ALL, "Russian");

 

cout<<Введите х<<"\nx=";

cin>> x;

 

if (x > 3.5)

y=(log(x)*cos(2*x));

else

if (x=3.5) y=(pow(x*x*x-1,1/3));

else y=(1+sin(x)*sin(x)-2*cos(2*x)*cos(2*x));

 

cout<< "y=";

cout<< y;

 

getch();

 

return 0;

}

1.4. Результаты работы программы:

2. Индивидуальное задание №2:

2.1. Постановка задачи:

Решить задачу, составить UML-диаграмму деятельности и программу с использованием переключателя.

Задача: в понедельник фирма работает с 9-00 до 16-00; во вторник, среду, четверг, пятницу - с 8-00 до 19-00; в субботу - с 10-00 до 15-00; воскресенье - выходной. По заданному номеру дня недели определить часы работы.

2.2. UML-диаграмма:

2.3. Листинг программы:

// Индивидуальное задание №2

 

#include "stdafx.h"

#include <iostream>

#include "conio.h"

#include "windows.h"

 

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])

{

int n;

setlocale(LC_ALL, "Russian");

 

cout<<"Введите номер дня недели\n"<<"\nn=";

cin>> n;

 

switch(n)

{

case 1:

cout<<"\nВремя работы фирмы: с 9-00 до 16-00\n";

break;

case 2:case 3:case 4:case 5:

cout<<"\nВремя работы фирмы: с 8-00 до 19-00\n";

break;

case 6:

cout<<"\nВремя работы фирмы: с 10-00 до 15-00\n";

break;

case 7:

cout<<"\nВыходной\n";

break;

default:

cout<<"\nОшибка!\n";

}

 

getch();

 

return 0;

}

2.4. Результаты работы программы:

3. Индивидуальное задание №3:

3.1. Постановка задачи:

Решить задачу, составить UML-диаграмму деятельности и программу с использованием конструкций ветвления и переключателя.

Задача: школьники сдают нормы по прыжкам в длину. Если длина прыжка больше 2,5 м, то оценка - 5, если от 2 м до 2,5 - оценка 4; от 1,5 м до 2 м - оценка 3; если меньше 1,5 м - 2. Выставить школьнику оценку, если известна длина его прыжка.

3.2. UML-диаграмма:

3.3. Листинг программы:

// Индивидуальное задание №3

 

#include "stdafx.h"

#include <iostream>

#include "conio.h"

#include "math.h"

#include "windows.h"

 

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])

{

double dlina;

setlocale(LC_ALL, "Russian");

 

cout<<"Введите длину прыжка\n"<<"\ndlina=";

cin>> dlina;

 

if (dlina > 2.5)cout<<"\nОценка: 5\n";

else

if (dlina > 2)cout<<"\nОценка: 4\n";

else

if (dlina > 1.5)cout<<"\nОценка: 3\n";

else

if (dlina > 0)cout<<"\nОценка: 2\n";

else cout<<"\nОшибка! Введите положительное число\n";

 

getch();

 

return 0;

}

3.4. Результаты работы программы:

 

 


Лабораторная работа №3.
Организация циклических вычислений в языке C++

Цель работы и содержание: приобретение навыков программирования циклических алгоритмов. Освоить конструкции языка C++, позволяющего реализовывать циклические алгоритмы.

 

Ход работы

Алгоритм циклической структуры - это алгоритм, в котором происходит многократное повторение одного и того же участка программы. Такие повторяемые участки вычислительного процесса называются циклами.

Операторы цикла используются для организации многократно повторяющихся вычислений. Любой цикл состоит из тела цикла, то есть тех операторов, которые выполняются несколько раз, начальных установок, модификации параметра цикла и проверки условия продолжения выполнения цикла. Один проход цикла называется итерацией. Проверка условия выполняется на каждой итерации либо до тела цикла (тогда говорят о цикле с предусловием), либо после тела цикла (цикл с постусловием). Разница между ними состоит в том, что тело цикла с постусловием всегда выполняется хотя бы один раз, после чего проверяется, надо ли его выполнять еще раз. Проверка необходимости вы­полнения цикла с предусловием делается до тела цикла, поэтому возможно, что он не выполнится ни разу.

Переменные, изменяющиеся в теле цикла и используемые при проверке условия продолжения, называются параметрами цикла. Целочисленные параметры цик­ла, изменяющиеся с постоянным шагом на каждой итерации, называются счет­чиками цикла.

Начальные установки могут явно не присутствовать в программе, их смысл со­стоит в том, чтобы до входа в цикл задать значения переменным, которые в нем используются.

Программа циклической структуры содержит один или несколько циклов. Различают детерминированные циклы с заранее известным числом повторений и итерационные циклы, в которых число повторений заранее неизвестно.

В языке C++ существует 3 вида циклов:

1) цикл с параметром или цикл типа for,

2) цикл с предусловием или цикл типа while,

3) цикл с постусловием или цикл типа do... while.

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

Цикл завершается, если условие его продолжения не выполняется. Возможно принудительное завершение, как текущей итерации, так и цикла в целом. Для этого служат операторы break, continue, return и goto.

Цикл с параметром или цикл типа for. Для цикла типа for заголовок цикла состоит из трех разделов: инициализации (присваивания начальных значений), проверки условия повторения, модификации (изменения параметров). Разделителем между разделами заголовка цикла типа for служит точка с запятой.

 
 

 


Рисунок 3.1 - Структурная схема оператора цикла с параметром (for)

 

Основная форма цикла for имеет следующий вид:

 

for(<список_инициализации>; <условие_продолжения>;

<переход_к_следующей_итерации>) <тело_цикла>;

 

Все три параметра цикла for должны быть разделены точкой с запятой. Перед выполнением цикла выполняются операторы, содержащиеся в первом параметре <список_инициализации> оператора for,затем осуществляется проверка условия продолжения цикла (обычное условное выражение, определяющее, при каких условиях цикл будет продолжен) в параметре <условие_продолжения>, если данное условие принимает истинное значение, то выполняются операторы, образующие тело цикла (<тело_цикла>). Изменение (приращение) обычно используется для изменения параметра цикла каждый раз при повторении цикла. Если условие продолжения принимает ложное значение, то работа цикла завершается, и выполняются операторы, следующие за телом цикла. После выполнения последнего оператора в теле цикла, выполняются <переход к следующей итерации> операторы третьего параметра цикла for. После чего снова производится проверка условия продолжения и процесс повторяется.

Инициализация используется для объявления и присвоения начальных значений величинам, используемым в цикле. В этой части можно записать несколько опе­раторов, разделенных занятой (операцией «последовательное выполнение»). Областью действия переменных, объявленных в части инициализации цикла, яв­ляется цикл. Инициализация выполняется один раз в начале исполнения цикла.

Выражение определяет условие выполнения цикла: если его результат, приве­денный к типу bool, равен true, цикл выполняется. Цикл с параметром реализо­ван как цикл с предусловием.

Модификации выполняются после каждой итерации цикла и служат обычно для изменения параметров цикла. В части модификаций можно записать несколько операторов через запятую. Простой или составной оператор представляет собой тело цикла. Любая из частей оператора for может быть опущена (но точки с запя­той надо оставить на своих местах!).

Рисунок 3.2 - Фрагмент диаграммы деятельности UML, описывающей действия оператора for в C++

 

В качестве параметра цикла необязательно использовать целочисленный счетчик. Далее показан фрагмент программы, выводящей на экран все буквы английского алфавита:

unsignet char ch;

for(ch = ‘A’; ch <= ‘Z’; ch++) cout << ch;

Cледующий фрагмент программы показывает как вывести на печать квадраты вещественных чисел от -2 до 3 с шагом 0.1:

double x;

for(x = -2.; x <= 3.; x += 0.1)

cout << x*x << endl;

С помощью цикла типа for удобно находить суммы, произведения, искать максимальные и минимальные значения и т.п. При нахождении суммы некоторой переменной, например S присваивается значение 0, затем в цикле к этой переменной прибавляется соответствующий член заданной последовательности. Далее показано, как можно найти сумму натуральных чисел от 1 до 10:

S = 0;

for(i = 1; i < 11; i++) S += i;

с использованием операции «запятая» и операции постфиксного инкремента данная задача может быть решена следующим образом:

for(S = 0, i = 1; i < 11; S += i++);

Цикл for может быть вложенным. В качестве примера рассмотрим программу, печатающую таблицу умножения целых чисел от 0 до 9:

 

Листинг 3.1

 

#include “stdafx.h”

#include <iostream>

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])

{

int i, j;

 

for(i = 0; i < 10; i++)

for(j = 0; j < 10; j++)

cout << i << “*“ j << “ = “<< i*j << endl;

 

getch();

return 0;

}

Пример 3.1. Составить UML-диаграмму деятельности и написать программу, позволяющую вычислить сумму квадратов натуральных чисел от 1 до n, где n вводится с клавиатуры.

S = = 12 + 2 2 +... + n 2. (3.1)

Составим UML-диаграмму деятельности расчета суммы квадратов натуральных чисел от 1 до n (рис. 3.3).

Рисунок 3.3 - UML-диаграмма деятельности для задачи расчета суммы квадратов натуральных чисел от 1 до n

 

 

По составленной диаграмме может быть написана программа вычисления значения функции.

 

Листинг 3.2

 

#include “stdafx.h”

#include <iostream>

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])

{

int n, i, S = 0;

setlocale(LC_ALL, "Russian");

cout << “Введите значение n: “;

cin >> n;

 

for(i = 1; i <= n; i++) S += i*i;

cout << “Сумма чисел S = “ << S << endl;

 

getch();

return 0;

}

Пример 3.2. Составить UML-диаграмму деятельности и написать программу, позволяющую вычислить конечную сумму

(3.2)

где n и x вводятся с клавиатуры.

Составим UML-диаграмму деятельности расчета конечной суммы (рис. 3.4).

Рисунок 3.4 - UML-диаграмма деятельности для задачи расчета конечной суммы

 

По составленной диаграмме может быть написана программа вычисления значения конечной суммы.

 

Листинг 3.3

 

#include “stdafx.h”

#include <iostream>

#include <math.h>

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])

{

double x, S = 0.;

int k, n;

setlocale(LC_ALL, "Russian");

 

cout << “Введите значение x: “;

cin >> x;

cout << “Введите значение n: “;

cin >> n;

 

for(k = 1, k <= n; k++)

{

double a = log(k*x)/(k*k);

S += a;

}

 

cout << “Конечная сумма: “ << S << endl;

getch();

return 0;

}

Очень часто в операторе for используются операторы инкремента (++) - увеличения на единицу и декремента (--) - уменьшения на единицу. Оба оператора используются как в префиксной, так и в постфиксной формах. Префиксная операция инкремента (++i) - увеличение на 1 операнда до его использования, соответственно, префиксная операция декремента (--i) - уменьшение на 1 операнда до его использования. Постфиксная операция инкремента (i++) - увеличение значения операнда на 1 после его использования, соответственно, постфиксная операция декремента (i--) - уменьшение значения операнда на 1 после его использования. Операнд этих операций не может быть константой либо другим праводопустимым выражением. Операндом не может быть и произвольное выражение. Операндом унарных операций ++ и -- должны быть всегда леводопустимые выражения, например, переменные.

Пример 3.3. Составить UML-диаграмму деятельности и написать программу, позволяющую протабулировать функцию, заданную формулой (2.1), в диапазоне от до в равноудаленных точках.

Составим UML-диаграмму деятельности расчета значений функции в указанных точках (рис. 3.5).

Рисунок 3.5 - UML-диаграмма деятельности для задачи табулирования функции

 

По составленной диаграмме может быть написана программа табулирования функции.

 

Листинг 3.4

 

#include “stdafx.h”

#include <iostream>

#include <math.h>

using namespace std;

 

const double x_min = -10.;

const double x_max = 10.;

const int N = 100;

 

int _tmain(int argc, _TCHAR* argv[])

{

double y, dx = (x_max - x_min) / N;

 

for(double x = x_min; x <= x_max; x += dx)

{

if(x <= 0.) y = 2*x*x + cos(x);

else if(x < 5.) y = x + 1;

else y = sin(2*x) - x*x;

 

cout << “x = “ << x << “ y = “ << y << endl;

}

getch();

}

Любой из трех параметров цикла forможет быть опущен. Например, найти сумму натуральных чисел от 1 до 10 можно с помощью следующего фрагмента программы:

for(S = 0, i = 1; i < 11)

{

S += i;

i++;

}

Если не задано условие завершения в цикле for, то он будет выполняться бесконечно. В этом случае для завершения работы цикла необходимо использовать оператор break. Для нахождения суммы чисел от 1 до 10 можно использовать также следующий фрагмент кода:

for(S = 0, i = 1;; i++)

{

if(i > 10) break;

S += i;

}

 

Также может быть пропущен список инициализации в цикле for, в этом случае:

S = 0;

i = 1;

for(; i < 11; i++) S += i;

 

При выполнении итерационного цикла for условие продолжения может изменяться либо при вычислении его значений, либо под действием операторов тела цикла, либо под действием выражений из списка заголовка. Если условие продолжения не изменяется, либо отсутствует, то цикл бесконечен. Следующие операторы обеспечивают бесконечное выполнение пустых операторов:

for(;;); \\ бесконечный цикл

for(; 1;); \\ бесконечный цикл

 

Цикл с предусловием или цикл типа while. Не всегда число повторений цикла известно заранее, в этих случаях применяются циклы с предусловием (проверка перед циклом) или с постусловием (проверка после цикла) - это цикл while. Основная его форма

while(<выражение_условие>) <тело_цикла>

При входе в цикл вычисляется выражение_условие. Если его значение отлично от нуля, то выполняется тело_цикла. Затем вычисление условия, заданного в выражении_условии и выполнение операторов тела_цикла выполняются последовательно, пока выражение_условие не станет равным 0. Данная инструкция может быть выполнена ноль или более раз. Оператором while удобно пользоваться для просмотра всевозможных последовательностей, если в конце каждой из них находится заранее известный признак.

Например, сумма натуральных чисел от 1 до 10 с использованием цикла while может быть найдена следующим образом:

 

S = 0;

i = 1;

while(i <= 10)

{

S += i;

i++;

}

 

     
 
 
   


Рисунок 3.6 – Структурная схема оператора цикла с предусловием

Рисунок 3.7 - Фрагмент диаграммы деятельности UML, описывающей действия оператора while в C++

Пример 3.4. Найти значение натурального логарифма от аргумента , значение которого вводится с клавиатуры с точностью , по его разложению в ряд

. (3.3)

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

, (3.4)

тогда как следующий член ряда может быть определен следующим образом

. (3.5)

Отношение следующего и текущего членов ряда

, (3.6)

следовательно

. (3.7)

Первый член ряда

. (3.8)

С учетом выражения (3.8) формула (3.7) может быть записана в следующем виде

. (3.9)

Условие завершения вычисления суммы ряда может быть записано следующим образом . На основании данных рассуждений может быть построена диаграмма деятельности UML для решения поставленной задачи (рис. 3.8)

Рисунок 3.8 - UML-диаграмма деятельности для расчета значения натурального логарифма по его разложению в ряд

По составленной диаграмме может быть написана программа вычисления значения натурального логарифма по его разложению в бесконечный ряд.

 

Листинг 3.5

 

#include “stdafx.h”

#include <iostream>

#include <math.h>

using namespace std;

 

// Точность вычислений.

const double eps = 1e-10;

 

int _tmain(int argc, _TCHAR* argv[])

{

double x, a, a02, S;

int n = 0;

 

setlocale(LC_ALL, "Russian");

cout << “Введите значение x: “;

cin >> x;

 

// Первый член ряда.

a = (x - 1)/(x + 1);

// Квадрат первого члена ряда.

a02 = a*a;

// Инициализировать сумму членов ряда.

S = a;

while(fabs(a) > eps)

{

a *= ((n + n + 1)*a02)/(n + n + 3);

// 2*n = n + n

n++; S += a;

}

 

cout << “Натуральный логарифм: “ << (S + S)

<< endl

<< “Точное значение: “ << log(x) << endl;

 

getch();

return 0;

}

 

Цикл с постусловием или цикл типа do … while. Инструкция do представляет собой вариант инструкции while. Но вместо проверки условия в начале цикла, в инструкции do она производится в конце. Это значит, что инструкция, контролируемая условием do, выполняется по крайней мере один раз, тогда как while может вообще не передать управление своему телу, если условие изначально не выполняется. Оператор цикла do … while называется оператором цикла с постусловием. Основная форма цикла do

do

<тело_цикла>

while (<выражение_условие>);

 

Сначала выполняется тело_цикла, затем вычисляется условие продолжения цикла выражение_условие. Если оно истинно то управление передается обратно на начало инструкции do и процесс повторяется. Когда значение условия становится ложно, управление передается следующей инструкции после тела цикла.

Например, сумма натуральных чисел от 1 до 10 с использованием цикла do … while может быть найдена следующим образом:

S = 0;

i = 1;

do

{

S += i;

i++;

}

while(i < 11);

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-06-21 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: