Контрольная работа по "Программированию на языке СИ++"

Министерство образования и науки

Сарапульский политехнический институт (филиал)

Государственного образовательного учреждения

Высшего профессионального  образования

«Ижевский государственный  технический университет»

 

Кафедра КИПР

 

 

 

 

 

КОНТРОЛЬНАЯ РАБОТА

по дисциплине: Программирование на языке СИ++

 

 

 

 

 

 

Выполнит студент группы 261ЗДУ                               Пастухов Р.В.

 

Проверил преподаватель                       Максимов М. В.

 

 

 

 

 

 

 

 

 

Сарапул 2010

 

Лабораторная работа №1.

 

Цель. Получить практические навыки реализации классов на C++.

Основное содержание работы.

Написать программу, в  которой создаются и разрушаются  объекты, определенного пользователем класса «Цех». Выполнить исследование вызовов конструкторов и деструкторов.

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

1.Определить пользовательский  класс в соответствии с вариантом  задания (смотри приложение).

2.Определить в классе  следующие конструкторы: без параметров, с параметрами, копирования.

3.Определить в классе  деструктор.

4.Определить в классе  компоненты-функции для просмотра и установки полей данных.

5.Определить указатель  на компоненту-функцию.

б.Определить указатель  на экземпляр класса.

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

8.Показать в программе  использование указателя на объект  и указателя на компоненту-функцию.

 

 Приложение 1 Файл ceh.h

 

#ifndef ceh_h

#define ceh_h

class ceh{//Объявление цеха

public:

ceh();//Конструктор без параметров

cehf(char *n1, char *n2, int n3);//Конструктор  с параметрами

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

~ceh();

ceh& operator=(const ceh& op2);//Оператор присваивания (аналогично копированию) х=у

void  show();//Функция вывода  на  экран 

void  input();//Функция ввода

private:

char name[25], nach[25];//Имя и начальник

int num;//Количество работающих

};

#endif

 

 

Файл ceh.cpp

 

#include "ceh.h"

#include <string>

ceh::ceh(){//Конструктор без параметров ceh x;

printf("Call constructor\n");

this->name[0] = NULL; this->nach[0] = NULL; this->num =0;

}

ceh::ceh(char *n1, char *n2, int n3){//Конструктор  с параметрами ceh x(...)

strcpy(this->name, n1); strcpy(this->nach, n2); this->num = n3;

}

ceh::ceh(const ceh& op2){//Конструктор  копирования 

ceh x = у

strcpy(this->name, op2.name); strcpy(this->nach, op2.nach); this->num = op2.num;

}

ceh::~ceh(){//Деструктор

printf("Call destructor\n");

}

ceh& ceh::operator = (const ceh& op2){//Оператор присваивания (аналогично копированию) х = y

strcpy(this->name, op2.name); strcpy(this->nach, op2.nach); this->num = op2.num;

return *this;

}

void ceh::show(){//Вывод на экран

printf("Name: %s\nNach: %s\nNumber of workers: %i\n\n",this->name, this->nach,

this->num);

}

void ceh::input(){//3aпись данных

printf("Input name: "); scanf("%s",this->name); printf("Input nach: "); scanf("%s",this->nach);

printf("Input number: "); scanf("%i",&this->num);

}

 

 

Приложение 2 Файл.срр

 

#include "ceh.h"

ceh c1; //Вызов конструктора без  параметров

ceh c2("Avia", "Gorbunov", 150); //Вызов  конструктора с параметрами 

