Добавил:
ФКН Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Семестр 1 / Алгоритмизация Практика 7 язык С

.pdf
Скачиваний:
99
Добавлен:
05.12.2019
Размер:
410.87 Кб
Скачать

Алгоритмизация и программирование Си

Практическое занятие №7

«Вложенные циклы»

«Блок операторов», который составляет тело цикла, может быть любого, в том числе, довольно большого, размера. В частности, нет никаких ограничений на использование внутри тела цикла еще одного или нескольких циклов. Такие конструкции называются вложенными циклами.

В качестве примера рассмотрим фрагмент программы, выводящий на экран все возможные показания электронных часов вида «ЧЧ:ММ» в течение суток.

for(int hh=0; hh<24; hh++) /* внешний цикл по hh */

{

for(int mm=0; mm<60; mm++) /* внутренний цикл по mm */

{

printf("%2d:%2d", hh, mm"\n";

}

}

Рис. 1. Пример вложенных циклов

Контрольные вопросы (дополнительное оценивание)

1.Сколько всего раз выполнится тело внутреннего цикла на рис. 1?

2.Как изменится работа некоторой программы, если имеющиеся в ней вложенные циклы разместить не один внутри другого, а друг за другом?

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

п. 1.

Ряд — это сумма бесконечного числа слагаемых. Например

 

1

 

1

 

1

 

1

 

1

 

1

 

 

 

 

 

 

 

 

k

 

 

 

 

 

k 0

2

1 2 4 8 16

 

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

1.положить sum = 0;

2.вычислить следующее слагаемое;

3.прибавить его к переменной sum;

4.если полученное слагаемое больше — вернуться к шагу 2,

иначе — конец вычислений

Практическоезанятие№7

Страница1

Алгоритмизация и программирование Си При реализации этого алгоритма следует помнить, что члены ряда («слагаемые») иногда

могут иметь и отрицательный знак — и поэтому с величиной следует сравнивать их модуль, а не само значение (см. функцию abs()).

п.2

Довольно часто в записи формулы ряда присутствует какой-нибудь дополнительный параметр (например, x), значение которого существенно влияет на результат суммирования данного ряда. А если при разных значениях x получаются разные результаты — значит сумма нашего ряда

— это уже функция величины x. При такой постановке задачи часто требуется «табулировать» эту функцию. То есть — в табличной форме представить соответствие: x — f(x), где f(x) это сумма ряда при заданном значении x. Сделать это можно при помощи следующего короткого алгоритма:

for(double x=x_min; x<=x_max; x+=x_step){

1)вычислить сумму ряда при текущем значении x

2)вывести на экран (в одну строку) x и полученную сумму

}

В этом алгоритме x_min, x_max и x_step — это начальное и конечное значение x, а также шаг его изменения соответственно. О том, как реализовать пункт (1) данного алгоритма, см. выше.

п.3

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

(см. ряд в п.1 ), если нам уже известно значение a

 

 

1

 

, то из него легко получить a

:

 

2k

 

 

 

k

 

 

 

 

 

 

 

 

k 1

 

a

 

1

 

 

1

 

 

1

a

 

 

1

 

 

 

 

2k

 

 

 

 

 

k 1

2k 1

 

 

2

 

k

2

 

 

Если обозначить отношение (k+1)-го члена ряда к k-му через r (r

 

ak 1

, а для приведенного

 

 

 

 

k

k

 

a

 

 

 

 

 

 

k

выше примера ряда r

 

1

при любом значении k), то получим следующий, оптимизированный,

 

k

2

 

 

 

 

 

алгоритм вычисления суммы ряда:

1)положить sum = 0

2)положить k = 0

3)вычислить первое (т.е. «нулевое») слагаемое a0

4)прибавить его к переменной sum

5)вычислить rk

6)вычислить следующее слагаемое: ak 1 ak rk

7)k = k + 1

8)если полученное слагаемое больше — вернуться к шагу 4

иначе — конец вычислений

Практическоезанятие№7

Страница2

Алгоритмизация и программирование Си

Простые числа

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

ввод N — числа для проверки

int prime = 1; // «флаг», обозначающий, что число - простое for(int i=2; i<N; i++){

если N делится нацело на i — положить prime = 0, конец вычислений

}

если теперь проверить значение переменной prime, и оно окажется равным нулю – значит число составное.

если же не окажется – значит простое!

Задания для самостоятельного решения

Задание 1 (0.5 балла).

Напечатать с использованием вложенных циклов данные, приведенные в таблице. Вариант выбрать согласно номера в журнале группы (для номера больше 10 отнимаем целое количество «десяток»).

1

2

3

4

5

6

7

8

 

 

 

 

Практическоезанятие№7

Страница3

Алгоритмизация и программирование Си

9

 

10

 

 

 

 

 

Задание 2 (0.5 балла).

Напишите программу для вычисления числа eпо формуле:

1

e k 0 k!

Вычисление суммы продолжать до тех пор, пока очередное слагаемое по модулю не станет меньше 10 4 .

Задание 3 (1 балл). Написать программу для проверки натурального числа N на простоту. N вводится с клавиатуры.

Практическоезанятие№7

Страница4