Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические указания.pdf
Скачиваний:
81
Добавлен:
13.02.2015
Размер:
1.2 Mб
Скачать

иначе

если 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