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 с.


 

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

21312. Основные определения и критерии классификации угроз 87.5 KB
  Попытка реализации угрозы называется атакой а тот кто предпринимает такую попытку злоумышленником. Потенциальные злоумышленники называются источниками угрозы. Отметим что некоторые угрозы нельзя считать следствием какихто ошибок или просчетов; они существуют в силу самой природы современных ИС. Рассмотрим наиболее распространенные угрозы которым подвержены современные информационные системы.
21313. Хакерские атаки 928 KB
  Термин хакер здесь используется в его современном значении человек взламывающий компьютеры. Надо заметить что раньше быть хакером не считалось чемто противозаконным скорее это была характеристика человека умеющего профессионально обращаться с компьютерами. В наши дни хакерами мы называем тех кто ищет пути вторжения в компьютерную систему или выводит ее из строя.
21314. USING CONTEXT DATA IN INFORMATION RETRIEVAL 21 KB
  Proposed approach can be easily included in current search engines. This approach is not a complete alternative to classic methods applied in popular search engines, but it can be treated as an additional improvement that provides more efficient way in positioning on relevant document.
21315. Понятие электронно-цифровой подписи 38 KB
  Эта проблема решается при помощи ЭЦП. ЭЦП связывает содержимое документа и идентификатор подписывающего лица делает невозможным изменение документа без нарушения подлинности подписи и подтверждает принадлежность ЭЦП автору электронного документа. Алгоритмы формирования и проверки ЭЦП реализованы в соответствии с требованиями ГОСТ Р 34. ЭЦП Sign представляет собой вычисляемую по стандартизованному алгоритму математическую функцию хэшфункцию от содержимого подписываемых данных data информации документа и закрытого секретного ключа...
21316. Юридические вопросы информационной безопасности 202.5 KB
  Независимо от способа совершения компьютерного преступления его исполнители должны быть наказаны и профессионалы работающие в сфере информационной безопасности должны уметь собирать информацию необходимую правоохранительным органам при задержании и вынесении приговора лицам несущим ответственность за это преступление. В новом законодательстве нашли отражение вопросы безопасности финансовой информации о клиентах и конфиденциальности сведений медицинского характера. Все эти проблемы требуют понимания и изучения профессионалами работающими...
21317. Состав текущих затрат, сформированный в зависимости от производственно-хозяйственных целей предприятия РГБ 195.5 KB
  Все затраты на производство и реализацию продукции (работ, услуг) должны быть документально обоснованы и иметь исключительно целевое назначение. Поскольку издержки производства и обращения являются главной составляющей при расчете прибыли организации, они участвуют в расчете налогооблагаемой прибыли...
21318. Категории атак на информацию 317.5 KB
  Существуют четыре основных категории атак: атаки доступа; атаки модификации; атаки на отказ в обслуживании; атаки на отказ от обязательств. Атаки такого рода наиболее разрушительны. Атаки нацеленные на захват информации хранящейся в электронном виде имеют одну интересную особенность: информация не похищается а копируется. Определение атаки доступа Атака доступа это попытка получения злоумышленником информации для просмотра которой у него нет разрешений.
21319. Предмет і завдання екології. Місце екології у системі інших наук. Значення екології для людської цивілізації. Глобальні проблеми екології 56 KB
  З розвитком виробництва очевидною стає обмеженість традиційно використовуваних природних багатств суші, тому в наш час перспективи розвитку виробництва все в більшій мірі звязують з використанням ресурсів Світового океану та космічного простору. Тому можна сказати, що в наш час екологічні проблеми поширилися навіть за межі Землі.
21320. Безопасность сетей 113.46 KB
  Обеспечение безопасности сетей представляет собой сумму мероприятий направленных на предотвращение несанкционированного доступа к ресурсам сети а именно: Безопасность входа в систему Безопасность доступа к файловой системе Безопасность передачи данных по сети Физическая защита оборудования и помещений. Следует отметить что доступ к сети вообще говоря не означает полного доступа ко всем ресурсам. Поэтому в решении этой задачи предусмотрены как средства аутентификации пользователя так и средства описывающие права доступа к различным...