969

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

Контрольная

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

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

Русский

2013-01-06

323.5 KB

101 чел.

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

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

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

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

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

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

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

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


 

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

1242. Административное право, ответы к экзамену 1.31 MB
  Понятие и правовое регулирование в административном праве. Понятие и основные черты административно-правовых отношений. Административно-правовые гарантии реализации прав граждан. Обращения граждан. Основные принципы построения и функционирования системы государственной службы: понятие, система и виды.
1243. Информационные системы в экономике 438 KB
  Объективность процесса информатизации, направления ее развития. Основные понятия экономической информатики. Информационный бизнес, рынок, менеджмент. Структура и схема функционально-позадачных информационных систем. Основные направления в развитии инфокоммуникационных технологий. Этапы компьютерного решения экономических задач.
1244. Шпаргалка по логике: Ответы на экзаменационные билеты 531.08 KB
  МЫШЛЕНИЕ КАК ПРЕДМЕТ ЛОГИКИ. ВЗАИМОСВЯЗЬ ЛОГИКИ И ЯЗЫКА. ОСОБЕННОСТИ ЛОГИЧЕСКИХ ЗАКОНОВ И ИХ СВЯЗЬ С ПРИНЦИПАМИ МЫШЛЕНИЯ. ЗАКОН ИСКЛЮЧЕННОГО ТРЕТЬЕГО. ПОНЯТИЕ КАК ФОРМА МЫШЛЕНИЯ. ОБОБЩЕНИЕ И ОГРАНИЧЕНИЕ ПОНЯТИЯ. ОПРЕДЕЛЕНИЕ ПОНЯТИЯ КАК ЛОГИЧЕСКАЯ ОПЕРАЦИЯ.
1245. Место и роль Фонда социального страхования РФ в обеспечении социальной защиты населения 626 KB
  Сущность и особенности функционирования фонда социального страхования РФ. Понятие, функции и принципы социальной защиты населения. Роль Фонда социального страхования в системе социальной защиты населения. Анализ деятельности фонда социального страхования РФ (на примере калужского регионального отделения).
1246. Право собственности в гражданском праве 389.5 KB
  Понятие и содержание права собственности по законодательству РФ. Проблема соотношения видов и форм права собственности. Классификации собственности на виды. Первоначальные и производные основания приобретения права собственности. Проблема определения момента приобретения права собственности на выморочное имущество (коллизии судебной практики).
1247. Проектирование одноцепной ВЛ 110 кВ ПС Березники 883.5 KB
  Определение расчетных климатических условий. Электрический расчет проводов. Определение единичных нагрузок на провод АС 150/24. Определение единичных нагрузок на трос ТК – 50. Поддерживающее неизолированное крепление для троса ТК – 50 (с заземлением) для ВЛ 110 кВ. Схема дополнительного заземления для промежуточных железобетонных опор. Определение срока монтажа ВЛ.
1248. Проектування токарно-револьверного верстата 761.5 KB
  Вибір компонування і визначення основних технічних характеристик верстата і приводів. Вибір базової моделі й обґрунтування принципової конструкції верстата. Проектний розрахунок приводу у автоматизованій системі PRIVOD. Розрахунок кількості зубів шестерень привода та оцінювання точності кінематичного розрахунку. Проектний розрахунок міцності деталей та механізмів привода головного руху.
1249. Проектирование предприятия пищевой промышленности 1.03 MB
  Компоновка и анализ помещений. Расчет фундаментной площади и болтов для крепления экстрактора НД-1250. Расчет фундаментных болтов для экстрактора. Расчет кинетостатики экстрактора НД-1250. Расчет сетевого графика монтажа.
1250. Пошук і використання альтернативних джерел палива 876.5 KB
  Аналіз основних напрямків розвитку альтернативного палива у світі. Використання газових та водневих вдигунів. Індикаторна діаграма циклу Отто. Паралельна схема роботи гібридів. Схема роботи двигуна Civic Hybrid. Функціональні системи автомобіля Toyota Prius. Аналіз схемних рішень електрозапалювання робочої суміші. Мікропроцесорна система запалювання.