Отчет по лабораторным работам по "Технологии программирования"

Автор работы: Пользователь скрыл имя, 03 Марта 2013 в 20:31, лабораторная работа

Описание работы

Цель работы:
Изучить основы объектно-ориентированного программирования на алгоритмическом языке С++. Получить представление об организации инкапсуляции, наследования и полиморфизма.
Порядок выполнения работы
1. Изучить предлагаемую программу изображения элементарных графических образов. Исследовать порядок наследования.
2. Ввести в схему наследования новый класс графической фигуры предложенный преподавателем.
3. В разрабатываемом классе графической фигуры определить атрибуты и сделать их полями класса.

Файлы: 1 файл

мой отчет по быкову.doc

— 120.00 Кб (Скачать файл)

 

 

   setcolor(prev_color);

       }

      void Hide()

{

    int prev_col=getcolor();

Color=getbkcolor();

    setcolor(Color);

ShowF();

    setcolor(prev_col);

}

      void Move(int DeltaX, int DeltaY)

{

    CenterX+=DeltaX;

CenterY+=DeltaY;

    Color=2;

    ShowF();

}

 

 

~Cube()

  {strcat(s, "Del class Cube \n");};

  };

 

 

 

 

// Љ« бб Њ“‹њ’€”€ѓ“ђЂ

class Comb: virtual public Cylinder, public Cube

{

public:

  Comb(int iCenterX, int iCenterY, int xRadius):

Cylinder(iCenterX, iCenterY, xRadius),

Cube(iCenterX, iCenterY, xRadius)

  {

Cylinder::SetNewColor(4);

Cube::SetNewColor(2);

   strcat(s,"Create class Comb \n");

  }

 

// ЊҐв®¤л Њ“‹њ’€”€ѓ“ђ›

  void Show()

  {

Cylinder::Show();

Cube::ShowF();

  }

  void Hide()

  {

Cube::Hide();

Cylinder::Hide();

  }

  void Move(int DeltaX, int DeltaY)

  {

Cylinder::Move(DeltaX, DeltaY);

Cube::Move(DeltaX, DeltaY);

  }

  void SetNewColor(int NewColor)

  {

Cylinder::SetNewColor(NewColor);

Cube::SetNewColor(NewColor);

  }

~Comb()

  {strcat(s, "Del class Comb \n");};

 

};

 

 

 

//Main Procedure

int main()

{ int num;

  int gdriver=DETECT, gmode, errorcode;

  initgraph(&gdriver, &gmode, "C:\\BORLANDC\\Bgi");

  errorcode=graphresult();

  if(errorcode!=grOk)

    {cerr<<"Graphics error"; exit(1);}

 

  Comb * F1;

F1=new Comb(350,150,100);

   

  F1->Show();

getch();

  int maxcolor=getmaxcolor();

  int direction=1;

  for (int color=1; !kbhit();color++)

    { if (color>maxcolor)

{ color=0; direction*=-1;};

    //  F1->SetNewColor(color);

      F1->Move(-10*direction,-5*direction);

      delay(100);

    };

  F1->Hide();

  delete F1;

  closegraph();

  /*‚лў®¤ Ї®б«Ґ¤®ў вҐ«м­®бвЁ ўл§®ў®ў Є®­бв\¤Ґбв*/

  cout<<s;

  s[0]='\0';

  getch();

  cout<<"\n  End Program\n  Press any key...";

  getch();

  return 0;

}

 

 

 

 

 

 

 

 

 

 

 

Лабораторная работа №3 
ОБОБЩЕННЫЕ КЛАССЫ

 

Цель работы

Изучить средства обобщения классов в языке C++.

 

Порядок выполнения работы

1. Разработать обобщенный класс по заданию преподавателя.

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

3. Разработать тестовые  наборы входных данных. Провести  тестирование.

11 вариант. Класс «Множество с повторениями». Методы: включение элемента, исключение элемента, определение количества вхождений заданного значения во множество, объединение множеств, отображение всех элементов множества на дисплее.

 

Текст программы:

#include <STDLIB.H>

#include <IOSTREAM.H>

#include <CONIO.H>

#include <time.h>

 

template <class Type> class CSets

{

public:

  CSets(int iSize);

  ~CSets();

  void Init();

  void Add(Type A);

  void Kick(Type A);

  int  getCountIn(Type A);

  void ConcatSets(CSets <Type> &A);

  void Print();

  Type *Buf;

 

private:

  int i;

  int j;

  int nSize;

};

 

