Стадия 2. Препроцессорная обработка программы

Первый семестр

Литература

1. Герберт. Шилдт. С++ руководство для начинающих

2. Т.А. Павловская. С/С++ Программирование на языке высокого уровня

3. Никлаус Вирт. Алгоритмы и структуры данных

4. Т.А. Павловская, Ю.А. Щупак С/C++ Структурное программирование. Практикум

5. В.В. Лаптев , А.В. Морозов , А.В.Бокова. С++ объектно-ориентированное программирование. Задачи и упражнения

6. Н. Культин . С/С++ в задачах и примерах

7. Л.З. Шауцукова. Информатика 10-11

Методическая литература

1. В.С. Кугураков, Р.К. Самитов, В.В. Кугуракова

Практикум на ЭВМ. Методические указанияи задачи для программирования

по теме : Основные структуры управления

2. В.С. Кугураков, Р.К. Самитов, В.В. Кугуракова

Практикум на ЭВМ. Методические указанияи задачи для программирования \

по теме : Циклическая структура управления. Массив как стуктура данных

3. В.С. Кугураков, Р.К. Самитов, Р.Б. Ахтямов, В.Р. Байрашева

Практикум работы на ЭВМ.

Задание 1. Структуры управления и массивы – числовые задачи

4. В.С. Кугураков, Р.К. Самитов, Р.Б. Ахтямов, В.Р. Байрашева

Практикум работы на ЭВМ.

Задание 2. Процедуры и функции

5. В.С. Кугураков, Р.К. Самитов, Р.Б. Ахтямов, В.Р. Байрашева

Практикум работы на ЭВМ.

Задание 3. Представление данных и методы разработки алгоритмов

6. В.С. Кугураков, Р.К. Самитов, Р.Б. Ахтямов, В.Р. Байрашева

Практикум работы на ЭВМ.

Задание 4. Синтаксический анализ простых формальных языков

Лекция№1

Введение в C++

Пример задачи

(Методическое пособие.

Задание 1,структура уравнений и массивно-числовые задачи)

Вычисление объема конуса

Формула:1/3*π*R2*h

π =pi=3.14 определяется как константа

Листинг программы

#include<iostream.h> //описание объекта cin и cout

const double pi=3.14;

void main() //основная функция функция не имеет параметров.

{

double V, h, R; // объявление переменных

cout<<”Enter R= ”; //просьба ввести радиус конуса

cin>>R; //ввод данных

cout<<”Enter h= ”; //просьба ввести высоту конуса

cin>>h; //ввод данных

V=R*R*h*pi/3;// оператор присваивания

сout<<”V=”<<V<<endl; //вывод данных(объема заданного конуса)

}

Рассмотрим каждую строчку отдельно.

  1. #include<iostream.h>

В языке С++ определены ряд заголовочных файлов

( с расширением .h) , которые содержат информацию , необходимую для программы.

В данном случае #include<iostream.h> - директива препроцессора. include – включить

h файл с именем iostream в исходный текст программы. Файл iostream.h используется для поддержки С++ системы ввода и вывода. В данном случае компилятору необходимо знать описание объектов cin и cout



  1. const double pi=3.14;

Объявление вещественной константы pi

3/ void main()

void – тип функции (без значения.т.е. функция не фозвращает значения)

main- имя функции. Выполнение С++- программы начинается и заканчивается выполнением функции main()

4. {

Фигурная открывающая скобка { - начало блока

Блок

{

операторы

}

5. double V, h, R;

Объявление вещественных переменных

6. cout<<”Enter R= ”;

Это инструкция вывода символьной константы

<<”Enter R= ” на консоль. При выполнении этой инструкции на экране компьютера появится сообщение Enter R=. В этой инструкции используется оператор вывода <</

Он обеспечивает вывод выражения, стоящего с правой стороны , на устройство, стоящего с левой. Слово coutпредставляет собой встроенный идентификатор ( consol output ),

который означает экран компьютера.

7. cin>>R;

cin – встроенный идентификатор, в данном случае он связан с клавиатурой.

>> - оператор ввода в С++

Иденитификатор R принимает символы , вводимые с клавиатуры.

8. V=R*R*h*pi/3

Это выражение представляет собой оператор присваивания.

Вычисляется выражение R*R*h*pi/3 и его значение устанавливается для переменной V (говорят , что переменной V присваивается значение вырыжения R*R*h*pi/3)

9. }

Закрывающая фигурная скобка } означает конец блока.

