Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Контрольная работа ооп.doc
Скачиваний:
49
Добавлен:
01.04.2014
Размер:
1.42 Mб
Скачать
  1. Задача 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 длины:

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