template <class Type> CSets<Type>::CSets(int iSize)

{

 

   nSize = iSize;

   Buf = new Type[nSize];

 

};

 

template <class Type> CSets<Type>::~CSets()

{

      delete [] Buf;

};

 

template <class Type> void CSets<Type>::Init()

{

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

      Buf[i] = random(50)/5.0;//[0..10 | 0.0..10.0]

};

 

template <class Type> void CSets<Type>::Add(Type A)

{

  Type *TmpBuf;

  nSize = nSize + 1;

  TmpBuf = new Type[nSize];

  for (i=0; i < nSize - 1; i++)

     TmpBuf[i] = Buf[i];

     TmpBuf[nSize - 1] = A;

  delete [] Buf;

  Buf = new Type[nSize];

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

     Buf[i] = TmpBuf[i];

  delete [] TmpBuf;

}

 

template <class Type> void CSets<Type>::Kick(Type A)

{

  int k;

  do

  {

    k = -1;

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

      if  (Buf[i] == A)

      {

k = i;

break;

      }

 

    if (k==-1)  break;

 

    nSize = nSize - 1;

    for (i=k; i < nSize; i++)

      Buf[i] = Buf[i+1];

  }

  while (k != -1);

}

 

template <class Type> int CSets<Type>::getCountIn(Type A)

{

  Type Result = 0;

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

    if  (Buf[i] == A) Result = Result + 1;

  return Result;

}

 

template <class Type> void CSets<Type>::ConcatSets(CSets <Type> &A)

{

  Type *TmpBuf;

  TmpBuf = new Type[nSize+A.nSize];

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

     TmpBuf[i] = Buf[i];

  for (i=0; i<A.nSize; i++)

     TmpBuf[i+nSize] = A.Buf[i];

  delete [] Buf;

  nSize = nSize + A.nSize;

  Buf = new Type[nSize];

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

     Buf[i] = TmpBuf[i];

  delete [] TmpBuf;

}

 

template <class Type> void CSets<Type>::Print()

{

cout << '(';

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

   {

      cout << Buf[i] <<' ';

   }

cout << ')' << endl;

 

};

 

int main()

