/*
Объявите класс с именем text. Объявите функцию show(), функция сортирования текста по возрастанию.
Текст можно вставить любой, а сортировать по количеству букв в слове от меньшего к большему ну или на оборот.
/*
/*
codeby.net
Autor: DarkKnight125
*/
#include <iostream>
#include <ctype.h>
class Text
{
private:
char* str;
int st3;
int size;
public:
//Функция возврата массива символов
const char* Show(void);
//Функция сортировки слов (по возрастанию)
void SortWord(void);
//Опаратор присваивание Text = char*;
Text& operator= (char*);
//Перегрузка конструктора копирование по умолчанию
Text& operator= (Text&);
//Конструктор по умолчанию + инициализация переменной
Text(char* = "");
//Деструктор класса
~Text();
};
//Перегрузка конструктора копирование по умолчанию
Text& Text::operator= (Text& Value)
{
delete[] str;
size = strlen(Value.str);
str = new char[size+1];
strcpy(str,Value.str);
return *this;
}
//Конструктор по умолчанию + инициализация переменной
Text::Text(char *Value = "")
{
size = strlen(Value); // Запишим размер строки
str = new char[size+1]; //Выделим память под размер строки + нулевой символ
memset(str,0,size+1); //Обнулим выделеную память
if (strlen(Value)>0)
{
strcpy(str,Value); //Скопируем Value - в память
}
};
//Функция возврата массива символов
const char* Text::Show(void)
{
return str;
}
//Функция сортировки слов (по возрастанию)
void Text::SortWord(void)
{
int Word = 0; //Счетчик слов
char** ArrWord = new char*[size+1]; //Массив слов
char *buffer = new char[size+1]; //Буферная переменная
char *ptr = buffer; //Указатель на буферную переменную
memset(buffer,0,size+1); //Обнулим буфрную переменную
for (int i=0; i <= strlen(str); i++) //Обойдем по-символьно всю строку
{
if (!(isspace((unsigned char)str[i]) || ::iscntrl((unsigned char)str[i]))) //Если символ не управляющий или не разделитель
{
*ptr++ = str[i]; //Пишим в буферную переменную и сдвигаем указатель
}
else if (strlen(buffer)>0) //Если же управляющий или разделитель и длина буферной переменной >0
{
ArrWord[Word] = new char[size+1]; //Выделим память под слово
strcpy(ArrWord[Word++],buffer); //Скопируем буферную переменную в слово
memset(buffer,0,size+1); //Обнулим память буферной переменной
ptr = buffer; //Поставим указатель на начало буферной переменной
}
}
memset(str,0,size+1); //Обнулим строку
//Сортируем слова по длине
for (int i = 0; i<Word; i++)//Обойдем весь массив слов
{
int Max = size+1; //Текущая длина слова
int pos = -1; //Текущая позиция в массиве
for (int j=i; j<Word; j++) //Обойдем все слова с i
{
if (Max > strlen(ArrWord[j]))
{
Max = strlen(ArrWord[j]);
pos = j;
}
}
strcpy(buffer,ArrWord[i]);
strcpy(ArrWord[i],ArrWord[pos]);
strcpy(ArrWord[pos],buffer);
strcat(str,ArrWord[i]);
if ( (i+1) != Word) strcat(str," ");
}
for (int i = 0; i<Word; i++)
{
delete[] ArrWord[i];
}
delete [] buffer;
delete [] ArrWord;
}
//Деструктор класса
Text::~Text()
{
delete[] str;
}
//Опаратор присваивание Text = char*;
Text& Text::operator= (char* Value)
{
delete[] str;
size = strlen(Value);
str = new char[size+1];
memset(str,0,size+1);
strcpy(str,Value);
return *this;
}
using namespace std;
void main(void)
{
setlocale(LC_ALL,"Russian");
//Тестирование класса Text
Text K("Обычный текс для проверки программы");
K.SortWord();
cout<<K.Show()<<endl;;
K = "Компания IBM";
K.SortWord();
Text D("FF");
D = K;
K = "Row Set";
cout<<"{"<<D.Show()<<"}"<<endl;
}