Примечание : все инструкции долдны завершаться символом ;

Типичная среда разработки С++

Давайте разберем, поэтапно, создание и исполнение приложения С++ в типичной среде разработки С++. Системы С++ обычно состоит из трех частей: среды разработки, языка и Стандартой библиотеки С++.

Инструменты среды обработки C++

- Borland C++ Builder,

- Microsoft Visual Studia C++ 6

- Microsoft Visual Studia 2010 Express

- Microsoft Visual C++ .NET

( работают под операционной системой Windows)

- GNU C++ в Linux (общее название Unix – подобных операционных систем)

Программы на С++ проходят шесть стадий:

  1. редактирования
  2. препроцессорной обработки
  3. компиляции
  4. компоновки
  5. загрузки
  6. исполнения


Стадия 2. Препроцессорная обработка программы - student2.ru

Типичная среда

1. Программа создается редактором и сохраняется на диске

Редактор ↔Диск

2. Программа предварительно обрабатывается. Преобразование кода

Препроцессор↔ Диск

3. Объектный код и сохранение его на диске

Компилятор↔ Диск

4. Компоновщик связывает объектный код с библиотеками (редактор связи)

Компоновщик↔Диск

5. Загрузчик создает исполняющий файл и сохраняет на диске. Размещение программы в памяти

Загрузчик↔ Диск

ОЗУ

6. Процессор выбирает каждую инструкцию и выполняет ее, возможно сохраняя новые значения.

Процессор↔ ОЗУ

Стадия 1. Создание программ

Первая стадия состоит в редактировании файла с помощью программ редактора.

С помощью редактора вы вводите программу на С++ ( которую обычно называют исходным кодом) вносите необходимые исправления и сохраняете программу на вторичном запоминающем устройсте , например ,на жестком диске. Файлы исходного кода С++ часто имеют расширение .cpp, .cxx, .C , показывающие, что файл содержит исходный код С++

Стадия 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

Пример

Стадия 2. Препроцессорная обработка программы - student2.ru

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

Стадия 2. Препроцессорная обработка программы - student2.ru

(X,Y) ? D→(Y>=X-1) || (Y<=X+1)|| (Y<= -X+1)|| (Y >= -X-1)

Стадия 2. Препроцессорная обработка программы - student2.ru

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;

Стадия 2. Препроцессорная обработка программы - student2.ru

Неполный

If ( B) C1;

Стадия 2. Препроцессорная обработка программы - student2.ru

Блочный оператор

if (B) {c1;c2;}

else c3;

*{c1;c2;}-блок операторов

Стадия 2. Препроцессорная обработка программы - student2.ru

Примеры

1)Вычисление max

x, y

max=max{x, y}

Стадия 2. Препроцессорная обработка программы - student2.ru

if (x<y) max=y;

else max=x;

max=max{x, y, z}

1)

Стадия 2. Препроцессорная обработка программы - student2.ru

if (x<y)

if (y<z) max=z;

else max=y;

else if (x<z) max=z;

else max=x;

2)

Стадия 2. Препроцессорная обработка программы - student2.ru

max=x;

if (max<y) max=y;

if (max<z) max=z;

3)

Стадия 2. Препроцессорная обработка программы - student2.ru

if (1) {if (2) 1;}

else 2;

4)

Стадия 2. Препроцессорная обработка программы - student2.ru if (1)

if (2) 1;

else 2;

5) Стадия 2. Препроцессорная обработка программы - student2.ru

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

Стадия 2. Препроцессорная обработка программы - student2.ru

# 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 байта

1234 - мантисса

Порядок

Примечание

int x=100; double y=2.5;

y-y+x- тип double

Циклы

1) Цикл с предусловием

while (B) C;

Стадия 2. Препроцессорная обработка программы - student2.ru

Пустой цикл

Стадия 2. Препроцессорная обработка программы - student2.ru

Бесконечный цикл

Стадия 2. Препроцессорная обработка программы - student2.ru

While (B)

{

C1;C2;C3;

}

