969

Создание объектов разработанного класса (символьная строка)

Контрольная

Информатика, кибернетика и программирование

Описание диаграммы классов. Блок-схема метода ExchangeWords. Динамический массив символов и операции над ним. Цикл while и оператор if. обработка строк стандартными функциями библиотеки string.

Русский

2013-01-06

323.5 KB

116 чел.

Министерство образования республики Беларусь

Учреждение образования

«БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ»

Институт информационных технологий

Специальность__________ИСиТ_______________

КОНТРОЛЬНАЯ РАБОТА

По курсу «Объектоно-ориентированное программирование»

Вариант №11

Студент-заочник I курса

Группы №182322

Лисовский Дмитрий

Константинович

Адрес 225510 ул. Солнечая, 74

г. Берёза Брестская обл.

Тел. 8(029)828-35-86

Минск, 2011

Содержание

Содержание 2

Задание 1 3

1.1. Формулировка задания 3

1.2. Диаграмма классов 3

1.3. Описание диаграммы классов 3

1.4. Блок-схема метода «ExchangeWords()» 4

1.5. Текст программы 4

1.6. Результат выполнения программы 8

1.7. Теоретическая часть 8

Задание 2 9

2.1. Формулировка задания 9

2.2. Диаграмма классов 9

2.3. Описание диаграммы классов 9

2.4. Блок-схема метода «operator -= (const MyClass &)» 10

2.5. Текст программы 10

2.6. Результат работы программы 12

2.7. Теоретическая часть 13

Задание 3 14

3.1. Формулировка задания 14

3.2. Диаграмма классов 14

3.3. Описание диаграммы классов 14

3.4. Блок-схема метода «MaxSummElementsCol()» 16

3.5. Текст программы 17

3.6. Результат работы программы 20

3.7. Теоретическая часть 20

Список использованных источников 21


Задание 1

1.1. Формулировка задания

Создать 2 объекта разработанного класса. Одной из компонент класса является  символьная строка. В результате выполнения программы в обоих объектах поменять местами первое и последнее слова строки. Содержимое объектов (их строки) до и после обмена вывести на экран.

1.2. Диаграмма классов

1.3. Описание диаграммы классов

Метод ExchangeWords() возвращает указатель на обработанную в соответствии с заданием строку. Для осуществления обмена местами слов сначала вызывается метод TrimString(), который отсекает пробелы и символы табуляции в начале и конце строки, затем метод CheckString() проверяет условия осуществления обмена местами слов: строка не пуста и содержит как минимум два слова, разделённых пробелом. Метод PrintSourceString() выводит на экран значение свойства str, в соответствии с заданием он реализован как friend. Класс, так же содержит конструктор копирования и перегруженный конструктор с параметром char *.

1.4. Блок-схема метода «ExchangeWords()»

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

WordsExchanging.h

#ifndef WORDSEXCHANGING

#define WORDSEXCHANGING

#include <iostream>

#include <string.h>

#include <Windows.h>

using namespace std;

// Класс для обмена позиции первого и последнего слова в строке.

class WordsExchanging

{

public:

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

WordsExchanging();

explicit WordsExchanging(const char * );

// Конструктор копирования.

WordsExchanging(WordsExchanging &rhs);

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

~WordsExchanging();

// Методы.

friend void PrintSourceString(const WordsExchanging & src);

WordsExchanging & SetNewString(const char *);

char * ExchangeWords();

private:

char * str;

bool CheckString() const;

char * TrimString() const;

};

#endif

WordsExchanging.cpp

#include "WordsExchanging.h"

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

WordsExchanging::WordsExchanging()

{

str = new char [1];

str[0]='\0';

}

// char * Конструктор.

WordsExchanging::WordsExchanging(const char * ch)

{

str = new char[strlen(ch)+1];

strcpy(str, ch);

}

// Конструктор копирования.

WordsExchanging::WordsExchanging(WordsExchanging &rhs)

{

str = new char [strlen(rhs.str) + 1];

strcpy(str, rhs.str);

}

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

WordsExchanging::~WordsExchanging()

{

delete [] str;

}

// Проверка строки.

bool WordsExchanging::CheckString() const

{

char * buffer = TrimString();

if(strlen(buffer) == 0)

{

 cout << "\nError #1: The string is empty!";

 return false;

}

if(strchr(buffer, ' ') == NULL)

{

 cout << "\nError #2: There is only one word in string!";

 return false;

}

return 1;

}

// Удаление ненужных символов.

char * WordsExchanging::TrimString() const

{

char * buffer = new char [strlen(str)+1];

strcpy(buffer, str);

    // Удаление пробелов и табов в начала строки.

    int i=0,j;

    while((buffer[i]==' ')||(buffer[i]=='\t'))

    {

         i++;

    }

    if(i>0)

    {

         for(j=0;j< int(strlen(buffer));j++)

         {

              buffer[j]=buffer[j+i];

         }

         buffer[j]='\0';

    }

    // Удаление пробелов и табов в конце строки.

    i=strlen(buffer)-1;

    while((buffer[i]==' ')||(buffer[i]=='\t'))

    {

         i--;

    }

    if(i<int(strlen(buffer)-1))

    {

         buffer[i+1]='\0';

    }

 return buffer;

}

// Вывод строки на экран. (friend - функция)

void PrintSourceString(const WordsExchanging & src)

{

cout << src.str;

}

// Ввод строки.

WordsExchanging & WordsExchanging::SetNewString(const char * newstr)

{

delete [] str;

str = new char [strlen(newstr)+1];

strcpy(str, newstr);

return *this;

}

// Обмен слов.

char * WordsExchanging::ExchangeWords()

{

if(! CheckString())

{

 return NULL;

} else

{

 char * buffer = TrimString();

 int bufferlen = strlen(buffer);

 char * ptFirst = strchr(buffer, ' ');

 char * ptLast = strrchr(buffer, ' ');

 int firstStrLen = ptFirst - buffer;

 int lastStrLen = bufferlen - (ptLast - buffer + 1);

 int otherStrLen = bufferlen - (firstStrLen+lastStrLen);

 char * res = new char [bufferlen+1];

 char * firstWord = new char [firstStrLen+1];

 char * lastWord = new char [lastStrLen+1];

 char * otherString = new char [otherStrLen+1];

 res[0] = '\0';

 firstWord[firstStrLen] = '\0';

 lastWord[lastStrLen] = '\0';

 otherString[otherStrLen] = '\0';

 strncpy(firstWord, buffer, firstStrLen);

 strncpy(lastWord, ptLast + 1, lastStrLen);

 strncpy(otherString, ptFirst, otherStrLen);

 strcat(res, lastWord);

 strcat(res, otherString);

 strcat(res, firstWord);

 delete [] firstWord;

 delete [] otherString;

 delete [] lastWord;

 delete [] buffer;

 cout << res << endl;

 return res;

}

}

main.cpp

#include "WordsExchanging.h"

int main()

{

WordsExchanging * obj1;

WordsExchanging * obj2;

cout << "-= The first object: =-\n\n";

obj1 = new WordsExchanging();

obj1->SetNewString("last and first");

cout << "Source string: ";

PrintSourceString(*obj1);

cout << "\nString after processing: ";

obj1->ExchangeWords();

cout << "\n\n-= The second object: =-\n\n";

obj2 = new WordsExchanging();

obj2->SetNewString("     String contains spaces and long    ");

cout << "Source string: ";

PrintSourceString(*obj2);

cout << "\nString after processing: ";

obj2->ExchangeWords();

delete obj1;

delete obj2;

return 0;

}

1.6. Результат выполнения программы

1.7. Теоретическая часть

Для выполнения задания был использован динамический массив символов и оперцации над ним: выделение/освобождение памяти, обработка строк стандартынми функциями библиотеки string.h, ввод/вывод библиотекой iostream. Использовался цикл while и оператор if. Использовался friend – метод.

Задание 2

2.1. Формулировка задания

Создать несколько объектов  (например, a и b) разработанного класса. Класс – символьная строка. Реализовать для объектов данного класса перегрузку операции  -=   (b-=a). Содержимое объектов (a,b, их строк), до и после выполнения операции, вывести на экран.

2.2. Диаграмма классов

 

2.3. Описание диаграммы классов

Класс содержит свойство – str – указатель на char. Два конструктора, один из них параметризован, конструктор копирования, методы установки и вывода значения на экран. Метод «operator -=» возвращает исходную строку без вхождений второй, указанной после знача =.

2.4. Блок-схема метода «operator -= (const MyClass &)»

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

MyClass.h

#ifndef MYCLASS

#define MYCLASS

#include <iostream>

#include <string.h>

using namespace std;

class MyClass

{

public:

MyClass();

MyClass(const char * src);

MyClass(const MyClass & src);

~MyClass();

MyClass & SetStr(const char *);

void PrintStr() const;

MyClass & operator -= (const MyClass &);

private:

char * str;

};

#endif

MyClass.cpp

#include "MyClass.h"

MyClass::MyClass()

{

str = new char[1];

str[0]='\0';

}

MyClass::MyClass(const char * src)

{

str = new char[strlen(src)+1];

strcpy(str, src);

}

MyClass::MyClass(const MyClass & src)

{

str = new char[strlen(src.str)+1];

strcpy(str, src.str);

}

MyClass::~MyClass()

{

delete [] str;

}

MyClass & MyClass::SetStr(const char * src)

{

delete [] str;

str = new char[strlen(src)+1];

strcpy(str, src);

return *this;

}

void MyClass::PrintStr() const

{

cout << str << endl;

}

MyClass & MyClass::operator -= (const MyClass & src)

{

char * temp = new char [strlen(str)+1];

strcpy(temp, str);

char * rightStr = 0;

char * leftStr = 0;

char * pt = 0;

while (0 != (pt=strstr(temp, src.str)))

{

 leftStr = new char [pt - temp + 1];

 leftStr[pt - temp] = '\0';

 strncpy(leftStr, temp, pt - temp);

 rightStr = new char [strlen(pt) - strlen(src.str) + 1];

 rightStr[strlen(pt) - strlen(src.str)] = '\0';

 strncpy(rightStr, pt + strlen(src.str), strlen(pt) - strlen(src.str));

 delete [] temp;

 temp = new char [strlen(leftStr) + strlen(rightStr) + 1];

 temp[strlen(leftStr) + strlen(rightStr)] = '\0';

 strcpy(temp, leftStr);

 strcat(temp, rightStr);

 delete [] leftStr;

 delete [] rightStr;

}

this->SetStr(temp);

delete [] temp;

return *this;

}

main.cpp

#include "MyClass.h"

int main()

{

MyClass a("ababababab");

MyClass b("b");

a.PrintStr();

b.PrintStr();

a-=b;

a.PrintStr();

return 0;

}


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

2.7. Теоретическая часть

Для решения задачи был использован динамический массив символов и оперцации над ним: выделение/освобождение памяти, обработка строк стандартынми функциями библиотеки string.h, ввод/выод библиотекой iostream. Использовался цикл while и оператор if.


Задание 3

3.1. Формулировка задания

Создать иерархию классов представляющих простое наследование. Базовый класс – матрица (динамическая (int **mt или int* или int *mt[константа])). Производный класс – методы, работающие с данными базового класса. Реализовать в производном классе метод – нахождения столбца с максимальной суммой элементов и заменой его с первым столбцом местами.

3.2. Диаграмма классов

 

3.3. Описание диаграммы классов

Базовый класс – «MatrixBase» содержит свойства и методы для работы с двумерным массивом элементов целого типа. В соответствии с заданием присутствуют методы «Get» и «Set» для доступа к закрытым членам класса. Класс «MatrixExt» - дочерний, содержит методы для выполнения задания: «MaxSummElementsCol» - находит столбец с максимальной суммой элементов, «SpawCols» - меняет местами столбцы, индексы которых переданы в параметры.

Оба класса содержат конструкторы, конструкторы копирования, деструкторы.

3.4. Блок-схема метода «MaxSummElementsCol()»

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

MatrixBase.h

#ifndef MATRIXBASE

#define MATRIXBASE

#include <iostream>

#include <stdio.h>

#include <windows.h>

#include <time.h>

using namespace std;

class MatrixBase

{

public:

MatrixBase():colsCount(0), rowsCount(0), a(0){}

MatrixBase(int, int, bool=true);

MatrixBase(const MatrixBase &);

MatrixBase & RandomFilling(int=1, int=100);

~MatrixBase();

void PrintMatrix() const;

int ** Get() const;

void Set(const int**, int, int);

protected:

int colsCount,rowsCount;

int **a;

int Random(int=1, int=100) const;

};

#endif

MatrixBase.cpp

#include "MatrixBase.h"

MatrixBase::MatrixBase(int rows, int cols, bool fillRand)

{

colsCount = cols;

rowsCount = rows;

a = new int * [rowsCount];

for(int i=0; i<colsCount; a[i++] = new int [colsCount]);

if(fillRand) RandomFilling();

}

MatrixBase::MatrixBase(const MatrixBase & src)

{

rowsCount = src.rowsCount;

colsCount = src.colsCount;

a = new int * [rowsCount];

for(int i=0; i<colsCount; a[i++] = new int [colsCount]);

for(int i=0; i<rowsCount; ++i)

 for(int j=0; j<colsCount; ++j) a[i][j] = src.a[i][j];

}

MatrixBase::~MatrixBase()

{

for(int i=0; i<rowsCount; delete [] a[i++]);

delete [] a;

}

int MatrixBase::Random(int min, int max) const

{

return rand()%(max - min) + min;

}

MatrixBase & MatrixBase::RandomFilling(int min, int max)

{

srand (time(NULL));

for(int i=0; i<rowsCount; ++i)

 for(int j=0; j<colsCount; a[i][j++] = Random(min, max));

return *this;

}

void MatrixBase::PrintMatrix() const

{

for(int i=0; i<rowsCount; ++i, cout << endl)

 for(int j=0; j<colsCount; cout << a[i][j++] << "\t");

cout << endl;

}

int ** MatrixBase::Get() const

{

return a;

}

void MatrixBase::Set(const int ** arr, int NewColsCount, int NewRowsCount)

{

for(int i=0; i<this->rowsCount; delete [] a[i++]);

delete [] a;

colsCount = NewColsCount;

rowsCount = NewRowsCount;

a = new int * [rowsCount];

for(int i=0; i<colsCount; a[i++] = new int [colsCount]);

for(int i=0; i<rowsCount; ++i)

 for(int j=0; j<colsCount; ++j) a[i][j] = arr[i][j];

}

MatrixExt.h

#include "MatrixBase.h"

#ifndef MATRIXEXT

#define MATRIXEXT

class MatrixExt: public MatrixBase

{

public:

MatrixExt():MatrixBase(){}

MatrixExt(int rows, int cols, bool fillRand=true):MatrixBase(rows, cols, fillRand){}

MatrixExt(const MatrixBase &src):MatrixBase(src){}

int MaxSummElementsCol() const;

MatrixExt & SpawCols(int, int);

};

#endif

MatrixExt.cpp

#include "MatrixExt.h"

int MatrixExt::MaxSummElementsCol() const

{

if(colsCount<1)

{

 cout << "Error! Columns count is 0!" << endl;

 return -1;

}

int ColElementsSumm = 0;

int MaxSumm = 0;

int ColMaxSumm = 0;

for(int j=0; j<colsCount; ++j)

{

 ColElementsSumm = 0;

 for(int i=0; i<rowsCount; ++i)

 {

  ColElementsSumm += a[i][j];

 }

 if(j==0) MaxSumm = ColElementsSumm;

  else

   if(ColElementsSumm>=MaxSumm)

   {

    MaxSumm = ColElementsSumm;

    ColMaxSumm = j;

   }

}

cout << "Max summ = " << MaxSumm << " in column #" << ColMaxSumm + 1 << endl;

return ColMaxSumm;

}

MatrixExt & MatrixExt::SpawCols(int col1, int col2)

{

if(col1>colsCount || col1 < 0 || col2>colsCount || col2 < 0)

{

 cout << "Error! Column number out of range!" << endl;

 return *this;

}

for(int i=0; i<rowsCount; ++i)

{

 int t = a[i][col1];

 a[i][col1] = a[i][col2];

 a[i][col2] = t;

}

return *this;

}

main.cpp

#include "MatrixExt.h"

int main()

{

MatrixExt a(5,5);

a.PrintMatrix();

a.SpawCols(a.MaxSummElementsCol(), 0).PrintMatrix();

return 0;

}

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

3.7. Теоретическая часть

