Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой - Специфицирование и тестирование программ.doc
Скачиваний:
63
Добавлен:
02.05.2014
Размер:
125.95 Кб
Скачать

2 Методика выполнения курсовой работы

2.1 Цель работы

Целью курсовой работы, методика выполнения которой изложена ниже, является получение начальных навыков проектирования и разработки программ с применением структурных методов анализа, а также усвоение методов тестирования разработанных программ.

2.2 Постановка задачи обработки информации

Применение описанных методов специфицирования и тестирования рассмотрим на примере.

На магнитном диске текстовым редактором EDIT созданы файлы F1 и F2, структура которых и пример заполнения приведены соответственно в таблицах 2.1 и 2.2.

Таблица 2.1 - Структура и содержание файла F1

ФИО студента

Номер группы

Номер предмета

Оценка

Иванов И.И.

Т28-Т210

2

3

Сидоров С.А.

Т28-Т210

5

2

Смирнов А.А.

Т28-Т210

2

5

Петрова М.С.

Т28-Т210

5

3

Иванов И.И.

Т28-Т210

5

3

Петров П.В.

Т28-Т210

1

5

Иванов И.И.

Т28-Т210

1

4

Таблица2.2 - Структура и содержание файла F2

Номер предмета

Наименование предмета

1

Математика

2

Физика

3

Химия

4

Иностранный язык

5

Алгоритмические языки

В файлах F1 и F2 данные одного поля записи отделяются от данных следующего за ним поля хотя бы одним пробелом. На основании информации из этих файлов необходимо получить отчет, вид которого представлен в таблице 2.3.

Таблица 2.3 - Выходная таблица

Номер группы

Наименование предмета

Оценка

Количество оценок в группе

Т28-Т210

Математика

4

1

Физика

3

1

5

1

Алгоритмические языки

2

1

3

2

Т28-Т211

Математика

5

1

2.3 Ограничения на входные и выходные данные

Согласно учебному плану, студенты сдают в сессию не более 5-6 экзаменов, кроме того, академические группы насчитывают максимум 25-30 студентов. Положим, что при постановке эти ограничения были конкретизированы следующим образом:

а) количество различных предметов у одной академической группы не превышает 5;

б) число студентов в группе не превышает 25 человек;

в) еще одним ограничением является диапазон оценок. Очевидно, оценка может принимать значения 2, 3, 4, 5;

г) кроме того, номеру предмета может быть поставлено в соответствие некоторое наименование, если номер предмета из файла F1 совпадает с одним из номеров предметов файла F2;

д) корректная справочная информация в файле F2 должна удовлетворять следующему условию: номера предметов и соответствующие им наименования должны быть уникальными, то есть разным номерам предметов не могут соответствовать одинаковые наименования и один и тот же номер не может быть присвоен двум или более наименованиям предметов.

Перечисленные ограничения должны быть учтены при разработке алгоритма решения задачи и внешних спецификаций программы. Кроме того, при дальнейшем изложении методики разработки программы предполагается, что записи в файле F1 упорядочены по номеру группы. При выполнении работы студенты могут либо сразу создавать текстовым редактором отсортированный файл, либо могут осуществить его программную сортировку, что, естественно, будет только приветствоваться.

2.4 Структурирование целей разрабатываемой программы

Предлагаемая задача обработки данных не настолько сложна, чтобы её обязательно необходимо было структурировать. Однако попытаемся вычленить из неё более простые функции, чтобы упростить их описание и, в дальнейшем, кодирование. Основанием для такого структурирования послужат следующие соображения.

Корректность информации файла F2 следует проверять до совместной обработки файлов F1 и F2. Более того, в случае её некорректности есть смысл решение задачи обработки прекратить до устранения всех ошибок в файле F2. Следовательно, эту функцию выделим из задачи обработки, как относительно самостоятельную, и назовем её “проверка на корректность файла F2”.

При совместной обработке файлов F1 иF2 должны проверяться условия‘в’и‘г’. Результатом совместной обработки и проверки условий‘в’и‘г’должно быть формирование записи в выходной таблице либо сообщение, предупреждающее об ошибке в информации файлаF1.