Стадия 2. Препроцессорная обработка программы - student2.ru

Цикл с постусловием

Do C while ( B)

Стадия 2. Препроцессорная обработка программы - student2.ru

Пример 1

С помощью цикла while вычислить

y=1+2+3+..+n

y=∑in=1i

Стадия 2. Препроцессорная обработка программы - student2.ru

# 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

Стадия 2. Препроцессорная обработка программы - student2.ru

# 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

Стадия 2. Препроцессорная обработка программы - student2.ru

# 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+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)!= ∑0ti

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

Преобразование типа переменной в программе.

Операторы перехода

Преобразование типа переменной в программе

1) y=y+static_coast<double>i / (i+1)

2) y=y+(double) i/(i+1)

Операторы перехода

Break

i=1;

while(1)

{

if(i>10) break;

cout<<”i=”<<i<<”_”;

i++;

}

cout<<endl;

результат работы программы:1_2_3_4_5_6_7_8_9_10

Continue

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

{

if (i %2) continue;

cout<<i<<”_”;

}

результат работы программы:2_4_6_8

Goto

С помощью инструкции goto и метки можно организовать

следующий цикл на 100 итераций.

i=1;

loop1:

cout<<i<<”_”;

i++;

if (i<=100) goto loop1;

результат работы программы:1_2_3_4_5_6_7_... _100

Оператор switch (переключатель)

switch (выражение) { case константа 1: [список операторов]

case константа 2: [список операторов]

………………………………………….

case константа n: [список операторов]

default: [список операторов]

}

Задача 1

Простейший калькулятор

# include <iostream.h>

void main()

{

int a,b,res;

char op;

cout <<” enter 1 operand:”;

cin>>a;

cout <<” enter sign of operation:”;

cin>>op;

cout <<” enter 2 operand:”;

cin>>b;

bool f=true;

switch (op) {

case ‘+’ : res=a+b; break;

case ‘-‘ : res=a-b; break;

case ‘*‘ : res=a*b; break;

case ‘/‘ : res=(double) a/b; break;

default: cout<<”unknown operator “<<endl;

f=false;

}

if (f) cout<<”result:”<<res<<endl;

}

Задача 2

Угадывание числа

# include <iostream.h>

# include <stdlib.h>

# include <time.h>

void main()

{

bool t;

int x, y, n, i;

srand (time(0));

x=rand()%10+1;

cout<<” the computer define number in the range 1-10”<<endl;

t=false;

cout<<” Guess the number!!!”<<endl;

cout<< “You must guess the number the computer”<<endl;

cout<<” enter n=”;

cin>>n; //ввод количества попыток

i=1;

while ( i<=n && !t )

{

cout<<”enter number”;

cin>>y; //ввод числа пользователем

if (y==x) t=true;

i++;

}

if (t)

{

cout<< “You win!”<<endl;

cout<<” The number of attempts i = ”<<i<<endl;

cout<<”Computer defined number:<<x<<endl;

}

else {

cout<<”Sorry! The computer number =”<<x<<endl;

}

}

Задача 3

Определение простого числа

true, если число x простое

T=

false, если число x не является простым

i=2…..sqrt(x)- возможные делители числа х.

Листинг программы

# include <iostream.h>

# include <math.h>

void main()

{

int i,x;

bool t;

cout<<”enter x=”;

cin>>x;

if (x<=1) t=false;

else if (x==2) t=true;

else

{

t=true;

for (i=2; i<=sqrt(x) && t; i++)

{

if (x% i==0) t=false;

}

}

if (t) cout<< x<<” -prime”<< endl;

else cout<< x<<” - not prime”<< endl;

}

Задача 4.

Задача 5

Число итераций за 1 сек.

Секундомер

#include <iostream.h>

#include <stdlib.h>

#include <time.h>

void main()

{

int i, j, k, m;

int l=time (0);

int p=1;// число итераций за 1 сек

while (time (0)-l < 1)

{

cout<<time(0)<<':'<<'_';

p++;

// system("pause");

}

cout<<endl<<"p= "<<p<<endl;

// число итераций за 1 сек

cout<<endl;

cout<<"hours: minutes: second"<<endl;

for(m=0;m<=24;m++)

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

for(j=0; j<=59;j++)

for (k=1;k<=100000;k++)// задержка

{

cout.fill('0'); cout.width(2);

cout<<m<<':';

cout.fill('0'); cout.width (2);

cout<<i<<':';

cout.fill('0'); cout.width (2);

cout<<j<<'\r';

}

cout<<endl;

}

