Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lr1_3

.pdf
Скачиваний:
34
Добавлен:
14.02.2015
Размер:
383.68 Кб
Скачать

Лабораторная работа № 1. Простые классы

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

Содержание работы и методические указания к ее выполнению

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

Концепция классов лежит в основе объектно-ориентированного программирования, которое облегчает разработку и использование больших комплексов программ. Перед изучением визуального программирования в MS Windows необходимо познакомиться с общими сведениями о классах и принципами их построения.

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

Вкачестве примера создания и использования простого класса в листинге 1 представлена программа, в которой разработан класс Cube (куб). Класс Cube содержит закрытую (private) переменную а — ребро куба и закрытую переменную для хранения имени объекта. Выделение памяти для имени объекта (посредством оператора new) и его инициализация проводится

вконструкторе, освобождение выделенной памяти (посредством оператора delete) — в дест-

рукторе. Класс также содержит методы, вычисляющие и возвращающие значения площадей основания, боковой и полной поверхности по формулам: Sосн = а2; Sбок=4*а2; Sполн = 2* Sосн + Sбок;

Впрограмме создается объект класса Cube с и выводятся значения площадей основания, боковой и полной поверхностей куба (рис. 1). Для инициализации объекта используется конструктор с параметрами.

Листинг 1

#include <iostream> #include <conio.h> #include <windows.h> using namespace std;

char bufRus [256]; char* Rus(char* mes)

{

CharToOem (mes, bufRus); return bufRus;

}

class Cube

{

private:

char* name; //имя куба double a; //длина ребра

public:

Cube(char* name1, double a1); //конструктор ~Cube(); //деструктор

double get_So(){return a*a;}

double get_Sb(){return 4*a*a;} double get_Sp(){return 2*a*a+4*a*a;}

};

Cube::Cube(char* name1, double a1)

{

int leng=strlen(name1); //вычисляем длину имени name=new char [leng+1]; //выделяем память strcpy(name,name1); //копируем имя

a=a1;

}

Cube::~Cube()

{

delete []name;

}

int main()

{

int key;

char name1[50]; double a1; do

{

cout<< Rus("\n1-Вычисление, 0-Выход.\nВаш выбор:"); cin >> key;

if (key == 1)

{

cout << Rus("\nВведите имя куба:"); cin >> name1;

cout << Rus("Введите длину ребра куба:"); cin >> a1;

Cube Cub1(name1,a1); //создание объекта

cout << Rus("\nПлощадь основания =") << Cub1.get_So();

cout << Rus("\nПлощадь боковой поверхности =") << Cub1.get_Sb();

cout << Rus("\nПлощадь полной поверхности =") << Cub1.get_Sp()<<"\n";

}

}while (key!=0);

cout << Rus("Для выхода нажмите <Enter>:"); getch();

}

Рисунок 1 – Результаты выполнения программы

2

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

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

2.Для выполняя задания необходимо разработать консольную программу на языке С++, в которой описывается и используется простой класс. Поля данных класса должны быть закрытыми, а доступ к ним должен осуществляться с помощью открытых методов. Кроме полей с данными в классе должны быть конструкторы, деструктор и другие методы класса в соответствии с заданием.

3.Выполнить отладку и тестирование разработанной программы.

Варианты заданий:

Вариант 1

Класс Rectang_Parallel (прямоугольный параллелепипед) должен содержать переменные: a, b

стороны прямоугольника-основания, H — высота параллелепипеда и переменную для хранения имени объекта, а также методы, вычисляющие и возвращающие значения площадей основания, боковой и полной поверхностей по формулам:

Sосн a b, Sбок 2a H 2b H, Sполн 2Sосн Sбок .

Вариант 2

Класс Prism_Inscribed_Rectilineal_Triangular (прямая призма, в основании — правильный треугольник, вписанный в окружность) должен содержать переменные: R — радиус описанной окружности (R = а/2 • sin 60°, где а — сторона правильного треугольника), Н— высота призмы и переменную для хранения имени объекта, а также методы, вычисляющие и возвращающие значения площадей основания get_So (), боковой get_Sb () и полной get_Sp () поверхностей по формулам:

