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




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

 

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

Первая строка 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}

 

ОБЪЕКТЫИ КЛАССЫ

 

Класс как обобщение структуры

 

Пример 1. Будем использовать ключевое слово struct для определения класса двумерного вектора, для которого определены функции ввода и вывода данных, составляющих объект.

 

#include <iostream.h>

#include <conio.h>

 

// Класс вектор

struct Vector

{

double x, y; // Координаты вектора

 

// Функция вывода на экран координат вектора

void get()

{

cout<<"x="<<x<<' '<<"y="<<y<<'\n';

}

 

// Функция ввода с клавиатуры координат вектора

void put()

{

cout<<"Введите через пробел координаты вектора (x и y): ";

cin>>x>>y;

}

 

};

 

void main()

{

clrscr(); // Очистка экрана

 

Vector v, w[2]; // Определение векторов

 

v.put(); w[0].put(); w[1].put(); // Ввод координат векторов

 

// Вывод координат векторов

cout<<"\nКоординаты вектора v: ";

v.get();

 

cout<<"Координаты вектора w[0]: ";

w[0].get();

 

cout<<"Координаты вектора w[1]: ";

w[1].get();

 

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

}

 

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

 

Введите через пробел координаты вектора (x и y): 12.4 3.56

Введите через пробел координаты вектора (x и y): 2.34 5.6

Введите через пробел координаты вектора (x и y): 7 8.02

 

Координаты вектора v: x=12.4 y=3.56

Координаты вектора w[0]: x=2.34 y=5.6

Координаты вектора w[1]: x=7 y=8.02

 

Пример 2. Рассмотрим подпрограмму перегрузки операции присваивания для структуры, состоящей из строки и ее длины. В теле класса эта функция объявлена как

 

str& operator = (const str&);

 

она будет возвращать адрес объекта, полученного после присваивания. Это позволит применять цепочки присваиваний, например, str1 = str2 = str3. Аргумент функции сделаем ссылочным, чтобы избежать копирования всего объекта в стек при вызове операции присваивания. В стек теперь будет сохраняться адрес объекта.

 

#include <string.h>

#include <iostream.h>

#include <conio.h>

 

// Класс строка

struct Str

{

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

int len; // Длина строки

void init(const char*); // Функция инициализации строки

Str operator = (const Str); // Перегрузка операции =

};

 

// Перегрузка операции =

Str Str::operator = (const Str st)

{

len = st.len; // Выяснение длины новой строки

delete s; // Удаление старого содержимого

s = new char[len + 1]; // Выделение памяти под новую строку strcpy(s, st.s); // Копирование строки

return *this; // Возвращение полученной строки по значению

}

 

// Функция инициализации строки

void Str::init(const char* s)

{

len = strlen(s); // Выяснение длины строки

Str::s = new char[len + 1]; // Выделение памяти под строку strcpy(Str::s, s); // Копирование строки

}

 

void main()

{

clrscr(); // Очистка экрана

 

Str str1, str2, str3; // Создание строк

str1.init("Пирамида"); // Инициализация первой строки

str3 = str2 = str1; // Присваивание значения первой строки

// остальным двух строкам

cout<<"Объект str3 = " << str3.s << '\n'; // Вывод третьей строки

 

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

}



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-12-29 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: