969

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

Контрольная

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

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

Русский

2013-01-06

323.5 KB

119 чел.

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

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

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

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

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

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

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

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


 

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

77269. Оболочки и межоболочечные пространства спинного мозга. Содержимое этих пространств. Фиксирующий аппарат спинного мозга 13.58 KB
  От латеральной части отходят ligment denticult во фронтальной плоскости в форме зубцов верхушки которых охватываются отростками паутинной оболочки и заканчиваются на внутренней поверхности твёрдой посередине между двумя СМН rchnoide mter spinlis паутинная оболочка прозрачная плёнка переходит в паутинную оболочку головного мозга в области formen mgnum; на уровне SII сливается с мягкой оболочкой. Её отростки образуют влагалища для пронизывающих её корешков СМН и зубчатых связок. От боковой поверхности отходят отростки в виде рукавов для...
77270. Продолговатый мозг, его развитие, внешнее и внутреннее строение (ядра, проводники), артерии продолговатого мозга 385.3 KB
  Серое вещество: 4 группы ядер nuclei grcilis et cunetus; nuclei olive; nuclei formtion reticulris; ядра IXXII пар черепных нервов Черепные нервы продолговатого мозга: nn hypoglossus XII пара ccessories XI пара vgus X пара glossophryngeus IX пара.
77271. Мост, его развитие, внешнее и внутреннее строение (ядра и проводники). Артерии моста 147.51 KB
  Артерии моста. Внутреннее строение: На поперечном срезе можно выделить основание моста базилярную часть вентральную часть prs bsilris ventrlis; покрышку моста tegmentum pontis дорсальную часть prs dorslis и трапециевидное тело corpus trpezoideum Серое вещество: nuclei proprii pontis; nuclei formtion reticulris; nuclei nterior et posterior corporis trpezoideum; ядра VVIII пар черепных нервов. Черепные нервы моста n. Белое вещество: В базальной части основании моста проходят: tr.
77272. Мозжечок, его развитие, внешнее и внутреннее строение. Связи мозжечка с др отделами центральной нервной системы. Артерии мозжечка 232.24 KB
  Части: Средняя vermis Боковые hemispheri Поверхности: Fcies superior cerebelli посередине продольное возвышение vermis superior Fcies inferior cerebelli посередине продольное возвышение vermis inferior продольное углубление долина мозжечка vllecul cerebelli. Дольки червя: lingul cerebelli lobulus centrlis monticulus culmen declive folium cerebelli tuber vermis pyrmis vermis uvul vermis nodulus. Дольки полушарий: lobulus qudrngulris lobulus semilunris superior et inferior lobulus grcilis lobulus biventer tonsill...
77273. Спинно-мозжечковые пути 14.9 KB
  spinocerebellris posterior Идет в составе нижних ножек мозжечка. Заканчиваются на нейронах коры нижней части червя мозжечка.spinocerebellris nterior Идет в составе верхних ножек мозжечка. Заканчиваются на нейронах коры верхней части червя мозжечка.
77274. Средний мозг, его развитие, внешнее и внутреннее строение (отделы, ядра, тракты, полость) 120.39 KB
  Внутреннее строение: Серое вещество: substnti nigr чёрное вещество Земмеринга разграничивает bsis pedunculi cerebri вентральнее и tegmentum mesencephli дорсальнее содержит серое и белое вещество ножек мозга nucleus ruber на нём заканчиваются tr. striorubrlis nucleus interpedunculris межножковое непарное на нём заканчивается tr. hbenulointerpedunculris поводковомежножковый путь предположительно одно из звеньев эфферентного вегетативного пути substnti grise centrlis: nucl. trigemini V ядра III nucl.
77275. Промежуточный мозг, его развитие, классификация, отделы и полость. Стенки полости 445.42 KB
  Таламический мозг: Thlmus Epithlmus Metthlmus Внешнее строение таламуса зрительного бугра: tuberculum nterius pulvinr задний конец подушка stri terminlis терминальная полоска разделяет thlmus зрительный бугор и хвостатое ядро nucleus cudtus stri medullris мозговая полоска проходит на границе верхней и медиальной поверхностей зрительного бугра sulcus hypothlmicus sulcus limitns пограничная борозда граница между отделами промежуточного мозга dhesio interthlmic соединяет зрительные бугры tel choroide сосудистая...
77276. САМОКАЛИБРУЮЩАЯСЯ МАСШТАБИРУЕМАЯ СИСТЕМА ВВОДА ТРЁХМЕРНЫХ ЖЕСТОВ 62.5 KB
  Традиционные методы калибровки оптических камер требуют больших усилий со стороны пользователей и больших вычислительных ресурсов. Описываемый метод может работать в системах включающих в себя различные типы камер. Ключевые слова: калибровка оптические камеры алгоритм SCLBLE SELFCLIBRTING 3DGESTURE INPUT SYSTEM . Поэтому нами была разработана собственная технология основанная на единственной вебкамере и обыкновенном фонарике который пользователь держит в руке.
77277. Веб-ориентированная среда поддержки удаленного рендеринга и онлайн-визуализации 28.5 KB
  Классический подход к высокопроизводительным вычислениям подразумевает пакетное исполнение параллельных программ. При этом в определенных случаях практически ценным оказывается наблюдение за состоянием считающейся задачи и возможность управления ей. В простейшем варианте это может быть вывод в лог-файл по ходу счета значений переменных программы. Более сложные случаи требуют наличия специальной системы онлайн-визуализации для наблюдения и управления задачей.