Контрольная работа по «Объектно-ориентированное программирование»
Министерство образования Республики Беларусь
ГУВПО «Белорусско-Российский университет»
Кафедра АСУ
Контрольная работа №1
по дисциплине
«Объектно-ориентированное программирование»
Выполнил:
студент гр. АСОИЗ-102
Шагов А.
Шифр 102917
Проверил:
Н.К. Борисов
2012
- Описать класс, содержащий следующую текущую информацию о книгах в библиотеке. Сведения о книгах содержат:
- номер УДК;
- фамилию и инициалы автора;
- название;
- год издания;
- количество экземпляров данной книги в библиотеке.
Класс должен реализовывать следующие операции над данными:
- начальное формирование данных о всех книгах в библиотеке в виде списка;
- добавление данных о книгах, вновь поступающих в библиотеку;
- удаление данных о списываемых книгах;
- по запросу выдаются сведения о наличии книг в библиотеке, упорядоченные по годам издания.
Написать программу, демонстрирующую работу с этим классом. Программа должна содержать меню, позволяющее осуществить проверку всех методов класса.
# 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>
max=j;
}
tmp=book_data[max];
book_data[max]=book_data[n-i-
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<<
cout<<book_data[i].book_year<<
cout<<book_data[i].book_
}
}
}
int main()
{
list book;
char ch;
for(;;)
{
cout<<"_______________________
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<<"_______________________
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(
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(
d--;
}
else if(dd>d)
while(d!=dd)
{
str[strlen(str)+1]=str[strlen(
str[strlen(str)]='0';
d++;
}
}
else
{
str[strlen(str)+1]=str[strlen(
str[strlen(str)]='.';
for(n=0;n<dd;n++){
str[strlen(str)+1]=str[strlen(
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Исходные строки\
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("Введите
наименьшую ширину строки")<<
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.Ввод элементов")<
cout<<"a: "<<endl;
cin>>a;
cout<<"b:"<<endl;
cin>>b;
cout<<Rus("2.Пересечение")<<
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.Ввод элементов")<
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-------------------
//работа с типом 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. Архангельский А. Я.
2. Мейн М., Савитч У. Структуры данных и другие объекты в С++: Пер. с англ. – М.: “Вильямс”, 2002. – 832 с
3. Прата С. Язык

- Контрольная работа по «Объектно-ориентированное программирование»
- Контрольная работа по "Объектно-ориентированным языкам программирования"
- Контрольная работа по "Овощеводство"
- Контрольная работа по " Овощеводству"
- Контрольная работа по "Овощеводству"
- Контрольная работа по "Овощеводству и плодоводству"
- Контрольная работа по "Овцеводству"
- Контрольная работа по "Общему курсу транспорта"
- Контрольная работа по «Общему товароведению»
- Контрольная работа по «Общественное здоровье и здравоохранение»
- Контрольная работа по "Общественному питанию"
- Контрольная работа по «Общий менеджмент»
- Контрольная работа по "Общий психологический практикум"
- Контрольная работа по "Общим основам педагогики"