- •Общие указания
- •Установка программного обеспечения
- •Основные библиотеки
- •Лабораторная работа №1
- •Основные теоретические сведения Создание проекта
- •Написание программного кода
- •Компиляция и устранение ошибок
- •Запуск программы на выполнение и ее останов
- •Ввод/вывод информации на экран
- •Генератор случайных чисел
- •Задание к лабораторной работе
- •Контрольные вопросы
- •Лабораторная работа №2
- •Основные теоретические сведения
- •Переменные и оператор присваивания
- •Арифметические операторы
- •Математические функции
- •Оператор if
- •Логические операторы
- •Оператор switch
- •Цикл while
- •Цикл for
- •Инструкция return
- •Решение типовых задач
- •Задание к лабораторной работе Варианты заданий к задаче 1
- •Варианты заданий к задаче 2
- •Варианты заданий к задаче 3
- •Контрольные вопросы
- •Лабораторная работа №3
- •Основные теоретические сведения
- •Одномерные массивы
- •Двумерные массивы
- •Алгоритмы
- •Решение типовых задач
- •Варианты заданий
- •Контрольные вопросы
- •Лабораторная работа №4
- •Основные теоретические сведения. Функции
- •Самодиагностика
- •Лабораторная работа №4
- •Основные теоретические сведения.
- •Транспонирование матриц
- •Сложение матриц
- •Умножение матриц
- •Задание на лабораторную работу №4
- •Варианты заданий
- •Контрольные вопросы
- •Лабораторная работа №5
- •Основные теоретические сведения.
- •Работа с файлами
- •Решение типовых задач
- •Задание на лабораторную работу №5
- •Варианты заданий
- •Производная функции на интервале
- •Решение типовых задач
- •Задание на лабораторную работу №6
- •Вычисление интегральной функции
- •Решение типовых задач
- •Задание на лабораторную работу №7
- •Контрольные вопросы
- •Лабораторная работа №8
- •Основные теоретические сведения.
- •Решение типовых задач
- •Задание на лабораторную работу №8
- •Варианты заданий
- •Контрольные вопросы
- •Литература
Самодиагностика
Рассмотрим теперь другую задачу. Пусть необходимо вывести на экран значения функции:
при 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. Нам достаточно контролировать только значение знаменателя. Важно только не ошибиться с выбором значения возвращаемого в случае нарушения нормальной работы.