Лекция №6

Массивы

а0, а1, а2,…….аn-1

Массив- конечная именованная последовательность элементов

Описание массива в С++:

Тип имя [размер]

Например:

int a[100] или const int N=100;

int a[N];

Обращение к элементу массива: а[номер].

Одномерный массив – вектор;

Память для элементов массива выделяется подряд

1234

a- указатель-переменная, которая хранит адрес.

Задача 1

Описание переменных

Ввод данных

Соответствующие вычисления

Вывод результата

Задача 2

Задача 3

Задача 4

Задача 5

Или равны нулю

# include <iostream.h>

void main()

const int n=10;

{

int a[n];

int i;

bool p=true;

//Ввод массива с клавиатуры

cout<<”enter array a”<<endl;

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

{

cout<<”a[“<<i<<”]=”;

cin>>a[i];

}

//Вывод массива на экран

cout<<”array a”<<endl;

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

cout<<a[i]<<’ ‘;

cout<<endl;

for (i=0; i<n&&p; i++)

if(a[i]<0) p = false;

if (p) cout<<”any”<<endl;

else cout<<” not any”<<endl;

}

Лекция №7

Массивы(продолжение)

Методы сортировки массивов.

Задача 1

Задача 2.

Задача 3.

Лекция

Уровня

Вариант 7

Вариант 8

Вариант 9

Лекция

Двумерные массивы.

В С++ можно использовать многомерные массивы. Двумерный массив представляет собой список одномерных массивов.

Объявление двумерного массива, состоящего из целых чисел с размерностью 5*6: int a[5][6].

В двумерном массиве позиция любого элемента определяется двумя индексами. Если представить двумерный массив в виде таблицы данных, то один индекс означает строку, а второй индекс – столбец. Из этого следует, что если доступ к элементам массива представить в порядке , в котором они реально хранятся в памяти, то правый индекс будет изменяться быстрее , чем левый.

EA- и AE–предикаты

a) AiEj( a[i][j]>0)

Умножение матриц

С=A*B

# include <iostream.h>

const int n=3;

void main()

{

int a[n] [n], b[n] [n], c[n] [n];

int i, j, k;

//Ввод массива с клавиатуры

cout<<”enter array a:”<<endl;

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

for (j=0; j<n; j++)

cin>>a[i][j];

//Вывод массива на экран

cout<<”array a:”<<endl;

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

{

for (j=0; j<n; j++) cout<<a[i][j]<<’ ‘;

cout<<endl;

}

//Ввод массива с клавиатуры

cout<<”enter array b”<<endl;

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

for (j=0; j<n; j++)

cin>>b[i][j];

//Вывод массива b на экран

cout<<”array b:”<<endl;

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

{

for (j=0; j<n; j++) cout<<b[i][j]<<’ ’;

cout<<endl;

}

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

for (j=0; j<n; j++)

{

c[i][j]=0;

for (k=0; k<n; k++)

c[i][j]=c[i][j]+a[i][k]*b[k][j];

}

//Вывод массива на экран

cout<<”array c:”<<endl;

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

{

for (j=0; j<n; j++)

cout<<c[i][j]<<’ ’;

cout<<endl;

}

}

Лекция

Указатели.

Указатель – это объект, который содержит некоторый адрес памяти. Этот адрес обозначает местоположение в памяти другого объекта, такого как переменная. Если x содержит адрес переменной y, то о переменной x говорят, что она «указывает» на y.

Формат объявления переменной-указателя таков:

Тип *имя переменной.

Использование символа * перед именем переменной в инструкции объявления превращает эту переменную в указатель.

int *x;

x – укзатель на int.

Операторы, используемые с указателями.

С указателями используются два оператора ”*” и “&”.

Оператор “&”- унарный. Он возвращает адрес памяти, по которому расположен операнд.

int *ptr;

ptr= &total;

В переменную ptr помещается адрес переменной total.

