Контрольная работа по «Объектно-ориентированное программирование»

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

ГУВПО «Белорусско-Российский университет»

Кафедра АСУ

 

 

 

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

по дисциплине

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

 

 

Выполнил:

студент гр. АСОИЗ-102

Шагов А. 

Шифр 102917

Проверил:

Н.К. Борисов

 

 

2012

    1. Описать класс, содержащий следующую текущую информацию о книгах в библиотеке. Сведения о книгах содержат:
    • номер УДК;
    • фамилию и инициалы автора;
    • название;
    • год издания;
    • количество экземпляров данной книги в библиотеке.

Класс должен реализовывать следующие операции над данными:

    • начальное формирование данных о всех книгах в библиотеке в виде списка;
    • добавление данных о книгах, вновь поступающих в библиотеку;
    • удаление данных о списываемых книгах;
    • по запросу выдаются сведения о наличии книг в библиотеке, упорядоченные по годам издания.

Написать программу, демонстрирующую работу с этим классом. Программа должна содержать меню, позволяющее осуществить проверку всех методов класса.

# include <iostream.h>

# include <stdio.h>

# include <windows.h>

# define SIZE 255

struct library

{

int UDK;

char FIO[20];

char book_name[40];

int book_year;

int book_number;

};

//описание класса список

class list

{

int  n;

library *book_data;

 

public:

list();

~list();

void input();

void add();

void remove();

void show();

};

//конструктор

list::list()

{

book_data=new library[SIZE];

n=0;

}

//деструктор

list::~list()

{

delete book_data;

}

//ввод исходных  данных

 void list::input()

{

int i;

cout<<"Enter the number of books in the library:";

cin>>n;

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

{

cout<<"Enter the UDK number of "<<i+1<<" book:";

cin>>book_data[i].UDK;

puts("Enter the author's name of the book:");

gets(book_data[i].FIO);

puts("Enter the name of the book:");

gets(book_data[i].book_name);

cout<<"Enter year of publication of the "<<i+1<<" book:";

cin>>book_data[i].book_year;

cout<<"Enter the number of the "<<i+1<<" book:";

cin>>book_data[i].book_number;

}

}

//добавление элемента  в список

 void list::add()

{

int i=n;

cout<<"Enter the UDK number of book:";

cin>>book_data[i].UDK;

puts("Enter the author's name of the book:");

gets(book_data[i].FIO);

puts("Enter the name of the book:");

gets(book_data[i].book_name);

cout<<"Enter year of publication of the book:";

cin>>book_data[i].book_year;

cout<<"Enter the number of the book:";

cin>>book_data[i].book_number;

n=i+1;

 

}

//удаление элемента из списка

void list::remove()

{

int number,i,j;

bool flag;

if(!n)

cout<<"There is no books in the library!\n";

else

{

cout<<"Enter the UDK number of written off book:";

cin>>number;

flag=TRUE;

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

{

if(book_data[i].UDK==number)

{

flag=FALSE;

for(j=i;j<n+1;j++)

book_data[j]=book_data[j+1];   

cout<<"Remove is complete successfuly!\n";   

n--;

return;

}

}

if(flag)

{

cout<<"The book is not found in the library!\n";

}

}

//вывод содержимого  списка

 void list::show()

{

int i,j,max;

library tmp;

if(!n)

cout<<"There is no books in the library!\n";

else

{

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

{

max=0;

for(j=0;j<n-i;j++)

{

if(book_data[j].book_year>book_data[max].book_year)

max=j;

}

tmp=book_data[max];

book_data[max]=book_data[n-i-1];

book_data[n-i-1]=tmp;

}

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

{

cout<<book_data[i].UDK<<"\t";

cout<<book_data[i].FIO<<"\t";

cout<<book_data[i].book_name<<"\t";

cout<<book_data[i].book_year<<"\t";

cout<<book_data[i].book_number<<"\n";

}

}

}

int main()

{

list book;

char ch;

for(;;)

{

cout<<"________________________________________________________________\n";

cout<<"1. Creating data about the books in the library\n";

cout<<"2. Adding data of a new book\n";

cout<<"3. Remove written off book\n";

cout<<"4. Show the list of the book in the library\n";

cout<<"5. Quit\n";

cin>>ch;

cout<<"________________________________________________________________\n";

if(ch=='1')

book.input();

if(ch=='2')

book.add();

if(ch=='3')

book.remove();

if(ch=='4')

book.show();

if(ch=='5')

exit(1);

}

return 0;

}

 

 

  19) Создать класс StringType  для эффективной работы со строками, позволяющий форматировать и сравнивать строки, хранить в строках числовые значения и извлекать их. Строки должны быть представлены в виде массива символов с размещением в динамической памяти.  Для данного класса необходимо реализовать:

  • перегруженные операции присваивания и конкатенации;
  • операции сравнения и приведения типов;
  • преобразование в число любого типа;
  • форматный вывод строки.