Для решения задачи использовался двумерный динамический массив элементов целого типа и операции над ним: выделение/высвобождение памяти, заполнение, вывод на экран стандартной библиотекой iostream. Так же в приминено наследование.


Список использованных источников

  1.  Пол А. Объектно-ориентированное программирование на С++ – Изд-во Бином, Невский Диалект, 2001. –  464 с.
    1.  Буч Г. Объектно-ориентированное программирование с примерами применения  Издательство: M.: Конкорд, раниц; 1992 г. – 519 с
    2.  Дж. Либерти C++. Энциклопедия пользователя, Издательство: ДиаСофт, 2001 г.,  –  М. - Мысль, 1969. – 590 с.


 

А также другие работы, которые могут Вас заинтересовать

53601. Модель оценки капитальных активов 31 KB
  Одним из ключевых положений портфельной теории является обоснование того, что с каждым рисковым активом связаны два типа рисков – диверсифицируемый и недиверсифицируемый
53602. Работа в сети Интернет. Электронная почта 60 KB
  Электронная почта Этапы работы Содержание этапа заполняется педагогом Оценка эксперта по базовым педагогическим компетенциям и уровню владения учебным материалом 1. Методы: беседа Педагог здоровается отмечает отсутствующих в группе. Определение целей и задач которых педагог хочет достичь на данном этапе урока: повторение и закрепление теоретических знаний предыдущего занятия; закрепление практических навыков сохранения информации из интернета стимулирование обучающихся к быстрому выполнению работы воспитание эстетического...
53603. Конспект урока обучение грамоте: «Написание заглавной буквы «Т» 40.5 KB
  Детям предлагается игра Угадай букву по описанию Ставим ручку на верхнюю линию рабочей строки опускаемся по наклонной линии поднимаемся по наклонной до середины выполняем узелок уходим вправовверх и на 1 3 выписываем секрет по секрету наклонная вниз качалочка крючок до середины Ставим ручку на 1 3 сверху уходим влево вверх задерживаемся на строке опускаемся по наклонной вниз выполняем качалочку поднимаемся по крючку до середины две части соединяем секретом по секрету наклонная линия вниз качалочка крючок до середины...
53604. Введение в информатику. Правила техники безопасности 582.5 KB
  Дидактическая цель: дать общее представление об информатике как о науке ввести понятие информатика cформировать знания по технике безопасности работы в компьютерном классе. Знать: формулировку понятия информатика основные правила техники безопасности нормы работы в компьютерном классе основные упражнения физкультминутки. Информатика и ИКТ : учебник для 7 класса Н. Вначале мы узнаем что изучает предмет информатика а также поймем значимость этого предмета в современном мире.
53605. Оценка облигаций 23 KB
  Номинальная цена напечатана на бланке облигации и обозначает сумму, которая берется взаймы и подлежит возврату по истечении срока облигационного займа.
53606. Сантиметр 30 KB
  Сколько грибков у белочки Сколько грибков у ежика Как узнать сколько всего грибков Как записать это выражение Клик Прочитайте это выражение разными способами. Устное решение примеров слайд 4 кликаем Задания с окошками слайд 5 кликаем Восстановление числового ряда слайд 6 кликаем Задание от гнома Найти лишнюю фигуру слайд 7 почему...
53607. Компоненты оборотных активов 30 KB
  Оборотные средства (current assets) – это активы предприятия, возобновляемые с определенной регулярностью для обеспечения текущей деятельности, вложения в которые как минимум однократно оборачиваются в течение года или одного производственного цикла.
53608. Сложение и вычитание смешанных чисел 139 KB
  Высота Тайницкой башни м Благовещенской м. На сколько первая выше второй 2 Высота Водовзводной башни м Комендантской башни м Петровской башни м а Первой Безымянной м. Какая высота четырёх башен вместе 3 Высота Никольской башни до звезды м. Какова высота Угловой Арсенальной башни 4 Высота Боровицкой башни 54 м а Беклемишевской м.
53609. Основные теории структуры капитала: традиционная, Модильяни-Миллера 27 KB
  Соотношение между собственными и заемными источниками средств является одним из ключевых аналитических показателей, характеризующих степень риска инвестирования финансовых ресурсов в данное предприятие