ВАРИАНТ №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();
}
Результат работы программы:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.