Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
mlr_progr_1sem.doc
Скачиваний:
7
Добавлен:
03.11.2018
Размер:
1.72 Mб
Скачать

Самодиагностика

Рассмотрим теперь другую задачу. Пусть необходимо вывести на экран значения функции:

при x = 0,…9.

Очевидно, что значение функции Func в точке x = 5 нельзя рассчитать обычными методами так как возникает ситуация деления на нуль. Если мы попытаемся решить эту задачу также как мы это сделали для функции mean у нас возникнет системная ошибка (деление на нуль) и программа завершит свое выполнение.

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

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

В нашем случае функция Func может предсказать ситуацию деления на нуль и не допустить ее.

Рассмотрим несколько из вариантов как можно этого добиться.

Вариант первый. Анализируя функцию Func, приходим к выводу, что в точке x = 5 функция принимает значение 0. Используя эту информацию, мы можем самостоятельно рассчитать значение функции в интересующей нас точке. В этом случае наша программа примет вид представленный в листингах 29 – 31.

Листинг 29

/* Первый вариант самодиагностирования программы

файл main.cpp */

#include “func.h”

#include <stdio.h>

int main( void )

{

int i;

for ( i = 0; i < 10; i++ )

{

printf( "func(%d) = %g\n", i, Func( i ));

}

return 0;

}

Листинг 30

/* Первый вариант самодиагностирования программы

файл func.h */

#ifndef __FUNC_

#define __FUNC_

double Func( int nArg1 );

#endif

Листинг 31

/* Первый вариант самодиагностирования программы

файл func.cpp */

#include "func.h"

#include <math.h>

double Func( int nArg1 )

{

if ( nArg1 == 5 )

{

return 0;

}

else

{

return pow( nArg1, 2 ) / ( nArg1 – 5 );

}

}

Обратите внимание на то, что в данном случае реализовать самодиагностику нам помогло предварителное знание свойств функции. В современном ПО такие ситуацие крайне редки.

Рассмотрим второй вариант реализации самодиагностики. Он основан на том, что функция в случае ошибки возвращает значение которое принципиально не может возникнуть в случае нормального завершения работы. Например, функция возвращает количество чего-либо. В случае ошибки она может вернуть отрицательное число и т.п. Этот подход реализован в листингах 32-34.

Листинг 32

/* Второй вариант самодиагностирования программы

файл main.cpp */

#include “func.h”

#include <stdio.h>

int main( void )

{

int i;

for ( i = 0; i < 10; i++ )

{

double dResult = Func( i );

if ( dResult > -1000 )

{

printf( "func(%d) = %g\n", i, Func( i ));

}

else

{

printf( "Division by zero\n");

}

}

return 0;

}

Листинг 33

/* Второй вариант самодиагностирования программы

файл func.h */

#ifndef __FUNC_

#define __FUNC_

double Func( int nArg1 );

#endif

Листинг 34

/* Второй вариант самодиагностирования программы

файл func.cpp */

#include "func.h"

#include <math.h>

double Func( int nArg1 )

{

double dDenominator = ( nArg1 – 5 );

if ( dDenominator == 0 )

{

return -1000;

}

else

{

return pow( nArg1, 2 ) / dDenominator;

}

}

Во втором варианте мы используем знание о том, что функция Func не может принимать значения меньше –1000. В случае когда знаменатель превращается в нуль ( dDenominator = 0 ) функция возвращает значение –1000 которое сигнализирует функции main об ошибке деления на нуль.

Как видите в этом случае мы уже не нуждаемся в заниях свойств функции Func. Нам достаточно контролировать только значение знаменателя. Важно только не ошибиться с выбором значения возвращаемого в случае нарушения нормальной работы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]