969

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

Контрольная

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

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

Русский

2013-01-06

323.5 KB

113 чел.

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

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

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

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

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

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

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

Вариант №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 с.


 

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

27532. Преемственность в праве: понятие, виды и значение 28.5 KB
  Преемственность в праве – заимствование правом того или иного государства положения прошлых либо современных правовых систем заимствование наилучших моделей элементов конструкций описания механизма правового регулирования с целью совершенствования правовых систем и правовой культуры Правопреемственность – это необходимый элемент закона отрицания отрицания. Главным фактором обусловливающим преемственность является необходимость нормативного регулирования ряда общественных отношений вытекающая из потребностей самого общества и...
27533. Презумпции и фикции в праве 27.5 KB
  Все приёмы законодательной техники делятся на 2 группы: 1 юридические средства – это допустимые правом предметы и явления с помощью которых обеспечивается достижение поставленных целей и получения результатов юридические термины и понятия; юридические конструкции; юридические символы; перечисления; юридические презумпции; юридические фикции; 2 юридические способы – пути достижения намеченных целей с помощью конкретных юридических средств и при наличие условий и предпосылок законодательной практики способы структуризации; способы...
27534. Приведите примеры юридических фактов-действий 30 KB
  Юридический факт конкретные социальные обстоятельства события действия вызывающие в соответствии с нормами права наступление определенных правовых последствий – возникновение изменение или прекращение правовых отношений. Классификация: 1 по характеру наступающих последствий: а правообразующие поступление в вуз; б прамоприменяющие перевод с очной формы на заочную; в правопрекращающие окончание вуза; 2 по связи с волей участников правоотношений: а события обстоятельства независящие от воли субъекта стихийное бедствие...
27535. Принципы права: понятие, классификация и значение 28 KB
  Принципы права исходные нормативноруководящие начала императивные требования определяющие общую направленность правового регулирования общественных отношений. Принципы права обусловлены рядом факторов: уровень экономического развития; особенности политической системы; социальноклассовые природы государства. Принципы российского права: 1 принцип справедливости; 2 принцип равноправия равенство перед законом и судом; 3 единство прав и обязанностей; 4 гуманизм основан на уважении человека его достоинства и прав; 5...
27536. Проиллюстрируйте соотношение норм права и статьи закона на примере ст.8.13 КоАП РФ 30 KB
  Соотношение между статьей и нормой во многом зависит оттого что перед нами логическая норма или норма предписание. Если это норма предписание то она полностью содержится в статье. В одной статье может содержаться две или более нормы предписания. Логическая норма может находиться в составе трех ее элементов и одной целой статье но тогда диспозицию или санкцию нужно выводить в статье логическим путем.
27537. Публичная (политическая власть) признак государства 23.5 KB
  Имеется в виду то что: 1 государство является властью которая не сливается с обществом а выделяется из него будучи относительно самостоятельной по отношению к обществу в определенном смысле над ним; 2 государственная власть внешне и официально представляет все общество выступает в качестве особого органа управления обществом; 3 эта власть призвана обеспечить поддержание правопорядка нормальной жизнедеятельности людей; 4 публичная власть как разновидность политической власти означает наличие у нее особого аппарата включающего...
27538. Разделение власти как принцип организации деятельности правового государства 27 KB
  Правовое государство можно определить как организацию политической власти в обществе основанную на верховенстве правового закона. Государство возлагает на граждан юридические обязанности запрещая совершать противоправные и обязывая совершать правомерные действия и в случае их неисполнения привлекает их к юридической ответственности. В свою очередь государство приобретая ряд монопольных прав на правотворчество на применение государственного принуждения на сбор налогов на эмиссию денежных знаков и др. Государство должно не просто...
27539. Рассмотрите отличия государственной власти от власти общественной 28 KB
  Рассмотрите отличия государственной власти от власти общественной. Таким образом можно выделить две основные особенности общественной власти характерные для первобытнообщинного строя: 1. Главными органами власти являлись: род собрание старейшина при необходимости военачальник. Эта власть по существу сливалась с населением так как не существовало разграничения между субъектом и объектом власти общество одновременно было и объектом и субъектом власти.
27540. Рассмотрите соотношение права и религиозных норм 29.5 KB
  Рассмотрите соотношение права и религиозных норм. Сходство норм права и религиозных норм имеет практически те же черты что и сходство норм права и норм морали и выражается в нормативности совокупность определенных норм являющихся образцом масштабом поведения людей универсальности эти нормы распространяются на общественные отношения общности права и религии в нормативноценностных критериях правомерного и неправомерного. В настоящее время принято выделять семьи религиозного права где в качестве основных источников права выступают...