Следует отметить, что условия ‘а’и‘б’могут быть проверены лишь после того, как обработаны все записи файлаF1, относящиеся к одной академической группе. В случае, если ограничения выполняются, никаких действий не требуется. Если же ограничения не выполняются, то рекомендуется выдать в выходной таблице предупреждающие сообщения о нарушении ограничений. Эти действия подводят итог обработки данных, относящихся к одной академической группе.

Назовем соответственно эти функции “формирование строк выходной таблицы” и “подведение итогов обработки данных одной академической группы” и приведем структуру целей разрабатываемой программы ( рисунок 3.1).

Рисунок 2.1 -Структура целей программы

2.5 Внешние спецификации функций разрабатываемой программы

Внешние спецификации функций разрабатываемой программы строятся в соответствии с описанной в п. 1.1.2 методикой построения таблиц решений.

Функция ‘проверка на корректность файлаF2’должна выявлять возможную неуникальность номеров или наименований предметов и в случае обнаружения такой ситуации заканчивать обработку. Это словесное описание выполняемой функции формализуется в виде ТР, приведенной в таблице 2.4.

Напомним, что в ТР буква “Д” в программе соответствует ситуации, когда логическая переменная принимает значение TRUE, соответственно Н - логическая переменная принимает значениеFALSE. Цифрами отмечаются те действия, которые должны быть выполнены при истинности или ложности проверяемых условий, причем значение указывает порядок выполнения в программе соответствующих операторов. Черточкой “-“ отмечены те условия, которые в соответствующей комбинации не проверяются.

Таблица 2.4 - ТР для функции “проверка на корректность файла F2”

Условия

1

2

3

4

5

Имеют ли 2 разных предмета одинаковые номера?

Н

Д

Н

-

-

Присвоены ли 2 разных номера одному предмету?

Н

Н

Д

-

-

Просмотрены все записи файла F2?

Н

Н

Н

Д

Д

Обнаружена некорректность F2?

-

-

-

Д

Н

Действия

Выдать сообщение 1 ‘2-м предметам’<имя1, имя2>‘присвоен один номер’<N>

1

Выдать сообщение 2 ‘предмету’<имя> ‘присвоены 2 разных номера’ <N1,N2>

1

Установить признак некорректности

2

2

Занести запись из файла в таблицу TAB

1

Продолжить обработку

2

3

3

1

Выдать сообщение 3 ‘внесите исправления вF2’

1

Прекратить обработку

2

В выдаваемых программой сообщениях в ограничителях ‘<>’ указаны те элементы сообщения, которые должны быть заменены соответствующим наименованием предмета (имя, имя1, имя2) или номером предмета (N, N1, N2) из файлаF2. Таблица TAB представляет собой массив записей следующей структуры:

type zap1 : record

N: integer;{номер предмета}

NAME:string (30) {наименование предмета}

end;

var TAB : array [1..30] of zap1;

Содержанием функции ‘формирование строк выходной таблицы’является проверка ограничений 3, 4 пункта 2.3 и формирование списка предметов для функции‘подведение итогов обработки данных одной академической группы’. Соответствующая ТР приведена в таблице 2.5.

Формируемый список предметов представляет собой таблицу - в языке программирования PASCAL это массив записей следующего вида:

type zap2 : record

nom : integer;{номер предмета}

itog : integer {общее количество оценок по предмету}

end;

var spisok : array [1..5] of zap2;

Таблица 2.5 - ТР для функции “формирование строк выходной таблицы”

Условия

1

2

3

4

5

6

7

Оценка в интервале [2,5]?

Д

Д

Н

Н

Д

Д

-

Существует () вTAB номер предмета, совпадающий с номером предмета из файлаF1?

Д

Д

-

-

Н

Н

-

в списке предметов номер предмета, совпадающий с номером предмета изF1?

Н

Д

-

-

-

-

-

Просмотрены все записи файла F1, относящиеся к одной академической группе?

Н

Н

Н

Д

Н

Д

-

Просмотрены все записи файла F1?

Н

Н

Н

Н

Н

Н

Д

Действия

Выдать сообщение 4 ‘оценка не в диапазоне[2,5]’

