Lab3 - Report (1077287)
Текст из файла
Московский Государственный Технический Университет
имени Н.Э. Баумана.
УТВЕРЖДАЮ
"___"__________2000 г.
_____________________
(Большаков С.А.)
"Лабораторная работа по ПППО № 3"
Вариант № 4
Группа ИУ5-62
Отчет
(тип документа)
Бумага формата А4
(вид носителя)
6
(количество листов)
ИСПОЛНИТЕЛЬ
" " 2000 г.
_____________________
(Бидяк И.Н.)
Москва – 2000
-
Цель работы
Целью лабораторной работы является изучение продвинутое изучение оболочки(IDE) системы программирования BC 3.1 C++ и классов для с списками (OBJECT, LIST и LISTITERATOR) библиотеки CLASSLIB. В результате студенты должны приобрести навыки работы со стандартными классами по: материалам лекций, справочной информации BC 3.1, документации и файлам LIST.CPP, OBJECT.CPP , OBJECT.H И LIST.H..
-
Порядок работы
-
Изучение оболочки BC 3.1 C++ в интерактивном режиме( всех пунктов меню и окон настройки работы оболочки)
-
Составление блок-схемы и написание программы, состоящей из двух исходных файлов.
-
Редактирование текстов в среде оболочки
-
Создание проектного файла
-
Отладка программы с помощью отладчика
-
Формирование листинга программы и листинга результатов
-
Оформление отчета
-
Диаграмма классов Object, MyObj, List, MyList, и ListIterator
-
Ошибки, допущенные при написании программы
-
Для удаления элементов из списка сначала не использовал метод detachAt класса MyList, что приводило к необходимости после каждого удаленного элемента удалять iterator4 и заново его создават для списка, из которого уже удален элемент.
-
В методе addAtTail при очистке временного и основного списков сначала вызывал метод flush как flush( TshouldDelete::NoDelete) вместо flush( TshouldDelete::Delete), что приводило к неосвобождению памяти старых объектов списков и ошибке с выдачей сообщения 'assertion failed…'
-
Тело конструктора копирования для класса MyObj выглядело как " { integerValue=((MyObj)srcObject).GetValue(); };", вместо " { integerValue=((MyObj&)srcObject).GetValue(); };", что приводило к неправильной работе метода addAtTail класса MyList.
-
Сначала не определял для класса MyObj виртуальные методы isA, nameOf, hashValue, isEqual, что приводило к выдаче ошибки типа "Cannot create instance of absract class 'MyObj'".
-
Недостатки классов списков
-
Невозможно добавлять новые элементы в произвольное место списка (в частности в его конец, а не начало).
-
Нельзя узнать общее количество элементов в списке.
-
Неудобно реализован механизм удаления элементов – нельзя одновременно удалить несколько элементов (приходится каждый раз заново инициализировать объкт типа ListIterator).
-
Класс List может хранить только указатели на тип Object. Это с одной стороны не позволяет использовать класс List для хранения данных типа int, long, char и т.д., и с другой стороны возникает необходимость сначала создать объект какого класса, выделить под него память, а потом добавить указатель на него в объект класса List. Это делает использование класса List очень неудобным.
-
Листинг программы
//Начало файла LAB3MAIN.CPP
//Лабораторная работа по ПППО № : 3
//Номер варианта по списку : 4
//Группа : ИУ5-62
//Автор и исполнитель : Бидяк Иван Николаевич
//Назначение данного файла : Основной файл программы
#include <iostream.h>
#include <iomanip.h>
#include <list.h>
#include <ltime.h>
#include <conio.h>
#include <stdlib.h>
#include "MyObj.h"
#include "MyList.h"
//основная процедура
void main( void )
{
//производим необходимые приготовления для выполнения программы
clrscr();
//объявляем используемые списки
MyList A4;
MyList* B4=new MyList();
//получаем от пользователя 10 целых чисел и заносим их в список A4
int i4;
for (i4=0; i4<10; i4++)
{
cout << "Введите " << (i4+1) <<"(ый) элемент списка =>";
A4.add( *( new MyObj(cin) ) );
}
//распечатка A4 с помошью цикла и объекта класса ListIterator
cout<<endl<<"Распечатка A4 с помошью цикла и объекта класса ListIterator:\n";
A4.PrintContentsOn( cout );
//распечатка пустого B4 с помошью цикла и объекта класса ListIterator
cout<<endl<<"Распечатка пустого B4 с помошью цикла и объекта класса ListIterator:\n";
B4->PrintContentsOn( cout );
//формирование B4 как копии A4
ListIterator* iterator4 = new ListIterator( A4 );
iterator4->restart();
while ( iterator4->current()!=NOOBJECT )
{
B4->add( iterator4->current() );
(*iterator4)++;
}
//распечатка B4 с помошью цикла и объекта класса ListIterator
if ( iterator4!= 0 ) delete iterator4; //удаляем "старый" iterator4
iterator4 = new ListIterator( *B4 );
iterator4->restart();
cout<<endl<<"Распечатка B4 с помошью цикла и объекта класса ListIterator:\n";
while ( iterator4->current()!=NOOBJECT )
{
iterator4->current().printOn( cout<<" ");
(*iterator4)++;
}
cout << endl;
//удаление из B4 1-ого, 3-его, 5-ого и 7-ого элементов
B4->detachAt(1); //удаляем 1-ый элемент
B4->detachAt(2); //удаляем 3-ий элемент
B4->detachAt(3); //удаляем 5-ый элемент
B4->detachAt(4); //удаляем 7-ой элемент
//распечатка B4 после удаления из него 1, 3, 5 и 7 элементов
cout<<endl<<"Распечатка B4 после удаления из него 1, 3, 5 и 7 элементов:\n";
B4->PrintContentsOn( cout );
//добавляем в конец списка B4 новый элемент
cout << endl << "Введите новый элемент списка =>";
B4->addAtTail( *(new MyObj(cin) ) );
//распечатка B4 после добавления в него последнего элемента
cout<<endl<<"Распечатка B4 после добавления в него последнего элемента:\n";
B4->PrintContentsOn( cout );
//удаляем Iterator4
if ( iterator4!=0 )
delete iterator4;
//ждем нажатия пользователем любой клавиши
while( !kbhit() );
}
//Конец файла LAB3MAIN.CPP
//Начало файла MYLIST.H
//Лабораторная работа по ПППО № : 3
//Номер варианта по списку : 4
//Группа : ИУ5-62
//Автор и исполнитель : Бидяк Иван Николаевич
//Назначение данного файла : Заголовочный файл для класса MyList
#include <list.h>
class MyList : public List
{
public:
MyList() : List() {};
virtual ~MyList() {};
void addAtTail ( Object& toAdd );
void detachAt( int number, DeleteType dt = TShouldDelete::NoDelete );
void PrintContentsOn( ostream& outStream );
};
//Конец файла MYLIST.H
//Начало файла MYLIST.CPP
//Лабораторная работа по ПППО № : 3
//Номер варианта по списку : 4
//Группа : ИУ5-62
//Автор и исполнитель : Бидяк Иван Николаевич
//Назначение данного файла : Файл с методами класса MyObj
#include "MyList.h"
#include "MyObj.h"
void MyList::detachAt( int number, DeleteType dt )
{
ListIterator iterator4( *this );
iterator4.restart();
for (int i=1; i<number; iterator4++, i++);
if ( iterator4.current()!=NOOBJECT )
this->detach( iterator4.current(), dt );
}
void MyList::addAtTail( Object& toAdd )
{
//создаем новый (временный) список из старого (текущего)
MyList tempList4;
ListIterator* iterator4 = new ListIterator( *this );
iterator4->restart();
MyObj* tempObj;
while ( iterator4->current() != NOOBJECT )
{
tempObj = new MyObj( iterator4->current() );
tempList4.add( *tempObj );
(*iterator4)++;
}
//добавляем к новому списку элемент toAdd
tempList4.add( toAdd );
//удаляем все элементы из старого списка...
flush( TShouldDelete::Delete );
//...и формируем его заново из нового
if ( iterator4!=0 ) delete iterator4;
iterator4 = new ListIterator( tempList4 );
iterator4->restart();
while ( iterator4->current() != NOOBJECT )
{
this->add( *( new MyObj(iterator4->current()) ) );
(*iterator4)++;
}
//удаляем новый список
tempList4.flush( TShouldDelete::Delete );
}
void MyList::PrintContentsOn( ostream& outStream )
{
ListIterator iterator4( *this );
iterator4.restart();
outStream << "{";
while ( iterator4.current()!=NOOBJECT )
{
outStream<<" ";
iterator4.current().printOn( outStream );
iterator4++;
if ( iterator4.current()!=NOOBJECT )
outStream<< ",";
}
outStream << " }" << endl;
}
//Конец файла MYLIST.CPP
//Начало файла MYOBJ.H
//Лабораторная работа по ПППО № : 3
//Номер варианта по списку : 4
//Группа : ИУ5-62
//Автор и исполнитель : Бидяк Иван Николаевич
//Назначение данного файла : Заголовочный файл для класса MyObj
#include <object.h>
class MyObj : public Object
{
protected:
int integerValue;
int GetValue() { return integerValue; };
public:
MyObj( ) { integerValue=0; };
MyObj( Object& srcObject ) { integerValue=((MyObj&)srcObject).GetValue(); };
MyObj( istream& inputStream ) { inputStream >> integerValue; };
virtual ~MyObj( ) { };
virtual int isEqual( const Object _FAR& cmpObj) const;
virtual void printOn( ostream _FAR & outStream) const
{
outStream<<integerValue;
};
virtual classType isA() const { return 0; };
virtual char _FAR *nameOf() const { return "MyObj"; };
virtual hashValueType hashValue() const { return 0; };
};
//Конец файла MYOBJ.H
//Начало файла MYOBJ.CPP
//Лабораторная работа по ПППО № : 3
//Номер варианта по списку : 4
//Группа : ИУ5-62
//Автор и исполнитель : Бидяк Иван Николаевич
//Назначение данного файла : Файл с методами класса MyObj
#include "MyObj.h"
int MyObj::isEqual( const Object _FAR& cmpObj) const
{
if ( integerValue==((MyObj&)cmpObj).GetValue() )
return( 1 ); //TRUE
else
return( 0 ); //FALSE
};
//Конец файла MYOBJ.CPP
-
Листинг результатов
Листинг результатов получен путем перенаправления вводы/вывода с помощью команды "ivan_3.exe>listing.txt".
Введите 1(ый) элемент списка =>11
Введите 2(ый) элемент списка =>22
Введите 3(ый) элемент списка =>33
Введите 4(ый) элемент списка =>44
Введите 5(ый) элемент списка =>55
Введите 6(ый) элемент списка =>66
Введите 7(ый) элемент списка =>77
Введите 8(ый) элемент списка =>88
Введите 9(ый) элемент списка =>99
Введите 10(ый) элемент списка =>1010
Распечатка A4 с помошью цикла и объекта класса ListIterator:
{ 1010, 99, 88, 77, 66, 55, 44, 33, 22, 11 }
Распечатка пустого B4 с помошью цикла и объекта класса ListIterator:
{ }
Распечатка B4 с помошью цикла и объекта класса ListIterator:
11 22 33 44 55 66 77 88 99 1010
Распечатка B4 после удаления из него 1, 3, 5 и 7 элементов:
{ 22, 44, 66, 88, 99, 1010 }
Введите новый элемент списка =>1111
Распечатка B4 после добавления в него последнего элемента:
{ 22, 44, 66, 88, 99, 1010, 1111 }
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.















