- •ОСНОВЫ АЛГОРИТМИЗАЦИИ И ПРОГРАММИРОВАНИЯ
- •Требования к оформлению лабораторных работ
- •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
- •ПРИЛОЖЕНИЕ А
- •ПРИЛОЖЕНИЕ Б
- •СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ
- •ОГЛАВЛЕНИЕ
иначе
если tek > max то max = tek tek = 1
Вывод (max)
Все полученные значения на каждом шаге записываем в таблицу 1.1.
По окончании выполнения первой строки в памяти появится массив из десяти значений А=[5 11 4 4 4 2 2 2 2 2].
После выполнения второй строки переменные max и tek будут равны 1. В третьей строке переменная i примет значение 2, затем будет проверено условие A[2] = A[1] (5 = 11), которое не выполняется и соответственно будет
отработана часть программы, находящаяся после иначе.
Условие tek > max (1>1) на текущем этапе не выполняется и переменные tek и max сохраняют свои значения. После этого управление передается на
строку для i |
от |
2 до |
10 и переменная i принимает значение 3 и ручная |
|||||||||
прокрутка продолжается в аналогичном режиме. |
||||||||||||
|
Таблица 1.1 Результат ручной прокрутки после первого этапа |
|||||||||||
Переменная |
|
|
|
|
|
Значение |
||||||
|
|
|
|
|
|
|
6-й |
|
|
|
|
|
|
0-й |
1-й |
2-Й |
3-й |
4-й |
5-й |
7-й |
8-й |
9-й |
10-й |
||
|
этап |
|
этап |
этап |
этап |
этап |
этап |
этап |
этап |
этап |
этап |
этап |
А |
|
|
|
|
|
5 11 4 |
4 4 2 2 2 2 2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
max |
1 |
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tek |
1 |
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i |
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рассмотрим окончание ручной прокрутки.
Значение i=10. Следовательно, А[10] сравнивается с А[9], то есть 2 сравнивается с 2. Следовательно, выполняться будет то, что после то:
то tek = tek + 1
tek сейчас равно 4, станет = 5 (табл. 1.2).
Таблица 1.2 Результат ручной прокрутки после первого этапа
Переменная |
|
|
|
|
Значение |
||||||
|
|
|
|
|
|
|
6-й |
|
|
|
|
|
0-й |
1-й |
2-Й |
3-й |
4-й |
5-й |
7-й |
8-й |
9-й |
10-й |
|
|
этап |
этап |
этап |
этап |
этап |
этап |
этап |
этап |
этап |
этап |
этап |
А |
|
|
|
|
5 11 4 |
4 4 2 2 2 2 2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
max |
1 |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tek |
1 |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i |
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8
При этом операторы после иначе не исполняются (поскольку исполнялись операторы после то). И поскольку в цикле больше операторов нет, то управление вновь передается к строке начала цикла: для i от 2 до 10
i увеличивается на 1 (было 10, становится 11). 11 > 10, и потому цикл завершен и управление передается к оператору, следующему за оператором цикла:
Вывод (max) Что у нас находится в переменной max? 3! Число 3 и будет выведено в качестве ответа (табл. 1.3). Это — ошибка, ведь правильный ответ
— 5 для данного теста.
Таблица 1.3 Итог выполнения ручной прокрутки
Переменная |
|
|
|
|
Значение |
|
|
|
|
||
|
|
|
|
|
|
|
6-й |
|
|
|
|
|
0-й |
1-й |
2-Й |
3-й |
4-й |
5-й |
7-й |
8-й |
9-й |
10-й |
|
|
этап |
этап |
этап |
этап |
этап |
этап |
этап |
этап |
этап |
этап |
этап |
А |
|
|
|
|
5 11 4 |
4 4 2 2 2 2 2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
max |
1 |
1 |
|
|
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
tek |
1 |
1 |
1 |
2 |
3 |
1 |
3 |
4 |
5 |
|
|
|
|
|
|
|
|
|
7 |
|
|
|
|
i |
|
2 |
3 |
4 |
5 |
6 |
8 |
9 |
10 |
11 |
|
|
|
|
|
|
|
|
|
|
|
|
|
Ошибка заключается в том, что в алгоритме не предусмотрен случай, когда наибольшее число подряд идущих элементов получается в результате завершения массива, то есть когда соответствующие подряд идущие элементы стоят в конце массива. Исправить алгоритм легко: достаточно поставить дополнительный оператор сравнения переменных max и tek после завершения цикла.
Ввод А [1..10] max = 1, tek = 1
для i от 2 до 10
если А[i] = A[i-1] то tek = tek + 1
иначе
если tek > max то max = tek tek = 1
если tek > max то max = tek
Вывод [max)
Теперь, когда мы убеждены, что алгоритм работает верно, легко написать по нему текст соответствующей программы.
Несколько замечаний относительно ручной прокрутки. Наверное, многим показалось, что ручная прокрутка — это очень трудоемкий процесс. И некоторые попробуют обходиться без него. Это опасный путь, и он может привести к значительно большей трате времени. В то время как регулярное применение ручной прокрутки приводит к тому, что ваш мозг начинает выполнять эту рабо-
9
ту подсознательно еще в тот момент, когда вы только сочиняете алгоритм. Это, соответственно, резко сокращает количество допущенных вами ошибок при разработке все новых и новых алгоритмов. Кроме того, выполнение ручной прокрутки позволяет легко найти ошибки на стадии отладки.
13.2 Перевод алгоритма в Паскаль-программу
Рассмотрим алгоритм и его запись на языке программирования Паскаль:
max = 1, |
tek = 1 |
max:=1; tek:=1; |
для i от |
2 до 10 |
for i:=2 to 10 do |
если А[i] = A[i-1] |
if A[i]=A[i-1] |
|
то tek = tek + 1 |
then inc(tec) |
|
иначе |
|
else |
если |
tek > max |
begin |
if tek>max |
||
то max = tek |
then max:=tek; |
|
|
tek = 1 |
tek:=1; |
если tek > max |
end; |
|
if tek>max |
||
то max = tek |
then max:=tek; |
|
Вывод [max) |
writeln(max); |
Очевидно, что при выполнении перевода алгоритма в программу следует соблюсти следующие нехитрые правила.
1.Все « = » заменить на « : = ».
2.Ключевые слова заменить их аналогами:
для |
если |
то |
иначе |
вывод |
for |
if |
then |
else |
writeln |
3.В конце операторов поставить символ « ; ».
4.Наиболее «сложное» правило: в случае, если после для, то или иначе в алгоритме выполняются два или более действия, поставить «операторные скобки» - begin end, которые в алгоритме подразумеваются сдвигами.
5.Все переменные и массивы объявить в программе, а исходные данные
— ввести.
В результате получаем текст программы.
Листинг 1.2 Решение задачи о поиске подряд идущих элементов var
max,tek,i:byte; a:array[1..10] of byte; begin
writeln('Введите элементы массива'); for i:=1 to 10 do
begin
10
write('A[',i,']=');
readln(A[i]);
end;
max:=1; tek:=1; for i:=2 to 10 do
if A[i]=A[i-1] then inc(tec) else
begin
if tek>max then max:=tek; tek:=1;
end;
if tek>max then max:=tek; writeln(max);
readln;
end.
13.3 Использование готовых алгоритмов при решении задач
Мировой накопленный опыт программирования позволяет решать большинство задач алгоритмизации, используя уже известные алгоритмы [], что значительно ускоряет процесс написания программ. Однако для того, чтобы использовать чужие алгоритмы, их нужно изучить, а затем научиться применять и видоизменять эти алгоритмы.
В качестве примера рассмотрим простейшие алгоритмы на одномерных массивах.
Наиболее часто используемыми алгоритмами на одномерных массивах являются:
-подсчет элементов, обладающих заданным свойством;
-поиск максимального и минимального элементов;
-поиск элементов, обладающих заданным свойством.
Подсчет элементов, обладающих заданным свойством
Пусть мы имеем одномерный массив с оценками 10 учеников по информатике. Требуется посчитать, сколько из них имеют оценку 5. Алгоритм для такой задачи имеет вид:
s:=0; |
//Подсчет элементов |
|
for i:=1 to 10 do |
//равных данному (5) |
|
if a[i]=5 then s:=s+1; |
//правильнее писать |
inc(s) |
Рассмотрим алгоритм построчно.
s:=0; Начальное значение количества отличников по информатике уста-
11