1

1

Выдать сообщение 5 ‘не найдено наименование, соответствующее номеру предмета’<N>

1

1

Записать номер предмета в список

1

Добавить 1 к общему количеству оценок по текущему предмету

2

1

Выполнить функцию ‘подведение итогов обработки данных одной академической группы’

2

2

1

Очистить список

3

3

Продолжить обработку

3

2

2

4

2

4

Закончить обработку

2

Отметим, что столбцы 4 и 6 таблицы 2.5 отражают такую ситуацию, когда ошибка обнаруживается в первой записи, относящейся к академической группе, а столбцы 3 и 5 - когда ошибочная запись не является первой записью среди данных одной академической группы. Кроме того, записи, в которых обнаруживается ошибка (неправильно указана оценка или номер предмета), в дальнейшем не обрабатываются, поэтому не исключена ситуация, когда в одной академической группе не будет обнаружено ни одной правильной записи.

Сформированный список обрабатывается функцией ‘подведение итогов обработки данных одной академической группы’. Причем очевидно, что если в списке больше 5 предметов, то нарушается ограничение‘а’из пункта 2.3, а если общее количество оценок больше 25, то нарушается ограничение‘б’из пункта 2.3. ТР для этой функции приводится в таблице 2.6.

Таблица 2.6 - ТР функции ‘подведение итогов обработки данных одной академической группы’

Условия

1

2

3

4

5

Количество предметов в списке больше 1?

Д

Н

Д

Д

Д-

Количество предметов в списке меньше 6?

Д

-

Д

Н

Н

Общее число оценок по предмету <=25?

Д

-

Н

Д

Н

Действия

Выдать сообщение 6 ‘в группе’<номер группы>‘ни одна запись не расшифрована’

1

Выдать сообщение 7 ‘в группе’<номер группы>‘больше 5 предметов’

1

1

Выдать сообщение 8 ‘в группе’<номер группы> ‘по предмету’ <имя>‘больше 25 оценок’

1

2

Закончить функцию

1

2.6 Рекомендации по кодированию программы

При достаточно большой практике работы с общесистемным и прикладным программным обеспечением можно заметить, что одни программные продукты более ‘дружественны’пользователю, другие - менее. Так, сообщения транслятора Турбо Паскаля об ошибке в программе, сформулированные на английском языке, очень часто приводят студентов в замешательство, особенно тех, кто изучал другой иностранный язык. Это пример того, как не нужно писать свои программы. Практический вывод, который студент может сделать и самостоятельно, таков:

- сообщения, формируемые программой, должны быть лаконичны, но содержать всю необходимую для принятия решения информацию.

Так, если при проверке файла F2 на корректность при неуникальности номеров или наименований предметов программист предусмотрит выдачу сообщения‘В файлеF2обнаружена ошибка’, то при большом объеме информации в файле найти конкретную ошибку будет не так просто, ведь из сообщения непонятно, надо ли искать одинаковые номера или одинаковые наименования предметов. Поэтому рекомендуем обратить внимание на приведенные в данном методическом пособии таблицы решений 2.4- 2.6, в которых демонстрируются примеры подробных сообщений об обнаруженных ошибках.

Вторая рекомендация относится к проверке данных прежде, чем программа начнет их обрабатывать. В противном случае программист не застрахован от ситуаций, аналогичных вычислению площади по трем сторонам, одна из которых больше суммы двух других сторон, или, например, от получения отрицательных значений времени. Поэтому, создавая свои программы, возьмите за правило:

- программа должна принимать от пользователя любые данные, однако, если введенная информация не является допустимой, программа должна информировать об этом пользователя.

Кодирование программы обработки, соответствующей заданию на курсовую работу, может быть выполнено на языках программирования Турбо Паскале или Си. Ниже приводятся необходимые сведения для обработки данных из текстовых файлов в программе.

В Турбо Паскале различают текстовые файлы, типированные файлы и нетипированные файлы /3/.

При работе с файлами ключевым понятием является понятие переменной файлового типа или файловой переменной (ФП). В зависимости от класса файла ФП описывается одним из следующих способов:

