TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means o...Iosif Itkin
Expanding the Meta-Generation of Correctness Conditions by Means of Semantic Markup
Dmitry Kondratyev, A.P. Ershov Institute of Informatics Systems, Novosibirsk
12 - 14 November 2015
Tools and Methods of Program Analysis in St. Petersburg
TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means o...Iosif Itkin
Expanding the Meta-Generation of Correctness Conditions by Means of Semantic Markup
Dmitry Kondratyev, A.P. Ershov Institute of Informatics Systems, Novosibirsk
12 - 14 November 2015
Tools and Methods of Program Analysis in St. Petersburg
TMPA-2015: Lexical analysis of dynamically formed string expressionsIosif Itkin
Lexical analysis of dynamically formed string expressions
Marina Polubelova, Semyon Grigorev, Saint Petersburg State University, Saint Petersburg
12 - 14 November 2015
Tools and Methods of Program Analysis in St. Petersburg
TMPA-2015: Lexical analysis of dynamically formed string expressionsIosif Itkin
Lexical analysis of dynamically formed string expressions
Marina Polubelova, Semyon Grigorev, Saint Petersburg State University, Saint Petersburg
12 - 14 November 2015
Tools and Methods of Program Analysis in St. Petersburg
Мы закончили рассмотрение паттернов 64-битных ошибок. Последнее на чем мы остановимся в связи с этими ошибками, является то, как они могут проявляться в программах.
Лекция 12. Быстрее, Python, ещё быстрее.Roman Brovko
Измерение времени работы кода на Python с помощью модулей timeit, cProfile и line_profiler. Немного о NumPy. JIT и AOT компиляция кода на Python на примере Numba и Cython.
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
В своем докладе Олег расскажет о замене стандартных функций на более быстрые и об ускорении работы python. Также продемонстрирует несколько примеров быстрых конструкций python.
Многим читателя понравилась моя статья "Последствия использования технологии Copy-Paste при программировании на Си++ и как с этим быть" [1]. Обратил на неё внимание и Scott Meyers [2] и задал вопрос о том, как же собственно статический анализ помог выявить описанные в статье ошибки.
1. Лекция 3. Программирование циклов. Оператор цикла while
Составной оператор
Составной оператор состоит из одного или большего числа операторов
любого типа, заключенных в фигурные скобки.
Пример:
{ x=1; y=2; z=3; }
Он необходим при программировании циклов и ветвлений.
Оператор цикла while
Оператор цикла служит для многократного выполнения одних и тех
же действий. Оператор while используется при программировании циклов
с предусловием:
нет
услов
ие
да
оператор
Формат оператора while:
while ( условие)
оператор
Оператор while выполняется так,
как изображено на схеме.
Проверяется условие; если оно истинно, то выполняется оператор, входящий
в состав while (так называемое "тело цикла"). Затем снова проверяется
условие... Тело цикла будет выполняться до тех пор, пока условие не станет
ложным. Затем управление передается следующему оператору программы.
27
2. Условие - это выражение, которое кроме арифметических операций и
операции присваивания может содержать операции отношения и логические
операции.
Операции отношения:
>
>=
<
больше,
больше или равно,
меньше,
<=
меньше или равно,
==
равно,
!=
не равно.
Логические операции:
&& (и)
| | (или)
! (не)
Условия в циклах задаются в виде целочисленного выражения языка С
в скобках. Условие истинно, если значение выражения ≠ 0, ложно в
противном случае.
Примеры условий:
while ( a>0 )
истинно, если а>0
while ( a )
истинно, если а ≠ 0
while ( a!=0 )
истинно, если а ≠ 0
while ( !a )
истинно, если а = 0
while ( a+b )
истинно, если а+b ≠ 0
while ( a && b )
истинно, если а ≠ 0 и b ≠0
while (a > 0 || b >0)
истинно, если a > 0 или b > 0
Обратите внимание, что тело цикла - это один оператор: либо
простой, либо составной. Если в цикле должны выполняться несколько
операторов, заключите их в фигурные скобки.
28
3. Пример оператора цикла:
while (i<=n)
{ s=s+i/(i+1); i++; }
Пример решения задачи
Задача. Дано действительное число x.
Вычислить значение
sinx
с помощью ряда
x3
x5
x2n+1
y = sinx = x - — + — - ... + (-1) n ——— + ...
3!
с точностью 10
-5
5!
(2n+1)!
(т.е. учитывая только те члены ряда, которые по
абсолютной величине больше либо равны 10-5). Для проверки результата
вычислить sinx с помощью стандартной функции.
Если при вычислении очередного члена ряда отдельно вычислять
числитель и знаменатель, где значения могут быть очень большие, то
получится слишком большая погрешность. Поэтому выведем рекуррентную
формулу вычисления очередного члена ряда через предыдущий член.
Обозначим очередной член данного ряда через an .
a0 = x
x3
x2
a1= - — = -a0* ——
3!
2*3
x5
x2
a2= + — = -a1 * ——
5!
4*5
29
4. ...
an = -an-1
x2
* ————
2n(2n+1)
Поскольку для вычисления очередного члена ряда нужно знать только
значение предыдущего члена, а все суммируемые значения хранить нет
необходимости, то массив не нужен. Достаточно одной простой переменной
для вычисления очередного члена ряда. Назовем ее a.
начало
Ввод x
y=0, a=x, n=0
нет
|a|
≥10-5
да
y=y+a
n=n+1
a=-a x2 /(2n(2n+1))
Вывод
y, sin(x)
конец
Рис. 2.1. Схема алгоритма вычисления y=sinx
30
5. Программа:
/* Приближенное вычисление y=sin x */
#include <stdio.h>
#include <math.h>
#define E 1e-5
/* точность вычисления */
main()
{
float x,
y;
float a;
int n;
/* аргумент функции */
/* сумма ряда
*/
/* очередной член ряда */
/* номер итерации
*/
printf ("x=");
scanf ("%f",&x);
y=0; a=x; n=0;
while ( fabs(a) >= E )
{ y=y+a;
n++;
/* n=n+1; */
a=-a*x*x/(2*n*(2*n+1)); /* вычисление очередного члена ряда
через предыдущий */
}
printf ("y=%fn",y);
printf ("sinx=%fn",sin(x));
return 0;
}
Примеры результатов выполнения программы:
x=3.14159
y=0.000002
sinx=0.000003
x=0
y=0.000000
sinx=0.000000
x=1.5708
y=1.000004
sinx=1.000000
x=-1.5708
y=-1.000004
sinx=-1.000000
31
6. Отладка программы в TURBO C или Borland C++
1. Запустите систему (см. часть 3, приложение 1 или приложение 2) и
введите текст своей программы, соблюдая ступенчатую запись.
2. Выполните компиляцию программы.
При компиляции могут быть обнаружены синтаксические ошибки
в программе. В таком случае в окне Message
появятся сообщения об
ошибках с указанием номеров строк программы, где обнаружены ошибки.
В программе будет выделена первая неверная строка, а курсор укажет на
предполагаемое местоположение ошибки в программе. Исправьте ошибки и
повторите компиляцию.
3. После исправления всех синтаксических ошибок сохраните
программу в файле на диске, указав какое-либо имя с расширением .с .
4.
Запустите программу на выполнение.
По запросу программы введите тестовые исходные данные. Проверьте
результат. Если результаты оказались неверными, проверьте программу.
После редактирования программы повторите действия с пункта 2.
Если программа зациклилась, попытайтесь прервать ее выполнение
с помощью одновременного нажатия клавиш [Ctrl] и [Break]. Если
это
сделать не удалось, снимите задачу, снова запустите систему и откройте
файл со своей программой.
Если причина ошибки не понятна, выполните трассировку программы
на компьютере с помощью команд меню Run и Trace into (F7) или Steep
over (F8). Эти команды вызывают выполнение одной выделенной строки
программы.
При
этом
можно
проследить,
как
меняются
значения
поременных программы. Для этого служит окно Watch. Чтобы добавить в
окно Watch
интересующую вас переменную, нажмите
32
одновременно
7. клавиши [Ctrl] и [F7] и введите имя переменной, затем нажмите [Enter].
Прервать выполнение программы при трассировке можно нажатием
клавиш [Ctrl] - [F2] или выполнив команды меню Run и Program reset.
Контрольные вопросы и упражнения.
1. В каких случаях используется составной оператор?
2. Какие из перечисленных условий будут ложными при заданных
значениях a = 10; b = -5;
a) while (a)
б) while (a>0 || b>0)
в) while (a>0 && b>0)
г) while (!a || b)
д) while (!a && b)
е) while (a && b)
3. Напишите программу вычисления произведения двух натуральных
чисел А и В, не используя операцию умножения: A*B = A+A+ … +A (число
слагаемых равно B).
Выполнение контрольных заданий
1. Получите у преподавателя индивидуальное задание.
2. Составьте блок-схему и программу на языке С и подберите тесты для
проверки программы на компьютере.
3. Отладьте программу на компьютере.
5. Оформите и сдайте отчет.
Контрольные задания
1. Дано действительное число x. Вычислить значение y с помощью
стандартной функции и с помощью ряда с точностью 0,0001:
33
8. x2
x4
x2n
а) y = cos(x) = 1 - — + — - ... + (-1)n ——— + ...
2!
4!
(2n)!
x2 x3
xn
б) y = ex = 1+ x + — + — + ... + — + ...
2! 3!
n!
x2 x3
xn
в) y = e-x = 1- x + — - — + ... + (-1)n — + ...
2! 3!
n!
x2
x3
xn
г) y = ln(1+x) = x - — + — - ... + (-1)n-1 —— + ...
2
3
n
x-1
(x-1)3
(x-1) 5
д) y = ln (x) = 2 ( —— + ——— + ——— + … ) ,
x+1
3(x+1)3
5(x+1)5
x+1
,
где |x|<1.
где x>0
x2
x3
xn
е) y = ln(1-x) = - ( x + — + — + ... + —— + ... ) ,
2
3
n
x3
x5
x7
ж) y = arctg(x) = x - — + — - —— + ...
3
5
7
,
где |x|<1.
где |x|≤1.
1
1
1
з) y = ln ——— = 2 ( —— + —— + —— + … ) ,
x–1
x
3x3
5x5
где |x|>1
(x-1)2
(x-1)3
и) y = ln x = ( x-1) - —— + —— 2
3
… ,
где 0 < x ≤2
(x-1)2 (x-1)3
к) y = ln x = —— + —— + —— +
x
2x2
3x3
… ,
где x > 0.5
x-1
34
9. 2. Дано натуральное число n. Проверить справедливость равенства:
n(n+1)
а) 1 + 2 + 3 +...+ n = ———
2
n(n+1)(2n+1)
б) 12 + 22+ 32 +...+ n2 = ——————
6
в) 1 + 2 + 22 +...+2n-1 = 2n - 1
г) 13 + 23+ 33 +...+ n3 = (1 + 2+ 3 + … + n)2
3. Дано натуральное число n.
а) Определить количество цифр в числе n.
б) Определить сумму его цифр.
в) Определить первую цифру числа n.
35
10. 2. Дано натуральное число n. Проверить справедливость равенства:
n(n+1)
а) 1 + 2 + 3 +...+ n = ———
2
n(n+1)(2n+1)
б) 12 + 22+ 32 +...+ n2 = ——————
6
в) 1 + 2 + 22 +...+2n-1 = 2n - 1
г) 13 + 23+ 33 +...+ n3 = (1 + 2+ 3 + … + n)2
3. Дано натуральное число n.
а) Определить количество цифр в числе n.
б) Определить сумму его цифр.
в) Определить первую цифру числа n.
35