Стадия 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; //вывод данных(объема заданного конуса)
}
Рассмотрим каждую строчку отдельно.
- #include<iostream.h>
В языке С++ определены ряд заголовочных файлов
( с расширением .h) , которые содержат информацию , необходимую для программы.
В данном случае #include<iostream.h> - директива препроцессора. include – включить
h файл с именем iostream в исходный текст программы. Файл iostream.h используется для поддержки С++ системы ввода и вывода. В данном случае компилятору необходимо знать описание объектов cin и cout
- 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. Процессор выбирает каждую инструкцию и выполняет ее, возможно сохраняя новые значения.
Процессор↔ ОЗУ
Стадия 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
Пример
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+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
Преобразование типа переменной в программе.
Операторы перехода
Преобразование типа переменной в программе
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];
Обращение к элементу массива: а[номер].
Одномерный массив – вектор;
Память для элементов массива выделяется подряд
▄1 ▄2 ▄ 3▄ 4
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- взятие адреса
*p=10 – изменение х через указатель
*-операция разыменования (косвенное присвоение)
Ссылки.
В языке 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])
Примечание
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 – множество целых чисел.
Лекция
Табулирование интегральной функции.
Вычислить значение функции
в заданных точках t1, …, tm с точностью e. Входными данными программы являются числа m, a, b, e и массив t[1: m]. Выходные данные – массив y[1: m], где . В программе предусмотреть:
- функцию, вычисляющую значение F(x, t), с формальными параметрами x и t;
- функцию вычисления интеграла по одной из квадратурных формул с формальными параметрами: границы интегрирования a, b, точность вычисления интеграла e, функция F(x, t) и значение ее параметра t.
Исходные данные
I. Квадратурные формулы для вычисления интеграла (всюду ):
а) формула прямоугольников
;
За приближенное значение интеграла принимается такое, при котором .
II. Подынтегральная функция. Представим
.
Функция y (x):
;
Функция j (z):
;
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;