- VAR<имя ФП>:Text-для текстового файла;

- VAR<имя ФП>:File of<Тип компонентов>- для типированного файла;

- VAR<имя ФП>:File - для нетипированного файла.

ФП связывается с именем файла оператором

ASSIGN(<ФП>’<путь к файлу>\<имя конкретного файла>’).

Этот оператор должен быть первым среди операторов, работающих с файлом. В кавычках указывается внешнее имя файла. Если во внешнем имени отсутствует указание пути, файл ищется в текущей директории.

Прежде чем станут доступны для чтения компоненты файла, его необходимо открыть оператором RESET(<ФП>), после чего автоматически текущим становится компонент с номером 0. Для чтения компонентов файла используются процедурыReadln иRead.

Текстовый файл не является однородной последовательностью символов, его компонентами являются строки, заканчивающиеся маркерами конца строки Eoln(занимает 2 байта и содержит коды :#13).

При работе с текстовым файлом список ввода (вывода) может содержать переменные символьного, строкового и любого числового типа. Запрещены в списке ввода (вывода) переменные-структуры (запись, массив, множество), но можно вводить из текстового файла простые значения полей записей или элементов массива.

Компоненты файла F1 могут иметь в программе следующее описание:

Var

FIO: String[20];

NGR: String[9];

X: String[1];

NPR, REZ: Word;

в описании фиксируется, “ФИО студента” занимает 20 позиций в записи компоненты текстового файла, следующий за этим полем пробел и номер группы (NGR) занимают 9 позиций, затем следует один пробел (Х) и целочисленные поля номер предмета (NPR) и оценка (REZ).

Положим, что файл F1 имеет внешнее имя “Rezses.dat” и помещен в ту же директорию, что и файл программы, и приведём операторы доступа в программе к компонентам файла F1:

Var

f: text;

Begin

Assign(f, ‘Rezses.dat’);

Reset(f);

While not EOF(f) do

Begin

readln(f, FIO, NGR, X, NPR, REZ);

{операторы обработки данных из записи}

End;

Close (f)

End.

Отметим, что процедура Readln считывает строку от начала; всякий раз, как только все перечисленные в списке ввода переменные получат значения, остаток строки (если он есть) вместе с маркером конца строки пропускаются и программа готова читать следующую строку из файла для чтения. При вводе значения символьной переменной оператор Read считывает в неё очередной символ строки, в том числе и символы маркера конца строки или конца файла. При вводе значений числовой переменной символы считываются вплоть до пробела, символа табуляции, маркера конца строки или конца файла и интерпретируются, как одно значение.

Доступ к полям записи файла F1 можно было получить в программе и другим способом, описав запись F1, как строку символов (длина строки=20+1+8+1+1+1+1+2=35, где последним слагаемым являются 2 символа Eoln-маркера конца строки).

Type

Stro=String[35];

Var

fp: File of Stro;

NGR:String[8];

m, NPR, REZ:Word;

S:Stro;

Begin

Assign (fp, ‘Rezses.dat’);

Reset(fp);

Repeat

Read(fp, s);

NGR:=Copy (S,22,8);

Val (Copy (S, 31, 1), NPR, m);

if m<>0 then Writeln (‘нечисловой номер предмета’);

Val (Copy (S, 33, 1), REZ, m);

if m<>0 then Writeln(‘нечисловая оценка’);

{другие операторы обработки}

Until EOF (fp);

Close (fp)

End.

В языке СИ файлы рассматриваются как неструктурированные последовательности байтов, ввод-вывод которых осуществляется библиотечными функциями /9/. Библиотека языка СИ поддерживает несколько уровней ввода-вывода, из них для выполнения стандартных операций применяют ввод-вывод, ориентированный на поток. Функции библиотеки, поддерживающие такой обмен данными с файлами на уровне потока, позволяют обрабатывать данные разных размеров и форматов, обеспечивая при этом буферизированный ввод-вывод. Таким образом, согласно концепции языка СИ, поток - это файл вместе с предоставляемыми средствами буферизации.

Для того, чтобы можно было использовать функции библиотеки ввода-вывода, в программу необходимо включить заголовочный файл stdio.h, который содержит прототипы функций ввода-вывода, а также определения констант, типов и структур, требуемых для работы функций обмена с потоком.

Данные в файле становятся доступными после его открытия. При этом в исполняемой программе поток связывается со структурой предопределеннного типа FILE. Определение структурного типаFILE включено в заголовочный файлstdio.h и включает: указатель на буфер, указатель (индикатор) текущей позиции в потоке и другие аналогичные компоненты, поддерживающие обмен с потоком. При открытии потока в программу возвращается указатель на поток, который является адресом объекта структурированного типаFILE ( иначе говоря, совокупности всех тех компонент, о которых упоминалось выше). Этот указатель и будет определять поток во всех последующих операциях и должен быть объявлен в программе, например, следующим образом:

# include < stdio.h >

FILE *fp.

Объявленный указатель fpприобретет конкретное значение в результате выполнения функции открытия потока:

fp=fopen (имя_файла, режим_открытия).

Параметры имя_файла и режим_открытия являются строковыми данными, содержащими соответственно внешнее имя файла, связанного с потоком, и символьное обозначение режима открытия, например:

fp=fopen (²t.txt², ²r²),

где t.txt- внешнее имя файла данных в текущем каталоге;r обозначает режим работы с файлом (тип доступа к потоку).

Стандартно файл, связанный с потоком, можно открыть в одном из следующих режимов:

- ²r²означает открытие для чтения существующего текстового файла;

- ²w²открывает для записи новый текстовый файл, причем если файл с таким внешним именем уже существует на носителе, то его содержание будет потеряно;

-²a² открывает существующий текстовый файл для дозаписи (добавления новой порции) информации;

-²r+² означает открытие существующего текстового файла как для чтения, так и для изменения содержимого файла;

- ²w+²открывает новый текстовый файл для чтения-записи и последующих многократных изменений содержимого файла, причем если файл уже существует, то предыдущее содержимое стирается;

-²a+² открывает существующий текстовый файл для добавления или создает новый текстовый файл (если на носителе такого файла нет).

Обратите внимание, что во всех вышеперечисленных случаях поток открывается в текстовом режиме, для которого характерно, что прочитанная из потока комбинация символов CR (значение 13 - управляющий код‘возврат каретки’) иLF(значение 10 - управляющий код‘перевод строки’) преобразуется в один символ‘\n’, имеющий значение, совпадающее сLF. При записи в поток в текстовом режиме осуществляется обратное преобразование ( т.е. символ‘\n’заменяется последовательностью CRLF). Если поток открыт для изменений, т.е. в параметре режима присутствует символ‘+’, то разрешен как вывод в поток, так и чтение из него.

При открытии потока могут возникать такие характерные ошибки, когда на диске не найден файл, связанный с потоком, диск заполнен или защищен от записи. В таких случаях указатель на поток приобретает значение NULL, которое определено в файлеstdio.h. Заметим, что значение указателя на поток в любом режиме, отличном от вышеуказанных ошибочных ситуаций, не бывает равнымNULL. Поэтому типичная последовательность операторов при открытии текстового файла, связанного с потоком, и с проверкой ошибочных ситуаций может быть следующей:

if ((fp=fopen(²t.txt², ²w²))= = NULL)

{

perror (²ошибка при открытии файлаt.txt \n²);

exit (0);

}

Для вывода на экран дисплея сообщения об ошибке при открытии потока используется стандартная библиотечная функция perror (), прототип которой находится вstdio.h.

После того, как файл открыт, конкретные значения полей записей файла можно либо считывать из него, либо записывать в файл (в зависимости от режима). Когда все операции с данными файла закончены, файл рекомендуется закрывать явно, для чего используется библиотечная функция fclose(указатель_на_поток). После закрытия файл может быть открыт повторно в другом режиме (этот прием часто используется, когда в одной программе создается новый файл, а затем информация из него обрабатывается согласно некоторому алгоритму).

Следует обратить внимание, что понятие текстового файла в языках программирования Паскаль и СИ не эквивалентны, единственным общим свойством является то, что в обоих языках в текстовых файлах записи отделяются друг от друга комбинацией кодов ‘возврат каретки’и‘перевод строки’. Понятию текстового файла Паскаля как совокупности записей из полей данных символьного типа в языке СИ соответствует текстовый файл форматного ввода-вывода (такой же файл создается стандартным текстовым редакторомEDITMS DOS, достоинством файлов такого типа является то, что конкретные значения полей записей из них могут непосредственно отображаться на экран дисплея без преобразования вьюеромVIEW). Логичнее было бы во всех языках программирования и системах программирования такие файлы называть символьными, что могло бы исключить разночтение.

В языке программирования СИ ввод-вывод таких файлов выполняется функциями fscanf () и fprintf(), которые имеют следующие прототипы:

int fscanf (указатель_на_поток, форматная_строка, список_адресов_переменных);

int fprintf (указатель_на_поток, форматная_строка, список_адресов_переменных).

Эти функции очень схожи с функциями scanf () и printf()для форматного обмена с клавиатурой и дисплеем, отличие лишь в том, что в случае обмена, ориентированного на поток, в качестве первого параметра функций требуется задавать указатель на поток, с которым производится обмен.

Для полноты изложения приведем фрагмент программы на языке СИ, включающий операторы чтения результатов сессии из вышеприведенного файла Rezses.dat:

# include < stdio.h >

void main()

{

char fio[21], ngr[9];

int npr,rez;

FILE *f;

if ((f=fopen(²Rezses.dat², ²r²))= = NULL)

{

perror (²ошибка при открытии файла Rezses.dat \n²);

exit (0);

}

while ( fscanf(f, ²%s%s%d%d², fio, ngr, &npr,&rez)!=EOF);

{ операторы обработки данных из записи}

fclose(f);

}

2.7 Тестирование программы

Согласно изложенной в 2.2.3 методики тестирования спецификаций необходимо разработать как минимум один тест на каждый столбец таблиц решений 2.4- 2.6, т.е. всего 17 тестов. Полное тестирование приводить вряд ли имеет смысл из-за его громоздкости, поэтому ограничимся двумя тестами, на которых продемонстрируем примеры изложения в отчете целей и результатов тестирования.

2.7.1 Тестирование функции ‘проверка на корректностьF2’

Цель теста: проверить функционирование программы при неуникальных номерах предметов.

Содержание теста: файл F2включает записи, приведенные в таблице 2.7.

Таблица2.7 - Содержание файла F2.

Номер предмета

Наименование предмета

1

Математика

2

Физика

2

Химия

4

Иностранный язык

5

Алгоритмические языки

Ожидаемый результат: сообщение ‘2-м предметам физика, химия присвоен один номер 2’.

Фактический результат: совпадает с ожидаемым.

Результат тестирования: неуспешный.

2.7.2 Тестирование функции ‘формирование строк выходной таблицы’

Цель теста: проверить функционирование программы при несовпадении номеров предметов в файлах F1иF2.

Содержание теста отражено в таблицах 2.8, 2.9.

Таблица2.8 - Содержание файла F2.

Номер предмета

Наименование предмета

1

Математика

2

Физика

3

Химия

4

Иностранный язык

5

Алгоритмические языки

Таблица 2.9 - Содержание файла F1.

ФИО студента

Номер группы

Номер предмета

Оценка

Иванов И.И.

Т28-Т210

2

3

Сидоров С.А.

Т28-Т210

5

2

Смирнов А.А.

Т28-Т210

2

5

Петрова М.С.

Т28-Т210

6

3

Иванов И.И.

Т28-Т210

5

3

Петров П.В.

Т28-Т210

1

5

Иванов И.И.

Т28-Т210

1

4

Ожидаемый результат представляет собой выходной документ на экране дисплея, содержание которого приведено между горизонтальными линиями ниже.

__________________________________________________________________

Номер группы

Наименование предмета

Оценка

Количество оценок в группе

Т28-Т210

Математика

4

1

Физика

3

1

5

1

Алгоритмические языки

2

1

3

1

Т28-Т211

Математика

5

1

Не найдено наименование, соответствующее номеру предмета 6

Фактический результат: совпадает с ожидаемым.

Результат тестирования: неуспешный.