

Рисунок 7.1 – Алгоритм, использующий вложенные циклы
Следует отметить, что в рассмотренном ранее алгоритме вычисления суммы (пример 5.4) начальное значение переменной S обнулялось, при вычислении произведения начальное значение переменной Р задается равным 1.
Наиболее распространенными ошибками при решении подобных задач являются следующие.
1. Определение начального значения Р до циклов перебора элементов матрицы. В этом случае будет решаться задача вычисления произведения отрицательных элементов всей матрицы.
2. Вывод результата за пределами циклов перебора элементов матрицы. В этом случае будет выведено значение произведения для элементов последней строки матрицы.
Недостатком данного алгоритма является отсутствие анализа ситуации, когда в текущей строке матрицы нет ни одного отрицательного элемента. Нижеприведенный алгоритм позволяет учесть данную ситуацию.
![]() |

Пример 7.2. Удалить в строке начальные пробелы.
Решение.
Для обработки строк можно использовать приведенные в таблице 7.1 операции.
Таблица 7.1 – Операции по работе со строками
Слияние (S1, S2, …, Sn) | S1, S2, …, Sn – строки, которые необходимо слить. |
Копирование (S, Start, Len) | S – строка, из которой, начиная с позиции Start, копируется подстрока длиной Len символов. |
Длина (S) | S – строка, длину которой необходимо определить. |
Позиция (Str, S) | S – строка, в которой ищется вхождение подстроки Str, и запоминается позиция первого символа этой подстроки. Если подстрока не найдена, то возвращается значение 0. |
Удаление (S,Start,Len) | S – строка, из которой удаляется Len символов, начиная с позиции Start. |
Вставка(Str, S, Start) | S – строка, в которую, начиная с позиции Start, вставляется подстрока Str. |
Алгоритм.
![]() |
![]() |

Пример 7.3. В строке удалить все «нечетные» слова (слова, стоящие на нечетных позициях).
Решение.
Словом будем считать непустую последовательность символов, ограниченную разделителями и не содержащую разделителей внутри себя.
К разделителям отнесем: пробел, знаки препинания (- . , ? ! : ; ” ), признак окончания строки.
При разборе строки возможны несколько вариантов:
1) строка не содержит ни одного символа – результатом в этом случае является сообщение о невозможности обработки;
2) строка содержит только разделители – результатом является сообщение о том, что в строке нет ни одного слова;
3) строка содержит кроме разделителей и другие символы - в этом случае каждое слово обрабатывается по следующей схеме:
- пропускаем в исходной строке все разделители, предшествующие текущему слову, и записываем их в результирующую строку;
- если слово «нечетное», то пропускаем все символы слова до ближайшего разделителя;
- если слово «четное», то пропускаем все его символы до ближайшего разделителя и записываем их в результирующую строку.
Входные данные: S:строка.
Выходные данные:
S1:строка;
Результатом работы алгоритма также может быть одно из сообщений: «На входе пустая строка!», «В строке нет ни одного слова!».
Промежуточные данные:
i:цел. {номер текущего символа строки}
k:цел. {признак наличия слов в строке (при k=0 слов в строке нет, если k=1, то в строке есть хотя бы одно слово)}
Р:цел. {определяет «четность» или «нечетность» текущего слова (если Р=0, то текущее слово «четное», если Р=1, то текущее слово «нечетное»)}
Алгоритм.
![]() |
8 ТРАССИРОВКА АЛГОРИТМОВ
Составленный алгоритм необходимо проверить, то есть убедиться в том, что он описывает именно тот процесс, который приводит к нужному результату. Одним из самых доступных способов проверки правильности алгоритма является его исполнение с некоторыми контрольными наборами исходных данных.
В процессе разработки алгоритма составитель постоянно должен отдавать себе отчет в том, какие действия компьютера на самом деле будут вызваны командами алгоритма и к каким изменениям значений используемых переменных эти действия приведут.
Исполнение алгоритмов удобно делать, заполняя специальную таблицу значений используемых в алгоритме переменных. В программировании такие таблицы обычно называют трассировочными таблицами. Трассировочные таблицы содержат графы (столбцы) для переменных величин, которые будут контролироваться. Если проверяется весь алгоритм, то выделяются графы для исходных данных, промежуточных и конечных результатов. Для каждой скалярной переменной выделяется одна графа, для массива – каждому элементу отдельная графа. Отдельная графа используется для записи проверяемых условий.
Варианты значений аргументов должны быть, во-первых, достаточно просты, чтобы можно было легко определить правильный ответ каким-либо другим способом, во-вторых, достаточно разнообразны, чтобы можно было проверить все ветви алгоритма.
В любой момент времени каждая переменная имеет лишь одно значение.
Пример 5.1. Проверить правильность составления алгоритма обмена значениями величин А и В.
Предположим, что был составлен следующий алгоритм:
А:=А+В
В:=А-В
А:=А-В
Проверим работу данного алгоритма. Пусть А=3, В=7. Выполним алгоритм и заполним трассировочную таблицу:
№ шага | А | В |
3 | 7 | |
1 | 10 | |
2 | 3 | |
3 | 7 | |
Результат | 7 | 3 |
Видим, что после выполнения алгоритма А стало равным 7, а В стало равным 3, то есть эти величины обменялись значениями. Следовательно, для этих значений А и В алгоритм работает верно. Утверждать, что этот алгоритм будет так же правильно работать и при любых других значениях А и В, пока нельзя. Покажем это.
Возьмем произвольные значения для А и В: А=а, В=b и снова выполним трассировку алгоритма:
№ шага | А | В |
a | b | |
1 | a+b | |
2 | a | |
3 | b | |
Результат | b | a |
Таким образом, при любых значениях переменных А и В алгоритм приводит к правильному решению.
Пример 5.2. Проверить, решает ли следующий алгоритм задачу упорядочения по возрастанию значений А, В, С:
![]() |
если A>B то
P:=A
A:=B
B:=P
если B>C то
P:=В
В:=С
С:=P
Решение.
Для тестирования разветвляющегося алгоритма необходимо иметь все комбинации значений исходных данных: A<B<C, A<C<B, B<A<C, B<C<A, C<A<B, C<B<A.
Будем выполнять алгоритм, последовательно перебирая эти варианты значений величин A, B, C.
1-й вариант: А=3, В=5, С=7.
№ шага | А | В | С | Р | Проверка условий |
3 | 5 | 7 | |||
1 | 3>5, Нет | ||||
2 | 5>7, Нет | ||||
Результат | 3 | 5 | 7 |
Результат выполнения алгоритма верен.
2-й вариант: А=3, В=7, С=5.
№ шага | А | В | С | Р | Проверка условий |
3 | 7 | 5 | |||
1 | 3>7, Нет | ||||
2 | 7>5, Да | ||||
3 | 7 | ||||
4 | 5 | ||||
5 | 7 | ||||
Результат | 3 | 5 | 7 |
Результат выполнения алгоритма верен.
3-й вариант: А=5, В=3, С=7.
№ шага | А | В | С | Р | Проверка условий |
5 | 3 | 7 | |||
1 | 5>3, Да | ||||
2 | 5 | ||||
3 | 3 | ||||
4 | 5 | ||||
5 | 5>7, Нет | ||||
Результат | 3 | 5 | 7 |
Результат выполнения алгоритма верен.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 |







