Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
примеры к лекциям ООП.doc
Скачиваний:
7
Добавлен:
24.11.2019
Размер:
2.9 Mб
Скачать

Операторы динамического распределения памяти

Пример. Приведём подпрограмму конкатенации строк, возвращающую адрес строки, полученной объединением двух строк.

// peregr.cpp

#include <iostream.h> //библиотека ввода-вывода

#include <conio.h> //консольный ввод-вывод

#include <string.h> //библиотека функций для работы со строками

char* conc(char* s, char* t)

{

int i;

char *res=new char[strlen(s)+strlen(t)+1]; //результирующая строка

for (i=0; i<strlen(s); i++)

res[i]=s[i]; //копируем в результат сначала

//первую строку

for (i=strlen(s); i<strlen(s)+strlen(t); i++)

res[i]=t[i-strlen(s)]; //а затем вторую

res[i]=0; //строка должна завершаться нулём

return res;

}

void main()

{

char* p="abc",*q="1234"; //объявим две строки p и q

clrscr();

cout<<"Входные данные:\nПервая строка "<<p;

cout<<"\nВторая "<<q;

cout<<"\n\nВыходные данные:\n";

cout<<"Результат конкатенации первой и второй строки ";

cout<<conc(p,q)<<"\n"; //результат конкатенации p и q -

//"abc1234"

cout<<"Результат конкатенации первой второй и снова первой строк ";

cout<<conc(conc(p,q),p)<<"\n"; //результат конкатенации (p и q)

//и p - "abc1234abc"

getch(); //ожидание нажатия клавиши

}

Р еультаты работы программы представлены на рис. 1.1.

Перегрузка функций и операций

#include <stdio.h> //библиотека стандартного ввода-вывода

#include <math.h> //библиотека математических функций

struct Vector3d { //структура трёхмерного вектора

double x,y,z; //состоит из трёх координат в пространстве

};

double absl(double x) //эта функция возвращает модуль double

{

if(x<0) return -x;//воспользуемся определением модуля

else return x;

}

double absl(Vector3d v) //эта функция возвращает модуль(длину)

//трёхмерного вектора

{

return sqrt(v.x*v.x+v.y*v.y+v.z*v.z); //корень квадратный из

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

}

int absl(int i) //эта функция возвращает модуль целого числа

{

if(i<0) return -i;//воспользуемся определением модуля

return i;

}

main()

{

Vector3d n={3.14159, 2.71828, -1}; //n-трёхмерный вектор

printf("\nВходные данные:\n");

printf("Трёхмерный вектор n={%f,%f,%f}\n",n.x,n.y,n.z);

printf("\nВыходные данные:");

printf("\nМодуль вектора n равен %f",absl(n));

//найдём модуль n

printf("\nМодуль целого числа -1 равен %d",absl(-1));

//вызов функции для int

printf("\nМодуль double числа -1 равен %f",absl(-1.));

//вызов функции для double

}

Результаты работы программы

Входные данные:

Трёхмерный вектор n={3.141590,2.718280,-1.000000}

Выходные данные:

Модуль вектора n равен 4.273012

Модуль целого числа -1 равен 1

Модуль double числа -1 равен 1.000000

Например, подпрограмму конкатенации строк, определяемых структурой

Struct String{

int length; //длина строки

char *p; //указатель на строку

}

можно определить как операцию сложения строк

String operator+(String s,String t);

Приведём пример программы, в которой определена такая операция:

#include <stdio.h> //библиотека стандартного ввода-вывода

#include <string.h> //библиотека функций для работы со строками

#include <conio.h> //библиотека консольного ввода-вывода

struct string { //структура string

int length; //содержит длину

char *p; //и саму строку

};

string operator+(string s, string t) //перегрузка операции +

{

int i;

string res; //результирующая строка

res.p=new char[s.length+t.length+1];//выделим память для строки

strcpy(res.p, s.p); //копируем первую строку

strcpy(res.p+s.length, t.p); //копируем вторую строку

res.length=s.length+t.length; //заполняем поле структуры- //длина строки

return res;

}

void main()

