Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
visual с++.doc
Скачиваний:
30
Добавлен:
18.08.2019
Размер:
10.99 Mб
Скачать

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

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

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

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

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

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

/* Горошко А.А.

гр. БАС-051*/

#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;

}

Цикл с постусловием или цикл типа dowhile. Инструкция 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);

Рисунок 3.9 - Структурная схема оператора цикла с постусловием

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

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

.

(3.10)

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

Составим диаграмму деятельности UML для задачи отыскания значения квадратного корня по итеративной формуле (рис. 3.6), которая соответствует следующей прорамме.

Листинг 3.6

#include “stdafx.h”

#include <iostream>

#include <math.h>

using namespace std;

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

const double eps = 1e-10;

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

{

double x = 1., xp, a;

setlocale( LC_ALL, "Russian" );

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

cin >> a;

if(a <= 0)

{

cout << “Неверное значение a!\n”;

return 1;

}

do

{

xp = x; // Предыдущее значение x.

x = (x + a/x)/2; // Текущее значение x.

} while(fabs(x - xp) > eps)

cout << “Квадратный корень “ << x << endl <<

“Точное значение “ << sqrt(a) << endl;

getch();

return 0;

}

Любой цикл while может быть приведен к эквивалентному ему циклу for и, наоборот, по следующей схеме:

for(b1; b2; b3) оператор;

b1;

while(b2)

{

оператор;

b3;

}

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

Чтобы избежать ошибок, рекомендуется:

  • проверить, всем ли переменным, встречающимся в правой части операторов присваивания в теле цикла, присвоены до этого начальные значения (а также возможно ли выполнение других операторов);

  • проверить, изменяется ли в цикле хотя бы одна переменная, входящая в усло­вие выхода из цикла;

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

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

Операторы цикла взаимозаменяемы, но можно привести некоторые рекоменда­ции по выбору наилучшего в каждом конкретном случае.

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

Оператор for предпочтительнее в большинстве остальных случаев (однознач­но - для организации циклов со счетчиками).

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

В C++ есть четыре оператора, изменяющих естественный порядок выполнения вычислений:

  • оператор безусловного перехода goto;

  • оператор выхода из цикла break;

  • оператор перехода к следующей итерации цикла continue;

  • оператор возврата из функции return.

Оператор безусловного перехода goto. Оператор безусловного перехода имеет вид:

goto идентификатор;

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

Передача управления разрешена на любой помеченный оператор в теле функции. Однако существует одно важное ограничение: запреще­но «перескакивать» через описания, содержащие инициализацию объ­ектов. Это ограничение не распространяется на вложенные блоки, которые можно обходить целиком. Следующий фрагмент иллюстри­рует сказанное:

goto В; // Ошибочный переход, минуя описание

float х = 0.0; // Инициализация

// не будет выполнена

goto В; // Допустимый переход, минуя блок

{

int n = 10; /* Внутри блока определена

переменная*/

x = n*x + x;

}

В: cout << "\tx = " << х;

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

Принятая в настоящее время дисциплина программирования ре­комендует либо вовсе отказаться от оператора goto, либо свести его применение к минимуму и строго придерживаться следующих реко­мендаций:

  • не входить внутрь блока извне;

  • не входить внутрь условного оператора, т.е. не передавать управление операторам, размещенным после служебных слов if или else;

  • не входить извне внутрь переключателя (switch);

  • не передавать управление внутрь цикла.

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

Второй случай возникает, когда нужно выйти из нескольких вло­женных друг в друга циклов или переключателей. Оператор break прерывания цикла и выхода из переключателя здесь не поможет, так как он обеспечивает выход только из самого внутреннего вложенного цикла или переключателя. Например, в задаче поиска в матрице хотя бы одного элемента с заданным значением для перебора элементов матрицы обычно используют два вложенных цикла. Как только эле­мент с заданным значением будет найден, нужно выйти сразу из двух циклов, что удобно сделать с помощью goto.

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

Необходимость в использовании оператора break в теле цикла возникает, когда условия продолжения итераций нужно проверять не в начале итерации (циклы for, while), не в конце итерации (цикл do), а в середине тела цикла. В этом случае тело цикла может иметь такую структуру:

{

операторы;

if(условие) break;

операторы;

}

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

