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

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

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

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

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

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

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

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

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

по курсу ООП

Вариант №11

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

Минск 2009

Задача 1.

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

Алгоритм.

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

Код.

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

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

Задача 2.

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

Алгоритм.

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

Код.

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

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

Задача 3.

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

Алгоритм.

В процессе выполнения программы создаем два объекта разработанного класса с произвольным значением строк. Выводим значения обеих строк на экран. Изменяем значение строки второго объекта оператором <= (оператор «<=» перегружен). Содержимое обеих строк выводи на экран.

Код.

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

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

Задача 4.

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

Алгоритм.

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

Код.

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

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

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

Файл OOP2.cpp:

#include "stdafx.h"

#include "MyString.h"

#include "DVector.h"

void runTestString(void);

void runVectorTest(void);

void task1(void);

void task2(void);

void task3(void);

void task4(void);

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

task1();

//task2();

//task3();

//task4();

return 0;

}

void task1() {

MyString a = MyString("ads fa AS asdf af adsfadffadsgfgg ffg");

MyString b = MyString("first lasdjasljdal last");

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

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

a.print();

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

b.print();

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

char *first = a.getFirstWord();

char *last = a.getLastWord();

a.replace(first,last,true);

a.replace(last,first,false);

first = b.getFirstWord();

last = b.getLastWord();

b.replace(first,last,true);

b.replace(last,first,false);

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

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

a.print();

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

b.print();

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

}

void task2() {

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

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

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

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

a.print();

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

b.print();

a.replace(b.getMaxWord(), a.getMaxWord(), true);

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

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

a.print();

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

b.print();

}

void task3() {

MyString a = MyString("first line");

MyString b = MyString("second line");

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();

}

void task4() {

DVector a= DVector(15);

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

a.set(i,i * 3);

}

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

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

a.print();

DVector b = a++;

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

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

a.print();

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

b.print();

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

}

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

Файл MyString.h:

#pragma once

class MyString {

private:

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

char *s;

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

int size;

public:

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

MyString(void);

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

MyString(char*);

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

MyString(const MyString &);

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

~MyString(void);

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

void print(void);

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

int getSize(void);

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

char* getMinWord(void);

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

char* getMaxWord(void);

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

void replace(char*,char*,bool);

/* Возвращает первое слово.*/

char* getFirstWord(void);

/* Возвращает последнее слово.*/

char* getLastWord(void);

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

MyString operator<=(const MyString);

};

Файл MyString.cpp:

#include "StdAfx.h"

#include "MyString.h"

#include "string.h"

MyString::MyString(void) {

s = new char[11];

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

size = 10;

}

MyString::MyString(char *ss) {

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

strcpy(this->s,ss);

size = strlen(this->s);

}

MyString::MyString(const MyString &ss) {

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

size = ss.size;

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

}

MyString::~MyString(void) {

delete [] s;

}

void MyString::print(void) {

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

}

int MyString::getSize(void) {

return size;

}

char* MyString::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* MyString::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 MyString::replace(char* src,char* dst,bool recursive) {

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 && recursive) {

this->replace(src,dst,true);

}

}

char* MyString::getFirstWord(void) {

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

int tmpI = 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 > 0) {

tmp[tmpI] = '\0';

break;

}

} 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[tmpI];

strcpy(res,tmp);

delete [] tmp;

return res;

}

char* MyString::getLastWord(void) {

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

int tmpI = 0;

int lastSize = 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 > 0) {

lastSize = tmpI;

tmp[tmpI++] = '\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[lastSize];

strcpy(res,tmp);

delete [] tmp;

return res;

}

MyString MyString::operator<=(const MyString str) {

char *newS = new char[str.size + size + 1];

strcpy(newS,s);

strcat(newS,str.s);

s = newS;

size = str.size + size;

return *this;

}

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

Файл DVector.h:

#pragma once

class DVector {

private:

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

int *ms;

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

int size;

public:

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

DVector(void);

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

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

DVector(int n);

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

DVector(const DVector &);

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

~DVector(void);

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

int getSize(void);

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

void set(int,int);

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

int get(int);

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

void add(const int &);

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

void remove(int);

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

void print();

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

DVector operator=(const DVector &);

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

DVector operator++(void);

};

Файл DVector.cpp:

#include "StdAfx.h"

#include "DVector.h"

DVector::DVector(void) : size(10), ms(new int[10]){}

DVector::DVector(int n) : size(n), ms(new int[n]) {}

DVector::DVector(const DVector &v) {

this->size = v.size;

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

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

}

DVector::~DVector(void) {

delete [] this->ms;

}

int DVector::getSize(void) {

return this->size;

}

void DVector::set(int i, int t) {

this->ms[i] = t;

}

int DVector::get(int i) {

return this->ms[i];

}

void DVector::add(const int &t) {

int *tmp = ms;

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

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

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

if (tmp) delete [] tmp;

}

void DVector::remove(int i) {

int *tmp = ms;

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

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

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

delete [] tmp;

}

void DVector::print(void) {

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

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

printf("%c",' ');

}

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

}

DVector DVector::operator=(const DVector &x) {

ms = new int[x.size];

size = x.size;

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

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

}

return *this;

}

DVector DVector::operator++(void) {

DVector res = DVector(size);

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

res.ms[i] = ms[i];

ms[i]++;

}

return res;

}