{

   randomize();

   int i;// Counter'л

   int j;

   // ђ §¬Ґа ¬ ббЁў 

   int ns = 5;//1 + rand() % 10;// 1..10

 

   clrscr();

 

   // Џ а ¬ҐваЁ§ жЁп и Ў«®­  жҐ«л¬ вЁЇ®¬ ¤ ­­ле

   CSets <int> iSet1(ns);

   iSet1.Init();

 

   CSets <int> iSet2(ns);

   iSet2.Init();

 

   cout << "Set1" << endl;

   iSet1.Print();

   cout << "Set2" << endl;

   iSet2.Print();

 

   cout << "Set1 = Set1 + Set2" << endl;

   iSet1.ConcatSets(iSet2);

   iSet1.Print();

 

   cout << "getCountIn(5) = " << iSet1.getCountIn(5) << endl;

   iSet1.Print();

 

   cout << "Add(6) Set1" << endl;

   iSet1.Add(6);

   iSet1.Print();

 

   cout << "Kick(6) Set1" << endl;

   iSet1.Kick(6);

   iSet1.Print();

 

  getch();

//-------------------------------------------

 

   CSets <float> fSet1(ns);

   fSet1.Init();

 

   CSets <float> fSet2(ns);

   fSet2.Init();

 

   cout << "Set1" << endl;

   fSet1.Print();

   cout << "Set2" << endl;

   fSet2.Print();

 

   cout << "Set1 = Set1 + Set2" << endl;

   fSet1.ConcatSets(fSet2);

   fSet1.Print();

 

   cout << "getCountIn(6.0) = " << iSet1.getCountIn(6.0) << endl;

  iSet1.Print();

 

   cout << "Add(6.0) Set1" << endl;

   fSet1.Add(6.0);

   fSet1.Print();

 

   cout << "Kick(6.0) Set1" << endl;

   fSet1.Kick(6.0);

   fSet1.Print();

 

  return 0;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Лабораторная работа № 4 
ПЕРЕГРУЗКА ОПЕРАТОРОВ

 

Цель работы:

Изучить механизм перегрузки операторов в языке C++.

 

Порядок выполнения работы:

1. Изучить предлагаемый  пример программы.

2. Вставить в  программу шаблонный класс, разработанный  в лабораторной работе № 3 (далее будем его называть MyTemplateClass). Дополнить поведение MyTemplateClass операторами, необходимыми для его использования в качестве элемента шаблона Vector. Например, если MyTemplateClass – матрица, то оператор «меньше» меньше может реализовать сравнение сумм квадратов элементов главной диагонали.

3. Определить  требования к типу, которым должен  параметризоваться MyTemplateClass. Дополнить поведение класса Complex необходимыми операторами. Например, если MyTemplateClass – матрица, для которой в методе умножения требуется умножать элементы матрицы, то в класс Complex надо ввести перегруженный оператор умножения.

4. Изменить головную  программу из примера таким  образом, чтобы шаблон Vector параметризовался классом MyClass, который, в свою очередь, должен параметризоваться классом Complex. Параметризация шаблона MyTemplateClass будет выполняться следующим образом (между символами «>» обязательно должен быть пробел):

Vector< MyTemplateClass<Complex> > vect1(2), vect2(1);

 

Текст программы:

/////////////////////////////////

//    Лабораторная работа №4   //

//    ПЕРЕГРУЗКА ОПЕРАТОРОВ    //

//         ВАРИАНТ 11          //

/////////////////////////////////

 

#include <iostream.h>

#include <iomanip.h>

#include <conio.h>

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

 

template <class T> class CArray //элемент списка

{

public:

    CArray(const T & Value, CArray<T> *NextVal);

    T Data;

    CArray<T> *Next;

    ~CArray();

};

 

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

template <class T> CArray<T>::CArray(const T & Value, CArray<T> *NextVal)

{

   Next = NextVal;

   Data = Value;

};

 

template <class T> CArray<T>::~CArray() {};//деструктор

 

// реализация шаблона класса

template <class T> class ArrayWithIterance

{

public:

  ArrayWithIterance(); //конструктор

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

  void Push(const T & Value); //вставка

  void Pop(const T & Value);     //удаление

  int Skoko(const T & Value);        //определение кол-ва вхождений

  ArrayWithIterance<T> * Soed(ArrayWithIterance<T> *Data2);     //обьединение множеств

  ArrayWithIterance<T> * Sort();     //сортировка

  void Onscr(); //вывод на экран

  ArrayWithIterance<T> & operator = (ArrayWithIterance<T> &Data2);

  int operator > (ArrayWithIterance<T> &Data2);                   //оператор сравнения

 

private:

  CArray<T> *Head; //указатель на начало списка

 friend ostream &operator << (ostream &arg1, ArrayWithIterance<T> &Data2);

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

 

template <class T> ArrayWithIterance<T>::ArrayWithIterance()

{

   Head = NULL;

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

 

template <class T> ArrayWithIterance<T>::~ArrayWithIterance()

{

CArray<T> *temp = Head;//указатель на голову списка

  CArray<T> **prev = &Head;//указатель на указатель

while (temp)   //просмотр списка до его конца (до Next=0)

{

*prev = temp->Next;//меняем указатель предидущего

delete temp;//и удаляем

prev = &temp->Next;//переходим к след.

temp = temp->Next;

}

}

 

//Методы: Push - включение элемента

template <class T> void ArrayWithIterance<T>::Push(const T & Value)

{

  Head = new CArray<T>(Value, Head);//добавляем элемент в  начало списка

//(создаем новый эл-т со ссылкой на голову и меняем указатель на голову

}

 

//Pop - исключение элемента

template <class T> void ArrayWithIterance<T>::Pop(const T & Value)

{

int el=0;

T zn;

  CArray<T> *temp1 = Head;//указатель на голову списка

  CArray<T> **prev = &Head;//указатель на указатель

  while (temp1)   //просмотр списка до его конца (до Next=0)

  {

    zn=(temp1->Data);

     if (zn == Value)//если нашли удаляемый эл-т, то

     {

      ++el;

*prev = temp1->Next;//меняем указатель предидущего

delete temp1;//и удаляем

break;

     }

     prev = &temp1->Next;//переходим к след.

     temp1 = temp1->Next;

  }

  if (el==0) cout<<endl<<"Искомый элемент не входит в данное множество! "<<endl;

}

 

//Skoko - определение количества вхождений заданного значения

//        во множество

template <class T> int ArrayWithIterance<T>::Skoko(const T & Value)

{

int s=0; char r[10]="";

CArray<T> *temp = Head;//указатель на голову списка

  while (temp)   //просмотр списка до его конца (до Next=0)

  {

     if (temp->Data == Value)//если нашли эл-т, то

         ++s;

     temp = temp->Next;

  }

if (s==0) cout << "Элемент "<< Value << " не входит во множество " << endl;

else

{

   if ((s%10)<2||(s%10)>4) strcpy(r," раз \n");

    else strcpy(r," раза \n");

     cout << "Элемент "<< Value << " входит во множество " << s << r;

 }

  return s;

}

 

//Soed - объединение множеств

template <class T> ArrayWithIterance<T> * ArrayWithIterance<T>::Soed(ArrayWithIterance<T> *Data2)

{

  ArrayWithIterance<T> *Data = new ArrayWithIterance<T>;

  CArray<T> *temp = this->Head;//указатель на голову списка

  while (temp)   //просмотр списка до его конца (до Next=0)

  {

     Data->Push(temp->Data);

     temp = temp->Next;

  }

  temp = Data2->Head;//указатель на голову списка

  while (temp)   //просмотр списка до его конца (до Next=0)

  {

     Data->Push(temp->Data);

     temp = temp->Next;

  }

 

  return Data;

}

 

//Sort

template <class T> ArrayWithIterance<T> * ArrayWithIterance<T>::Sort()

{

  ArrayWithIterance<T> *DataX = new ArrayWithIterance<T>;

  CArray<T> *temp = this->Head;//указатель на голову списка

  T zn;

  while (temp)   //просмотр списка до его конца (до Next=0)

  {

  while (temp)   //просмотр списка до его конца (до Next=0)

  {

if ((temp->Data) > zn)

     {

zn = (temp->Data);

     }

     temp = temp->Next;

  }

this->Pop(zn);

temp = this->Head;

DataX->Push(zn);

zn = temp->Data;

  }

 

return this;

}

 

//Onscrin - отображение всех элементов множества на дисплее

template <class T> void ArrayWithIterance<T>::Onscr()

{

   CArray<T> *temp = Head;

     while (temp)

     {

       cout << setprecision(3) << temp -> Data << "   ";

       temp = temp -> Next;// setprecision(3)-выводит 3 знака после запятой

     }

cout << endl;

}

 

//оператор присваивания

template <class T> ArrayWithIterance<T> & ArrayWithIterance<T>::operator = (ArrayWithIterance<T> &Data2)

{

  CArray<T> *temp = Head;//указатель на голову списка

  CArray<T> **prev = &Head;//указатель на указатель

while (temp)   //просмотр списка до его конца (до Next=0)

{

*prev = temp->Next;//меняем указатель предидущего

delete temp;//и удаляем

prev = &temp->Next;//переходим к след.

temp = temp->Next;

}

 

  ArrayWithIterance<T> temp1;//создание промежуточного списка

     temp = Data2.Head;//указатель на голову списка

while (temp)   //просмотр списка до его конца (до Next=0)

{

temp1.Push(temp->Data);

temp = temp->Next;

}

 

     temp = temp1.Head;//указатель на голову списка

while (temp)   //просмотр списка до его конца (до Next=0)

{

Push(temp->Data);

temp = temp->Next;

}

  return *this;

}

 

template <class T> int ArrayWithIterance<T>::operator > (ArrayWithIterance<T> &Data2) //оператор сравнения

{

int naib = 1, a1 = 0, a2 = 0;

    CArray<T> *temp = Head;//указатель на голову списка

while (temp)   //просмотр списка до его конца (до Next=0)

{

                ++a1;

temp = temp->Next;

}

  temp = Data2.Head;//указатель на голову списка

while (temp)   //просмотр списка до его конца (до Next=0)

{

        ++a2;

temp = temp->Next;

}

  if (a1 < a2) naib = 0;

 

return naib;

}

 

template <class T> ostream &operator << (ostream &arg1, ArrayWithIterance<T> &Data2) //оператор вставки в поток

{

   CArray<T> *temp = Data2.Head;

     while (temp)

     {

       arg1 << temp -> Data << "   ";

       temp = temp -> Next;

     }

  return arg1;

}

 

 

 

template <class Element>

class Vector

{

private:

        int size;

        Element * array;

 

public:

        Vector()

        {

                size = 0;

                array = NULL;

        }

        Vector(int sz)

        {

                size = sz;

                array = new Element[size];

        }

        ~Vector()

        {

                if(array != NULL)

                        delete [] array;

        }

        Element& operator[](int i)

        {

                return array[i];

        }

        void sort();

void outputToScreen(int ima);

        Vector<Element>& operator=(Vector<Element> &arg2);

int operator<(Vector<Element> &arg2);

Информация о работе Отчет по лабораторным работам по "Технологии программирования"