Программа – это аналог формулы в обычной математике.
Формула для функции f, полученной f1, f2, ... fn – выражение, описывающее эту
f = f1* f2* f3*... * fn
Если аналог f1,f2,... fn – операторы языка программирования, то их формула – программа.
Существует два метода обоснования
A**3 = A*A*A A*A*A = A -> R, A*R -> R, A*R -> RПреимущество формального подхода заключается в том, что с его помощью удается избегать обращений к бесконечной области значений и на каждом шаге доказательства оперировать только конечным множеством символов.
Интерпретационный подход используется при экспериментальной проверке соответствия программы своей спецификации
Применение интерпретационного подхода в форме экспериментов над исполняемой программой составляет суть
Термин "
Если программа не содержит синтаксических ошибок (прошла трансляцию) и может быть выполнена на компьютере, она обязательно вычисляет какую-либо функцию, осуществляющую отображение входных данных в выходные. Это означает, что компьютер на своих ресурсах доопределяет частично определенную программой функцию до тотальной определенности. Следовательно, судить о правильности или неправильности результатов выполнения программы можно, только сравнивая спецификацию желаемой функции с результатами ее вычисления, что и осуществляется в процессе
// Метод вычисляет неотрицательную
// степень n числа x
static public double Power(double x, int n)
{
double z=1;
for (int i=1;n>=i;i++)
{
z = z*x;
}
return z;
}
double Power(double x,int n)
{
double z=1;
int i;
for(i=1;n>=i;i++)
{
z=z*x;
}
return z;
}
Если вызвать метод Power с отрицательным значением степени n Power(2,-1), то получим некорректный результат 1. Исправим метод так, чтобы ошибочное значение параметра (недопустимое по спецификации значение) идентифицировалось специальным сообщением, а возвращаемый результат был равен 1 (Пример 2.2).
// Метод вычисляет неотрицательную
// степень n числа x
static public double PowerNonNeg(double x,
int n)
{
double z=1;
if (n>0)
{
for (int i=1;n>=i;i++)
{
z = z*x;
}
}
else Console.WriteLine(
"Ошибка ! Степень числа n" +
" должна быть больше 0.");
return z;
}
double PowerNonNeg(double x, int n)
{
double z=1;
int i;
if (n>0)
{
for (i=1;n>=i;i++)
{
z = z*x;
}
}
else printf("Ошибка! Степень числа n должна быть больше 0.\n");
return z;
}
Если вызвать скорректированный метод PowerNonNeg(2,-1) с отрицательным значением параметра степени, то сообщение об ошибке будет выдано автоматически.
Статическое
Динамическое
X и множестве предполагаемых результатов Y – (X,Y), которые задают график желаемой функции. Кроме того, зафиксирована процедура Yв (вычисленные по входным данным – X) желаемым результатам – Y, т.е. принадлежит ли каждая вычисленная точка (X,Yв) графику желаемой функции (X,Y).
(X,Yв) и ничего не говорит о том, каким образом она была вычислена или каков правильный алгоритм – он только сравнивает вычисленные и желаемые результаты. (X,Y) для вычисления эталонных значений Y.
Пункт спецификации: "Метод Power должен принимать входные параметры: x – целое число, возводимое в степень, и n – неотрицательный порядок степени. Метод должен возвращать вычисленное значение xn ".
Выполняем метод со следующими параметрами: Power(2,2)
Проверка результата выполнения возможна, когда результат вычисления заранее известен – 4. Если результат выполнения 22 = 4, то он соответствует спецификации.
В процессе (X,Y) и соответствующие им результаты вычислений (X,Yв) для идентификации фактов несовпадений (test
При выявлении $$(X,Yв)\notin (X,Y)$$ запускается процедура исправления ошибки, которая заключается во внимательном анализе (просмотре) протокола промежуточных вычислений, приведших к (X,Yв), с помощью следующих
Можно выводить промежуточные значения переменных при выполнении программы. Код, осуществляющий вывод, расположен ниже (Пример 2.3). Этот
// Метод вычисляет неотрицательную
// степень n числа x
static public double Power(double x, int n)
{
double z=1;
for (int i=1;n>=i;i++)
{
z = z*x;
Console.WriteLine("i = {0} z = {1}",
i, z);
}
return z;
}
double Power(double x, int n)
{
double z=1;
int i;
for (i=1;n>=i;i++)
{
z = z*x;
printf("i = %d z = %f\n",i,z);
}
return z;
}
При
Например: на Рис. 2.1 условно изображен 0-1-3-4-5 зафиксирована в Табл. 2.1. Строки таблицы отображают вершины
(рис 2.1) Управляющий граф программы| № вершины-оператора | Значение переменной x | Значение переменной z | Значение переменной n | Значение переменной i |
|---|---|---|---|---|
0 |
3 |
1 |
2 |
не зафиксировано |
1 |
3 |
1 |
2 |
не зафиксировано |
3 |
3 |
1 |
2 |
1 |
4 |
3 |
3 |
2 |
2 |
5 |
3 |
3 |
2 |
не зафиксировано |
Обратное выполнение программы возможно при условии сохранения на каждом шаге программы всех значений переменных или состояний программы для соответствующей трассы. Тогда поднимаясь от конечной точки трассы к любой другой, можно по шагам произвести вычисления состояний, двигаясь от следствия к причине, от состояний на выходе преобразователя данных к состояниям на его входе. Естественно, такие возможности мы получаем в режиме off-line анализа при фиксации в Log – файле всей истории выполнения трассы.
В программе на Пример 2.4 фиксируются значения всех переменных после выполнения каждого оператора.
// Метод вычисляет неотрицательную
// степень n числа x
static public double PowerNonNeg(double x,
int n)
{
double z=1;
Console.WriteLine("x={0} z={1} n={2}",
x,z,n);
if (n>0)
{
Console.WriteLine("x={0} z={1} n={2}",
x,z,n);
for (int i=1;n>=i;i++)
{
z = z*x;
Console.WriteLine(
"x={0} z={1} n={2}" +
" i={3}",x,z,n,i);
}
}
else Console.WriteLine(
"Ошибка ! Степень" +
" числа n должна быть больше 0.");
return z;
}
double PowerNonNeg(double x, int n)
{
double z=1;
int i;
printf("x=%f z=%f n=%d\n",x,z,n);
if (n>0)
{
printf("x=%f z=%f n=%d\n",x,z,n);
for (i=1;n>=i;i++)
{
z = z*x;
printf("x=%f z=%f n=%d i=%d\n",
x,z,n,i);
}
}
else printf(
"Ошибка ! Степень "
"числа n должна быть больше 0.\n");
return z;
}
Зная структуру
Итак, в процессе
The process of operating a system or component under specified conditions,
observing or recording the results, and making an evaluation of someaspect of the system or component .
The process of analyzing a software item to detect the differences between existing and required conditions (that is, bugs) and to evaluate features of software items [[IEEE Std.610-12.1990], .
Возьмем несколько отличающуюся от Пример 2.4 программу:
// Метод вычисляет степень n числа x
static public double Power(int x, int n)
{
int z=1;
for (int i=1;n>=i;i++)
{
z = z*x;
}
return z;
}
[STAThread]
static void Main(string[] args)
{
int x;
int n;
try
{
Console.WriteLine("Enter x:");
x=Convert.ToInt32(Console.ReadLine());
if ((x>=0) (x<=999))
{
Console.WriteLine("Enter n:");
n=Convert.ToInt32(Console.ReadLine());
if ((n>=1) (n<=100))
{
Console.WriteLine("The power n" + " of x is {0}", Power(x,n));
Console.ReadLine();
}
else
{
Console.WriteLine("Error : n " + "must be in [1..100]");
Console.ReadLine();
}
}
else
{
Console.WriteLine("Error : x " + "must be in [0..999]");
Console.ReadLine();
}
}
catch (Exception e)
{
Console.WriteLine("Error : Please enter " + "a numeric argument.");
Console.ReadLine();
}
}
#include <stdio.h>
double Power(int x, int n)
{
int z=1;
int i;
for (i=1;n>=i;i++)
{
z = z*x;
}
return z;
}
void main(void)
{
int x;
int n;
printf("Enter x:");
if(scanf("%d",x))
{
if ((x>=0) (x<=999))
{
printf("Enter n:");
if(scanf("%d",n)) {
if ((n>=1) (n<=100))
{
printf("The power n of x is %f\n", Power(x,n));
}
else
{
printf("Error : n must be in [1..100]\n");
}
}
else
{
printf("Error : Please enter a numeric argument\n");
}
}
else
{
printf("Error : x must be in [0..999]\n");
}
}
else
{
printf("Error : Please enter a numeric argument\n");
}
}
Для приведенной программы, вычисляющей степень числа (Пример 2.5), воспроизведем последовательность действий, необходимых для
Спецификация программы
На вход программа принимает два параметра: x - число, n – степень. Результат вычисления выводится на консоль.
Значения числа и степени должны быть целыми.
Значения числа, возводимого в степень, должны лежать в диапазоне – [0..999].
Значения степени должны лежать в диапазоне – [1..100].
Если числа, подаваемые на вход, лежат за пределами указанных диапазонов, то должно выдаваться сообщение об ошибке.
Разработка тестов
Определим области эквивалентности входных параметров.
Для x – числа, возводимого в степень, определим классы возможных значений:
x < 0 (ошибочное)x > 999 (ошибочное)x - не число (ошибочное)0 <= x <= 999 (корректное)Для n – степени числа:
n < 1 (ошибочное)n > 100 (ошибочное)n - не число (ошибочное)1 <= n <= 100 (корректное)Анализ тестовых случаев
(x = 2, n = 3) (покрывают классы 4, 8).Ожидаемый результат: The power n of x is 8.
{(x = -1, n = 2),(x = 1000, n = 5)} (покрывают классы 1, 2).Ожидаемый результат: Error : x must be in [0..999].
{(x = 100, n = 0),(x = 100, n = 200)} (покрывают классы 5,6).Ожидаемый результат: Error : n must be in [1..100].
(x = ADS n = ASD) (покрывают классы эквивалентности 3, 7).Ожидаемый результат: Error : Please enter a numeric argument.
(x = 999, n = 1).Ожидаемый результат: The power n of x is 999.
(x = 0, n = 100).Ожидаемый результат: The power n of x is 0.
Выполнение тестовых случаев
Запустим программу с заданными значениями аргументов.
Оценка результатов выполнения программы на тестах
В процессе (X,Y) и соответствующие им результаты вычислений YВ. В процессе
Реализация
Основная
Рассмотрим вопросы
/* Функция вычисляет неотрицательную
степень n числа x */
1 double Power(double x, int n){
2 double z=1; int i;
3 for (i=1;
4 n>=i;
5 i++)
6 {z = z*x;} /* Возврат в п.4 */
7 return z;}
/* Функция вычисляет неотрицательную
степень n числа x */
1 double Power(double x, int n){
2 double z=1; int i;
3 for (i=1;
4 n>=i;
5 i++)
6 {z = z*x;} /* Возврат в п.4 */
7 return z;}
(рис 2.2) Управляющий граф программы1 и 2 не включаются в
G(V,A), где V(V1,… Vm) – множество вершин (операторов), A(A1,… An) – множество дуг (управлений), соединяющих операторы-вершины
Vi и приходит в вершину Vj, например: (3,4,7), (3,4,5,6,4,5,6), (3,4), (3,4,5,6)
(V1, V2, … Vk), где V1 - либо первый, либо условный оператор программы, Vk - либо условный оператор, либо оператор выхода из программы, а все остальные операторы – безусловные, например: (3,4) (4,5,6,4) (4,7).
Существуют реализуемые и нереализуемые
float H(float x,float y)
{
float H;
1 if (x*x+y*y+2<=0)
2 H = 17;
3 else H = 64;
4 return H*H+x*x;
}
float H(float x,float y)
{
float H;
1 if (x*x+y*y+2<=0)
2 H = 17;
3 else H = 64;
4 return H*H+x*x;
}
Например, для функции Пример 2.7 (1,3,4) реализуем, (1,2,4) нереализуем в условиях нормальной работы. Но при сбоях даже нереализуемый
Рассмотрим два примера
H(x:int, y:int) реализована в машине с 64 разрядными словами, тогда мощность множества тестов ||(X,Y)||=2**128Это означает, что компьютеру, работающему на частоте 1Ггц, для
Этот тривиальный пример требует
// Прочитать значения датчика
static public bool ReadSensor(bool Sensor)
{
//...чтение значения датчика
Console.WriteLine("...reading sensor value");
return Sensor;
}
// Открыть схват
static public void OpenHand()
{
//...открываем схват
Console.WriteLine("...opening hand");
}
// Закрыть схват
static public void CloseHand()
{
//...закрываем схват
Console.WriteLine("...closing hand");
}
[STAThread]
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("Enter Sensor value (true/false)");
if (ReadSensor(Convert.ToBoolean(Console.ReadLine())))
{
OpenHand();
CloseHand();
}
}
}
#include <stdio.h>
/* Прочитать значения датчика */
int ReadSensor(int Sensor)
{
/* ...чтение значения датчика */
printf("...reading sensor value\n");
return Sensor;
}
/* Открыть схват */
void OpenHand()
{
/* ...открываем схват */
printf("...opening hand\n");
}
/* Закрыть схват */
void CloseHand()
{
/* ...закрываем схват */
printf("...closing hand\n");
}
void main(void)
{
int s;
while (1)
{
printf("Enter Sensor value (0/1)");
scanf("%d",s);
if (ReadSensor(s))
{
OpenHand();
CloseHand();
}
}
}
(рис 2.3) Тестовая последовательность сигналов датчика схватаОтсюда вывод:
Требование к тестам - программа на любом из них должна останавливаться, т.е. не зацикливаться. Можно ли заранее гарантировать
Задача о (X,Y) для проверки программы в общем случае неразрешима.
Поэтому для решения практических задач остается искать частные случаи решения этой задачи.
Программа – это аналог формулы в обычной математике.
Формула для функции f, полученной f1, f2, ... fn – выражение, описывающее эту
f = f1* f2* f3*... * fn
Если аналог f1,f2,... fn – операторы языка программирования, то их формула – программа.
Существует два метода обоснования
A**3 = A*A*A A*A*A = A -> R, A*R -> R, A*R -> RПреимущество формального подхода заключается в том, что с его помощью удается избегать обращений к бесконечной области значений и на каждом шаге доказательства оперировать только конечным множеством символов.
Интерпретационный подход используется при экспериментальной проверке соответствия программы своей спецификации
Применение интерпретационного подхода в форме экспериментов над исполняемой программой составляет суть
Термин "
Если программа не содержит синтаксических ошибок (прошла трансляцию) и может быть выполнена на компьютере, она обязательно вычисляет какую-либо функцию, осуществляющую отображение входных данных в выходные. Это означает, что компьютер на своих ресурсах доопределяет частично определенную программой функцию до тотальной определенности. Следовательно, судить о правильности или неправильности результатов выполнения программы можно, только сравнивая спецификацию желаемой функции с результатами ее вычисления, что и осуществляется в процессе
// Метод вычисляет неотрицательную
// степень n числа x
static public double Power(double x, int n)
{
double z=1;
for (int i=1;n>=i;i++)
{
z = z*x;
}
return z;
}
double Power(double x,int n)
{
double z=1;
int i;
for(i=1;n>=i;i++)
{
z=z*x;
}
return z;
}
Если вызвать метод Power с отрицательным значением степени n Power(2,-1), то получим некорректный результат 1. Исправим метод так, чтобы ошибочное значение параметра (недопустимое по спецификации значение) идентифицировалось специальным сообщением, а возвращаемый результат был равен 1 (Пример 2.2).
// Метод вычисляет неотрицательную
// степень n числа x
static public double PowerNonNeg(double x,
int n)
{
double z=1;
if (n>0)
{
for (int i=1;n>=i;i++)
{
z = z*x;
}
}
else Console.WriteLine(
"Ошибка ! Степень числа n" +
" должна быть больше 0.");
return z;
}
double PowerNonNeg(double x, int n)
{
double z=1;
int i;
if (n>0)
{
for (i=1;n>=i;i++)
{
z = z*x;
}
}
else printf("Ошибка! Степень числа n должна быть больше 0.\n");
return z;
}
Если вызвать скорректированный метод PowerNonNeg(2,-1) с отрицательным значением параметра степени, то сообщение об ошибке будет выдано автоматически.
Статическое
Динамическое
X и множестве предполагаемых результатов Y – (X,Y), которые задают график желаемой функции. Кроме того, зафиксирована процедура Yв (вычисленные по входным данным – X) желаемым результатам – Y, т.е. принадлежит ли каждая вычисленная точка (X,Yв) графику желаемой функции (X,Y).
(X,Yв) и ничего не говорит о том, каким образом она была вычислена или каков правильный алгоритм – он только сравнивает вычисленные и желаемые результаты. (X,Y) для вычисления эталонных значений Y.
Пункт спецификации: "Метод Power должен принимать входные параметры: x – целое число, возводимое в степень, и n – неотрицательный порядок степени. Метод должен возвращать вычисленное значение xn ".
Выполняем метод со следующими параметрами: Power(2,2)
Проверка результата выполнения возможна, когда результат вычисления заранее известен – 4. Если результат выполнения 22 = 4, то он соответствует спецификации.
В процессе (X,Y) и соответствующие им результаты вычислений (X,Yв) для идентификации фактов несовпадений (test
При выявлении $$(X,Yв)\notin (X,Y)$$ запускается процедура исправления ошибки, которая заключается во внимательном анализе (просмотре) протокола промежуточных вычислений, приведших к (X,Yв), с помощью следующих
Можно выводить промежуточные значения переменных при выполнении программы. Код, осуществляющий вывод, расположен ниже (Пример 2.3). Этот
// Метод вычисляет неотрицательную
// степень n числа x
static public double Power(double x, int n)
{
double z=1;
for (int i=1;n>=i;i++)
{
z = z*x;
Console.WriteLine("i = {0} z = {1}",
i, z);
}
return z;
}
double Power(double x, int n)
{
double z=1;
int i;
for (i=1;n>=i;i++)
{
z = z*x;
printf("i = %d z = %f\n",i,z);
}
return z;
}
При
Например: на Рис. 2.1 условно изображен 0-1-3-4-5 зафиксирована в Табл. 2.1. Строки таблицы отображают вершины
(рис 2.1) Управляющий граф программы| № вершины-оператора | Значение переменной x | Значение переменной z | Значение переменной n | Значение переменной i |
|---|---|---|---|---|
0 |
3 |
1 |
2 |
не зафиксировано |
1 |
3 |
1 |
2 |
не зафиксировано |
3 |
3 |
1 |
2 |
1 |
4 |
3 |
3 |
2 |
2 |
5 |
3 |
3 |
2 |
не зафиксировано |
Обратное выполнение программы возможно при условии сохранения на каждом шаге программы всех значений переменных или состояний программы для соответствующей трассы. Тогда поднимаясь от конечной точки трассы к любой другой, можно по шагам произвести вычисления состояний, двигаясь от следствия к причине, от состояний на выходе преобразователя данных к состояниям на его входе. Естественно, такие возможности мы получаем в режиме off-line анализа при фиксации в Log – файле всей истории выполнения трассы.
В программе на Пример 2.4 фиксируются значения всех переменных после выполнения каждого оператора.
// Метод вычисляет неотрицательную
// степень n числа x
static public double PowerNonNeg(double x,
int n)
{
double z=1;
Console.WriteLine("x={0} z={1} n={2}",
x,z,n);
if (n>0)
{
Console.WriteLine("x={0} z={1} n={2}",
x,z,n);
for (int i=1;n>=i;i++)
{
z = z*x;
Console.WriteLine(
"x={0} z={1} n={2}" +
" i={3}",x,z,n,i);
}
}
else Console.WriteLine(
"Ошибка ! Степень" +
" числа n должна быть больше 0.");
return z;
}
double PowerNonNeg(double x, int n)
{
double z=1;
int i;
printf("x=%f z=%f n=%d\n",x,z,n);
if (n>0)
{
printf("x=%f z=%f n=%d\n",x,z,n);
for (i=1;n>=i;i++)
{
z = z*x;
printf("x=%f z=%f n=%d i=%d\n",
x,z,n,i);
}
}
else printf(
"Ошибка ! Степень "
"числа n должна быть больше 0.\n");
return z;
}
Зная структуру
Итак, в процессе
The process of operating a system or component under specified conditions,
observing or recording the results, and making an evaluation of someaspect of the system or component .
The process of analyzing a software item to detect the differences between existing and required conditions (that is, bugs) and to evaluate features of software items [[IEEE Std.610-12.1990], .
Возьмем несколько отличающуюся от Пример 2.4 программу:
// Метод вычисляет степень n числа x
static public double Power(int x, int n)
{
int z=1;
for (int i=1;n>=i;i++)
{
z = z*x;
}
return z;
}
[STAThread]
static void Main(string[] args)
{
int x;
int n;
try
{
Console.WriteLine("Enter x:");
x=Convert.ToInt32(Console.ReadLine());
if ((x>=0) (x<=999))
{
Console.WriteLine("Enter n:");
n=Convert.ToInt32(Console.ReadLine());
if ((n>=1) (n<=100))
{
Console.WriteLine("The power n" + " of x is {0}", Power(x,n));
Console.ReadLine();
}
else
{
Console.WriteLine("Error : n " + "must be in [1..100]");
Console.ReadLine();
}
}
else
{
Console.WriteLine("Error : x " + "must be in [0..999]");
Console.ReadLine();
}
}
catch (Exception e)
{
Console.WriteLine("Error : Please enter " + "a numeric argument.");
Console.ReadLine();
}
}
#include <stdio.h>
double Power(int x, int n)
{
int z=1;
int i;
for (i=1;n>=i;i++)
{
z = z*x;
}
return z;
}
void main(void)
{
int x;
int n;
printf("Enter x:");
if(scanf("%d",x))
{
if ((x>=0) (x<=999))
{
printf("Enter n:");
if(scanf("%d",n)) {
if ((n>=1) (n<=100))
{
printf("The power n of x is %f\n", Power(x,n));
}
else
{
printf("Error : n must be in [1..100]\n");
}
}
else
{
printf("Error : Please enter a numeric argument\n");
}
}
else
{
printf("Error : x must be in [0..999]\n");
}
}
else
{
printf("Error : Please enter a numeric argument\n");
}
}
Для приведенной программы, вычисляющей степень числа (Пример 2.5), воспроизведем последовательность действий, необходимых для
Спецификация программы
На вход программа принимает два параметра: x - число, n – степень. Результат вычисления выводится на консоль.
Значения числа и степени должны быть целыми.
Значения числа, возводимого в степень, должны лежать в диапазоне – [0..999].
Значения степени должны лежать в диапазоне – [1..100].
Если числа, подаваемые на вход, лежат за пределами указанных диапазонов, то должно выдаваться сообщение об ошибке.
Разработка тестов
Определим области эквивалентности входных параметров.
Для x – числа, возводимого в степень, определим классы возможных значений:
x < 0 (ошибочное)x > 999 (ошибочное)x - не число (ошибочное)0 <= x <= 999 (корректное)Для n – степени числа:
n < 1 (ошибочное)n > 100 (ошибочное)n - не число (ошибочное)1 <= n <= 100 (корректное)Анализ тестовых случаев
(x = 2, n = 3) (покрывают классы 4, 8).Ожидаемый результат: The power n of x is 8.
{(x = -1, n = 2),(x = 1000, n = 5)} (покрывают классы 1, 2).Ожидаемый результат: Error : x must be in [0..999].
{(x = 100, n = 0),(x = 100, n = 200)} (покрывают классы 5,6).Ожидаемый результат: Error : n must be in [1..100].
(x = ADS n = ASD) (покрывают классы эквивалентности 3, 7).Ожидаемый результат: Error : Please enter a numeric argument.
(x = 999, n = 1).Ожидаемый результат: The power n of x is 999.
(x = 0, n = 100).Ожидаемый результат: The power n of x is 0.
Выполнение тестовых случаев
Запустим программу с заданными значениями аргументов.
Оценка результатов выполнения программы на тестах
В процессе (X,Y) и соответствующие им результаты вычислений YВ. В процессе
Реализация
Основная
Рассмотрим вопросы
/* Функция вычисляет неотрицательную
степень n числа x */
1 double Power(double x, int n){
2 double z=1; int i;
3 for (i=1;
4 n>=i;
5 i++)
6 {z = z*x;} /* Возврат в п.4 */
7 return z;}
/* Функция вычисляет неотрицательную
степень n числа x */
1 double Power(double x, int n){
2 double z=1; int i;
3 for (i=1;
4 n>=i;
5 i++)
6 {z = z*x;} /* Возврат в п.4 */
7 return z;}
(рис 2.2) Управляющий граф программы1 и 2 не включаются в
G(V,A), где V(V1,… Vm) – множество вершин (операторов), A(A1,… An) – множество дуг (управлений), соединяющих операторы-вершины
Vi и приходит в вершину Vj, например: (3,4,7), (3,4,5,6,4,5,6), (3,4), (3,4,5,6)
(V1, V2, … Vk), где V1 - либо первый, либо условный оператор программы, Vk - либо условный оператор, либо оператор выхода из программы, а все остальные операторы – безусловные, например: (3,4) (4,5,6,4) (4,7).
Существуют реализуемые и нереализуемые
float H(float x,float y)
{
float H;
1 if (x*x+y*y+2<=0)
2 H = 17;
3 else H = 64;
4 return H*H+x*x;
}
float H(float x,float y)
{
float H;
1 if (x*x+y*y+2<=0)
2 H = 17;
3 else H = 64;
4 return H*H+x*x;
}
Например, для функции Пример 2.7 (1,3,4) реализуем, (1,2,4) нереализуем в условиях нормальной работы. Но при сбоях даже нереализуемый
Рассмотрим два примера
H(x:int, y:int) реализована в машине с 64 разрядными словами, тогда мощность множества тестов ||(X,Y)||=2**128Это означает, что компьютеру, работающему на частоте 1Ггц, для
Этот тривиальный пример требует
// Прочитать значения датчика
static public bool ReadSensor(bool Sensor)
{
//...чтение значения датчика
Console.WriteLine("...reading sensor value");
return Sensor;
}
// Открыть схват
static public void OpenHand()
{
//...открываем схват
Console.WriteLine("...opening hand");
}
// Закрыть схват
static public void CloseHand()
{
//...закрываем схват
Console.WriteLine("...closing hand");
}
[STAThread]
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("Enter Sensor value (true/false)");
if (ReadSensor(Convert.ToBoolean(Console.ReadLine())))
{
OpenHand();
CloseHand();
}
}
}
#include <stdio.h>
/* Прочитать значения датчика */
int ReadSensor(int Sensor)
{
/* ...чтение значения датчика */
printf("...reading sensor value\n");
return Sensor;
}
/* Открыть схват */
void OpenHand()
{
/* ...открываем схват */
printf("...opening hand\n");
}
/* Закрыть схват */
void CloseHand()
{
/* ...закрываем схват */
printf("...closing hand\n");
}
void main(void)
{
int s;
while (1)
{
printf("Enter Sensor value (0/1)");
scanf("%d",s);
if (ReadSensor(s))
{
OpenHand();
CloseHand();
}
}
}
(рис 2.3) Тестовая последовательность сигналов датчика схватаОтсюда вывод:
Требование к тестам - программа на любом из них должна останавливаться, т.е. не зацикливаться. Можно ли заранее гарантировать
Задача о (X,Y) для проверки программы в общем случае неразрешима.
Поэтому для решения практических задач остается искать частные случаи решения этой задачи.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.