Стадия 2. Препроцессорная обработка программы
На второй стадии программист дает команду скомпилировать программу. В системе С++ перед началом компиляции автоматически исполняется программа- препроцессорю.
Препроцессор С++ распознает команды , называемые препроцессорными директивами, которые указывают , что над программой перед компиляцией должны быть произведены определенные манипуляции. Эти манипуляции состоят обычно во включении в компиляцию других текстовых файлов и различных текстовых заменах.
Стадия 3. Компиляция программы
На третьей стадии компилятор транслирует программу на С++ в код машинного языка
( называемый также объектным кодом )
Стадия 4. Компоновка.
Четвертая стадия называется компоновкой (linking). Программы С++ обычно содержат ссылки на функции и данные , определяемые в другом месте (или проект содержит несколько cpp файлов) , например , в библиотеках или частных библиотеках группы программистов, работающих над конкретным проектом. Из-за отсутствия этих частей в программах С++ имеются “дыры”. Компоновщик (linker) присоединяет к объектному коду код отсутствующих функций, чтобы создать исполняемый образ. Если программа успешно компилируется и компонуется , образуется исполняемый файл.
Стадия 5. Загрузка
Для того чтобы программа смогла исполняться , необходимо поместить ее в память. Это выполняется программой загрузчиком
Стадия 6. Исполнение
Наконец , компьютер под управлением центрального процессора, исполняет программу одиночными инструкциями.
Переменные
Тип Диапазон Размер
bool true 1; false 0 1байт
char
signed -128 до 127 1байт
unsigned 0 до 255 1 байт
Int
signed mod 232-1 4 байтa
unsigned 0 до 4 294 967 295 4 байтa
Double 3.4e-308-1.7e+308 8 байов
Лекция№2
Алгебра логики
Bool a,y,z
True-истина
False-ложь
Операции
Конъюнкция
&&- *, ^.& -and
Дизъюнкция
||-v-or
Отрицание
!- ⌐X-not
X | Y | X&Y | XVY | ⌐X |
Правило де Моргана
⌐XvY= ⌐X&⌐Y ⌐ X&Y= ⌐Xv ⌐Y
X | Y | XVY | ⌐XVY | ⌐X | ⌐Y | ⌐X&⌐Y |
X&(Y v Z)=X&Y v X&Z
X v (Y&Z) =(X v Y) & (X v Z)
X v ⌐X =1
X & ⌐X =0
Импликация
Из X следует Y
X | Y | XàY |
Пересечение X ^ Y
Объединение X v Y
Пример
D=D1^D1^D2^D3^D4
(X,Y) € D →((X,Y) € D1)& ((X,Y) € D2)& ((X,Y) € D3)& ((X,Y) € D4)
На языке С
(X,Y) € D →(Y>=X-1)&& (Y<=X+1)& & (Y<= -X+1)&& (Y >= -X-1)
D=D1vD1vD2vD3vD4
(X,Y) € D→(Y>=X-1) || (Y<=X+1)|| (Y<= -X+1)|| (Y >= -X-1)
A € X\Y=X ^ ⌐Y
X\Y c X ^ ⌐Y
X ^ ⌐YcX\Y
Доказательство:
1) p€ X\Y=(p € X)&(p € ⌐Y)=p€ X ^ ⌐Y
2) p€ X ^ ⌐Y=(p € X)&(p € ⌐Y)=p€ X\Y
D1\D2
(X,Y) € D1\D2 =(X,Y) € D1^⌐ D2
((X,Y) € D1)&&((X,Y) € ⌐ D2)↔ ((X,Y) € D1)&&!(( X,Y) € D2)
Лекция№3
Операторы
Условный оператор
Полный
If ( B) C1; else C2;
если условие В истинно, то выполнится действие C1;
если условие В ложно, то выполнится действие C2;
Неполный
If ( B) C1;
Блочный оператор
if (B) {c1;c2;}
else c3;
*{c1;c2;}-блок операторов
Примеры
1)Вычисление max
x, y
max=max{x, y}
if (x<y) max=y;
else max=x;
max=max{x, y, z}
1)
if (x<y)
if (y<z) max=z;
else max=y;
else if (x<z) max=z;
else max=x;
2)
max=x;
if (max<y) max=y;
if (max<z) max=z;
3)
if (1) {if (2) 1;}
else 2;
4)
if (1)
if (2) 1;
else 2;
5)
if (1)
{
1;
if (2) {2;3;}
else {4;5;}
6;
}
else
{
if (3)
{
if (4) {3;4;}
}
else 9;
10;
}
6) Решение квадратного уравнения ax2+bx+c=0
# include <iostream.h>
# include <math.h>
void main()
{
int a ,b, c;
double x, d, x1, x2;
cout<<”Enter a, b, c”;
cin>>a, b, c;
if (a==0)
{
if (b==0)
{
if (c==0) cout<<”x-любое число”;
else cout<<”“нет решений”;
}
else {x= -c/b;}
}
else
{
D=b*b-4*a*c;
if (D>=0)
{
x1=( -b+ sqrt(D))/(2*a);
x2= (-b- sqrt(D))/(2*a);
}
else cout<<”нет действительных корней”;
}
cout<<endl;
}
Примечание
Возведение в степень
b2=paw(b,2)
Нельзя объявлять переменную два раза в одном и том же блоке
void main()
{
int i;
i=5;
{
int i;
i=10;
cout<<i; //на экран будет выведено 10
}
cout<<i; //на экран будет выведено 5
}
Лекция №4
Системы счисления
Циклы
Десятичная0,1,2,3,4,5,6,7,8,9
904=9*102+0*10+4*100
Двоичная0,1
1012=1*22+0*2+1*20=510
Троичная0,1,2
1013=1*32+0*3+1*30=1010
Шестнадцатеричная0,1,2,3,4,5,6,7,8,9,A, B, C, D
ABBA16=10*163+11*162+11*16+10*160=40960+2816+176+10=4396210
Перевод вещественных чисел из одной системы в другую
904,90410=1110001000,1112
Перевод целой части
904/2=452 остаток 0
452/2=226 остаток 0
226/2=113 остаток 0
113/2=56 остаток 1
56/2=28 остаток 0
28/2=14 остаток 0
14/2=7 остаток 0
7/2=3 остаток 1
3/2=1 остаток 1
Перевод дробной части
0,904*2=1,808
0,808*2=1,616
0,616*2=1,232
0,232*2=0,464
Перевод из двоичной системы в четверичную, восьмеричную, шестнадцатеричную.
0110111011100011=123232034
= 673438
=6ЕЕ316
10 16 2
0 0 0000
1 1 0001
2 2 0010
9 9 1001
10 А 1010
11 B 1011
12 C 1100
13 D 1101
14 E 1110
15 F 1111
10010=11001002=12104=1448=6416
int x =100
количество байтов=4 байт
1 байт=8 бит 4 байта=32бит
Инверсия битов
0→1
1→0
Прибавляя к коду 1, получаем число в дополнительном коде
0,25*1010-порядок
↕
Мантисса
Double 4 байта
▄1 ▄2 ▄3 ▄4 - мантисса
Порядок
Примечание
int x=100; double y=2.5;
y-y+x- тип double
Циклы
1) Цикл с предусловием
While (B) C;
Пустой цикл
Бесконечный цикл
While (B)
{
C1;C2;C3;
}
Цикл с постусловием
Do C while ( B)
Пример 1
С помощью цикла while вычислить
y=1+2+3+..+n
y=∑in=1i
# include <iostream.h>
void main()
{ int i ,y, n;
cout<<”Enter n=”;
cin>>n;
y=0;
i=1;
while (i<=n) { y=y+i;
i++;
}
cout<<”y=”<<y<<endl;
}
С помощью цикла do while вычислить
y=1+2+3+..+n
# include <iostream.h>
void main()
{ int i ,y, n;
cout<<”Enter n=”;
cin>>n;
y=0;
i=1;
do { y=y+i;
i++;
}
while (i<=n);
cout<<”y=”<<y<<endl;
}
Пример 2
y=1/1!+1/2!+1/3!+…1/n!
y=y+1/f - тип double
# include <iostream.h>
void main()
{
int i ,f, n;
double y;
cout<<”Enter n=”;
cin>>n;
y=0;
i=1;
f=1;
while (i<=n)
{f=f*i;
y=y+(double)1/f;
i++;
}
cout<<”y=”<<y<<endl;
}
Пример 3
Вычислить y=sin(x)
sin (x) =x -x3/3!+x5/5!-x7/7!+…
sin( x) = ∑0∞ (-1)i x2i+1/(2i+1)!
1 способ
step=x
znak=1
fact=1
y=y+ step*znak/fact
# include <iostream.h>
# include <math.h>
void main()
{
int i, n, fact, znak;
double y,x,step;
cout<<”enter x=”;
cin>>x;
cout<<”enter n=”;
cin>>n;
y=x;
znak=1;
step=x;
factorial=1;
for ( i=1;i<=n;i++)
{
znak=-znak;
step=step*x*x;
factorial=factorial*2*i*(2*i+1);
y=y+znak*stepen/fact;
}
cout<<”y=”<<y;
cout<<”sin(x)=”<<sin(x);
}
2 способ (универсальный для всех рядов )
y= x-x3/3!+x5/5!-x7/7!+…
y=∑0∞ (-1)i x2i+1/(2i+1)!= ∑0∞ti
ti=ti-1*p
p= ti/ ti-1= ((-1)i x2i+1/(2i+1)!)/ ((-1)i-1 x2i-1/(2i-1)!)= -x2/2*i*(2*i+1)
# include <iostream.h>
void main()
{
double y, x, t;
int i, n;
cout << ”enter x=”;
cin >> x;
cout << ”enter n=”;
cin >> n;
y=x;
t=x;
for ( i=1;i<=n;i++)
{
t= -t*x*x/((2*i+1)*2*i)
y=y+t;
}
cout << ”y=” << y;
}
Возможные варианты
while- вариант
# include <iostream.h>
# include <math.h>
void main()
{
const double eps=0.001;
double y, x, t;
cout << ”enter x=”;
cin >> x;
y=0;
t=x;
int i=1;
while (fabs(t)>eps)
{
y = y+t;
t = -t*x*x/((2*i+1)*2*i);
i++;
}
Cout << ”y=” << y;
}
2) При помощи цикла for
for (int i=1; fabs(t)>eps; i++)
{
t= -t*x*x/((2*i-1)*2*i)
y=y+t;
}
Пример 4
Вычислить косинус
Cos(x)=∑i∞ (-1)i x2i/2i!
p = -x2 / ((2*i+1)*2*i)
# include <iostream.h>
void main()
{double y, x, t; int n;
int n;
cout<<”enter x=”;
cin>>x;
cout<<”enter n=”;
cin>>n;
y=x;
t=x;
for (int i=1;i<=n;i++)
{
t= -t*x*x/((2*i-1)*2*i)
y=y+t;
}
cout<<”y=”<<y;
}
Лекция №5