При многократном вложении циклов и переключателей оператор break не может вызвать передачу управления из самого внутреннего уровня непосредственно на самый внешний. Например, при решении задачи поиска в матрице хотя бы одного элемента с заданным значе­нием удобнее всего пользоваться не оператором break, а оператором безусловной передачи управления (goto).

Оператор continue. Оператор continue употребляется только в операторах цикла. С его помощью завершается текущая итерация и начинается проверка усло­вия дальнейшего продолжения цикла, т.е. условий начала следующей итерации. Для объяснений действия оператора continue рекомендуется рассматривать следующие три формы основных операторов цикла:

while(<условие>)

{

if(<условие_прерывания>) continue;

}

do

{

if(<условие_прерывания>) continue;

} while(<условие>);

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

<следующая_итерация>)

{

if(<условие_прерывания>) continue;

}

В каждой из форм многоточием обозначены операторы тела цикла.

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

Пример 3.7. Вычислить значение специальной функции (интегральной показательной функции)

.

(3.11)

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

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

,

(3.12)

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

.

(3.13)

воспользовавшись свойством факториала последнее выражение может быть записано следующим образом

.

(3.14)

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

,

(3.15)

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

.

(3.16)

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

.

(3.17)

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

Листинг 3.7

#include “stdafx.h”

#include <iostream>

#include <math.h>

using namespace std;

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

const double eps = 1e-10;

// Постоянная Эйлера

const double euler = 0.5772156649;

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

{

double x, a, S;

setlocale( LC_ALL, "Russian" );

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

cin >> x;

// Начальное значение члена ряда и суммы.

a = x;

S = a;

// Найти сумму членов ряда.

for(int k = 1; fabs(a) > eps; k++)

{

// Найти значение следующего члена ряда.

a *= x*k/((k + 1)*(k+1));

// Добавить полученный член к сумме.

S += a;

}

// Вывести значение интегральной

// показательной функции.

cout << “Ei(x = “ << x << “) = “ << (euler + log(x) + S) << endl;

getch();

return 0;

}

Оператор return. Оператор возврата из функции return завершает выполнение функции и переда­ет управление в точку ее вызова. Вид оператора:

return [ выражение ];

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

Аппаратура и материалы. Для выполнения лабораторной работы необходим персональный компьютер со следующими характеристиками: процессор Intel Pentium-совместимый с тактовой частотой 800 МГц и выше, оперативная память - не менее 64 Мбайт, свободное дисковое пространство - не менее 500 Мбайт, устройство для чтения компакт-дисков, монитор типа Super VGA (число цветов от 256) с диагональю не менее 15. Программное обеспечение - операционная система Windows2000/XP и выше, среда разработки приложений Microsoft Visual Studio.

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

