Задача 2
2.1 Условие задачи
Создать 2 объекта разработанного класса. Одной из компонент класса является символьная строка. В результате выполнения программы в обоих объектах слово МАХ длины заменить на слово МIN длины. Содержимое объектов (их строки) до и после обмена вывести на экран.
2.2 Блок-схема алгоритма функции length
Функция length возвращает длину строки

2.3 Текст программы
#include <iostream>
using namespace std;
#define MAX_VECTOR_SIZE 1000
// класс для решения задачи 2
class MyString {
char *_data; // указатель на начало данных строки
unsigned int _length; // максимальный количество элементов строки
// выделение памяти под данные строки
void init(unsigned int length) {
_length = length;
if (_data) delete _data;
if (length != 0) {
_data = new char[_length];
} else {
_data = 0;
}
}
void init(const char* str) {
init(strlen(str) + 1);
memcpy(_data, str, _length);
}
void init(const char* str, unsigned int length) {
init(length + 1);
if (str != NULL) {
memcpy(_data, str, _length);
} else {
memset(_data, 0, _length);
}
_data[length] = 0;
}
public:
// конструктор по умолчанию, создает пустую строку
MyString() {
_data = NULL;
_length = 0;
}
// конструктор с параметрами, инициализация объекта строкой с 0 на конце
MyString(const char * str) {
_data = NULL;
init(str);
}
// конструктор с параметрами, инициализация объекта строкой length длинны
MyString(const char * str, unsigned int length) {
_data = NULL;
init(str, length);
}
// конструктор копирования
MyString(MyString const & copy) {
_data = NULL;
init(copy._data);
};
// деструктор, высвобождает выделенную память
~MyString() {
if (_data) delete _data;
};
// выводит строку на экран
void show() {
if (_data)
cout << _data << endl;
else
cout << endl;
}
// возврашает длинну строки
unsigned int length() const {
if (_length > 0) {
return _length - 1;
} else {
return 0;
}
}
// возвращает подстроку
MyString substr(unsigned int pos, unsigned length) {
MyString substr(_data + pos, length);
return substr;
}
// возвращает символ с индексом index из строки
char get(unsigned int index) const {
if (index < length())
return _data[index];
else {
cout << "oshibka, previshen index massiva" << endl;
return 0;
}
}
// присваивает одну строку другой
MyString operator=(const MyString& str2) {
init(str2._data, str2.length());
return *this;
}
// прибавляет одну строку в конец другой
MyString operator+=(const MyString& str2) {
MyString copy = substr(0, length());
init(NULL, length() + str2.length());
memcpy(_data, copy._data, copy.length());
memcpy(_data + copy.length(), str2._data, str2.length());
return *this;
}
// возвращает следующее слово, ограниченное пробелами
MyString get_next_word(int& pos) {
enum {
SEARCH_BEGIN, SEARCH_END
};
int state = SEARCH_BEGIN;
int begin = 0;
int lenght = 0;
for (; pos < length(); pos++) {
if (state == SEARCH_BEGIN && get(pos) != ' ') {
begin = pos;
state = SEARCH_END;
} else if (state == SEARCH_END && get(pos) == ' ') {
lenght = pos - begin;
return substr(begin, lenght);
} else if (state == SEARCH_END && (pos + 1) == length()) {
lenght = pos - begin + 1;
pos += 1;
return substr(begin, lenght);
}
}
return MyString();
}
};
// заменяет слова max длинны на слова min длинны в строке
void replace_max_to_min(MyString &str) {
int pos = 0;
MyString min_word;
int max_len = 0;
int min_len = 9999999;
while (pos < str.length()) {
MyString word = str.get_next_word(pos);
if (word.length() > max_len) {
max_len = word.length();
}
if (word.length() != 0 && word.length() < min_len) {
min_len = word.length();
min_word = word;
}
}
pos = 0;
MyString new_str;
MyString space(" ");
while (pos < str.length()) {
MyString word = str.get_next_word(pos);
if (word.length() == max_len) {
new_str += min_word;
} else {
new_str += word;
}
if (pos < str.length()) new_str += space;
}
str = new_str;
}
int main() {
cout << "ZADACHA 2" << endl;
MyString str1("one two three four five six seven");
cout << "STR1 ";
str1.show();
replace_max_to_min(str1);
cout << "STR1 ";
str1.show();
MyString str2("blue red green yellow white black violet");
cout << "STR2 ";
str2.show();
replace_max_to_min(str2);
cout << "STR2 ";
str2.show();
return 0;
}
2.4 Скриншоты с результатами работы
Скриншот на котором изображены исходные объекты, а также объекты после замены слова MAX длины на слово MIN длины:

Введем другое предложение:

