bsuir.info
БГУИР: Дистанционное и заочное обучение
(файловый архив)
Вход (быстрый)
Регистрация
Категории каталога
Другое [197]
Бухучет [16]
ВМиМОвЭ [4]
ОДМиТА [13]
ОЛОБД [17]
ООПиП [67]
ОС [19]
ПСОД [47]
Форма входа
Поиск
Статистика

Онлайн всего: 2
Гостей: 2
Пользователей: 0
Файловый архив
Файлы » ИСиТвЭ » ООПиП

Контрольная работа
Подробности о скачивании 10.01.2014, 02:09
Задание 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(" Institute of Information Technology ");
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 с.
2. Буч Г. Объектно-ориентированное программирование с примерами применения ¬ Издательство: M.: Конкорд, раниц; 1992 г. – 519 с
3. Дж. Либерти C++. Энциклопедия пользователя, Издательство: ДиаСофт, 2001 г., – М. - Мысль, 1969. – 590 с.
Категория: ООПиП | Добавил: marishka_505
Просмотров: 1393 | Загрузок: 15
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]