КР ООП, Вариант 5
.docx
Министерство образования РБ
Учреждение образования
«Белорусский государственный университет
информатики и радиоэлектроники»
Кафедра экономики.
Контрольная работа
по курсу ООП
Вариант №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);
}
}