S

 

a 2 3

, S

 

3a H, S

 

2S

S .

 

осн

4

 

бок

 

полн

 

осн бок

 

 

 

 

 

Вариант 3

Класс Triangle_Prism (прямая призма, в основании — треугольник) должен содержать переменные: a, b — стороны треугольника-основания, — угол между этими сторонами, Н — высота призмы и переменную для хранения имени объекта, а также методы, вычисляющие и возвращающие значения площадей основания get_So (), боковой get_Sb () и полной get_Sp () поверхностей по формулам:

Sосн

a

b sin

/ 2,

 

 

 

 

 

 

 

 

S

бок

(a

b

 

(a 2 b2 2a b cos ) ) H, .

 

 

 

 

 

 

Sполн

2Sосн

Sбок

Вариант 4

Класс Trapezium_Prism (прямая призма, в основании — равнобедренная трапеция) должен содержать переменные: a, b — параллельные стороны, h — высота трапеции-основания, Н — высота призмы и переменную класса для хранения имени объекта, а также методы, вычисляющие и возвращающие значения площадей основания get_So (), боковой get_Sb () и полной get_Sp () поверхностей по формулам:

3

Sосн = (а+ b)h/2, Sбок = (a + b + 2

1

((a b)2

h 2 ) ) H, Sполн = 2 Sосн + Sбок.

 

4

 

 

Вариант 5

Класс Tetrahedron (правильный тетраэдр, т.е. треугольная пирамида, грани — равносторонние треугольники) должен содержать переменную: а — ребро правильного тетраэдра и переменную для хранения имени объекта, а также методы, вычисляющие и возвращающие значения площадей основания get_So (), боковой get_Sb () и полной get_Sp () поверхностей по формулам:

Sосн = (a2 3 )/4, Sбок = 3(a2 3 )/4, Sполн = Sосн + S6ок.

Вариант 6

Класс Cone (прямой конус, в основании — круг) должен содержать переменные: r — радиус круга-основания, H — высота конуса и переменную для хранения имени объекта, а также методы, вычисляющие и возвращающие значения площадей основания get_So (), боковой get_Sb () и полной get_Sp () поверхностей по формулам:

Sосн=πr2 Sбок=πr r2 H2 Sполн= Sосн + Sбок.

Вариант 7

Класс Cylinder (прямой цилиндр, в основании — круг) должен содержать переменные: r — радиус круга-основания, H — высота цилиндра и переменную для хранения имени объекта, а также методы, вычисляющие и возвращающие значения площадей основания get_So(), боковой get_Sb() и полной get_Sp() поверхностей по формулам:

Sосн=πr2 Sбок=2πrH Sполн= 2Sосн + Sбок.

Вариант 8

Класс Truncated_Cone (усеченный конус, в основаниях — круги) должен содержать переменные: r, R — радиусы кругов-оснований, L — образующая усеченного конуса, Н — высота усеченного конуса и переменную класса для хранения имени объекта, а также методы, вычисляющие и возвращающие значения площадей оснований get_Sol () и get_So2 (), боковой

get_Sb () и полной get_Sp () поверхностей по формулам:

Sосн1=πr2, Sосн2=πR2 , Sбок=πL(R+r),

Sполн= Sосн1+Sосн2 + Sбок.

Вариант 9

Класс Hexagonal_Prism (прямая призма, в основании — правильный шестиугольник, вписанный в окружность) должен содержать переменные: R — радиус описанной окружности, Н — высота призмы и переменную для хранения имени объекта, а также методы, вычисляющие и возвращающие значения площадей основания get_So (), боковой get_Sb () и полной get_Sp () поверхностей по формулам:

 

 

 

 

 

S

3 3/ 2 R2 , S

