
- •1. Программирование на Паскале 8
- •1.1. Основные операторы языка и простейшие алгоритмы 8
- •1. Программирование на Паскале
- •1.1. Основные операторы языка и простейшие алгоритмы
- •1.1.1. Введение в программирование
- •1.1.2. Стандартная обработка одномерных массивов
- •Поиск максимального и минимального элементов
- •Поиск элементов, обладающих заданным свойством
- •Сортировка элементов одномерного массива
- •1.1.3. Стандартная обработка двумерных массивов Двумерный массив и его части
- •Индексы элементов двумерного массива
- •Индексы строки и столбца двумерного массива
- •Перенос простейших алгоритмов на двумерные массивы
- •Обьявление, ввод и вывод двумерного массива
- •Методические указания по решению задач 10,11,14,19-21
- •1.1.4. Как разрабатывать нестандартные алгоритмы и программы
- •Долгий путь к алгоритму
- •1.2. Ручная прокрутка
- •Методические указания по решению задач 6,8,16-18,22-24
- •1.3. Условия задач для самостоятельного решения
1.1.4. Как разрабатывать нестандартные алгоритмы и программы
Вообще разработка алгоритмов и программ - это не только наука, но и в значительной степени искусство. И потому многие считают, что учить разработке алгоритмов и программ - это все равно, что учить человека писать картины или сочинять стихи и мелодии. Тем не менее, существуют некоторые общие сведения, которые могут быть сообщены всем желающим ими воспользоваться, при попытках научиться разрабатывать алгоритмы. Ниже Вашему вниманию предлагается план, следование которому при разработке алгоритмов может помочь Вам быстрее освоить эту науку (или искусство). Совсем необязательно его помнить наизусть - достаточно пытаться придерживаться его при разработке алгоритмов для всякой новой для Вас программы.
План разработки алгоритмов и программ
Переформулировать условия задачи.
Выяснить, что на входе, что на выходе.
Составить тестовые примеры ( не забыв о крайних случаях )
Решить тестовые примеры вручную.
Если задача решается как композиция известных задач то перейти к пункту 9.
Разработать алгоритм программы.
Выполнить ручную прокрутку.
Если есть ошибки, то перейти к пункту 6.
Написать текст программы
Пояснения к этому плану будут приводится параллельно с применением плана для решения конкретных задач.
Долгий путь к алгоритму
Начнем с задачи 9.
Дана целочисленная таблица А [ 1:10]. Подсчитайте, сколько раз встречается в этой таблице максимальное по величине число.
1. Переформулировать условия задачи.
2. Выяснить, что на входе, что на выходе.
Имеется ввиду, что Вы должны постараться переформулировать условия так, чтобы формулировка условий содержала минимальное количество слов, и при этом задача оставалась той же, и однозначно определялось, что нужно вводить (число, одномерный массив чисел, двумерный массив чисел, строку символов) и что нужно выводить.
Например, для задачи 9:
Новая формулировка:
В одномерном массиве посчитать количество максимумов.
На входе - одномерный массив
На выходе - число
3. Составить тестовые примеры ( не забыв о крайних случаях )
4. Решить тестовые примеры вручную.
Прежде чем писать программу, Вы должны точно понять, что именно должна делать Ваша программа. А кроме того, Вы должны строго определить, какую программу Вы будете считать работающей правильно. Именно составление адекватного задаче множества тестов и позволяет решить эту задачу.
Что такое тест?
Это те данные, которые Вы должны ввести в Вашу программу и, то, что Вы считаете правильным ответом, который должна выдать Ваша программа, в случае ввода этих данных.
Сколько должно быть тестов?
С одной стороны, Вы должны придумать достаточное количество тестов, что бы Вы могли утверждать:
Если кто-то напишет программу, которая "пройдет" все мои тесты (т.е. для всех входных выведет определенные выходные), значит, этот кто-то написал правильную программу, которая ПРИ ЛЮБЫХ корректных входных данных будет выдавать правильные ответы.
С другой стороны, тестов должно быть как можно меньше. Потому что, исправив хоть один символ в Вашей программе, Вы должны перепроверить правильно ли теперь она работает НА ВСЕХ ТЕСТАХ, которые Вы сочинили.
Кроме того, при составлении тестов необходимо помнить, что часто программа должна специальным образом обрабатывать различные крайние случаи - и соответственно придумывать такие тесты.
Например, для задачи 9 достаточно следующих тестов.
ТЕСТЫ |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
ОТВЕТЫ |
1 - один максимум |
5 |
-2 |
4 |
0 |
6 |
11 |
7 |
0 |
2 |
14 |
1 |
2 - несколько максимумов |
5 |
11 |
4 |
0 |
6 |
11 |
7 |
0 |
2 |
11 |
3 |
3 - все максимумы |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
10 |
5. Если задача решается как композиция известных задач то перейти к пункту 9.
На этом этапе Вы должны попытаться из известных Вам алгоритмов составить их композицию, которая решит данную задачу. Например, для задачи 9, это можно сделать так:
Поиск максимального элемента в одномерном массиве.
Подсчет числа элементов (в одномерном массиве), равных данному (найденному максимальному)
И тогда можно сразу переходить к пункту 9 плана - т.е. непосредственно к написанию расчетной части программы:
max := a[1]; { }
for i := 2 to 10 do {Поиск максимального элемента }
if a[i] > max then max:=a[i];
n := 0; {Счетчик}
for i := 1 to 10 do {Подсчет элементов равных данному ( max )}
if a[i] = max then n:=n+1;
А затем и собственно программы:
program MaxNumb;
var
a : array [1..10] of integer; {Объявление массива a из 10 элемент}
i,n,max : integer; {переменныу i,n,max }
begin
writeln('Вводите 10 чисел'); {пояснения}
for i:=1 to 10 do readln(a[i]); {Ввододномерного массива }
max := a[1];
for i := 2 to 10 do {Поиск максимального элемента }
if a[i] > max then max:=a[i];
n := 0; {Счетчик}
for i := 1 to 10 do {Подсчет элементов равных данному ( max )}
if a[i] = max then n:=n+1;
writeln('исходный массив'); {пояснения}
for i:=1 to 10 do write(a[i],' '); {Вывод одномерного массива}
writeln;
write('Кол-во максимальных элементов'); {пояснения}
writeln(' одномерного массива = ',n); {Вывод результата}
end.
Однако, такая возможность представляется Вам далеко не всегда. Для примера рассмотрим задачу 15. Дана целочисленная таблица A[1:10]. Подсчитайте наибольшее число одинаковых идущих в ней подряд элементов.
Для повторения проведем начальные этапы разработки алгоритмов и для этой задачи:
Переформулировать условия задачи.
Выяснить, что на входе, что на выходе.
Новая формулировка: В одномерном массиве посчитать наибольшее число одинаковых идущих подряд элементов.
На входе - одномерный массив
На выходе - число
Составить тестовые примеры (не забыв о крайних случаях )
Решить тестовые примеры вручную.
В данном случае полное множество тестов более сложное.
ТЕСТЫ |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
ОТВЕТЫ |
нет подряд идущих |
5 |
-2 |
4 |
0 |
6 |
11 |
7 |
0 |
2 |
14 |
1 |
одна цепочка подряд идущих |
5 |
11 |
4 |
4 |
4 |
11 |
7 |
0 |
2 |
11 |
3 |
все подряд идущие |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
10 |
сначала min, потом max |
5 |
11 |
4 |
4 |
4 |
2 |
2 |
2 |
2 |
2 |
5 |
сначала max, потом min |
5 |
4 |
4 |
4 |
4 |
4 |
4 |
2 |
2 |
2 |
6 |
Обращаю Ваше внимание на необходимость присутствия в множестве тестов как теста 4, так и теста 5.
Так, например, если в множестве тестов будет отсутствовать тест 4, то написав программу, которая будет считать ПЕРВОЕ число одинаковых идущих подряд элементов, можно будет получить правильные ответы на всех оставшихся тестах и ошибочно считать, что Вами написана программа, полностью решающая поставленную задачу.
Аналогично, в случае, если множество тестов не будет содержать теста 5, то написав программу, которая будет считать последнее число одинаковых идущих подряд элементов, можно будет получить правильные ответы на всех оставшихся тестах и опять-таки ошибочно считать, что Вами написана программа, полностью решающая поставленную задачу.
Но, предположим, Вы составили полное множество тестов. Как же теперь составить алгоритм, решающий поставленную задачу?
Прежде всего, заметим, что раз Вы составили тесты и, для всех входных данных, вручную посчитали правильные ответы, ТО ВАМ ИЗВЕСТЕН ПРАВИЛЬНЫЙ АЛГОРИТМ решения задачи. Основная Ваша проблема теперь записать этот алгоритм так, что бы он был правильно понят и выполнен компьютером.
Чтобы помочь себе формализовать известный Вам алгоритм предлагается использовать следующий мнемонический прием:
ПРЕДСТАВИТЬ, ЧТО
НА ДЛИННОМ ШОССЕ РАЗЛОЖЕН МИЛЛИОН РЯДОМ ЛЕЖАЩИХ ТАБЛИЧЕК, НА КОТОРЫХ НАПИСАНЫ ЧИСЛА.
ВАМ ЛИЧНО ТРЕБУЕТСЯ РЕШИТЬ ЗАДАЧУ ДЛЯ ЭТОГО МИЛЛИОНА ЧИСЕЛ.
3. ХОДИТЬ ПРИХОДИТСЯ ПЕШКОМ ( поэтому хотелось бы поменьше ходить от числа к числу - в идеале прямо от первого до последнего, не возвращаясь назад ).
МОЖНО НА ЛАДОНИ ЗАПИСЫВАТЬ НЕКОТОРЫЕ ЧИСЛА, ЧТОБЫ НЕ НАДО БЫЛО ИХ ПОМНИТЬ.
5. СРАВНИВАТЬ МОЖНО ТОЛЬКО ДВА ЧИСЛА. (оба на ладони, оба на дороге, одно на ладони, другое на дороге)
Придумать схему действий (АЛГОРИТМ), по которым на ладони появится ответ, когда вы доберетесь до конца шоссе.
Другой мнемонический прием разработки алгоритмов можно использовать, когда Вы работаете вдвоем с товарищем. Тогда Вы просите товарища составить тест с большим количеством входных данных, и затем он называет Вам эти входные данные по одному, Вы НЕ ИМЕЕТЕ права записывать все числа, которые он называет, но можете записывать некоторые числа, как результат вычислений над называемыми числами. Задач у Вас в этом случае две:
Получить правильный ответ (сверив его потом с ответом товарища)
Придумать схему действий (АЛГОРИТМ), по которой можно получать правильный ответ всегда, независимо от того, какие бы входные данные не называл Ваш товарищ.
Так, например, алгоритм задачи о подряд идущих для исполнения человеком может быть записан следующим образом:
Записывать на ладони в нашем случае нужно только 2 числа
1 - сколько сейчас одинаковых подряд идущих элементов
2 - максимальное число одинаковых подряд идущих элементов, встреченное до сих пор
АЛГОРИТМ:
Записать на ладони что первое число=1 и второе число=1
Начиная со второго числа на шоссе и до последнего делать следующее
если текущее число на шоссе равно предыдущему
то увеличиваем на 1 первое число на ладони
иначе если первое число на ладони больше 2-ого числа на ладони
то на место 2-го числа на ладони записывать 1-ое
( чтобы сохранить максимум подряд идущих на место первого числа на ладони записывать 1 чтобы начать счет сначала для текуших подряд идущих )
Соответствующий компьютеризованный алгоритм задачи о подряд идущих может выглядеть так:
Формальная запись Комментарии
Ввод А[1..10] Разложили числа на шоссе
max = 1, tek = 1 Записали на ладони 2 числа
для i от 2 до 10 Повторяем для чисел от 2-го до 10-го
если A[i] = A[i-1] если подряд идут
то tek = tek + 1 то инкрементируем текущее
иначе если tek > max то max = tek иначе если надо меняем макс.
tek = 1 и начинаем считать сначала
Вывод max Выводим результат
Ну вот, наконец, мы получили алгоритм и нам кажется, что он правильный. Что теперь делать ? "Писать по нему программу" -можете ответить Вы. Можно, но я все-таки предлагаю сначала сделать ручную прокрутку, что бы, еще не садясь за компьютер, найти и исправить как можно больше ошибок в написанном алгоритме.