Методика и порядок выполнения работы. Перед выполнением лабораторной работы каждый студент получает индивидуальное задание. Защита лабораторной работы происходит только после его выполнения (индивидуального задания). При защите лабораторной работы студент отвечает на контрольные вопросы, приведенные в конце, и поясняет выполненное индивидуальное задание. Ход защиты лабораторной работы контролируется преподавателем. Порядок выполнения работы:

  1. Проработать примеры, приведенные в лабораторной работе.

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

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

  1. Найти все трехзначные натуральные числа, сумма цифр которых равна их произведению.

  2. Найти сумму целых положительных чисел, больших 20, меньших 100 и кратных 3.

  3. Начав тренировки, спортсмен пробежал 10 км. Каждый следующий день он увеличивал дневную норму на 10% от нормы предыдущего дня. Какой суммарный путь пробежит спортсмен за 7 дней?

  4. Через сколько дней спортсмен из задания 1 будет пробегать в день больше 15 км?

  5. Одноклеточная амеба каждые три часа делится на 2 клетки. Определить, сколько будет клеток через 6 часов.

  6. Напечатать таблицу соответствия между весом в фунтах и весом в кг для значений от 1 до а фунтов с шагом 1 фунт, если 1 фунт = 400 г.

  7. Определить среди всех двузначных чисел те, которые делятся на сумму своих цифр.

  8. Сумма цифр трехзначного числа кратна 7. Само число также делится на 7. Найти все такие числа.

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

  10. Сколько можно купить быков, коров и телят, платя за быка 10 р., за корову - 5 р., а за теленка - 0,5 р., если на 100 р. надо купить 100 голов скота?

  11. Составьте программу, которая печатает таблицу умножения натуральных чисел в десятичной системе счисления.

  12. Покупатель должен заплатить в кассу S р. У него имеются 1, 2, 5, 10, 100, 500 р. Сколько купюр разного достоинства отдаст покупатель, если он начинает платить с самых крупных.

  13. Дано натуральное число n. Получить все его натуральные делители.

  14. Вычислить сумму всех n-значных чисел (1<=n<=4)

  15. Вычислить сумму всех n-значных чисел, кратных k (1<=n<=4)

  16. Ученик выучил в первый день 5 английских слов. В каждый следующий день он выучивал на 2 слова больше, чем в предыдущий. Сколько английских слов выучит ученик в 10-ый день занятий.

  17. Составьте программу, которая печатает таблицу сложения натуральных чисел в десятичной системе счисления.

  18. Составить программу, выдающую 1, если заданное число - простое и 0 - в противном случае. Число называется простым, если он делится только на 1 и на само себя. Делители числа лежат в интервале от 2 до корня из k, где k заданное число.

  19. У гусей и кроликов вместе 64 лапы. Сколько могло быть кроликов и гусей (указать все сочетания, которые возможны).

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

  21. Ежемесячная стипендия студента составляет А р., а расходы на проживание превышают стипендию и составляют В р. в месяц. Рост цен ежемесячно увеличивает расходы на 3 %. Составьте программу расчета необходимой суммы денег, которую надо единовременно просить у родителей, чтобы можно было прожить учебный год (10 месяцев), используя только эти деньги и стипендию.

  22. Составьте программу, которая по номеру дня в году выводит число и месяц в общепринятой форме (например, 33-й день года - 2 февраля).

  1. Составить UML-диаграмму деятельности и программу для нахождения значения конечной суммы. Номер варианта определяется по формуле , где - номер студента по списку преподавателя.

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

  1. Вводится целое число . .

  2. Вводится целое число . .

  3. Вводится целое число . .

  4. Вводится целое число . .

  5. Вводится целое число .

  6. Вводится целое число .

  7. Вводятся целые числа и , . .

  8. Вводится целое число .

  9. Вводятся целые числа и . .

  10. Вводится целое число . S= .

  11. Вводится целое число . при xi = (1+i),

y = 1/i.

  1. Вводится целое число . , , .

  2. Вводится целое число . , где .

  3. Вводится целое число . .

  4. Вводится целое число . .

  5. Вводится целое число . .

  6. Вводится целое число . .

  7. Вводится целое число . .

  8. Вводится целое число . .

Примечание: При вычислении факториалов необходимо результат накапливать в переменных типа double.

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

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

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

1. Интегральный синус

;

2. Интегральный косинус

;

3. Интегральный гиперболический синус

;

4. Интегральный гиперболический косинус

;

5. Первый интеграл Френеля

;

6. Интеграл вероятности

;

7. Функция Бесселя первого рода , значение также должно вводиться с клавиатуры

;

8. Функция Бесселя первого рода , значение также должно вводиться с клавиатуры

;

9. Дилогарифм

.

Здесь - постоянная Эйлера, - отношение длины окружности к ее диаметру.

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

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

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

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

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

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

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

  1. Какой алгоритм является алгоритмом циклической структуры?

  2. Типы циклов в языке Си.

  3. Назовите основные параметры цикла.

  4. Что представляют собой операторы инкремента и декремента, в каких формах они используются?

  5. Как записывается условие продолжения цикла в циклах типа while и do ... while?

  6. Основная форма цикла do … while.

  7. Какие три раздела записываются в круглых скобках для оператора цикла типа for? Какой разделитель между разделами?

  8. Что такое вложенные циклы? Примеры.

  9. Как образуется бесконечный цикл и как выйти из него?

  10. Схема приведения цикла while к эквивалентному ему циклу for.

  11. Назовите операторы, способные изменять естественный порядок выполнения вычислений.

  12. Для чего нужен оператор break?

  13. Где употребляется оператор continue и для чего он используется?

  14. Для чего используется оператор return?

  15. Какой тип должно иметь выражение?

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

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