Определение класса заданного типа. Определение конструктора и деструктора

Страницы работы

Содержание работы

ВАРИАНТ №21

Задание. Определить класс заданного типа. Написать определенные как дружественные функции подпрограммы ввода с клавиатуры и вывода на экран данных, определяющих объекты этого класса. Перегрузить указанные операции и функции с помощью составных функций класса. Определить конструкторы и деструктор.

21. Символьная строка

==

=

<=

int length()

проверка на равенство, присваивание, подстрока, длина строки

Класс символьная строка состоит из последовательности символов и длины строки.

Текст программы:

#include <iostream.h>

#include <string.h>

#include <conio.h>

#include <stdlib.h>

#include <stdio.h>

#include <alloc.h>

// Класс - строка символов

class SymStr

{

private:

char *s;             // Строка

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

public:

// Конструкторы

SymStr() //создается пустая строка

{

s=new char[1];

*s='\0';

len=0;

}

SymStr(char *str) //создается строка с конкретным содержанием

{

len = strlen(str);

s = new char[len + 1];

strcpy (s, str);

}

// Деструктор

~SymStr() { delete s; }

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

int operator==(SymStr &);

// Перегрузка оператора <=

int operator<=(SymStr &);

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

SymStr &operator=(SymStr &Object);

int length (); //функция, вычисляющая длину

// Перегрузка оператора << для вывода строки

friend ostream &operator<<(ostream &, SymStr &);

// Перегрузка оператора >> для ввода строки

friend istream &operator>>(istream &, SymStr &);

};

int SymStr::length()

{

return len; //выводит длину строки

}

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

int SymStr::operator==(SymStr &Object)

{

if(strlen(s)>strlen(Object.s)) return 0;

if(strcmp(s, Object.s) == 0) return 1; //если две строки полностью идентичны

return 0;

}

// Перегрузка оператора <=

int SymStr::operator<=(SymStr &Object)

{

int l=strlen(Object.s);

int ln=strlen(s);

char st[20]={'\0'};

if(l<ln) return 0; //если длина строки из левой части оператора больше длины строки

//из правой части оператора, значит никакой подстроки быть не

//может

else

{

if(l==ln)

{

if(strcmp(s, Object.s) == 0) return 1;

}

if(l>ln) //если длина строки из правой части оператора больше длины строки из

//левой части оператора, то ищем подстроку

{

for(int i=0;i<=(l-ln);i++) //перебираем сначала строки по одному символу

{

strncpy(st,Object.s+i,ln); //копируем в промежуточную строку для

//сравнения

int k=strlen(st); //сравниваем со строкой из левой части оператора

if(strcmp(s,st)==0) return 1;

}

return 0;

}

}

free(st);

return 0;

}

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

SymStr& SymStr::operator=(SymStr &Object)

{

len = strlen(Object.s);

s = new char[len + 1]; //выделяем память под строку

strcpy(s, Object.s); //копируем исходную строку в только что сформированную

return *this; //возвращаем указатель на новую строку

}

// Перегрузка оператора << для вывода строки

ostream &operator<<(ostream &fo, SymStr &fp)

{

fo << fp.s;

return fo;

}

// Перегрузка оператора >> для ввода строки

istream &operator>>(istream &fo, SymStr &fp)

{

cout << "Введите строку: ";

fo>>fp.s;

return fo;

}

void main()

{

clrscr();

SymStr a("abccbaabbccd");

SymStr b;

SymStr c;

cout<< "string a= "<<a <<"\n";

cin >> b; //просим ввести строку

cout<< "string b= "<<b <<"\n";

if(b<=a) cout<<"Строка b является подстрокой a\n";

else cout<<"Строка b не является подстрокой a\n";

c=b; //присваиваем строке с строку b

cout<< "string c="<<c <<"\n";

if(a==c) cout<<"Строка а равна строке c\n";

else cout<<"Строка а не равна строке c\n";

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

getch();

}

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

Похожие материалы

Информация о работе