Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

КР ООП, Вариант 5

.docx
Скачиваний:
20
Добавлен:
01.04.2014
Размер:
73.94 Кб
Скачать

Министерство образования РБ

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

«Белорусский государственный университет

информатики и радиоэлектроники»

Кафедра экономики.

Контрольная работа

по курсу ООП

Вариант №05

Выполнил: Проверила:

Минск 2009

Задача 1.

Создать 2 объекта разработанного класса. Класс - динамический вектор (одномерный массив). В результате выполнения программы в первом объекте должны содержаться все четные, а во втором все нечетные числа исходных векторов. Содержимое объектов (их векторов) до и после обмена вывести на экран.

Алгоритм.

В процессе выполнения программы создаем два динамических вектора и заполняем их произвольными значениями. Выводим значения на экран. Далее перебираем все элементы первого вектора и если находим нечетный элемент – удаляем его из первого вектора и добавляем в конец второго. Затем аналогичным образом перемещаем четные элементы из второго вектора в первый. Выводим оба вектора на экран.

Код.

Код функции, реализующей задачу 1 находится в приложении А. OOP1.cpp, функция - void task1(void); Код разработанного класса (динамического вектора) представлен в приложении Б.

Результат выполнения.

Задача 2.

Создать 2 объекта разработанного класса. Одной из компонент класса является символьная строка. В результате выполнения программы в обоих объектах слово максимальной длинны заменить на слово минимальной длинны. Содержимое объектов (их строки) до и после обмена вывести на экран.

Алгоритм.

В процессе выполнения программы создаем два объекта разработанного класса с произвольным значением строк. Выводим значения обеих строк на экран. Находим в каждом слово максимальной и минимальной длин с помощью соответствующего метода. Затем с помощью соответствующего метода заменяем слово максимальной длины на слово минимальной длины. Содержимое обеих строк выводи на экран.

Код.

Код функции, реализующей задачу 2 находится в приложении А. OOP1.cpp, функция - void task2(void); Код разработанного класса (содержащего строку) представлен в приложении В.

Результат выполнения.

Задача 3.

Создать несколько объектов (a и b) разработанного класса. Класс - вектор (одномерный массив). Реализовать для объектов данного класса перегрузку операции с = а - b. Содержимое объектов (их векторов) до и после выполнения операции вывести на экран.

Алгоритм.

В процессе выполнения программы создаем два динамических вектора и заполняем их произвольными значениями. Выводим значения на экран. Далее создаем новый вектор и присваиваем ему значение разности первого и второго векторов (оператор “-” перегружен). Выводим все три вектора на экран.

Код.

Код функции, реализующей задачу 3 находится в приложении А. OOP1.cpp, функция - void task3(void); Код разработанного класса (динамического вектора) представлен в приложении Б.

Результат выполнения.

Задача 4.

Создать несколько объектов (a и b) разработанного класса. Класс - вектор (одномерный массив). Реализовать для объектов данного класса перегрузку операции > (b>a). Содержимое объектов (их векторов) до и после выполнения операции вывести на экран.

Алгоритм.

В процессе выполнения программы создаем два динамических вектора и заполняем их произвольными значениями. Выводим значения на экран. Далее изменяем значение второго вектора оператором > (оператор “>” перегружен). Выводим оба вектора на экран.

Код.

Код функции, реализующей задачу 4 находится в приложении А. OOP1.cpp, функция - void task4(void); Код разработанного класса (динамического вектора) представлен в приложении Б.

Результат выполнения.

Приложение А.

Файл OOP1.cpp:

#include "stdafx.h"

#include "DVector.h"

#include "DVector.cpp"

#include "JustString.h"

void task1(void);

void task2(void);

void task3(void);

void task4(void);

int _tmain(int argc, _TCHAR* argv[])

{

task1();

task3();

task4();

task2();

return 0;

}

void task1() {

DVector<int> a = DVector<int>();

DVector<int> b = DVector<int>(15);

for (int i = 0; i < a.getSize(); i++) {

a.set(i,i * 3);

}

printf("%s","Before:\n");

printf("%s","A: ");

a.print();

for (int i = 0; i < b.getSize(); i++) {

b.set(i,i * 5);

}

printf("%s","B: ");

b.print();

for (int i = 0; i < a.getSize(); i++) {

if (a.get(i) % 2 != 0) {

b.add(a.get(i));

a.remove(i);

}

}

for (int i = 0; i < b.getSize(); i++) {

if (b.get(i) % 2 == 0) {

a.add(b.get(i));

b.remove(i);

}

}

printf("%s","\nAfter:\n");

printf("%s","A: ");

a.print();

printf("%s","B: ");

b.print();

printf("%c",'\n');

}

void task2() {

JustString a = JustString("a fa A DSfa'SD fasd fasd ff d");

JustString b = JustString("asdasda saas dasdasda min asda maxxxxxxxx asdas");

printf("%s","Before:\n");

printf("%s","A: ");

a.print();

printf("%s","B: ");

b.print();

a.replace(a.getMinWord(), a.getMaxWord());

b.replace(b.getMinWord(), b.getMaxWord());

printf("%s","\nAfter:\n");

printf("%s","A: ");

a.print();

printf("%s","B: ");

b.print();

}

