лаб2 отчет (Лабораторная работа №2)
Описание файла
Файл "лаб2 отчет" внутри архива находится в следующих папках: Лабораторная работа №2, 2. Документ из архива "Лабораторная работа №2", который расположен в категории "". Всё это находится в предмете "объектно-ориентированное программирование (ооп)" из 3 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "объектно-ориентированное программирование (ооп)" в общих файлах.
Онлайн просмотр документа "лаб2 отчет"
Текст из документа "лаб2 отчет"
Московский Государственный Технический Университет им. Н. Э. Баумана |
Лабораторная работа №2 по курсу Объектно-Ориентированное Программирование «Изучение классов ARRAY и ARRAYITERATOR » |
Выполнил: Студент группы ИУ5-34 Белоус К.С. _____________________ Принял: Гапанюк Ю.Е. _____________________ |
Москва 2009 |
Цель работы
Целью лабораторной работы является продвинутое изучение оболочки (IDE) системы программирования BC 3.1 C++ и классов массивов, включенных в стандартную библиотеку CLASSLIB, (ARRAY и ARRAYITERATOR). В результате студенты должны изучить эти классы семейства ARRAY и приобрести навыки работы со стандартными классами (по материалам лекций, документации, литературе, справочной информации BC 3.1 и исходным файлам ARRAY.CPP , ARRAY.H, ARRAYS.H, ABSTARRY.CPP и ABSTARRY.H). Нужно детально изучить их состав и структуру, освоить приемы описания классов простой контейнерной структуры, а также научиться строить диаграммы классов и диаграммы объектов. В процессе ознакомления с данными классами обучающийся должен уметь описывать объекты этих классов и использовать их методы для управления объектами (модель поведения). Студенты в данной ЛР первоначально знакомятся с понятиями абстрактный класс и наследование (на примере классов OBJECT и ABSTARRAY) , а также получают навыки поиска информации о классах по исходным текстам программ и с помощью браузера классов (автоматическое построение диаграмм классов).
Действия и операции, необходимые к выполнению
-
Углубленно освоить порядок и особенности работы с оболочкой BC++ 3.1.
-
Изучить контейнерные классы по листингам (они тоже есть на сайте) и работу с ними (класс ARRAY и его базовые классы). Классы изучаются по текстам программ описания классов в виде заголовочных и исходных файлов (Для этого нужно инсталлировать ВС в полном объеме).
-
Изучить элементные классы (String или Date или Time по варианту) для включения объектов этих классов в массивы.
-
Изучить детально файлы ARRAY.CPP , ARRAY.H, ABSTARRY.CPP и ABSTARRY.H, содержащие описание класса ARRAY. Все свойства и методы, все базовые классы (Файлы располагаются по пути - <путь к BC>\CLASSLIB\INCLUDE\ и <путь к BC>\CLASSLIB\SOURCE\);
-
Освоить создание новых объектов типа ARRAY и элементных классов для включения в массивы (по варианту);
-
Продемонстрировать добавление элементов в массив с помощью метода add и других в программе;
-
Продемонстрировать работу с функциями printContentsOn и printOn в программе;
-
Продемонстрировать создание нового массива на основе другого;
-
Обратить внимание на недостатки и особенности использования класса массивов BC 3.1 C++. Зафиксировать основные недостатки класса ARRAY, которые имеются с Вашей точки зрения, в отчете по ЛР.
-
Изучить использование класса ARRAYITERATOR и его методов для навигации по массивам типа ARRAY (всех методов);
-
Освоить методы удаления и добавления элементов из массива (объектов членов в объект контейнер). При этом нужно показать различные способы удаления элементов, в том числе на основе:
-
Нового порожденного класса от Array класса, в котором делается доступным метод removeEntry из класса AbstractArray ( Там он защищен – protected);
-
И при использовании метода detach из класса AbstractArray при указании типа удаления TShouldDelete :: Delete для 2-го параметра метода.
-
Для уточнения процедур удаления и добавления нужно посмотреть и изучить файлы библиотеки классов: Abstarry.h, Abstarry.cpp, Shddel.h, Array.h.
Дополнительные требования (выполняются по желанию сильными студентами, выполнение дополнительных сребований учитывается при сдаче зачета по курсу):
-
Распечатать массивы с помощью нового перегруженного оператора для нового класса наследника от ARRAY ("<<"); Новый класс назвать MyArray.
-
Перегрузить самостоятельно операцию “=” для присваивания массивов( A = B; - элементы непустого массива А при выполнении операции должны быть корректно удалены ) и операцию “+” для сложения массивов ( C = A + B; - интерпретируется так: в новый массив С последовательно включаются элементы массива А и В, а элементы непустого С предварительно при выполнении этой операции должны быть удалены).
-
Выполнить перегрузку метода printOn для элементных объектов (String, Date, Time), включаемых в массив, при этом изменить формат распечатки отдельных объектов по сравнению со стандартным форматом. Для этого на основе элементного класса нужно создать новый класс c перегруженным методом. Править исходные тексты файлов BC++ не допускается. Продемонстрировать распечатку массива с новыми элементами с помощью методов printOn и printContentsOn для массива.
Перечень ошибок
-
Ошибки, связанные с настройкой компилятора.
-
Синтаксические ошибки.
-
Неправильное условие при написании цикла для копирования элементов.
Диаграмма классов.
ios – сохраняет информацию о потоке, содержит операторы для форматирования.
ostream – содержит перегрузку операции <<.
istream – содержит перегрузку операции >>.
iostream – обобщенный класс классов ostream и istream.
streambuf – обеспечивает операции ввода/вывода на низком уровне (взаимодействие с устройствами).
ostream_withassign, istream_withassign, iostream_withassign – содержат перегрузку операций =.
AbstractArray – содержит описание функций получения верхний и нижней границ массива, удаление элемента из массива и вывод его на экран.
Collection – содержит описание функции добавление элемента в массив, поиск элемента в массиве.
Container – содержит функции печати массива и др.
ArrayIterator – класс, позволяющий создавать итераторы, которые служат для удобного перемещения по массиву.
Array – класс, позволяющий создавать массивы, элементами которых будут объекты
myArray – мой порожденный класс, который делает доступной функцию removeEntry(int) – для удаления элемента из массива.
Листинг программы
Файл 2lab.cpp
#include <iostream.h>
#include <contain.h>
#include <array.h>
#include <strng.h>
#include <conio.h>
int Print();
//description of arrays
Array A(10);
Array B(10);
char* mas_st = new char [128];
class myArray: public Array
{
public:
myArray( int upper, int lower = 0, sizeType aDelta = 0 ) :
Array( upper, lower, aDelta ){}
void removeEntry(int loc) {Array::removeEntry(loc);}
ostream& operator << (ostream& stream_out)
{ContainerIterator& pIterator = (*this).initIterator();
pIterator.restart();
while (pIterator != 0)
{Object& array_member = pIterator++;
array_member.printOn(stream_out);}
return stream_out;
}
myArray& operator = (myArray& my)
{
for (int i =this->upperBound(); i>=0; i--)
{
this->detach(i,TShouldDelete::Delete);
}
ContainerIterator& pIterator = my.initIterator();
pIterator.restart();
while (pIterator != 0)
{
Object& array_member = pIterator++;
String &buf=(String&)array_member;
String* buf1 = new String;
*buf1 = buf;
this->add(*buf1);
}
return *this;
}
};
myArray& operator + (myArray& my1, myArray& my2)
{
myArray* m = new myArray(40);
ContainerIterator& pIterator1 = my1.initIterator();
pIterator1.restart();
ContainerIterator& pIterator2 = my2.initIterator();
pIterator2.restart();
while ((pIterator1 != 0)||(pIterator2 != 0))
{
if (pIterator1 != 0)
{
Object& array_member1 = pIterator1++;
String &buf=(String&)array_member1;
String* buf1 = new String;
*buf1 = buf;
m->add(*buf1);
}
if (pIterator2 != 0)
{
Object& array_member2 = pIterator2++;
String &buf2=(String&)array_member2;
String* buf3 = new String;
*buf3 = buf2;
m->add(*buf3);
}
}
return *m;
}
int main()
{
Print();
//input array A
for (int i=0; i<5; i++)
{ String* st = new String;
cout<<"input a string for array: ";
cin>>mas_st;
*st=mas_st;
A.add(*st);
}
//print array using printContentsOn
cout<<"\n output array A by using printContentsOn: ";
A.printContentsOn(cout);
getch();
//print array using printOn
cout<<"\n output array A by using printOn: \n";
for (i=0; i<5; i++)
{ A[i].printOn(cout);
cout<<endl;
}
getch();
//print array B using printContentsOn
cout<<"\n output array B by using printContentsOn: ";
B.printContentsOn(cout);
//copy array A
for (i=0; i<5; i++)
{String &buf=(String&)A[i];
String* buf1 = new String;
*buf1 = buf;
B.add(*buf1);
}
//print array B using printContentsOn
cout<<"\n output array B after copy: ";
B.printContentsOn(cout);
getch();
//print using iterators
cout<<"\nPrint using iterators\n";
ContainerIterator& printIter1 = A.initIterator();
ContainerIterator& printIter2 = B.initIterator();
for (i=0; i<5; i++)
{Object& array_object1 = printIter1++;
Object& array_object2 = printIter2++;
cout<<"A["<<i<<"] = ";
array_object1.printOn(cout);
cout<<"\nB["<<i<<"] = ";
array_object2.printOn(cout);
cout<<endl;
}
getch();
//add 1-st member of array A
String *st=new String;
cout<<"\n input a string for array: ";
cin>>mas_st;
*st=mas_st;
String &buf2=(String&)A[4];
String *buf3 = new String;
*buf3 = buf2;
A.add(*buf3);
//A.detach(A[0],TShouldDelete::Delete);
for (int j=4;j>0;j--)
{String &buf=(String&)A[j-1];
String *buf1 = new String;
*buf1 = buf;
A.addAt(*buf1,j);
}
A.addAt(*st,0);
//print array using printContentsOn
cout<<"\noutput array A after add: \n";
A.printContentsOn(cout);
getch();
//delete using new class
((myArray&)A).removeEntry(5);
//print array using printContentsOn
cout<<"\noutput array A after deleting: ";
A.printContentsOn(cout);
getch();
//delete
A.detach(A[4],TShouldDelete::Delete);
//print array using printContentsOn
cout<<"\noutput array A after deleting (detach): ";
A.printContentsOn(cout);
getch();
//print array using printContentsOn
cout<<"\noutput array B after deleting A (detach): ";
B.printContentsOn(cout);
getch();
myArray C(30);
myArray D(30);
C =((myArray&)B);
D =((myArray&)A);
cout<<"\noutput after operation C=B: ";
C.printContentsOn(cout);
cout<<"\noutput using <<: ";
cout<<C;
getch();
C=C+D;
cout<<"output after operation A+B: \n"<<C;
getch();
return 0;
}
Файл lab22.cpp
//About..
#include <iostream.h>
#include <conio.h>
int Print()
{cout<<"Lab #2."<<endl;
cout<<"Created by Kirill Belous, group IU5-34"<<endl;
return 0;
}
Результаты работы программы