- •ОСНОВЫ АЛГОРИТМИЗАЦИИ И ПРОГРАММИРОВАНИЯ
- •Требования к оформлению лабораторных работ
- •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
- •ПРИЛОЖЕНИЕ А
- •ПРИЛОЖЕНИЕ Б
- •СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ
- •ОГЛАВЛЕНИЕ
writeln(s1,s2,s3);
Задача 5. Найти количество элементов массива больших среднего арифметического этих элементов
s:=0;
for i:=1 to 10 do s:=s+a[i]; r:=s/10;
n:=0;
for i:=l to 10 do
if a[i]>r then inc(n); writeln(n);
Задача 6. Поиск максимального элемента и подсчет частоты его появления в массиве
mах:=а[1];
for i:=1 to 10 do
if a[i]>max then max:=a[i];
s:=0;
for i:=1 to 10 do
if a[i]=max then inc(s); writeln(s);
Задача 7. Поиск нулевого элемента i:=1:
while (i<=10) and (а[i]<>0) do inc(i); if i>10 then writeln(‘нет’)
else writeln(‘первый 0 стоит на позиции ‘,i);
Задача 8. Поиск отрицательного числа с конца массива i:=10;
while (i>=1) and (a[i]>=0) do dec(i);
if i<l then writeln(‘отрицательных чисел нет’)
else writeln(‘последнее число<0 стоит на позиции ‘,i);
13.4 Стандартная обработка двумерных массивов
Значительное количество практических задач требует обработки не одномерных, а двумерных массивов.
Двумерный массив и его части
Например, рассмотрим двумерный массив из 25 элементов, содержащий 5 строк и 5 столбцов:
5 -2 3 14 11
16
|
17 |
13 |
1 |
7 |
1 |
|
5 |
-2 |
3 |
14 |
20 |
|
8 |
0 |
9 |
10 |
-4 |
|
3 |
-6 |
3 |
14 |
16 |
Компонентами двумерного массива, требующими специальной обработ- |
|||||
ки, могут быть его строки, столбцы и диагонали, например: |
|||||
- |
вторая строка: |
|
|
|
|
|
17 |
13 |
1 |
7 |
1 |
- главная (первая) диагональ: |
|
|
|
||
|
5 |
13 |
3 |
10 |
16 |
- побочная (вторая) диагональ: |
|
|
|
||
- |
11 |
7 |
3 |
0 |
3 |
третий столбец: |
|
|
|
|
|
- |
3 |
1 |
3 |
9 |
3 |
и т.д. |
|
|
|
|
|
Индексы элементов двумерного массива |
|
|
|
||||||
|
Двумерный массив А из 25 элементов (5 строк и 5 столбцов) имеет такие |
|||||||||
индексы: |
|
|
|
|
|
|
|
|
|
|
5 |
-2 |
3 |
14 |
11 |
→ |
А[1,1] |
А[1,2] |
А[1,3] |
А[1,4] |
А[1,5] |
17 |
13 |
1 |
7 |
1 |
→ |
А[2,1] |
А[2,2] |
А[2,3] |
А[2,4] |
А[2,5] |
5 |
-2 |
3 |
14 |
20 |
→ |
А[3,1] |
А[3,2] |
А[3,3] |
А[3,4] |
А[3,5] |
8 |
0 |
9 |
10 |
-4 |
→ |
А[4,1] |
А[4,2] |
А[4,3] |
А[4,4] |
А[4,5] |
3 |
-6 |
3 |
14 |
16 |
→ |
А[5,1] |
А[5,2] |
А[5,3] |
А[5,4] |
А[5,5] |
Первый индекс — это номер строки, а второй — номер соответствующего столбца (в некоторых программных продуктах возможна другая трактовка: первый индекс — столбец, а второй — строка).
При обработке в программе всех элементов двумерного массива необходимо писать вложенные операторы FOR:
FOR I:=1 TO 5 DO
FOR J:=1 TO 5 DO ... A[I,J] ...
Индексы строки и столбца двумерного массива
Рассмотрим в качестве примера индексы второй строки:
А[2,1] А[2,2] А[2,3] А[2,4] А[2,5].
Легко заметить, что первый индекс — номер строки — фиксирован и равен 2 (для 2-й строки), а второй индекс последовательно пробегает значения от 1 до 5. Поэтому в случае необходимости обработки 2-й строки двумерного массива достаточно написать:
17
FOR I:=1 ТО 5 DO ... А[2 , I ] ...
Переменная I может быть по необходимости заменена любой другой, например М:
FOR M:=1 ТО 5 DO ... А[2 , M ] ...
Теперь рассмотрим в качестве примера индексы третьего столбца:
А[1,3] А[2,3] А[3,3] А[4,3] А[5,3]
Очевидно, что теперь второй индекс — номер столбца — фиксирован, а первый индекс — номер строки — пробегает последовательно все значения от 1 до 5. Поэтому цикл обработки элементов третьего столбца должен выглядеть так:
FOR I:=1 ТО 5 DO ... А[ I , 3 ] ...
Индексы диагоналей двумерного массива
Элементы первой диагонали двумерного массива имеют индексы:
А[1,1] А[2,2] А[3,3] А[4,4] А[5,5]
Легко заметить, что индекс строки равен индексу столбца для всех элементов первой диагонали, и потому цикл обработки ее элементов должен выглядеть следующим образом:
FOR I:=1 ТО 5 DO ... А[I , I] ...
Элементы второй диагонали двумерного массива имеют индексы:
А[1,5] А[2,4] А[3,3] А[4,2] А[5,1]
Нелегко, но можно заметить, что сумма индексов строки и столбца для всех элементов второй диагонали постоянна и равна 6 (для массива 5 x 5; для массива N x N это будет N + 1), и потому цикл обработки элементов второй диагонали должен выглядеть следующим образом:
FOR I:=1 ТО N DO ... А[I , N+1-I] ...
Перенос простейших алгоритмов на двумерные массивы
Учитывая все вышеизложенное, можно согласиться с методикой переноса алгоритмов с одномерных массивов на двумерные, которая проиллюстрирована на примере алгоритма суммирования элементов:
s:=0; |
{Суммирование элементов} |
for i:=1 to 30 do s:=s+А[i]; |
{одномерного массива А} |
s:=0; |
{Суммирование элементов второй} |
for i:=1 to 5 do s:=s+B[2,i]; |
{строки двумерного массива B} |
s:=0; |
{Суммирование элементов третье- } |
for i:=1 to 5 do s:=s+B[i,3]; |
{го столбца двумерного массива B} |
s:=0; |
{Суммирование элементов первой} |
for i:=1 to 5 do s:=s+B[i,i]; |
(диагонали двумерного массива B} |
s:=0; |
{Суммирование элементов второй} |
for i:=1 to 5 do s:=s+B[i,6-1]; |
{диагонали двумерного массива B} |
s:=0; |
{Суммирование элементов} |
18
for |
i:=1 |
to |
5 |
do |
{двумерного массива B} |
for |
j:=1 |
to |
5 |
do |
s:=s+B[i,j]; |
В чем же заключается эта методика? В замене индексов одномерного массива на индексы соответственно строки, столбца, первой или второй диагоналей или всего двумерного массива. В случае обработки всего двумерного массива необходимо также использовать вложенные операторы FOR.
Другие примеры работы с массивами смотрите в соответствующем разде-
ле.
13.5Отладка и тестирование программ
2.5.1Общие сведения об отладке и тестировании ПО
Отладка программы — это процесс поиска и устранения ошибок в программе, производимый по результатам её прогона на компьютере.[1]
Тестирование (англ. test — испытание) — это испытание, проверка правильности работы программы в целом, либо её составных частей.[1]
Отладка и тестирование — это два четко различимых и непохожих друг на друга этапа:
-при отладке происходит локализация и устранение синтаксических ошибок и явных ошибок кодирования;
-в процессе же тестирования проверяется работоспособность программы, не содержащей явных ошибок.
Тестирование устанавливает факт наличия ошибок, а отладка выясняет ее
причину. В современных программных системах (Visual Studio, Delphi и др.) отладка осуществляется часто с использованием специальных программных средств, называемых отладчиками. Эти средства позволяют исследовать внутреннее поведение программы.
Программа-отладчик обычно обеспечивает следующие возможности:
-пошаговое исполнение программы с остановкой после каждой команды (оператора);
-просмотр текущего значения любой переменной или нахождение значения любого выражения, в том числе, с использованием стандартных функций; также можно установить новое значение переменной;
-установку в программе "контрольных точек"(breakpont), т.е. точек, в которых программа временно прекращает свое выполнение, так что можно оценить промежуточные результаты, и др. Причем прерывание исполнения программы может быть вызвано как достижением точки прерывания, так и при выполнении в этой точке некоторого условия При отладке программ важно помнить следующее:
-в начале процесса отладки надо использовать простые тестовые дан-
19
ные;
-возникающие затруднения следует четко разделять и устранять строго поочередно;
-не нужно считать причиной ошибок машину, так как современные машины и трансляторы обладают чрезвычайно высокой надежностью. Тестовые данные должны обеспечить проверку всех возможных условий
возникновения ошибок:
-должна быть испытана каждая ветвь алгоритма;
-очередной тестовый прогон должен контролировать нечто такое, что еще не было проверено на предыдущих прогонах;
-первый тест должен быть максимально прост, чтобы проверить, работает ли программа вообще;
-арифметические операции в тестах должны предельно упрощаться для уменьшения объема вычислений;
-количества элементов последовательностей, точность для итерационных вычислений, количество проходов цикла в тестовых примерах должны задаваться из соображений сокращения объема вычислений;
-минимизация вычислений не должна снижать надежности контроля;
-тестирование должно быть целенаправленным и систематизированным, так как случайный выбор исходных данных привел бы к трудностям в определении ручным способом ожидаемых результатов; кроме того, при случайном выборе тестовых данных могут оказаться непроверенными многие ситуации;
-усложнение тестовых данных должно происходить постепенно. Пример. Система тестов для задачи нахождения корней квадратного
уравнения a x2 +b x +c =0 представлена в таблице 2:
Таблица 1.4
Номер |
Проверяемый случай |
Коэффициенты |
Результаты |
||||
теста |
a |
b |
c |
||||
|
|
|
|
|
|
|
|
1 |
d >0 |
|
|
1 |
1 |
-2 |
x1 = 1, x2 = - 2 |
2 |
d=0 |
|
|
1 |
2 |
1 |
Корни равны: x1 =- 1, x2 = - 1 |
3 |
d < 0 |
|
|
2 |
1 |
2 |
Действительных корней нет |
4 |
a=0, b=0, |
c=0 |
0 |
0 |
0 |
Все коэффициенты равны нулю. |
|
|
|
|
|
|
|
|
х — любое число. |
5 |
a=0, |
b=0, |
c<>0 |
0 |
0 |
2 |
Неправильное уравнение |
6 |
a=0, |
b<>0 |
|
0 |
2 |
1 |
Линейное уравнение. Один корень: x =- 0,5 |
7 |
a <> 0, b <> 0, с = 0 |
2 |
1 |
0 |
x1 = 0, x2 = - 0,5 |
Следует помнить о том, что ошибки могут быть допущены на всех этапах решения задачи — от ее постановки до оформления. Разновидности ошибок и соответствующие примеры приведены в таблице 3:
20
|
Таблица 1.5 |
Вид ошибки |
Пример |
Неправильная постанов- |
Правильное решение неверно сформулированной задачи |
ка задачи |
|
Неверный алгоритм |
Выбор алгоритма, приводящего к неточному или эффективному |
|
решению задачи |
Ошибка анализа |
Неполный учет ситуаций, которые могут возникнуть; логические |
|
ошибки |
Семантические ошибки |
Непонимание порядка выполнения оператора |
Синтаксические ошибки |
Нарушение правил, определяемых языком программирования |
Ошибки при выполне- |
Слишком большое число, деление на ноль, извлечение квадратно- |
нии операций |
го корня из отрицательного числа и т. п. |
Ошибки в данных |
Неудачное определение возможного диапазона изменения данных |
Опечатки |
Перепутаны близкие по написанию символы, например, цифра 1 и |
|
буквы I, l |
Ошибки ввода-вывода |
Неверное считывание входных данных, неверное задание форма- |
|
тов данных |
Обычно синтаксические ошибки выявляются на этапе трансляции. Многие же другие ошибки транслятору выявить невозможно, так как транслятору неизвестны замыслы программиста.
Отсутствие сообщений о синтаксических ошибках является необходимым, но не достаточным условием, чтобы считать программу правильной.
Примеры синтаксических ошибок:
-пропуск знака пунктуации;
-несогласованность скобок;
-неправильное формирование оператора;
-неверное образование имен переменных;
-неверное написание служебных слов;
-отсутствие условий окончания цикла;
-отсутствие описания массива и т.п.
Существует множество ошибок, которые транслятор выявить не в состоянии, если используемые в программе операторы сформированы верно. Приведем примеры таких ошибок.
Логические ошибки:
-неверное указание ветви алгоритма после проверки некоторого условия;
-неполный учет возможных условий;
-пропуск в программе одного или более блоков алгоритма.
Ошибки в циклах:
-неправильное указание начала цикла;
-неправильное указание условий окончания цикла;
21
-неправильное указание числа повторений цикла;
-бесконечный цикл.
Ошибки ввода-вывода; ошибки при работе с данными:
-неправильное задание типа данных;
-организация считывания меньшего или большего объёма данных, чем требуется;
-неправильное редактирование данных.
Ошибки в использовании переменных:
-использование переменных без указания их начальных значений;
-ошибочное указание одной переменной вместо другой.
Ошибки при работе с массивами:
-массивы предварительно не обнулены;
-массивы неправильно описаны;
-индексы следуют в неправильном порядке. Ошибки в арифметических операциях:
-неверное указание типа переменной (например, целочисленного вместо вещественного);
-неверное определение порядка действий;
-деление на нуль;
-извлечение квадратного корня из отрицательного числа;
-потеря значащих разрядов числа.
Все эти ошибки обнаруживаются с помощью тестирования.
22