void task3() {

int n = 5;

DVector<int> a = DVector<int>(n);

DVector<int> b = DVector<int>(n);

for (int i = 0; i < n; i++) {

b.set(i,i * 3);

a.set(i,i * 2);

}

printf("%s","Before:\n");

printf("%s","A: ");

a.print();

printf("%s","B: ");

b.print();

DVector<int> c = a - b;

printf("%s","After:\n");

printf("%s","A: ");

a.print();

printf("%s","B: ");

b.print();

printf("%s","C: ");

c.print();

}

void task4() {

int n = 15;

DVector<int> a = DVector<int>(n);

DVector<int> b = DVector<int>(n);

for (int i = 0; i < n; i++) {

b.set(i,i * 5);

if (i % 2 == 0) {

a.set(i,i * 4);

} else {

a.set(i,i * 6);

}

}

printf("%s","Before:\n");

printf("%s","A: ");

a.print();

printf("%s","B: ");

b.print();

b>a;

printf("%s","\nAfter:\n");

printf("%s","A: ");

a.print();

printf("%s","B: ");

b.print();

}

Приложение Б.

Файл DVector.h:

#pragma once

template <class T> class DVector {

private:

/* Содержит массив.*/

T *ms;

/* Содержит размер массива.*/

int size;

public:

/* Конструктор по умолчанию. Создает вектор длиной 10. */

DVector<T>(void);

/* Конструктор с параметром. Создает вектор длиной n.

n - длина вектора.*/

DVector<T>(int n);

/* Конструктор копирования. */

DVector<T>(const DVector<T> &);

/* Деструктор. */

~DVector<T>(void);

/* Возвразает длину вектора.*/

int getSize(void);

/* Задает значение i-му элементу вектора.*/

void set(int,T);

/* Возвращает значение i-го вектора. */

T get(int);

/* Добавляет один элемент в конец вектора. */

void add(const T &);

/* Ужаляет i-ый элемент вектора. */

void remove(int);

/* Выводит вектор на экран.*/

void print();

/* Перенрузка оператора "-".*/

template <class T> friend DVector<T> operator -(const DVector<T>, const DVector<T>);

/*Перенрузка оператора "=".*/

DVector<T> operator=(const DVector<T> &);

/*Перенрузка оператора ">".*/

DVector<T> operator>(const DVector<T>);

};

Файл DVector.cpp:

#include "StdAfx.h"

#include "DVector.h"

template <class T> DVector<T>::DVector(void) : size(10), ms(new T[10]){}

template <class T> DVector<T>::DVector(int n) : size(n), ms(new T[n]) {}

template <class T> DVector<T>::DVector(const DVector<T> &v) {

this->size = v.size;

this->ms = new T[this->size];

memcpy(ms,v.ms,sizeof(T)*size);

}

template <class T> DVector<T>::~DVector(void) {

delete [] this->ms;

}

template <class T> int DVector<T>::getSize(void) {

return this->size;

}

template <class T> void DVector<T>::set(int i, T t) {

this->ms[i] = t;

}

template <class T> T DVector<T>::get(int i) {

return this->ms[i];

}

template <class T> void DVector<T>::add(const T &t) {

T *tmp = ms;

ms = new T[this->size + 1];

if(tmp) memcpy(ms,tmp,sizeof(T)*this->size);

ms[this->size++] = t;

if (tmp) delete [] tmp;

}

template <class T> void DVector<T>::remove(int i) {

T *tmp = ms;

ms = new T[--this->size];

memcpy(ms,tmp,sizeof(T)*i);

memcpy(ms + i,tmp + i + 1,sizeof(T)*(this->size - i));

delete [] tmp;

}

template <class T> void DVector<T>::print(void) {

for (int i = 0; i < getSize(); i++) {

printf("%d",get(i));

printf("%c",' ');

}

printf("%c",'\n');

}

template <class T> DVector<T> operator-(const DVector<T> x, const DVector<T> y) {

DVector<T> res = DVector<T>(x.size);

for (int i = 0; i < res.getSize(); i++) {

res.ms[i] = x.ms[i] - y.ms[i];

}

return res;

}

template <class T> DVector<T> DVector<T>::operator=(const DVector<T> &x) {

ms = new T[x.size];

size = x.size;

for (int i = 0; i < size; i++) {

ms[i] = x.ms[i];

}

return *this;

}

template <class T> DVector<T> DVector<T>::operator>(const DVector<T> v) {

for (int i = 0; i < v.size; i++) {

if (v.ms[i] > ms[i]) {

ms[i] = v.ms[i];

}

}

return *this;

}

Приложение Б.

Файл JustString.h:

#pragma once