6R H (так как сторона правильного шестиугольника равна

осн

 

 

бок

 

радиусу описанной окружности),

Sполн=2Sосн+Sбок .

Вариант 10

4

5

Класс Prism_Inscribed_Triangular (прямая призма, в основании — треугольник, вписанный в окружность) должен содержать переменные: а, b, с — стороны треугольника, R — радиус описанной окружности, Н — высота призмы и переменную для хранения имени объекта, а также методы, вычисляющие и возвращающие значения площадей основания get_So (), боковой get_Sb () и полной get_Sp () поверхностей по формулам:

Sосн abc4R , Sбок аH bH cH , Sполн 2Sосн Sбок .

Вариант 11

Класс Prism_Attached_Rectilineal_Triangular (прямая призма, в основании — правильный треугольник, в который вписана окружность) должен содержать переменные: r — радиус вписанной окружности (r = а/2 tg 60°, где а — сторона правильного треугольника), H— высота призмы и переменную для хранения имени объекта, а также методы, вычисляющие и возвращающие значения площадей основания get_So (), боковой get_Sb () и полной get_Sp () поверхностей по формулам:

Sосн

a 2 3

, Sбок 3a H , Sполн 2Sосн Sбок .

 

4

 

Вариант 12

Класс Rhombus_Parallel (прямой параллелепипед, в основании — ромб) должен содержать переменные: а — сторона ромба-основания, α — угол между сторонами ромба, H — высота параллелепипеда и переменную для хранения имени объекта, также методы, вычисляющие и возвращающие значения площадей основания get_So (), боковой get_Sb () и полной get_Sp () поверхностей по формулам:

S

a2 sin , S

бок

4aH

, S

полн

2S

осн

S

бок

.

осн

 

 

 

 

 

 

Лабораторная работа № 2. Перегрузка операций

Цель работы: получить практические навыки и изучить правила перегрузки операций для объектов простых классов.

Содержание работы и методические указания к ее выполнению

При определении класса в С++ имеется возможность перегружать операции для объектов этого класса. Цель перегрузки – обеспечить такие же краткие выражения для типов, определенных пользователем, какие С++ обеспечивает для встроенных типов. Однако перегрузка операций не выполняется автоматически, поэтому требуется создавать функции, осуществляющие эту перегрузку.

До выполнения лабораторной работы необходимо изучить механизм перегрузки операций языка С++.

В качестве примера создания и использования простого класса с перегрузкой операций в листинге 2 представлена программа, в которой создан класс Cube уб) с наличием следующих возможностей:

конструктора по умолчанию; конструктора с параметрами конструктора копирования; деструктора;

функций вычисления значений площадей ; перегрузки операций присваивания (=), сложения (+) и сравнения (<); функции вывода параметров куба на экран.

Листинг 2

#include <iostream> #include <conio.h> #include <windows.h> using namespace std;

char bufRus [256]; char* Rus(char* mes)

{

CharToOem (mes, bufRus); return bufRus;

}

class Cube

{

private:

char* name; //имя куба double a; //длина ребра

public:

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

Cube(char* name1, double a1); //конструктор c параметрами

6

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

 

//перегрузка операции '='

 

Cube &operator= (const Cube &);

 

/* функция должна возвращать ссылку на объект, для

которого она вызва-

на, и принимать в качестве

 

параметра единственный аргумент - ссылку на присваиваемый объект */ //перегрузка операции '+'

Cube operator+ (const Cube &) const; //перегрузка операции '<'

bool operator< (const Cube &) const; ~Cube(); //деструктор

double get_So(){return a*a;} double get_Sb(){return 4*a*a;}

double get_Sp(){return 2*a*a+4*a*a;} void print(); //вывод

};

Cube::Cube(char* name1, double a1)

{

int leng=strlen(name1); //вычисляем длину имени name=new char [leng+1]; //выделяем память strcpy(name,name1); //копируем имя

a=a1;

}

Cube::Cube()

