Читайте также:
|
|
Для тестирования программы использовался встроенный символический отладчик Turbo C Version 2.1. Были использованы такие его возможности, как слежение за ходом выполнения программы и контроль значений переменных в точках останова.
Таблица точек останова
№ | Файл | Функция | Оператор | Просматриваемая переменная |
myio2.c | GetNum | if(scanf(“%d”, &n) != 1) | n | |
myio2.c | GetNum | if(scanf(“%d”, &n) != 1) | n | |
myio2.c | GetNum | if(n < minnum) | n | |
myio2.c | GetNum | if(n > maxnum) | n | |
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();
…
Было
файл: 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;
Дата добавления: 2015-07-20; просмотров: 70 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Исходный текст программы | | | Анализ работы по решению задачи |