Второй оперантор работы с указателями (“*”) служит дополнением к первому (“&”). Это также унарный оператор , но он обращается к значению переменной , расположенной по адресу , заданному его операндом. Другими словами, он ссылается на значение переменной , адресуемой заданным указателем. Если перменная ptr содержит адрес перменной total , то при выполнении инструкции

val=*ptr;

будет присвоено значение переменной total, на которую указывает переменная ptr.

Все байты в памяти нумеруются. Номер байта - адрес.

int х=5 – инициализация переменной

int *p- объявление указателя;

p- указатель( адрес)

p=&x- взятие адреса

Стадия 2. Препроцессорная обработка программы - student2.ru

*p=10 – изменение х через указатель

*-операция разыменования (косвенное присвоение)

Стадия 2. Препроцессорная обработка программы - student2.ru

Ссылки.

В языке C ссылок нет. С точки зрения реализации, ссылка — это, по сути, указатель, который жестко привязан к области памяти, на которую он указывает, и который автоматически разыменовывается, когда мы обращаемся по имени ссылки

int y=10;

int & x=y;

cout<<”x= “<<x<<endl;// x=10

* конкретные адреса переменных могут быть другими */ int a; //переменная с именем "a" типа int размещена по адресу 0xbfd86d6c int &ra = a; /* задано альтернативное имя (ra) для переменной по адресу 0xbfd86d6 символ "&" используемый для уже созданного объекта является операцией взятия адреса (и эта операция не есть ссылка), то есть &a тут означает получить адрес переменной к которому привязано имя "a" */ cout << &a << '\n' << &ra << '\n';

В stdout будет записано:

0xbfd86d6c
0xbfd86d6c

То есть оба имени "a" и "ra" привязаны к одному и тому же адресу.

Ссылки нельзя объявлять без привязки к переменной (то есть не инициализировав при объявлении). После объявления ссылки её невозможно привязать к другой переменной.

Важно отличать ссылки от оператора взятия адреса & (address of). Оператор взятия адреса используется для уже созданного объекта с целью получить его адрес (то есть адрес области памяти, где хранятся значения), а ссылка это только задание альтернативного имени объекта (с точки зрения программиста, а не реализации). Например:

int a; //переменная типа int размещена по адресу 0xbfd86d6c с именем "a" int b = 3; /* создан указатель с именем "p" по адресу 0xbf971c4c, значение этого указателя адрес объекта с именем "a" - 0xbfd86d6c (это значение можно будет менять) */ int *p = &a; p = &b; //присваиваем указателю новое значение

Пример 1

# include <iostream.h>

void main()

{

int x=10;

int *p;

cout<<”x=”<<x<< endl; // 10

p=&x;

cout<<”p=”<<p<<endl;

//p=0X0012FF7C –адрес ячейки памяти, содержащей int x

*p=20;

cout<<”*p=”<<*p<<endl; //20

cout<<”x=”<<x<< endl; // 20

int & r=x; //& r-ссылка

r=50;

cout<<”r=”<<r<<endl; // 50

cout<<”x=”<<x<< endl; // 50

x=20;

cout<<”r=”<<r<<endl; // 20

cout<<”*p=”<<*p<<endl; //20

}

*Примечание

Ссылка -2ое имя Х, r работает как указатель, автоматически разыменовывается. Память под r не выделяется

Пример 2

# include <iostream.h>

void main()

{

int a[3]={1.2.3};

cout<<” array a:<<endl;

cout<<a[0]<<’ ‘ <<a[1]<<’ ‘ <<a[2]<<endl; // 1_2_3

cout<<”address a:”<<a<<’ ‘<<a+1<<’ ‘<<a+2<<endl ;

// address a: 0x0012FF68 0x0012FF6C 0x0012FF70

//Косвенное изменение массива

int *q=a; //q указатель на int

cout<<”q=”<<q<<’ ’<<q+1<<’ ’<<q+2<<endl;

// q= 0x0012FF68 0x0012FF6C 0x0012FF70

cout<<”*q=”<<*q<<’ ’<<*(q+1)<<’ ’<<*(q+2)<<endl;

//*q=1 2 3

*q=904; *(q+1)=905; *(q+2)=906;

cout<<” array a:”<<endl;

cout<<a[0]<<’ ‘ <<a[1]<<’ ‘<<a[2]<<endl;

// 904 905 906

a[0]=1;

a[1]=2;

a[2]=3;

cout<<” *q= ”<<*q<<’ ’<<*(q+1)<<’ ’<<*(q+2)<<endl ;

//*q=1 2 3

}