{

int leng=strlen("Куб1"); //вычисляем длину имени name=new char [leng+1]; //выделяем память strcpy(name,"Cube1"); //копируем имя

a=1;

}

Cube::~Cube()

{

delete []name;

}

//конструктор копирования

Cube::Cube(Cube const& m)

{

int leng=strlen(m.name); //вычисляем длину имени name=new char [leng+1]; //выделяем память strcpy(name,m.name); //копируем имя

a=m.a;

}

//перегрузка операции '='

Cube &Cube::operator= (const Cube &m)

{

7

int leng=strlen(m.name); //вычисляем длину имени name=new char [leng+1]; //выделяем память strcpy(name,m.name); //копируем имя

a=m.a; return *this;

}

//перегрузка операции '+'

Cube Cube::operator+ (const Cube &m)const

{

Cube temp(*this); temp.a=m.a+temp.a; return temp;

}

bool Cube::operator< (const Cube &m) const

{

return a<m.a;

}

//вывод

void Cube::print()

{

cout << "\nCube - " << name << "\nLength -" << a << "\nSo - " << get_So() << "\nSb - " << get_Sb() << "\nSp - " << get_Sp() << endl;

}

int main()

{

Cube Cub1,Cub2("Cube2",2),Cub3(Cub2),Cub4; Cub1.print();

Cub2.print(); if (Cub1<Cub2)

cout<<"\nCub1<Cub2\n";

else

cout<<"\nCub1>=Cub2\n";

Cub3.print();

Cub4=Cub1+Cub2;

Cub4.print(); return 0;

}

Cube - Cube1

Length -1

So - 1

Sb - 4

Sp - 6

8

Cube - Cube2

Length -2

So - 4

Sb - 16

Sp - 24

Cub1<Cub2

Cube - Cube2

Length -2

So - 4

Sb - 16

Sp - 24

Cube - Cube1

Length -3

So - 9

Sb - 36

Sp - 54

Рисунок 2 – Результаты выполнения программы

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

1. Изменить программы лабораторной работы №1 добавив возможности:

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

Кроме полей с данными в классе должны быть конструкторы, деструктор и другие методы класса в соответствии с заданием.

Для объектов класса выполнить перегрузку операций присваивания (=), сложения (+) и сравнения (<).

2.Выполнить отладку и тестирование разработанной программы.

9

Лабораторная работа № 3 Наследование и полиморфизм

Цель работы: получить практические навыки реализации в С++ наследования и полиморфизма.

Содержание работы и методические указания к ее выполнению

Наследование – это один из инструментов языка С++ (и других объектноориентированных языков программирования), позволяющих создавать новые классы на основе существующих (производные классы создаются на основе базовых).

Наследование поддерживает между классами (и соответственно между экземплярами этих классов т. е. объектами) отношение «is-a» («является разновидностью»). Производный класс всегда является разновидностью базового, т. е. базовый класс описывает общие поля данных и реализует только самые общие методы, описывающие поведение объектов его иерархии, а каждый производный класс лишь добавляет специфические особенности.

С помощью механизма наследования в С++ реализуется возможность повторного использования кода. Унаследованные поля и методы базового класса могут использоваться объектами производных классов.

Для построения иерархий классов в С++ предусмотрен так же механизм полиморфизма, обеспечивающий возможность по разному определять единый по названию метод для классов различных уровней иерархии.

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

В качестве примера использования отношения наследования и полиморфизма в листинге 3 представлена программа, в которой реализовано взаимодействие объектов трех классов: базового класса CPublication и производных классов CBook и CJournal.

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

Листинг 3

#include <iostream> #include <conio.h> #include <windows.h>

using namespace std;

char bufRus [256]; char* Rus(char* mes)

{ CharToOem (mes, bufRus); return bufRus;

}

//базовый класс "публикация" class CPublication

{ protected:

char m_szTitle[80];//название публикации int m_nYear; //год издания

public:

CPublication();

virtual ~ CPublication(){}

virtual void Display();//вывод описания публикации

10

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]