- •ОСНОВЫ АЛГОРИТМИЗАЦИИ И ПРОГРАММИРОВАНИЯ
- •Требования к оформлению лабораторных работ
- •1. ОСНОВЫ АЛГОРИТМИЗАЦИИ И ПРОГРАММИРОВАНИЯ
- •13.1 План разработки алгоритмов и программ
- •Таблица 1.1 Результат ручной прокрутки после первого этапа
- •Таблица 1.2 Результат ручной прокрутки после первого этапа
- •Таблица 1.3 Итог выполнения ручной прокрутки
- •13.2 Перевод алгоритма в Паскаль-программу
- •13.3 Использование готовых алгоритмов при решении задач
- •Подсчет элементов, обладающих заданным свойством
- •Поиск максимального и минимального элементов
- •Поиск элементов, обладающих заданным свойством
- •Задача 1. Подсчет ненулевых элементов
- •Задача 2. Подсчет элементов, абсолютная величина которых больше 7
- •Задача 3. Поиск элемента равного 7
- •Задача 5. Найти количество элементов массива больших среднего арифметического этих элементов
- •Задача 6. Поиск максимального элемента и подсчет частоты его появления в массиве
- •Задача 7. Поиск нулевого элемента
- •Задача 8. Поиск отрицательного числа с конца массива
- •13.4 Стандартная обработка двумерных массивов
- •Двумерный массив и его части
- •Индексы элементов двумерного массива
- •Индексы строки и столбца двумерного массива
- •Индексы диагоналей двумерного массива
- •Перенос простейших алгоритмов на двумерные массивы
- •13.5 Отладка и тестирование программ
- •2. СОЗДАНИЕ КОНСОЛЬНЫХ ПРИЛОЖЕНИЙ СРЕДСТВАМИ DELPHI 7.0
- •13.1 Создание консольного приложения средствами Delphi
- •13.2 Структура программы в Delphi
- •Таблица 2.1
- •13.3 Введение в типы данных Delphi
- •13.4 Венгерская нотация
- •13.5 Отладка и тестирование программ средствами среды Delphi 7
- •3. ЛАБОРАТОРНАЯ РАБОТА №1 «ЛИНЕЙНЫЕ ПРОГРАММЫ»
- •13.1 Пояснения и примеры к лабораторной работе
- •13.2 Задания к лабораторной работе №1:
- •4. ЛАБОРАТОРНАЯ РАБОТА №2 «АЛГОРИТМЫ С ВЕТВЛЕНИЯМИ»
- •13.3 Пояснения и примеры к лабораторной работе
- •13.2 Реализация алгоритмов с ветвлениями средствами C#
- •13.3 Задания к лабораторной работе №2
- •5. ЛАБОРАТОРНАЯ РАБОТА №3 «ОПЕРАТОР ВЫБОРА»
- •13.1 Пояснения и примеры к лабораторной работе
- •13.2 Реализация оператора выбора в языке C#
- •13.3 Задания к лабораторной работе №3
- •6. ЛАБОРАТОРНАЯ РАБОТА №4 «ЦИКЛИЧЕСКИЕ АЛГОРИТМЫ»
- •13.1 Основные разновидности циклов
- •Цикл с постусловием
- •Цикл с предусловием
- •Цикл с параметром
- •Программное прерывание выполнения циклов
- •13.2 Примеры решения задач с использованием операторов цикла
- •Проверка корректности введенных данных
- •Решение задач с использованием диапазонов чисел
- •Решение задач полным перебором
- •Пояснения к задачам 18, 23, 24, 25:
- •13.3 Задания к лабораторной работе №4
- •7. ЛАБОРАТОРНАЯ РАБОТА №5 «РЯДЫ И ПОСЛЕДОВАТЕЛЬНОСТИ»
- •13.1 Примеры решения задач
- •Вычисление суммы n-первых членов ряда
- •Вычисление суммы n-первых членов последовательности, удовлетворяющих условию
- •Нахождение наименьшего номера члена последовательности, для которого выполняется некоторое условие
- •13.2 Задания к лабораторной работе №5
- •8. ЛАБОРАТОРНАЯ РАБОТА №6 «ТАБУЛИРОВАНИЕ ФУНКЦИЙ»
- •13.1 Пример решения задачи на табулирование функции
- •8.1.2 Организация перенаправления ввода-вывода средствами C#
- •13.2 Задания к лабораторной работе №6
- •9. ЛАБОРАТОРНАЯ РАБОТА №7 «ПОДПРОГРАММЫ»
- •13.1 Задания к лабораторной работе №7
- •13.2 Задания к лабораторной работе №8
- •13.1 Примеры и пояснения к лабораторной работе
- •13.2 Задания к лабораторной работе №9
- •Задания к лабораторной работе №10
- •13.1 Примеры работы со строками
- •Пример 13.2 Удалить из строки символ, указанный пользователем.
- •Пример 13.3 Удалить из строки лишних пробелов (пробелы в начале и в конце строки, между словами также должен быть один пробел).
- •Пример 13.4 Определить количество слов в заданном тексте.
- •13.2 Задания к лабораторной работе №11
- •13.1 Задания к лабораторной работе №12
- •13.1 Пояснения к работе
- •13.1 Задания к лабораторной работе №13
- •13.1 Пояснения к лабораторной работе №14
- •Формирование файла случайных чисел
- •Анализ файла случайных чисел
- •13.2 Задания к лабораторной работе №14
- •13.1 Примеры решения задач с использованием текстовых файлов
- •13.2 Задания к лабораторной работе №15
- •13.1 Задания к лабораторной работе №16
- •13.1 Задания к лабораторной работе №17
- •13.2 Задания к лабораторной работе №18
- •13.1 Задания к лабораторной работе №19
- •ПРИЛОЖЕНИЕ А
- •ПРИЛОЖЕНИЕ Б
- •СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ
- •ОГЛАВЛЕНИЕ
6. ЛАБОРАТОРНАЯ РАБОТА №4 «ЦИКЛИЧЕСКИЕ АЛГОРИТМЫ»
Цель работы: Сформировать навыки по решению задач с использованием циклических алгоритмов средствами изучаемого языка программирования
13.1 Основные разновидности циклов
Унифицированная структура цикл обеспечивает многократное выполнение некоторой совокупности действий, которая называется телом цикла.
Цикл с постусловием
Данный вид циклов реализуется оператором цикла REPEAT, который организует выполнение цикла, состоящего из любого числа операторов, с неизвестным заранее числом повторений. Тело цикла выполняется хотя бы один раз. Выход из цикла осуществляется при истинности некоторого логического выражения, поэтому иногда его называют ЦИКЛ - ДО. Структура этого оператора следующая:
repeat instruction1; instruction2;
. . .
instructionN until S;
В этой структуре:
Instruction1, Instruction2, ..., InstructionN
операторы, составляющие тело цикла;
S - логическое выражение, истинность которого проверяется в конце каждой итерации.
Так как слова repeat и until являются своеобразными операторными скобками, точку с запятой перед словом until ставить не обязательно.
Цикл с предусловием
Данный вид циклов реализуется оператором цикла WHILE, который организует выполнение одного оператора неизвестное заранее число раз. Выход из цикла осуществляется, если некоторое логическое выражение окажется ложным, поэтому данный вид циклов имеет второе название ЦИКЛ - ПОКА. Так как истинность логического выражения проверяется в начале каждой итерации, тело цикла может не выполняться ни разу. Структура оператора цикла имеет вид:
52
While S do Instruction;
В этой структуре:
S - логическое выражение, истинность которого проверяется в начале каждой итерации;
Instruction - выполняемый оператор цикла (единственный).
Важно: для циклов repeat и while необходимо, чтобы в теле цикла изменялась переменная, влияющая на условие выхода из цикла, либо предусмотрен альтернативный выход, в противном случае цикл будет бесконечным.
Цикл с параметром
Данный вид циклов реализуется при помощи оператора FOR, который организует выполнение одного оператора заранее известное число раз. Существует два варианта оператора:
for Param:=Start to Finish do Instruction; for Param:=Start downto Finish do Instruction;
В этих операторах:
Param - параметр цикла, являющийся переменной порядкового типа; Start - выражение, определяющее начальное значение параметра цикла; Finish - выражение, определяющее конечное значение параметра цикла; Instruction - выполняемый оператор.
Start и Finish должны быть совместимы для присваивания с параметром цикла .
Цикл действует следующим образом. Первоначально вычисляются и запоминаются начальное - Start и конечное - Finish значения параметра цикла, после чего параметру цикла Param присваивается начальное значение Start. Затем значение параметра цикла сравнивается с конечным значением Finish. Далее, пока параметр цикла меньше или равен конечному значению (в первом варианте оператора) или больше или равен конечному значению (во втором варианте), выполняется очередная итерация цикла; в противном случае происходит выход из цикла. Выполнение очередной итерации включает в себя сначала выполнение оператора Instruction, a затем присваивание параметру цикла следующего большего значения (в первом варианте оператора) или следующего меньшего значения (во втором варианте).
Естественно, что, если в первом варианте значение Start больше Finish или во втором варианте меньше Finish, оператор не выполняется ни разу.
Важно: после выхода из цикла параметр цикла принимает значение Finish (для Turbo Pascal) либо Finish + 1 или Finish – 1 (для консольного приложения Delphi), за исключением случая, когда выход из цикла был осуществлен с помощью оператора Goto или стандартной процедуры Break.
53
Пример 6.1 Посчитать сумму целых чисел от Xнач до Xкон с шагом 1
Таблица 6.1 Система тестов
Номер |
|
Данные |
Результат |
|
теста |
|
|
|
|
|
|
|
|
|
1. |
1 |
|
9 |
45 |
2. |
1 |
|
10 |
55 |
3. |
10 |
|
12 |
33 |
Решим эту задачу, используя все виды циклов. Следует отметить, что использование цикла с параметром для данной задачи возможно только при шаге равном 1. Если задача будет перефразирована например к виду: посчитать сумму чисел от Xнач до Xкон с каким-либо вещественным шагом, тогда цикл с параметром для этой цели не подойдет. Фрагменты блок-схем для каждого цикла приведены на рис. 6.1. Реализация алгоритма показана в таблице 6.2.
Рис. 6.1 Фрагменты блок-схем для примера 4.1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Таблица 6.2 |
||
|
|
Цикл While |
|
|
Цикл Repeat |
|
Цикл For |
|
|||||||||
sum:=0; |
|
|
|
sum:=0; |
|
|
|
sum:=0; |
|
|
|
||||||
while xn<=xk do |
|
repeat |
|
|
|
for k:=xn to xk |
|
||||||||||
begin |
|
|
|
sum:=sum+xn; |
|
sum:=sum+k; |
|
||||||||||
|
sum:=sum+xn; |
inc(xn); |
|
|
|
|
|
|
|
|
|||||||
|
inc(xn); |
|
until xn>xk; |
|
|
|
|
|
|
||||||||
end; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
Исполнение |
алгоритмов при xn=10 |
и xk=12 |
|
|
|
|||||||||
|
|
(все значения приведены после соответсвующего шага) |
|
||||||||||||||
шаг |
|
xn |
xk |
|
sum |
шаг |
|
xn |
|
xk |
|
sum |
шаг |
|
k |
|
sum |
1 |
|
11 |
12 |
|
10 |
1 |
|
11 |
|
12 |
|
10 |
1 |
|
10 |
|
10 |
2 |
|
12 |
12 |
|
21 |
2 |
|
12 |
|
12 |
|
21 |
2 |
|
11 |
|
21 |
|
|
|
|
|
|
|
54 |
|
|
|
|
|
|
|
|
|
3 |
13 |
12 |
33 |
3 |
13 |
12 |
33 |
3 |
12 |
33 |
Программное прерывание выполнения циклов
В циклах REPEAT, WHILE и FOR можно использовать две стандартные процедуры: Break и Continue. Процедура Break позволяет досрочно выйти из цикла, не дожидаясь выполнения условия выхода рис. 4.2.a. Процедура Continue позволяет начать новую итерацию цикла, даже если предыдущая не завершена; однако при этом проверяется вначале, существует ли новая итерация (анализируется условие выхода из цикла) рис. 4.2.b.
Для демонстрации применения инструкции Continue приведен пример
6.3.
Пример 6.2 Посчитать сумму целых чисел от Xнач до Xкон с шагом 1, причем вычисления прекратить если значения суммы превысит 100.
//Delphi
sum:=0;
while xn<xk do begin
sum:=sum+xn;
inc(xn);
if sum>100 then break; end;
//C# sum = 0;
while (xn < xk)
{
sum += xn; xn++;
if (sum > 100) break;
}
Пример 6.3 Вывести на экран значения функции f(x)=1/x для целых x, изменяющихся от -10 до 10 с шагом 1.
//Delphi x:=-10; dec(x); repeat inc(x);
if x=0 then begin
writeln('f(',x,') не существует'); continue;
end;
f:=1/x;
writeln('f(',x,')=',f:0:3);
55
until x>=10;
//C#
int x= -11; double f = 0; do
{
x++;
if (0 == x)
{
Console.WriteLine("f({0}) не существует", x); continue;
}
f = 1.0 / x; Console.WriteLine("f({0})={1:f3}", x, f);
}while (x < 10);
Вданном примере оператор continue используется для обработки деления на нуль.
|
|
Сум=0 |
|
- |
Xнач <= Хкон |
|
|
|
|
|
+ |
|
|
Сум = Сум + Xнач |
|
|
Хнач = Хнач + 1 |
+ |
|
Сум > 100 |
|
|
|
|
|
- |
|
|
a |
X=-10 |
|
Dec(x) |
|
Inc(x) |
|
X=0 |
+ |
|
|
- |
F(0) не |
|
|
|
существует |
F=1/x |
|
F(0) не |
|
существует |
|
X>=10 |
|
b |
|
Рис. 6.2 Фрагменты блок-схем примеров 6.2 и 6.3
56