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





Рисунок 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 февраля).

 

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

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

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

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

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

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

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

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

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

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

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

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

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

y = 1/i.

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

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

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

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

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

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

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

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

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

 

 

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

 

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

Индивидуальное задание №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:

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

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

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

Задача: в 1985 г. урожай ячменя составил 20 ц с га. В среднем каждые 2 года за счет применения передовых агротехнических приемов, урожай увеличился на 5%. Определить, через сколько лет урожай достигнет 25 ц с га.

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

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

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



Поделиться:




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

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


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