Написать программу, демонстрирующую работу с этим классом.

 

#include  <iostream.h>

#include <string.h>

#include<windows.h>

 

// создание  класса  StringType

class StringType {

 

char *str;

 

public:

StringType(const StringType &); // конструктор  копирования

StringType(char *);     // конструктор 

~StringType();   // деструктор

 

int len();//вычисление длины  строки

void sput(int,int);//форматированный  вывод строки

        int strtoi();

double strtof();

//перегрузка операторов

StringType& operator=(const StringType&);

StringType operator+(const StringType &) const;//слияние(конкатенцию) строк

bool operator>(const StringType &) const; 

bool operator<(const StringType &) const;

bool operator==(const StringType &) const;

};

 

// конструктор

StringType :: StringType(char *s):str(NULL)

{

if(s==NULL)

{

str=new char [1];

*str='\0';

}

else

{

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

strcpy(str,s);

}

}

StringType :: StringType(const StringType &s):str(NULL)

{

 

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

strcpy(str,s.str );

 

}

 

// деструктор

StringType :: ~StringType()

{

delete str; 

}

//вычисление длины  строки

int StringType :: len()

{

return strlen(str);

}

//преобразование строки  в целое число

int StringType :: strtoi()

{

int a=atoi(str);

return a;

}

//преобразование строки в вещ. число

double StringType :: strtof()

{

double a=atof(str);

return a;

}

 

StringType& StringType::operator=(const StringType &s1) 

{

if(this==&s1) return *this;

delete str;

str=new char[strlen(s1.str)+1];

strcpy(str,s1.str);

return *this;

 

}

// слияние (конкатенцию) строк

//перегрузка оператора +

StringType StringType::operator+(const StringType &s1) const

{

char *s=new char[strlen(s1.str)+strlen(str)+1];

strcpy(s,str);

strcat(s,s1.str);

StringType newStr(s);

delete s;

return newStr;

}

//вывод строки

void StringType :: sput(int ll=1,int dd=0)//ll-ширина dd-точность

{

char *p;

int n,d;

cout.width (ll);

if ((p=strchr(str,'.'))!=NULL)

{

n=p-str+1;

d=strlen(str)-n;

if(dd<d)

while(d!=dd)

{

str[strlen(str)-1]=str[strlen(str)];

d--;

}

else if(dd>d)

while(d!=dd)

{

str[strlen(str)+1]=str[strlen(str)];

str[strlen(str)]='0';

d++;

}

}

else

{

str[strlen(str)+1]=str[strlen(str)];

str[strlen(str)]='.';

for(n=0;n<dd;n++){

str[strlen(str)+1]=str[strlen(str)];

str[strlen(str)]='0';}

}

cout<<str<<endl;

}

 

//перегрузка оператора >

bool StringType::operator>(const StringType &s1) const

{

if(atof(str)>atof(s1.str))

return true;

else

return false;

}

//перегрузка оператора <

bool StringType::operator<(const StringType &s1) const

{

if(atof(str)<atof(s1.str))

return true;

else

return false;

}

//перегрузка оператора  ==

bool StringType::operator==(const StringType &s1) const

{

if(atof(str)==atof(s1.str))

return true;

else

return false;

}

 

char buf[100];

char* RUS(char *text)//функция кодировки кирилицы в консольном прилож.

{

CharToOem(text, buf);

return buf;

}

 

int main()