Функции

Создание функции.

#include<iostream>

using namespace std;

void myfunc();// прототип функции myfunc()

void main()

{

cout<<”В функции main().”<<endl;

myfunc();

cout<<”Снова в функции main().”<<endl;

}

// Определение функции myfunc()

void myfunc()

{

cout<<”В функции myfunc().”<<endl;

}

Возврат значений.

Локальная область видимости

Сокрытие имен

Параметры функции

Передача функции указателя

Передача функции массива

Передача функциям строк

Пример 1

Функция плюс

# include <iostream.h>

void plus (int,int,int); // прототип функции plus, параметры переданы по значению

void plus1 (int,int,int&); // прототип функции plus1, последний параметр передан по ссылке

int plus2(int, int) //результат функции число типа int

Void main()

{

int a=4; int b=5; int c=10;

cout<<”plus()”<<endl;

plus(a,b,c);

cout<<”c=”<<c<<endl; //9

plus1(a,b,c);

cout<<”c=”<<c<<endl; //10

int c2=plus2(a,b);

cout<<”c2=”<<c2<<endl; //9

// Возможен вариант

cout<<”plus2()=”<<plus2(a,b)<<endl; //9

}

Int plus2 (int x, int y)

{

cout<<”x=”<<x<< endl; //4

cout<<”y=”<<y<< endl; // 5

cout<<”x+y”<<x+y<< endl; // 9

return x+y;

}

Примечание

При вызове функций plus2() на месте аргументов могут быть любые выражения данного типа.

plus2(a+b*c,2*c);

plus2(5,7);

Передача массивов функции.

Пример 2.

# include <iostream.h>

const int n=10;

void create ( int x[], int k);

//возможный вариант void vvod ( int x[n])

void show ( int x[], int k);

int max (int x[], int k);

void main()

{

int a[n];

create(a,n);

show ( a, n);

cout<< “max(a,n)= ”<<max(a,n)<<endl;;

}

void create ( int x[], int k)

{

int i;

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

{

cout<<”x[“<<i<<”]=”;

cin>>x[i];}

}

}

void show ( int x[], int k)

{

int i;

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

cout<<x[i]<<”_”;

}

int max(int x[], int k)

{

int i;

int m;

m=a[0];

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

if (m<x[i]) m=x[i];

return m;

}

Лекция №9

Динамические массивы

Задание статического массива

const int n=10;

int a[n];

Задание динамического массива

int n;

cout<< “Enter n:”;

cin>>n;

int*b //указатель на первый элемент массива

b= new int[n];

delete [] b - после работы программы необходимо освободить память «кучи» от b.

В параметрах функций динамический массив задается так же, как и статический

void vvod ( int x[], int n);

Или

void vvod ( int *x, int n);

void vvod ( int x[n])

Стадия 2. Препроцессорная обработка программы - student2.ru

Примечание

int*p;

p=new int;

*p=10; (косвенная динамическая память)

delete p ; (возврат памяти)

Задание двумерного динамического массива

Память выделяется в 2 этапа: сначала под строку указателей на столбцы, а затем в цикле под каждый столбец.

int colstr; colstb;

cout<< “Enter colstr:”;

cin>> colstr;

cout<< “Enter colstb:”;

cin>> colstb;

int **b;

b=new int*[colstr];

for (int i<0;i<colstr;i++)

b[i]=new int[colstb];

Соответственно, необходимо delete[][]b;

В параметрах функций

void create ( int **x, int n, int m);

void show( int **x, int n, int m);

Задача 1.

Void main()

{

int n;

cout<<”enter size=”;

cin>>n;

int **a, **b, **c;

a= new int*[n];

int i;

for (i<0;i<n;i++)

a[i]=new int[n];

b= new int*[n];

for (i<0;i<n;i++)

b[i]=new int[n];

c= new int*[n];

for (i<0;i<n;i++)

c[i]=new int[n];

create(a,n);

create(b,n);

if (EA(a,n)) mult(a,b,c);

else add(a,b,c);

cout<<”array c:”<<endl;

show(c,n);

delete[][]a;

delete[][]b;

delete[][]c;

}