{

string s1={3,"abc"}, s2={4,"1234"},s3; //строки s1,s2,s3

clrscr();

printf("Входные данные:\n");

printf("\nПервая строка %s\n",s1.p);

printf("Длина первой строки %d\n",s1.length);

printf("Вторая строка %s\n",s2.p);

printf("Длина второй строки %d\n",s2.length);

s3=s1+s2; //используем перегруженную

//операцию +

printf("\nВыходные данные:\n");

printf("Результат конкатенации первой и второй строк %s\n",s3.p);

printf("Длина результирующей строки %d\n",s3.length);

//результат конкатенации s1

//s2 - "abc1234" длина - 7

}

Результаты работы программы

Входные данные:

Первая строка abc

Длина первой строки 3

Вторая строка 1234

Длина второй строки 4

Выходные данные:

Результат конкатенации первой и второй строк abc1234

Длина результирующей строки 7

Те же самые результаты могут быть получены при запуске следующей программы, отличающейся от приведённой выше способом копирования входных строк в результирующую:

#include <stdio.h> //библиотека стандартного ввода-вывода

#include <string.h> //библиотека функций для работы со строками

#include <conio.h> //библиотека консольного ввода-вывода

struct string { //структура string

int length; //содержит длину

char *p; //и саму строку

};

string operator+(string s, string t) //перегрузка операции +

{

int i;

string res; //результирующая строка

res.p=new char[s.length+t.length+1];//выделим память для строки

for (i=0; i<s.length; i++)

res.p[i]=s.p[i]; //копируем первую строку

for (i=s.length; i<s.length+t.length; i++)

res.p[i]=t.p[i-s.length]; //копируем вторую строку

res.p[i]=0; //строка завершается 0

res.length=s.length+t.length; //заполняем поле структуры- //длина строки

return res;

}

void main()

{

string s1={3,"abc"}, s2={4,"1234"},s3; //строки s1,s2,s3

clrscr();

printf("Входные данные:",s3.p);

printf("\nПервая строка %s\n",s1.p);

printf("Длина первой строки %d\n",s1.length);

printf("Вторая строка %s\n",s2.p);

printf("Длина второй строки %d\n",s2.length);

s3=s1+s2; //используем перегруженную операцию +

printf("\nВыходные данные:\n");

printf("Результат конкатенации первой и второй строк %s\n",s3.p);

printf("Длина результирующей строки %d\n",s3.length);

//результат конкатенации s1

//s2 - "abc1234" длина - 7

}

Пример. Рассмотрим структуру, реализующую двумерный вектор. Определим для него операции суммы, разности, унарного минуса, скалярного произведения.

#include <stdio.h> //библиотека стандартного ввода-вывода

struct Vector { //структура вектора на плоскости

double x,y; //состоит из координат х и у

};

Vector operator+(Vector v, Vector w) //перегрузим операцию сложения

{

Vector t;

t.x=v.x+w.x; t.y=v.y+w.y; //складываются соответствующие координаты

//двух векторов

return t;

}

Vector operator-(Vector v, Vector w) //перегрузим операцию вычитания

{

Vector t;

t.x=v.x-w.x; t.y=v.y-w.y; //находится разность соответствующих

//координат двух векторов

return t;

}

Vector operator-(Vector v) //перегрузим операцию унарного минуса

{

Vector t;

t.x=-v.x; t.y=-v.y; //найдём вектор,противоположно направленный

//и имеющий ту же длину, для данного

return t;

}

double operator*(Vector v, Vector w) //перегрузим операцию умножения

{

return v.x*w.x+v.y*w.y;//найдём скалярное произведение двух векторов

}

int main()

{

Vector a={1,0}, b={-1,1},c,d,e;

printf ("\nВходные данные:\n");

printf ("Вектор а={%f,%f},b={%f,%f}\n",a.x,a.y,b.x,b.y);

c=a-b;

printf("\nРезультат вычитания a-b={%f,%f}",c.x,c.y); //вычитание

printf("\nРезультат скалярного произведения a*b=%f",a*b);

//произведение

d=a+b;

printf("\nРезультат сложения a+b={%f,%f}",d.x,d.y); //сложение

e=-a ;

printf("\nВектор противоположный а это вектор е={%f,%f}",e.x,e.y);

//унарный минус

}

Результаты работы программы

Входные данные:

Вектор а={1.000000,0.000000},b={-1.000000,1.000000}

Выходные данные:

Результат вычитания a-b={2.000000,-1.000000}

Результат скалярного произведения a*b=-1.000000

Результат сложения a+b={0.000000,1.000000}

Вектор противоположный а это вектор е={-1.000000,-0.000000}