class JustString {

private:

/* Содержит строку.*/

char *s;

/* Содержит размер строки.*/

int size;

public:

/* Конструктор по умолчанию. Создает строку со значение "tensymbols". */

JustString(void);

/* Конструктор с параметром. Создает строку со значением, передаваемым как параметр.*/

JustString(char*);

/* Конструктор копирования. */

JustString(const JustString &);

/* Деструктор. */

~JustString(void);

/* Выводит строку на экран.*/

void print(void);

/* Возвразает длину строки.*/

int getSize(void);

/* Возвращает слово минималной длины.*/

char* getMinWord(void);

/* Возвращает слово максмальной длины.*/

char* getMaxWord(void);

/* Заменяет в тексте строки одно слово на другое.*/

void replace(char*,char*);

};

Файл JustString.cpp:

#include "StdAfx.h"

#include "JustString.h"

#include "string.h"

JustString::JustString(void) {

s = new char[11];

strcpy(this->s,"tensymbols");

size = 10;

}

JustString::JustString(char *ss) {

s = new char[strlen(ss)+1];

strcpy(this->s,ss);

size = strlen(this->s);

}

JustString::JustString(const JustString &ss) {

this->s = new char[ss.size+1];

size = ss.size;

strcpy(this->s,ss.s);

}

JustString::~JustString(void) {

delete [] s;

}

void JustString::print(void) {

printf("%s%c",s,'\n');

}

int JustString::getSize(void) {

return size;

}

char* JustString::getMinWord(void) {

char *tmp = new char[size+1];

int tmpI = 0;

char *minWord = new char[size+1];

int minSize = size;

for (int i = 0; i < size; i++) {

if (s[i+1] == '\0' || s[i] == ' ') {

if (s[i+1] == '\0' && s[i] != ' ') {

tmp[tmpI++] = s[i];

}

if (tmpI < minSize && tmpI > 0) {

minSize = tmpI;

for (int j = 0; j < minSize; j++) {

minWord[j] = tmp[j];

}

minWord[minSize] = '\0';

}

tmpI = 0;

} else if (s[i] == '.' || s[i] == ',' || s[i] == '!' ||

s[i] == '?' || s[i] == '-' || s[i] == ':' || s[i] == ';') {

} else {

tmp[tmpI++] = s[i];

}

}

char *res = new char[minSize];

strcpy(res,minWord);

delete [] tmp;

delete [] minWord;

return res;

}

char* JustString::getMaxWord(void) {

char *tmp = new char[size+1];

int tmpI = 0;

char *maxWord = new char[size+1];

int maxSize = 0;

for (int i = 0; i < size; i++) {

if (s[i+1] == '\0' || s[i] == ' ') {

if (s[i+1] == '\0' && s[i] != ' ') {

tmp[tmpI++] = s[i];

}

if (tmpI > maxSize && tmpI > 0) {

maxSize = tmpI;

for (int j = 0; j < maxSize; j++) {

maxWord[j] = tmp[j];

}

maxWord[maxSize] = '\0';

}

tmpI = 0;

} else if (s[i] == '.' || s[i] == ',' || s[i] == '!' ||

s[i] == '?' || s[i] == '-' || s[i] == ':' || s[i] == ';') {

} else {

tmp[tmpI++] = s[i];

}

}

char *res = new char[maxSize];

strcpy(res,maxWord);

delete [] tmp;

delete [] maxWord;

return res;

}

void JustString::replace(char* src,char* dst) {

char *tmp = new char[size+1];

int tmpI = 0;

bool updated = false;

for (int i = 0; i < size; i++) {

if (s[i+1] == '\0' || s[i] == ' ') {

if (s[i+1] == '\0' && s[i] != ' ') {

tmp[tmpI++] = s[i];

}

tmp[tmpI] = '\0';

if (strcmp(tmp,dst)==0) {

char *newS = new char[size + 1 - strlen(dst) + strlen(src)];

for (int j = 0; j < i - strlen(dst); j++) {

newS[j] = s[j];

}

int align = 0;

if (s[i+1] == '\0') {

newS[i - strlen(dst)] = ' ';

align = 1;

}

int jj = 0;

for (int j = i - strlen(dst) + align; j < i + strlen(src) - strlen(dst) + align; j++) {

newS[j] = src[jj++];

}

if (s[i] == ' ') {

newS[i + strlen(src) - strlen(dst)] = ' ';

}

for (int j = i +1+ strlen(src) - strlen(dst); j < size+1 - strlen(dst) + strlen(src); j++) {

newS[j] = s[j + strlen(dst) - strlen(src)];

}

newS[size - strlen(dst) + strlen(src)] = '\0';

size = size - strlen(dst) + strlen(src);

s = newS;

updated = true;

break;

printf("%s","FOUND!");

}

tmpI = 0;

} else if (s[i] == '.' || s[i] == ',' || s[i] == '!' ||

s[i] == '?' || s[i] == '-' || s[i] == ':' || s[i] == ';') {

} else {

tmp[tmpI++] = s[i];

}

}

delete [] tmp;

if (updated) {

this->replace(src,dst);

}

}