{

int i,n,d;

//создание двух объектов типа StringType

StringType  a("123.698"), b("15");

do{

cout<<RUS("\nИсходные строки\na:")<<endl;

a.sput(a.len()+3,3);  //вывод строки a

cout<<"b:";

b.sput(b.len()+3,3); //вывод строки b

cout<<RUS("Меню:")<<endl;

cout<<RUS("1. присваивание  строк;")<<endl;

cout<<RUS("2. слияние (конкатенция)  строк;")<<endl;

cout<<RUS("3. сравнение  строк;")<<endl;

cout<<RUS("4. пребразование в целый  тип;")<<endl;

cout<<RUS("5. пребразование в вещественный  тип;")<<endl;

cout<<RUS("6. форматированный вывод")<<endl;

cout<<RUS("Для выхода нажмите  любую другую клавишу")<<endl;

cout<<RUS("Ваш выбор:")<<endl;

cin>>i;

switch(i)

{

case 1:

{StringType e=a;

cout<<"e:";

e.sput();

break;}

case 2:

{StringType c=a+b;// слияние (конкатенцию) строк a b

cout<<"a+b:";

c.sput(c.len()+3); //вывод строки c

break;}

case 3:

{if(a>b)

cout<<"a > b"<<endl;

if(a<b)

cout<<"a < b"<<endl;

if(a==b)

cout<<"a == b"<<endl;

break;}

case 4:

{int ii=a.strtoi();

cout<<ii<<endl;

ii=b.strtoi();

cout<<ii<<endl;

break;}

case 5:

{double f=a.strtof();

cout<<f<<endl;

break;}

case 6:

{cout<<RUS("Введите  наименьшую ширину строки")<<endl;

cin>>n;

cout<<RUS("Введите  точность")<<endl;

cin>>d;

cout<<"a:";

a.sput (n,d);

cout<<"b:";

b.sput (n,d);

break;}

}

}while(i>0&&i<=6);

 

return 0;

}

 

 

20) Создать абстрактный базовый класс Array с виртуальными методами сложения н поэлементной обработки массива foreach(). Разработать производные классы AndArray к OrArray (выбор). В первом классе операция сложения реализуется как пересечение множеств, а поэлементная обработка представляет собой извлечение квадратного корня. Во втором классе операция сложения реализуется как объединение, а поэлементная обработка - вычисление логарифма.

 

#include <iostream.h>

#include <stdlib.h>

#include<conio.h>

#include<math.h>

#include <windows.h>

char tt[256];

char* Rus(char *t)

{

CharToOem(t,tt);

return tt;

}

 

  class ARRAY

{ public:

float* elem;

int size;

 

ARRAY(int =1);//конструктор 

friend istream &operator>>(istream &, ARRAY &);

friend ostream &operator<<(ostream &, const ARRAY &);

virtual  void  add(ARRAY a,ARRAY b){}  //  виртуальная функция

virtual  void  foreach(){}  //  виртуальная функция

};

 

 

 

class  AndArray : public ARRAY {

public:

AndArray(int n=1):ARRAY(n){}

virtual void  add(ARRAY a,ARRAY b)

{

    int i,j,k=0;

 

for(i=0;i<a.size;i++)

for(j=0;j<b.size;j++)

if (a.elem[i]==b.elem[j])

k++;

size=k;

elem=new float[size];

for(k=i=0;i<a.size;i++)

for(j=0;j<b.size;j++)

if (a.elem[i]==b.elem[j])

elem[k++]=a.elem[i]; 

 

}

virtual void  foreach()

{

int i,j;

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

elem[i]=sqrt(elem[i]);

}

};

 

class  OrArray : public ARRAY {

public:

OrArray(int n=1):ARRAY(n){}

virtual void  add( ARRAY a, ARRAY b)

{

    int i,j,k=0;

bool flag;

for(i=0;i<a.size;i++)

for(j=0;j<b.size;j++)

if (a.elem[i]==b.elem[j])

k++;

size=a.size+b.size -k;

elem=new float[size];

for(i=0;i<a.size;i++)

elem[i]=a.elem[i];

k=a.size;;

for(i=0;i<b.size;i++)

{ for(j=0, flag=true;j<a.size;j++)

if (b.elem[i]==a.elem[j])

flag=false;

if(flag)

{elem[k]=b.elem[i];

k++;}

}

 

 

}

virtual void  foreach()

{

int i;

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

elem[i]=log(fabs(elem[i]));

}

};

//конструктор

  ARRAY::ARRAY(int n)

{

int i;

size=n;

elem=new float[size];

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

elem[i]=0;

}

 

ostream &operator<< (ostream &stream,  const ARRAY &ob)

