- •Формулировка задачи
- •2. Представление данных и ограничения
- •Описание функций программы
- •3.1. Иерархическая схема
- •Title – вывод заголовка программы
- •3.2. Прототипы функций
- •4. Алгоритм решения задачи
- •Поменять местами calc и yesno
- •5. Тестовые наборы данных и реакции
- •5.1. Таблица тест-реакция для чисел
- •5.2. Таблица тест-реакция для управления
- •Исходный текст программы
- •7. Описание тестирования программы
- •7.1. Таблица точек останова
- •1. Было:
- •2. Было:
- •3. Было
- •8. Анализ работы по решению задачи
- •1. Было:
- •2. Было:
- •3. Было
7. Описание тестирования программы
Для тестирования программы использовался встроенный символический отладчик Turbo C Version 2.1. Были использованы такие его возможности, как слежение за ходом выполнения программы и контроль значений переменных в точках останова.
7.1. Таблица точек останова
№ |
Файл |
Функция |
Оператор |
Просматриваемая переменная |
1 |
myio2.c |
GetNum |
if( scanf( “%d”, &n ) != 1 ) |
n |
2 |
myio2.c |
GetNum |
if( scanf( “%d”, &n ) != 1 ) |
n |
3 |
myio2.c |
GetNum |
if( n < minnum ) |
n |
4 |
myio2.c |
GetNum |
if( n > maxnum ) |
n |
5 |
myio2.c |
YesNo |
c = getchar
|
c |
В результате работы были выявлены следующие наиболее типичные синтаксические ошибки:
1. Было:
файл: myio2.с, функция Finish
void finish( char *final );
{
printf( “%s\n ”,final )
}
стало:
void Finish( char *final )
{
printf( “%s\n ”,final );
}
2. Было:
файл: main2.c, функция main
{
do{
title( SQUARES );
getpar( );
calc( );
…
стало:
{
do{
Title( SQUARES );
GetPar( );
Calc( );
…
3. Было
файл: calc2.c, функция calc
…
for( i = 0; i < maxnum; i+)
{
n = Begnum + i;
printf( OUTMSG, n, n * n );
…
стало
…
for( i = 0; i < Maxnum; i++)
{
n = Begnum + i;
printf( OUTMSG, n, n*n );
…
Устранив синтаксические ошибки, я смог скомпилировать программу и начал ее отладку.
После первого программы я подтвердил намерение повторить прогон программы, но на экран было выведено “Работа завершена” и был выполнен выход из программы. После проверки соответствующего значения переменной с в функции YesNo я пришел к выводу о необходимости ввести функцию fflush для очистки буфера.
1. Было:
файл: myio2.c, функция YesNo
int YesNo( char *text )
{
int c;
printf( “\n%s”, text );
c = getchar( );
if( (c == ’y’) || (c == ’Y’) )
return 1;
else
return 0;
}
стало:
файл: myio2.c, YesNo
int YesNo( char *text )
{
int c;
printf( “\n%s”, text );
fflush( stdin );
c = getchar( );
if( (c == ’y’) || (c == ’Y’) )
return 1;
else
return 0;
}
На ввод некоторых чисел программа реагировала некорректными значениями квадрата чисел. Я пришел к выводу о необходимости изменения ОДЗ для вводимых чисел.
На ввод достаточно большого количества выводимых чисел в процессе вывода на экране происходило смещение начальных строк за активную область экрана. Чтобы все строки умещались в видимой области, я изменил максимальное количество выводимых строк:
2. Было:
файл: const.h
#define MINNUM 1 /* мин. обрабатываемое число */
#define MAXNUM 1000 /* макс. Обрабатываемое число */
#define MINLINES 1 /* мин. выводимое число строк */
#define MAXLINES 1000 /* макс. выводимое число строк */
стало:
#define MINNUM -181 /* мин. обрабатываемое число */
#define MAXNUM 181 /* макс. Обрабатываемое число */
#define MINLINES 1 /* мин. количество выводимых строк */
#define MAXLINES 20 /* макс. количество выводимых строк */
Даже после введения истинных для каждой переменной ОДЗ при введении некоторых значений результат вычисления был неверен. С помощью отслеживания значений в точке останова я убедился в том, что некоторые значения, истинные для каждой переменной в отдельности несовместимы. Поэтому следующим моим шагом было введение проверки на совместимость.
3. Было:
файл: myio2.c, функция GetPar
void GetPar( void )
{
Begnum = GetNum( STARTNUM, MINNUM, MAXNUM );
Maxnum = GetNum( NUMBERS, MINLINES, MAXLINES );
}
стало:
файл: myio2.c, функция GetPar
void GetPar( void )
{
Begnum = GetNum( STARTNUM, MINNUM, MAXNUM );
Maxnum = GetNum( NUMBERS, MINLINES, MAXLINES );
if( Begnum + Maxnum > MAXNUM + 1 )
Maxnum = MAXNUM - Begnum + 1;
}
Далее при последующих прогонах я решил ввести защиту от введения нечисла, так как таковая не была введена ранее.
4. Было:
Файл: myio2.c, функция GetNum
int GetNum( char* query, int minnum, int maxnum )
{
int n;
printf( "\n%s = ", query );
if( n < minnum )
n = minnum;
else if( n > maxnum )
n = maxnum;
return n;
}
стало:
int GetNum( char* query, int minnum, int maxnum )
{
int n;
printf( "\n%s = ", query );
fflush( stdin );
if( scanf( "%d", &n ) != 1 )
n = ( minnum + maxnum ) / 2;
else if( n < minnum )
n = minnum;
else if( n > maxnum )
n = maxnum;
return n;
}
Стараясь привести программу к более логичному виду, я решил перенести знаки форматирования из констант в функции, управляющие вводом/выводом.
5. Было:
Файл: myio2.c, функция YesNo
int YesNo( char* text )
{
int c;
printf( “%s”, text );
fflush( stdin );
c = getchar( );
if ( (c == ’y’) || (c == ’Y’) )
return 1;
else
return 0;
}
стало:
int YesNo( char* text )
{
int c;
printf( “\n%s [Y/N]? ”, text );
fflush( stdin );
c = getchar( );
if ( (c == ’y’) || (c == ’Y’) )
return 1;
else
return 0;