ceh с3[3] = {ceh(“Mulitary", "Popov", 140), ceh("HQ","Ovechkin",132), ceh("System", "Himkin"., 164)};

ceh c4 = c2; //Вызов конструктора копирования

void main(){

ceh *c = new ceh[2];// Массив цех размещается  в динамической памяти

c1.input();

c1.show();

c3[1].show();

с[0] = сЗ[2];с[1] = с4;

c[1].show();//Использование указателя  на функцию 

void (ceh::*pf)();

pf=&ceh::show;

c3[0].*pf)();//Вызов функции

}

 

 

Лабораторная работа №2

 

Цель. Получить практические навыки создания иерархии классов и  использования статических компонентов класса.

Основное содержание работы.

Написать программу, в  которой создается иерархия классов. Включить полиморфные объекты в связанный список, используя статические компоненты класса. Показать использование виртуальных функций.

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

1.Определить иерархию  классов (в соответствии с вариантом).

2.Определить в классе  статическую компоненту - указатель на начало связанного списка объектов и статическую функцию для просмотра списка.

3.Реализовать классы.

4.Написать демонстрационную  программу, в которой создаются  объекты различных классов и  помещаются в список, после чего  список просматривается.

5.Сделать соответствующие методы не виртуальными и посмотреть, что будет.

6.Реализовать вариант,  когда объект добавляется в  список при создании, т.е. в  конструкторе.

Перечень классов: квитанция, накладная, документ, чек

 

Приложение 1 Файл document.h

 

#ifndef document_h

#define document_h

class document{//Базовый класс

public:

virtual void add() = 0;//Чистая виртуальная  функция добавления элемента  в список

virtual void show() = 0;//Чистая виртуальная  функция просмотра элемента списка static document *begin;//Указaтeль на начало списка

static void print();//Статическая функция  для просмотра списка

protected:

char name[25];

document  *пеxt;//Указатель на следующий  элемент в списке

};

class kvit:  virtual public document{//Производный  класс квитанция 

public:

kvit();// конструктор по умолчанию

kvit(char *n,  int s);

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

virtual ~kvit();// виртуальный деструктор

void add();

void show();// чистая виртуальная функция 

private:

int sum;//Количество мест

};

class nakl: virtual public document{//Производный класс накладная

public:

nakl();

nakl(char *n, int s);

nakl(const nakl& tmp);

virtual ~nakl();

void add();

void show();

private:

int sum;

};

class check: virtual public document{//Производный  класс чек 

public:

check();

check(char *n, int s);

check(const check& tmp);

virtual ~check();

void add();

void show();

private:

int sum;

};

#endif

 

Файл document.cpp

 

#include "document.h"

#include <stdio.h>

#include <string.h>

kvit::kvit(char *n,  int s){

strcpy(this->name, n); this->sum = s;

}

kvit::kvit(const kvit& tmp){

strcpy(this->name, tmp.name); this->sum = tmp.sum;

}

kvit::~kvit(){

}

void kvit: :аdd(){//Добавление  элемента в список

this->next - document::begin; //2 элементом  в списке является текущее  начало 

document::begin = this; //Задаем новое начало списка

}

void kvit::show(){//Вывод на экран  документа

printf("Name: %s\nSum: %i\n\n",this->name, this->sum);

}

nakl::nakl(char *n, int s){

strcpy(this->name, n); this->sum = s;

}

nakl::nakl(const nakl& tmp){

strcpy(this->name, tmp.name); this->sum = tmp.sum;

}

nakl::~nakl(){

}

void nakl::add(){

this->next = document::begin;

document::begin = this;

}

void nakl::show(){

printf("Name: %s\nSum: %i\n\n",this->name> this->sum);

}

check::check(char *n, int s){

strcpy(this->name, n); this->sum - s;

}

check::check(const checks tmp){

strcpy(this->name, tmp.name); this->sum = tmp.sum;

}

check::~check(){

}

void check::add(){

this->next = document::begin;

document::begin = this;

}

void check::show(){

printf("Name: %s\nSum: %i\n\n",this->name, this->sum);

}

 

 

Приложение 2 Файл.срр

 

#include "document.h"

document *document::begin = 0;//Инициализация вне  класса

void document: :print(){//Просмотр списка 

document *tmp = document::begin;

while(tmp){//Пока не найден конец  списка

tmp->show();//Выводим на экран

tmp = tmp->next;

}

}

void main(){

check d1("IzhCom",125);  nakl d2("SPI",150);  kvit d3("MVD",300);

d1.add;(); d2.add(); d3.add();//Добавление в  список 

document::print();//Просмотр списка

 

Лабораторная работа №5

 

Цель. Получить практические навыки работы в среде ВС++5.02 и создания EasyWin программы. Получить практические навыки создания абстрактных типов данных и перегрузки операций в языке C++.

Основное содержание работы.

Определить и реализовать класс set - абстрактный тип данных. Определить и реализовать операции над данными этого класса. Написать и выполнить EasyWin программу полного тестирования этого класса.

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

1 .Выбрать класс АТД в соответствии  с вариантом.

2.Определить и реализовать в  классе конструкторы, деструктор, функции Input (ввод с клавиатуры) и Рrint (вывод на экран), перегрузить операцию присваивания.

3.Написать программу тестирования  класса и выполнить тестирование.

4.Дополнить определение класса  заданными перегруженными операциями (в соответствии с вариантом).

5.Реализовать эти операции. Выполнить  тестирование.

 

Приложение 1. Файл set_int.h

 

#include<malloc.h>

#include<stdio.h>

class set{//Множество

public:

set(){

            thls->current_size=0;//Устанавливаем размер  множества равным 0

           this->mas=(int*)malloc(sizeof(int));

  }

  set(int n,  ...){

              int *p=&n, *tmp, i;

               this->max_size = 5; this->current_size=0;

                //Для дальнейшего изменения размера  массивов через realloc используем процедуру malloc

              mas = (int*)malloc(sizeof(int));

              tmp = (int*)malloc(sizeof(int));

              //Считываем все

                 While(*p){

                           if(this->current_size){

                                    tmp=(int*)realloc(&tmp[0],(this->current_size+1)*sizeof(int));//Изменяем размер временного массива

                              for(i=0;i<this->current_size;i++) tmp[i]=this->mas[i];//3aписываем  во временный массив данные

                               tmp[this->current_size]=(*р);//3аписываем                                              

                           mas=(int*)realloc(&mas[0],(this->currerrt_size+1)*sizeof(int));

                              for(i=0;i<this->current_size+i;i++) this->m3s[i] current_size++;

} else this->mas[this->current_size++]=(*p);

p++;

     }

     free(&tmp[0]);

}

set(const set& tmp){//Копирование

            this->current_size=tmp.current_size;

            this->mas=(int*)realloc(&mas[0],(this->current_size)*sizeof(int));

   for(int i=0;i<this->current_size;i++)

this->mas[i]=tmp.mas[i];

   this->max_size=tmp.max_size;

}

set& operator=(const set& tmp){//Присваивание

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

   this->current_size = tmp.current_size;

   this->mas=(int*)realloc(&mas[0],(this->current size)*sizeof(int));

   for(int i=0;i<this->current_size;i++) this->mas[i] = tmp.mas[i];

   this->max_size = tmp.max_size;

   return *this;

  }

  set& operator*(const set& ор2){//Пересечение

   set*x = new set; int *tmp;

   x->mas = (int*)malloc(sizeof(int));

   tmp=(int*)malloc(sizeof(int));

   x->current_size=0;

    x->max_size = 5;

   for(int i=0;i<this->current_size;i++)

             for(int j=0;j<op2.current_size;j++)

                        if(this->mas[i] == op2.mas[j]){

                                           tmp = (int*)realloc(&tmp[0],(x-

>current_size+1)*sizeof(int));

                                            for(int k=0;k<x->current_size;k++) tmp[k]=x->max[k];

                                            tmp[x->current_size++]=this->mas[i];

                                            x->max=(int*)realloc(&x->mas[0],(x-

>current_size+1)*sizeof(int)); 

                                                for(int k=0;k<x->current_size;k++) x->mas[k]=tmp[k];       

                                               break;

                                      }            

                free(&tmp[0]);

                return *x;

}

bool operator > (const int& ор){//Принадлежность

            for(int i=0;i<this->current_size;i++)

                             if(this->mas[i] == op) return true;

            return false;

}

bool operator < (const set& tmp){//Подмножество 

             bool b;

             for (int i=0;i<tmp.current_size;i++){

                        b = false;

                        for(int j=0;j<this->current_size;j++)

                                   if(this->mas[j]==tmp.mas[i]) b = true;

                        if(!b) return false;

             }

             return true;

}

~set(void){//Деструктор 

            free(&mas[0]);

}

void print(void){

           printf(“Size: %i\nSet:”,this->current_size);

           for(int i=0;i<this->current_size;i++) printf(“%i”,this->mas[i]);

           printf(“\n”);

}

void input(void){

           printf(“Enter size of set:”); scanf(“%i”,&this->current_size);

           mas=(int*)realloc(&mas[0],(this->current_size)*sizeof(int));

           printf(“Enter set:”);

           for(int i=0;i<this->current_size;i++) scanf(“%i”,&this->mas[i]);

}

void set_max_size(int max_size){

           this->max_size = max_size;

           if(this->current_size > this->max_size){

                     int*tmp=(int*)malloc((this->max_size)*sizeof(int));

                     for(int i=0;i<this->max_size;i++) tmp[i]=this->mas[i];

                     this->mas = (int*)realloc(&this->mas[0],(this-

>max_size)*sizeof (int));

                                     for(int i=0;i<this->max size;i++) this->mas[i] = tmp[i];                   

                                     free(&tmp[0]);

          }

          this->current_size=this->max_size;

}

private:

           int mах_size, current_size, *mas;

};

 

Приложение 2. Файл 10.срр

 

#include”set_int.h”

set A(1,2,3);//Конструктор с параметрами

set В(2,3,4);

set С(3,4,5);

void main(){

             A.print(); B.print(); C.print();//Вывод множества на экран

             (A*B*C).print();//Пересечение множеств

}

 

Лабораторная работа №6

 

Цель. Получить практические навыки создания шаблонов и использования их в программах С++.

Основное содержание работы.

Создать шаблон заданного  класса и использовать его для данных различных типов.

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

1.Создать шаблон заданного  класса. Определить конструкторы, деструктор, перегруженную операцию присваивания (“=”) и операции, заданные в варианте задания.

2.Написать программу  тестирования, в которой проверяется использование шаблона для стандартных типов данных.

3.Выполнить тестирование.

4.Определить пользовательский  класс, который будет использоваться  в качестве параметра шаблона.  Определить в классе необходимые  функции и перегруженные операции.

5.Написать программу  тестирования, в которой проверяется  использование шаблона для пользовательского типа.

6.Выполнить тестирование.

 

Приложение 1. Файл set.h

 

#include<inalloc.h>

#lnclude “ship.h”

template <class T> class set{

public:

          set(void){//Конструктор  без параметров

                      max_size = 5;

                      current = 0;

                      mas = (T*)malloc(sizeof(T));

         }

          set(int num, T n, …){//Конструктор с параметрами

                      T *p=&n; T *tmp; int i;

                      this->max_size=5; this->current = 0;

                      //Для дальнейшего изменения размера  массивов через realloc используем процедуру malloc

                     this->mas = (T*)malloc(sizeof(T));

                     tmp = (T*)malloc(sizeof(T));

                      if(num>this->max_size) num = this->max_size;

                       //Считываем все

                      for(int i=0; i<=num;i++){

                               if(this- >current){

                                       tmp=(T*)realloc(&tmp[0],(current+1)*sizeof(T));//Изменяем  размер временного массива

                                       for(i=0;i<this->current;i++) tmp[i] = this-

>mas[i];//Записываем во временный  массив данные

                                       tmp[this->current] = (*р);//3аписываем ???

                                       this->mas=(T*)realloc(&this->mas[0],(this->current+1)*sizeof(T));

                                       for(i=0;i<this->current+1;i++) this->mas[i] = tmp[i];

                                 } else this->mas[this->current] = (*p);

                                  this->current++;

                                  p++;

                        } 

                    free(&tmp[0]);

         }

         set(const set<T>& tmp){//Копирования

                   this->current=tmp.current;

                   this->mas = (T*)realloc(&mas[0],(current)*sizeof(T));

                      for(int i=0;i<current;i++) this->mas[i] = tmp.mas[i];

                      this->max_size = tmp.max_size;

         }

          set& operator = (const set& tmp){//Присваивание

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

                      this->current = tmp.current;

                      this->mas = (T*)realloc(&mas[0],(current)*sizeof(T));

                      for(int i=0; i<current; i++) this->mas[i] = tmp.mas[i];

                      this->max_size = tmp.max_size;

                      return *this;

          }

           set& operator * (const set& ор2){//Пересечение

                       set<T> *x = new set<T>; T *tmp;

                       x->mas=(T*)malloc(sizeof(T));

                       tmp=(T*)malloc(sizeof(T));

                       x->current=0;

                        x->max_size = 5;

                       for(int i=0;i<this->current; i++)

                                 for(int j=0; j<op2.current;j++)

                                      if(this->mas[i] ==op2.mas[j]){

                                          tmp=(T*)realloc(&tmp[0],(x>current+1)*sizeof(T));

                                           for(int k=0; k<x->current; k++)  tmp[k]=x->mas[k];                          

                                           tmp[x->current++]=this->mas[i];

x->mas = (T*)realloc(&x->mas[0],

(x->current+1)*sizeof(T));

for(int k=0;k<x->current;k++) x->mas[k] = tmp[k];

break;

}

free(&tmp[0]);

return *x;

}

bool operator > (const T& ор){//Принадлежность 

for(int i=0;i<this->current;i++)

if(this->mas[i] == op) return true;

return false;

}

bool operator < (const set& tmp){//Подмножество

bool b;

for(int i=0;i<tmp.current;i++){

b = false;

for(int j=0;j<this->current;j++)

if(this->mas[j] == tmp.mas[i]) b = true;

if(!b) return false;

}

return true;

}

~set(void){//Деструктор

free(&mas[0]);

}

void print(void){

printf("Size: %i\nSet: ",current);

for(int i=0;i<current;i++) printf("%i ",mas[i]);

prlntf("\n");

}

void input(void){

printf("Enter size of set: "); scanf("%i",&current);

mas = (T*)realloc(&mas[0],(current)*sizeof(T));

printf("Enter set: ");

for(int i=0;i<current;i++) scanf("%i",&mas[i]);

}

void set_max_size(int max_size){

this->max_size = max_size;

if(this->current > this->max_size){

T *tmp = (T*)malloc((this->max_size)*sizeof(T));

for(int i=0;i<this->max_size;i++) tmp[i] = this->mas[i];

this->mas = (T*)realloc(&this->mas[0],(this->max_size)*slzeof(T));

for(int i=0;i<this->max_size;i++) this->mas[i] = trmp[ i ];

free(&tmp[0]);

}

this->current = this->max_size;

}

private:

T *mas;//Указатель на начало массива 

int max_size;//Максимальный размер

int current;//Текущий размер

 

Приложение 2. Файл 10.срр

 

#include<stdio.h>

#include”set.h”

#include”ship.h”

set<int> s1(3, 1,2,3), s2(2, 2,3), s3;

set<ship> ss1(2,ship(1000, “TITANIK”, “PASSENGER”), ship(115, “St.George”, “MILITARY”));

ship ss2(1000, “TITANIK”, “PASSENGER”);

set<int> A(3, 1,2,3),B(3, 2,3,4),C(3, 3,4,5);

void main(){

            (A*B*C).print();

             s1.print();

             s3.input();//Проверка ввода

            (s1*s2).print();//Проверка пересечения  и вывода

             if(s1<s2) printf(“i n\n”);//Проверка подмножества

             if(s1<s3) printf(“i n\n”); else printf(“out\n”);

             if(s3>(int)2) printf(“in\n”); else printf(“out\n”);//Проверка вхождения

             if(ss1>ss2) printf(“i n\n”); else printf(“out\n”);//Пользовательский класс

}




Контрольная работа по "Программированию на языке СИ++"