{

int i;

for(i=0;i<ob.size;i++)

stream<<ob.elem[i]<<"  ";

stream<<endl;

return  stream;

}

istream &operator>> (istream &stream,  ARRAY &ob)

{

 

int i;

for(i=0;i<ob.size;i++)

stream>>ob.elem[i];

 

return  stream;

}

 

int main()

{

AndArray a(5),b(3), c;

cout<<Rus("1.Ввод элементов")<<endl;

cout<<"a: "<<endl;

cin>>a;

cout<<"b:"<<endl;

cin>>b;

cout<<Rus("2.Пересечение")<<endl;

c.add(a,b);

cout<<"c: "<<c<<endl;

cout<<Rus("3. Извлечение  корня")<<endl;

a.foreach();

b.foreach();

c.foreach();

cout<<"a: "<<a<<endl;

cout<<"b: "<<b<<endl;

cout<<"c: "<<c<<endl;

    OrArray a1(5),b1(3), c1;

cout<<Rus("1.Ввод элементов")<<endl;

cin>>a1;

cin>>b1;

cout<<Rus("2.Cложениe")<<endl;

c1.add(a1,b1);

cout<<"c: "<<c1<<endl;

cout<<Rus("3. Вычисление  логарифма")<<endl;

c1.foreach();

cout<<"c: "<<c1<<endl;

 

return 0;

}

 

 

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

# include <iostream>

# include <conio.h>

 

using namespace std;

 

//создаем шаблон класса  комплексных чисел

template <class type> class Complex

{

type a;//действительная  часть

type b;//мнимая часть

public:

//реализация конструктора  класса

//выполняющего функцию начальной инициализации

//действительной и  мнимой части

Complex(type A=0,type B=0){a=A;b=B;}

//реализация метода  перегрузки опрератора =

Complex operator=(Complex x)

{

a=x.a;

b=x.b;

return *this;

}

//реализация метода  перегрузки опрератора +

//для сложения комплексных  чисел

Complex operator+(Complex x)

{

Complex y;

y.a=a+x.a;

y.b=b+x.b;

return y;

}

//реализация метода  перегрузки опрератора -

//для вычитания комплексных  чисел

Complex operator-(Complex x)

{

Complex y;

y.a=a-x.a;

y.b=b-x.b;

return y;

}

//реализация метода  перегрузки опрератора *

//для умножения комплексных  чисел

Complex operator*(Complex x)

{

Complex y;

y.a=a*x.a-b*x.b;

y.b=a*x.b+b*x.a;

return y;

}

//реализация метода  вывода числа на экран

void show_number()

{

cout<<a<<" + i("<<b<<")"<<endl;

}

};

//реализация главной  функции

int main()

{

//объявление и инициализация 

//объектов класса Complex

//для типа int

Complex<int> i1(1,1),i2(-2,3),i3;

//объявление и инициализация 

//объектов класса Complex

//для типа double

Complex<double> d1(1.1,-2.3),d2(-1.,4.6),d3;

//работа с типом  int

cout<<"int numbers:"<<endl;

cout<<"i1 = ";i1.show_number();

cout<<"i2 = ";i2.show_number();

i3=i1+i2;

cout<<"\ni1+i2 =";i3.show_number();

i3=i1-i2;

cout<<"i1-i2 =";i3.show_number();

i3=i1*i2;

cout<<"i1*i2 =";i3.show_number();

cout<<"\n\n------------------------\n\n";

//работа с типом  double

cout<<"double numbers:"<<endl;

cout<<"d1 = ";d1.show_number();

cout<<"d2 = ";d2.show_number();

d3=d1+d2;

cout<<"\nd1+d2 =";d3.show_number();

d3=d1-d2;

cout<<"d1-d2 =";d3.show_number();

d3=d1*d2;

cout<<"d1*d2 =";d3.show_number();

 

getch();

return 0;

}

 

 

 

 

Список используемой литературы

1. Архангельский А. Я. Программирование  в C++Builder 4. – М.: ЗАО «Издательство БИНОМ», 1999. – 928 с.  

2. Мейн М., Савитч У. Структуры  данных и другие объекты в  С++: Пер. с англ. – М.: “Вильямс”, 2002. – 832 с

3. Прата С. Язык программирования  С++. Лекции и упражнения: Пер. с  англ. – К.: Диасофт, 2001. – 656 с

 


Контрольная работа по «Объектно-ориентированное программирование»