void create(int**x, int n)

{

int i,j;

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

for (j=0; j<n; j++)

cin>>x[i][j];

}

void show(int**x, int n)

{

int i,j;

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

{

for (j=0; j<n; j++)

cout<<a[i][j]<<’ ’;

cout<<endl;

}

}

Bool prime(int x)

{

bool t;

int i;

if (x<=1) return false;

if (x==2) return true;

t=true;

i=2;

while (i<=sqrt(x)&&t)

{

if (x% i==0) t=false;

i++;

}

return t;

}

bool EA(int**x, int n)

{

bool p,q;

int i,j;

bool p=false;

for (i=0;i<n&&!p;i++)

{

bool q=true;

for (j=0; j<n&&q; j++)

if (!prime(x[i][j])) q=false;

p=q;

}

return p;

}

void mult ( int **x, int**y, int**z)

{

int i, j, k;

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

for (j=0; j<n; j++)

{

z[i][j]=0;

for (k=0; k<n; k++)

z[i][j]=z[i][j]+x[i][k]*y[k][j];

}

}

void add ( int **x, int**y, int**z)

{

int i, j;

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

for (j=0; j<n; j++)

z[i][j]= x[i][k]+y[k][j];

}

ALGEBRA OF SETS

Алгебра множеств

Пусть A,B,C ‘элементы P(Z). Z – множество целых чисел.

Лекция

Табулирование интегральной функции.

Вычислить значение функции

Стадия 2. Препроцессорная обработка программы - student2.ru

в заданных точках t1, …, tm с точностью e. Входными данными программы являются числа m, a, b, e и массив t[1: m]. Выходные данные – массив y[1: m], где Стадия 2. Препроцессорная обработка программы - student2.ru . В программе предусмотреть:

- функцию, вычисляющую значение F(x, t), с формальными параметрами x и t;

- функцию вычисления интеграла по одной из квадратурных формул с формальными параметрами: границы интегрирования a, b, точность вычисления интеграла e, функция F(x, t) и значение ее параметра t.

Исходные данные

I. Квадратурные формулы для вычисления интеграла Стадия 2. Препроцессорная обработка программы - student2.ru (всюду Стадия 2. Препроцессорная обработка программы - student2.ru ):

а) формула прямоугольников

Стадия 2. Препроцессорная обработка программы - student2.ru ;

За приближенное значение интеграла принимается такое, при котором Стадия 2. Препроцессорная обработка программы - student2.ru .

II. Подынтегральная функция. Представим

Стадия 2. Препроцессорная обработка программы - student2.ru .

Функция y (x):

Стадия 2. Препроцессорная обработка программы - student2.ru Стадия 2. Препроцессорная обработка программы - student2.ru ;

Функция j (z):

Стадия 2. Препроцессорная обработка программы - student2.ru ;

III. Числовые данные

  a b e M t1 t2 t3 t4 t5 t6
а) 0,1 -3,7 1,8 7,2 - - -

// integral_function

//arb2013_integral_function

#include<iostream.h>

#include<fstream.h>

#include<math.h>

#include<iomanip.h>

#include<string.h>

const int lengthColumn=20;

const int Indent=7;

const int lengthTable=43;

//////////////////////////

double Fi(double x)

{

return cos(x)*cos(x);

}

///////////////////////////////

double Psi(double x)

{

return (1-x*x)/(1+x*x);

}

/////////////////////////

double F(double x,double t)

{

return Psi(x)*Fi(x+ t/(1+x*x));

}

///////////////////////////////////////

void create(ifstream &f, double x[], int n)

{

int i;

for(i=0;i<n;i++) f>>x[i];

}

/////////////////////////////////////////

void show(ofstream &f, double x[], int n)

{

int i;

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

f<<x[i]<<' '; f<<endl;

}

/////////////////////////////////////////

double Integral(double a, double b, double e, double t)

{

double h,J1,J2;

int i,n;

n=1; h=(b-a)/n;

J2=h*F(a+h/2, t);

do

{

J1=J2;

Наши рекомендации