Некоммерческое  акционерное общество
АЛМАТИНСКИЙ УНИВЕРСИТЕТ ЭНЕРГЕТИКИ И СВЯЗИ
Кафедра компьютерных технологий

ТЕХНОЛОГИИ ПРОГРАММИРОВАНИЯ
Методические указания по выполнению
лабораторных работ для студентов специальности
5В070400 – Вычислительная техника и программное обеспечение

Алматы 2014

СОСТАВИТЕЛИ: Е.С.Турганбаев, А.Р. Оразаева. Технологии программирования. Методические указания по выполнению лабораторных работ для студентов специальности 5В070400 -  Вычислительная техника и программное обеспечение. – Алматы: АУЭС, 2014. - 42 с.

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

Методические указания к выполнению лабораторных работ для студентов специальности 5В070400 -  Вычислительная техника и программное обеспечение.

Рецензент: Ни А.Г.

Печатается по плану издания некоммерческого акционерного общества «Алматинский университет энергетики и связи» на 2014 г.

© НАО «Алматинский университет энергетики и связи», 2014 г.

Содержание

Введение

4

1 Лабораторная работа №1. C++. Массивы

5

2 Лабораторная работа №2. C++. Массивы и указатели

15

3 Лабораторная работа №3. C++.  Полиморфизм

24

4 Лабораторная работа №4. Многофайловые проекты Visual Studio

32

Список литературы

41

Введение

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

Лабораторная работа состоит из выполнения рабочего задания, оформление отчета и защиты проделанной работы.

Рабочее задание содержит конкретные работы по выполнению того или иного задания по рассматриваемой теме.

Выполнение каждой лабораторной работы должно завершаться оформлением отчета, который должен содержать:

1)       Цель и задания работы.

2)       Краткие итоги теоретической подготовки.

3)       Результаты проделанной работы.

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

Выполненная работа и оформленный отчет защищается у преподавателя.

Отчет может быть оформлен в электронном виде.

1 Лабораторная работа №1. C++. Массивы

Цель работы: научиться использовать массивы объектов.

Практическая  часть

Задание 1

Описать класс «Треугольник» (три стороны). Разработать: функцию для определения площади треугольника, конструктор с параметрами,  перезагрузить оператор вывода. Создать массив объектов класса «Треугольник». Написать программу, иллюстрирующую приемы работы с массивом объектов.

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

#include<iostream>

#include<cmath>

using namespace std;

// класс Треугольник - описание

class Ttriangle

{

    float a, b, c;

public:

    Ttriangle(float, float, float);

    Ttriangle(){};

    float area();

    friend ostream & operator<<(ostream & os, const Ttriangle & t);

};

// класс Треугольник - реализация

Ttriangle::Ttriangle(float a1, float b1, float c1) {a=a1;b=b1; c=c1;};

float Ttriangle::area() {float p=(a+b+c)/2.; return sqrt(p*(p-a)*(p-b)*(p-c));};  // Формула Герона

ostream & operator<<(ostream & os, const Ttriangle & t)

                 {os<<«Ttriangle: «<< t.a << «  «<<t.b<<«  «<<t.c<<endl;};

main()

{

Ttriangle b[1000] = {Ttriangle(2, 3, 4),  Ttriangle(5, 3, 4), Ttriangle(5, 3, 4), Ttriangle(7, 3, 4) };

int i; for (i=0; i<=3; i++) {cout<<b[i]<<endl; };

cout<<sizeof(Ttriangle)<<endl;

cout<<sizeof(b)<<endl;   

system(«pause»);

}

Вид экрана


Задание 2

Описать класс «Треугольники» (число треугольников, массив треугольников). Разработать: функцию добавления элемента класса «треугольник», функцию для определения общей площади всех треугольников.

Написать программу, иллюстрирующую приемы работы с классом «Треугольники».

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

Описать класс «Треугольники» (число треугольников, массив треугольников). Разработать: функцию для определения общей площади всех треугольников.

Написать программу, иллюстрирующую приемы работы с классом «Треугольники».

*/

#include<iostream>

#include<cmath>

#define max_number_triangles 1000

using namespace std;

// класс Треугольник - описание

class Ttriangle

{

    float a, b, c;

public:

    Ttriangle();

    Ttriangle(float, float, float);

    float area();

    friend ostream & operator<<(ostream & os, const Ttriangle & t);

};

// класс Треугольник - реализация

Ttriangle::Ttriangle(){};

Ttriangle::Ttriangle(float a1, float b1, float c1) {a=a1;b=b1; c=c1;};

float Ttriangle::area() {float p=(a+b+c)/2.; return sqrt(p*(p-a)*(p-b)*(p-c));};  // Формула Герона

ostream & operator<<(ostream & os, const Ttriangle & t)

                 {os<<«Ttriangle: «<< t.a << «  «<<t.b<<«  «<<t.c<<endl;};

// класс Треугольники - описание

class Ttriangles

{

int number_triangles;

Ttriangle triangles[max_number_triangles];

public:

   Ttriangles();

   void add_triangle(float, float, float);

   float area();

   friend ostream & operator<<(ostream & os, const Ttriangles & t);            

      };

// класс Треугольники - реализация

Ttriangles::Ttriangles(){number_triangles=0;};

void Ttriangles::add_triangle(float a , float b, float c)

{number_triangles=number_triangles+1;

 Ttriangle t(a, b, c);

 triangles[number_triangles-1]=t;

};

                   

float Ttriangles::area()

{float s=0; int i;

      for (i=1; i<=number_triangles; i++)

      {s=s+triangles[i-1].area();

      };

      return s;

};  

ostream & operator<<(ostream & os, const Ttriangles & t)

{

int i; for (i=1; i<= t.number_triangles; i++)

     { os<<«Ttriangles: «<< t.triangles[i-1]<<endl;

           };

};                           

main()

{

Ttriangles d;

d.add_triangle(5, 3, 4); d.add_triangle(5, 3, 6); d.add_triangle(5, 4, 4);

d.add_triangle(5, 6, 4);

cout<<d.area()<<endl;

cout<<d;

cout<<sizeof(d)<<endl;

  

system(«pause»);

}

Вид экрана

Индивидуальные задания

Общая часть.

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

Создать класс, включающий в себя массив экземпляров другого класса. Размер массива задать с помощью предопределенной константы. Разработать функции, позволяющие: добавить элемент в конец списка; удалить последний элемент; вывести список на экран.

Идентификаторы переменных должны соответствовать предметной области. Разработать функции, обеспечивающие задание и получение полей. Разработать конструктор без параметров и конструктор с параметрами. В головной программе проиллюстрировать  работу с разработанным классом.

Указать все отношения. Построить диаграмму классов.

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

0.       Библиотека– Книга - Печатное издание

1.       Военнослужащий-Офицер-Штаб

2.       Человек-Продавец-Магазин

3.       Дипломированный специалист-Врач-Больница

4.       Отделение-Врач-Поликлиника

5.       Постройка –Гараж -Гаражный кооператив

6.       Лечебное средство-Лекарство-Аптека

7.       Общественное объединение-Партия-Парламент

8.       Медицинский работник-Врач-Поликлиника

9.       Организация –Магазин -Торговая сеть

10.  Житель города -Работник-Организация

11.   Отдел – Сотрудник - Персона

12.  Сборная страны– Спортсмен - Персона

13.  Поликлиника - Врач- Выпускник медицинского Вуза

14.  Кафедра – Преподаватель - Персона

15.  Больница – Пациент - Персона

16.  Школа – Школьник - Персона

17.  Жилищный кооператив – Собственник жилья – Персона

18.  Призыв – Призывник-Выпускник школы

19.  Государство – Налогоплательщик  - Персона

20.  Организация-Библиотека-Библиотекарь

21.  Автомобиль-Автобус-Автопарк

22.  Шофер-Таксист-Таксопарк

23.  Инженер-Программист-Проект

24.  Механизм-Танк-Полк

25.  Солдат-Снайпер-Отделение

26.  Самолет-Истребитель-Эскадрилья

27.  Плавающее средство-Корабль-Флот

28.  Выпускник консерватории - Музыкант-Оркестр

29.  Выпускник ПТУ-Тракторист-Бригада

30.  Тракторист-Бригадир-Совет бригадиров

31.  Сотрудник-Бухгалтер-Бухгалтерия

32.  Выпускник АУЭС- Сотрудник- Организация

33.  Ребенок-Школьник-Школа

34.  Выпускник ВУЗа- Дипломат - Министерство иностранных дел

35.  Гражданин-Член партии -Партия

36.  Государство-Член Совета безопасности - Совет безопасности

37.  Картина - Выставка-Экспонат

38.  Академия-Ученый-Выпускник Вуза

39.  Университет-Преподаватель-Сотрудник

40.  Данные – Информация – Банк данных

41.  Музей-Экспонат-Предмет

42.  Корпорация-Фирма-Отдел

43.  Музыкант-Сотрудник-Оркестр

44.  Фильм-Киностудия-Мультфильм

45.  Актер-Сотрудник-Театр

46.  Магистратура-Учащийся-Магистрант

47.  Персона -Дворец школьников-Школьник

48.  Архитектура-Архитектор-Персона

49.  Официант-Ресторан-Работник Ресторана

50.  Профсоюзный комитет-Работник – Член профсоюза

51.  Постройка –Гараж -Гаражный кооператив

52.  Лечебное средство-Лекарство-Аптека

53.  Общественное объединение-Партия-Парламент

54.  Медицинский работник-Врач-Поликлиника

55.  Организация –Магазин -Торговая сеть

56.  Житель города -Работник-Организация

57.   Отдел – Сотрудник - Персона

58.  Сборная страны– Спортсмен - Персона

59.  Поликлиника - Врач- Выпускник медицинского Вуза

Пример выполнения индивидуального задания для варианта 000.

Постановка задачи.

Для варианта «Библиотека– Книга - Печатное издание» разработать и описать модель предметной области. Построить иерархию классов. Для каждого класса определить минимум три поля различных типов.

Создать класс, включающий в себя массив экземпляров другого класса. Размер массива задать с помощью предопределенной константы. Разработать функции, позволяющие: добавить элемент в конец списка; удалить последний элемент; вывести список на экран.

Идентификаторы переменных должны соответствовать предметной области. Разработать функции, обеспечивающие задание и получение полей. Разработать конструктор без параметров и конструктор с параметрами. В головной программе проиллюстрировать  работу с разработанным классом.

Указать все отношения. Построить диаграмму классов.

Описание модели  предметной области.

Библиотека характеризуется городом, в котором она расположена, и своим уникальным названием. Город и название библиотеки – текстовые поля (состоит только из букв кириллицы, первая буква – заглавная, минимальное число символов – 3, максимальное число символов – 15). Библиотека состоит из книг.     

Печатное издание имеет название, число страниц, год издания. Название Печатного издания – текстовое поле (состоит из цифр, букв кириллицы и латиницы, минимальное число символов – 3, максимальное число символов – 70). Число страниц – положительное число с максимальным значением меньше 10000. Год издания – четырехзначное положительное число, больше (равно) 1900 и меньше (равно) текущего года.

Альтернативные варианты классов, производных из Печатных изданий: Книга, Журнал, Газета, Рекламный буклет, Статья, …

Каждая Книга является Печатным изданием и следовательно имеет название, число страниц, год издания. Кроме того, каждая Книга имеет автора и название издательства. Автор – текстовое поле (состоит только из букв кириллицы, точек и запятых, первая буква – заглавная, минимальное число символов – 3, максимальное число символов – 30). Название издательства – текстовое поле (состоит из букв кириллицы и латиницы, минимальное число символов – 3, максимальное число символов – 15).

Описание альтернативных вариантов классов, производных из Печатного издания:

Журнал характеризуется месяцем издания, адресом, типографией. Газета характеризуется месяцем и днем выпуска. Статья характеризуется автором, числом страниц. Рекламный буклет характеризуется организацией, видом услуг. Статья может входить в книгу. …

Все текстовые поля могут содержать пробелы.

Отношения.

Отношение наследования.

 Печатное издание – Книга. Печатное издание – базовый класс, Книга – производный класс. Каждая Книга – Печатное издание. Не каждое Печатное издание – Книга. Например – Статья, Буклет, Газета…

Отношение агрегации.

Книга – Библиотека. Библиотека состоит из книг. Книги входят в библиотеку. Библиотека – агрегирующий класс. Книга – агрегируемый класс

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

Вариант 000.

Для своего варианта создать производный класс, включающий в себя массив экземпляров базового класса.

Размер массива задать с помощью предопределенной константы. Разработать функции, позволяющие: добавить элемент массива в конец списка; удалить последний элемент массива; получить количество элементов массива

*/

#define lname 40

#include<iostream>

using namespace std;

//Описание класса Печатное издание

class Publication  

{     private: static int count; char name[lname];  int num_pages; int year;

      public:  Publication(); ~Publication();

               void set_name(const char*); char* get_name();

void set_num_pages(int); int get_num_pages(); void set_year(int);

               int get_year(); void show(); void read();

};

int Publication::count = 0; //Инициализация статических элементов классов

// Реализация методов класса Печатное издание

Publication::Publication(){count++;};

Publication::~Publication(){count--; /*cout<<«Деструктор Publication: число  элементов

«<<count<<endl;*/};

void Publication::set_name(const char*r) {if (strlen(r) <= lname) strcpy(name, r);};

char *Publication::get_name() {return &name[0];};

void Publication::set_num_pages(int r) {num_pages=r;};

int Publication::get_num_pages() {return num_pages;};

void Publication::set_year(int r) {year=r;};

int Publication::get_year() {return year;};

void Publication::show(){cout<<«Название=«<<name<<«Число страниц=«<<num_pages<<« Год=«<<year;};

void Publication::read() {cout<<«Введите Название печатного издания  «; gets(name);

                      cout<<« Введите Число страниц «; cin>>num_pages;

                           cout<<«Введите год издания «; cin>>year;};

                         

//описание класса Книга

class Book: public Publication 

{      private: char author [lname]; char publishing_house[lname]; // Автор, Издательство

       public:  void set_author(const char *); char *get_author();

                 void set_publishing_house(const char *); char *get_publishing_house();

                 void show(); void read();

             };

//Реализация методов класса Книга

void Book::set_author(const char *r) {if (strlen(r) <= lname) strcpy(author, r);};

char *Book::get_author() {return &author[0];};

void Book::set_publishing_house(const char *r) {int i;

for (i=0; i<=lname-1; i++) publishing_house[i]=r[i];};

char *Book::get_publishing_house() {return &publishing_house[0];};

void Book::show() {Publication::show(); cout<<«  автор=«<<

                               author<<«  Издание=«<<publishing_house<<endl;};

void Book::read() {Publication::read();

                 rewind(stdin);

cout<<«Введите автора книги  «; gets(author);

cout<<« Введите издательство «; gets(publishing_house); };

//описание класса Библиотека

#define max_nbooks 100

class Library

{      private: char name [lname]; char city[lname]; //

                 int nbooks; Book books[max_nbooks];

       public:  Library();

                void set_name(const char *); char *get_name();

                 void set_city(const char *); char *get_city();

                 void show();

                 void add_book(Book); void del_last_book(); void list_books();

      };

//Реализация методов класса Библиотека

Library::Library() {nbooks=0;};

void Library::set_name(const char *r) {if (strlen(r) <= lname) strcpy(name, r);};

char *Library::get_name() {return &name[0];};

void Library::set_city(const char *r) {if (strlen(r) <= lname) strcpy(city, r);};

char *Library::get_city() {return &city[0];};

void Library::show() {cout<<«  название библиотеки=«<<name<<«  Город=«<<city<<endl;};

void Library::add_book(Book b) {nbooks=nbooks+1; books[nbooks-1]=b;};

void Library::del_last_book() {if (nbooks >=1) {nbooks=nbooks-1;}

else {cout<<«Library::del_last_book: error»;};};

void Library::list_books() {int i; for (i=1; i<=nbooks; i++) books[i-1].show();};

// Головная программа

main()

{

Library t;

t.set_city(«Алматы»); t.set_name(«Национальная библиотека»);

t.show();

Book x;

x.read();

int i; char s[20];

for (i=1; i<=6; i++)

{

x.set_name(itoa(i, s, 10));

t.add_book(x);

};

t.del_last_book();

//x.read(); t.add_book(x);

//x.read(); t.add_book(x);

//x.read(); t.add_book(x);

t.list_books();

cout<<«size Book=«<<sizeof(Book)<<« size t=«<<sizeof(t)<<endl;

   system(«pause»);  

}

Вид экрана

Диаграмма классов

Дополнительные вопросы и задания

1.  Цель работы.

2.  Комментарии к произвольному месту кода.

3.  Количество членов, полей и функций для всех описанных классов.

4.  Размеры экземпляров всех классов – с проверкой sizeof().

5.  Отношение наследования в UML.

6.  Отношение агрегации в  UML.

7.  Построить диаграмму классов (вручную) для произвольного варианта.

8.  Функции для работы с массивами символов в С.

9.  Функции преобразования данных в С.

2 Лабораторная работа № 2. C++. Массивы и указатели

Цель работы: научиться использовать массивы указателей.

Практическая  часть

Задание 1

Описать класс «Треугольник» (три стороны). Разработать: функцию для определения площади треугольника, конструктор с параметрами,  перезагрузить оператор вывода. Создать массив указателей на объекты класса «Треугольник».

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

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

#include<iostream>

#include<cmath>

using namespace std;

// класс Треугольник - описание

class Ttriangle

{

    float a, b, c;

public:

    Ttriangle(float, float, float);

    float area();

    friend ostream & operator<<(ostream & os, const Ttriangle & t);

};

// класс Треугольник - реализация

Ttriangle::Ttriangle(float a1, float b1, float c1) {a=a1;b=b1; c=c1;};

float Ttriangle::area() {float p=(a+b+c)/2.; return sqrt(p*(p-a)*(p-b)*(p-c));};  // Формула Герона

ostream & operator<<(ostream & os, const Ttriangle & t)

                 {os<<«Ttriangle: «<< t.a << «  «<<t.b<<«  «<<t.c<<endl;};

main()

{

Ttriangle *b[1000];

//Ttriangle b[4] = {Ttriangle(2, 3, 4),  Ttriangle(5, 3, 4), Ttriangle(5, 3, 4), Ttriangle(7, 3, 4) };

int i; for (i=1; i<=4; i++)

{

    b[i-1] = new Ttriangle(i, 3, 4);

    cout<<*b[i-1]<<endl;

    };

cout<<sizeof(Ttriangle)<<endl;

cout<<sizeof(b)<<endl;   

system(«pause»);

}

Вид экрана

Задание 2

Описать класс «Треугольники» (число треугольников, массив указателей на объекты класса «Треугольник»). Разработать: функцию для определения общей площади всех треугольников.

Написать программу, иллюстрирующую приемы работы с классом «Треугольники».

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

#include<iostream>

#include<cmath>

#define max_number_triangles 1000

using namespace std;

// класс Треугольник - описание

class Ttriangle

{

    float a, b, c;

public:

    Ttriangle();

    Ttriangle(float, float, float);

    float area();

    friend ostream & operator<<(ostream & os, const Ttriangle & t);

};

// класс Треугольник - реализация

Ttriangle::Ttriangle(){};

Ttriangle::Ttriangle(float a1, float b1, float c1) {a=a1;b=b1; c=c1;};

float Ttriangle::area() {float p=(a+b+c)/2.; return sqrt(p*(p-a)*(p-b)*(p-c));};  // Формула Герона

ostream & operator<<(ostream & os, const Ttriangle & t)

                 {os<<«Ttriangle: «<< t.a << «  «<<t.b<<«  «<<t.c<<endl;};

// класс Треугольники - описание

class Ttriangles

{

int number_triangles;

Ttriangle *pt[max_number_triangles];

public:

   Ttriangles();

   void add_triangle(Ttriangle);

   float area();

   friend ostream & operator<<(ostream & os, const Ttriangles & t);            

      };

// класс Треугольники - реализация

Ttriangles::Ttriangles(){number_triangles=0;};

void Ttriangles::add_triangle(Ttriangle t)

{number_triangles=number_triangles+1;

 pt[number_triangles-1]=new Ttriangle;

 *pt[number_triangles-1]=t;

};

                   

float Ttriangles::area()

{float s=0; int i;

      for (i=1; i<=number_triangles; i++)

      {s=s+pt[i-1]->area();

      };

      return s;

};  

ostream & operator<<(ostream & os, const Ttriangles & t)

{

int i; for (i=1; i<= t.number_triangles; i++)

     { os<<«Ttriangles: «<< *t.pt[i-1]<<endl;

           };

};                           

main()

{

Ttriangles d;

Ttriangle r(3,4,5);

int i;

for (i=1; i<=4; i++)

{

    d.add_triangle(r);

};

cout<<d.area()<<endl;

cout<<d;

cout<<sizeof(d)<<endl;

  

system(«pause»);

}

Вид экрана

Индивидуальные задания

Общая часть.

Переделать приложение, разработанное в лабораторной работе №1, преобразовав массив объектов в массив указателей. В агрегирующий класс добавить функцию поиска элемента по полю – массиву символов.

Обеспечить ввод имен с пробелами. Написать программу, иллюстрирующую работу с разработанным классом. Продемонстрировать преимущество массивов указателей (с точки зрения экономии памяти).

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

0.  Библиотека– Книга - Печатное издание

1.  Военнослужащий-Офицер-Штаб

2.  Человек-Продавец-Магазин

3.  Дипломированный специалист-Врач-Больница

4.  Отделение-Врач-Поликлиника

5.  Постройка –Гараж -Гаражный кооператив

6.  Лечебное средство-Лекарство-Аптека

7.  Общественное объединение-Партия-Парламент

8.  Медицинский работник-Врач-Поликлиника

9.  Организация –Магазин -Торговая сеть

10.  Житель города -Работник-Организация

11.   Отдел – Сотрудник - Персона

12.  Сборная страны– Спортсмен - Персона

13.  Поликлиника - Врач- Выпускник медицинского Вуза

14.  Кафедра – Преподаватель - Персона

15.  Больница – Пациент - Персона

16.  Школа – Школьник - Персона

17.  Жилищный кооператив – Собственник жилья – Персона

18.  Призыв – Призывник-Выпускник школы

19.  Государство – Налогоплательщик  - Персона

20.  Организация-Библиотека-Библиотекарь

21.  Автомобиль-Автобус-Автопарк

22.  Шофер-Таксист-Таксопарк

23.  Инженер-Программист-Проект

24.  Механизм-Танк-Полк

25.  Солдат-Снайпер-Отделение

26.  Самолет-Истребитель-Эскадрилья

27.  Плавающее средство-Корабль-Флот

28.  Выпускник консерватории - Музыкант-Оркестр

29.  Выпускник ПТУ-Тракторист-Бригада

30.  Тракторист-Бригадир-Совет бригадиров

31.  Сотрудник-Бухгалтер-Бухгалтерия

32.  Выпускник АУЭС- Сотрудник- Организация

33.  Ребенок-Школьник-Школа

34.  Выпускник ВУЗа- Дипломат - Министерство иностранных дел

35.  Гражданин-Член партии -Партия

36.  Государство-Член Совета безопасности - Совет безопасности

37.  Картина - Выставка-Экспонат

38.  Академия-Ученый-Выпускник Вуза

39.  Университет-Преподаватель-Сотрудник

40.  Данные – Информация – Банк данных

41.  Музей-Экспонат-Предмет

42.  Корпорация-Фирма-Отдел

43.  Музыкант-Сотрудник-Оркестр

44.  Фильм-Киностудия-Мультфильм

45.  Актер-Сотрудник-Театр

46.  Магистратура-Учащийся-Магистрант

47.  Персона -Дворец школьников-Школьник

48.  Архитектура-Архитектор-Персона

49.  Официант-Ресторан-Работник Ресторана

50.  Профсоюзный комитет-Работник – Член профсоюза

51.  Постройка –Гараж -Гаражный кооператив

52.  Лечебное средство-Лекарство-Аптека

53.  Общественное объединение-Партия-Парламент

54.  Медицинский работник-Врач-Поликлиника

55.  Организация –Магазин -Торговая сеть

56.  Житель города -Работник-Организация

57.   Отдел – Сотрудник - Персона

58.  Сборная страны– Спортсмен - Персона

59.  Поликлиника - Врач- Выпускник медицинского Вуза

Пример выполнения индивидуального задания для варианта 000.

Постановка задачи.

Переделать приложение, разработанное в лабораторной работе №1, преобразовав массив объектов в массив указателей. В агрегирующий класс добавить функцию поиска элемента по полю – массиву символов.

Обеспечить ввод имен с пробелами. Написать программу, иллюстрирующую работу с разработанным классом. Продемонстрировать преимущество массивов указателей (с точки зрения экономии памяти).

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

#define lname 40

#include<iostream>

using namespace std;

//Описание класса Печатное издание

class Publication  

{     private: static int count; char name[lname];  int num_pages; int year;

      friend class Library;

      public:  Publication(); ~Publication();

               void set_name(const char*); char* get_name();

               void set_num_pages(int); int get_num_pages(); void set_year(int);

               int get_year(); void show(); void read();

};

int Publication::count = 0; //Инициализация статических элементов классов

// Реализация методов класса Печатное издание

Publication::Publication(){count++;};

Publication::~Publication(){count--; /*cout<<«Деструктор Publication: число элементов «<<count<<endl;*/};

void Publication::set_name(const char*r) { if (strlen(r) <= lname) {strcpy(name, r);}

else {cout<<«Publication::set_name: too long name»;}

                                          };

char *Publication::get_name() {return &name[0];};

void Publication::set_num_pages(int r) {num_pages=r;};

int Publication::get_num_pages() {return num_pages;};

void Publication::set_year(int r) {year=r;};

int Publication::get_year() {return year;};

void Publication::show(){cout<<«Название=«<<name<<«  Число страниц=«<<num_pages<<« Год=«<<year;};

void Publication::read() {cout<<«Введите Название печатного издания  «; cin.getline(name, lname);

cout<<« Введите Число страниц «; cin>>num_pages;

cout<<«Введите год издания «; cin>>year;cin.ignore();};

                         

//описание класса Книга

class Book: public Publication 

{      private: char author [lname]; char publishing_house[lname]; // Автор, Издательство

       public:   void set_author(const char *); char *get_author();

void set_publishing_house(const char *); char *get_publishing_house();

void show(); void read();

      };

//Реализация методов класса Книга

void Book::set_author(const char *r) {if (strlen(r) <= lname) strcpy(author, r);};

char *Book::get_author() {return &author[0];};

void Book::set_publishing_house(const char *r) {int i; for (i=0; i<=lname-1; i++) publishing_house[i]=r[i];};

char *Book::get_publishing_house() {return &publishing_house[0];};

void Book::show() {Publication::show(); cout<<«  автор=«<<author<<«  Издание=«<<publishing_house<<endl;};

void Book::read() {Publication::read(); cout<<«Введите автора книги  «; cin.getline(author, lname); cout<<« Введите издательство «;

                    cin>>publishing_house; cin.ignore();};

//описание класса Библиотека

#define max_nbooks 10

class Library

{      private: char name [lname]; char city[lname]; //

                 int nbooks; Book *books[max_nbooks];

        public:  Library();

                void set_name(const char *); char *get_name();

                 void set_city(const char *); char *get_city();

                 void show();

void add_book(Book); void del_last_book(); void list_books();

                 Book *find_name(char *name);

                

      };

//Реализация методов класса Библиотека

Library::Library() {nbooks=0;};

void Library::set_name(const char *r) {if (strlen(r) <= lname) strcpy(name, r);}; //

char *Library::get_name() {return &name[0];};

void Library::set_city(const char *r) {if (strlen(r) <= lname) strcpy(city, r);};

char *Library::get_city() {return &city[0];};

void Library::show() {cout<<«  название библиотеки=«<<name<<«  Город=«<<city<<endl;};

void Library::add_book(Book b) {nbooks=nbooks+1; books[nbooks-1] = new Book; *books[nbooks-1]=b;};

void Library::del_last_book() {if (nbooks >=1) {nbooks=nbooks-1;}

else {cout<<«Library::del_last_book: error»;};};

void Library::list_books() {int i; cout<<endl<<«Список книг:»<<endl;for (i=1; i<=nbooks; i++) books[i-1]->show();};

Book *Library::find_name(char *name)

   { int i;    Book *x; x=NULL;

       for (i=1; i<=nbooks; i++)

        {

            if ( strcmp(name, books[i-1]->name)== 0 ) { x=books[i-1]; /*cout<<name<<endl<<books[i-1]->name<<endl;*/}

         };

        

           return x;

    };

// Головная программа

main()

{

Library t;

t.set_city(«Алматы»); t.set_name(«Национальная библиотека»);

t.show();

Book x;

int i, n=5;

char name[5]; for (i=1;i<=n; i++) {name[i-1]=' ';};

for (i=1; i<=n; i++)

{

itoa(i, name, 10);

x.set_name(name); x.set_num_pages(i);

t.add_book(x);

};

char name_book[30]; cout<<«Введите имя искомой книги  «; cin>>name_book;

Book *f; f=t.find_name(name_book); if (f != NULL) {cout<<«Выбранная книга»<<name_book<<endl; f->show();}

else {cout<<«Книга отсутствует»<<endl;};

t.list_books();

cout<<«size Book=«<<sizeof(Book)<<« size t=«<<sizeof(t);

   system(«pause»);  

}

Вид экрана

Дополнительные вопросы и задания

1.  Цель работы.

2.  Комментарии к произвольному месту кода.

3.  Количество членов, полей и функций для всех описанных классов.

4.  Размеры экземпляров всех классов – с проверкой sizeof() – сравнить с размерами экземпляров классов, созданных в предыдущей лабораторной работе.

5.  Отношение наследования в UML.

6.  Отношение агрегации в  UML.

7.  Построить диаграмму классов (вручную) для произвольного варианта.

8.  Функции для работы с массивами символов в С.

Функции преобразования данных в С.

3 Лабораторная работа №3. C++.  Полиморфизм

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

Практическая  часть

Задание 1

Разработать класс «Комплексные числа». Перегрузить операции сложения, ввода и вывода.

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

// Пример перегрузки операций для комплексных чисел:

// Описание класса

#include<iostream>

using namespace std;

class complex

{

float Re, Im;

public:

       complex();

       complex(float Re, float Im);

       complex operator+(complex);

       friend ostream & operator<<(ostream & os, const complex & t); 

       friend istream & operator>>(istream & is, complex & t); 

};

// Реализация функций

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

complex::complex(float x, float y) {Re=x; Im=y;}; // конструктор с параметрами

complex complex::operator+(complex a)

             {complex c; c.Re=a.Re+Re; c.Im = a.Im+Im; return c;};

ostream & operator<<(ostream & os, const complex & t)

                 {os << t.Re << «  «<<t.Im<<endl;};

istream & operator>>(istream & is, complex & t)

                 {cout<<«Введите Re»<<endl;  is >> t.Re;

                  cout<<«Введите Im»<<endl; is>>t.Im;};

// Головная программа

main()

{

complex a(2,3), b(5,6), c;    

cin>>c; cout<<c;

c=a+b;   cout<<c;

system(«pause»);

}

Вид экрана

Задание 2

Создать абстрактный базовый класс «Уравнение» с объявленной чистой виртуальной функцией «Корень уравнения». Методом наследования создать из базового класса производные классы «Линейное уравнение» и «Квадратное уравнение». В каждом производном классе реализовать функцию «Корень уравнения» (для квадратного уравнения возвращать больший корень). Написать демонстрационную программу, иллюстрирующую вызов виртуальных функций.

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

#include<iostream>

#include<cmath>

using namespace std;

class Equation

{

protected:

    float a, b, c;       

public:

    Equation (float, float, float);

    virtual float Root()=0; 

};

Equation::Equation(float a1, float b1, float c1){a=a1; b=b1; c=c1;};

class Linear_Equation: public Equation

{

public:

      Linear_Equation(float, float, float);     

      float Root();

      };

// Реализация функций

Linear_Equation::Linear_Equation(float a1, float b1, float c1): Equation(a1, b1, c1) {};

float Linear_Equation::Root(){cout<<«Решаем линейное уравнение»<<endl; return (c-b)/a;};

class Square_Equation: public Equation

{

public:

     Square_Equation(float, float, float);     

      float Root();

      };

// Реализация функций

Square_Equation::Square_Equation(

float a1, float b1, float c1): Equation(a1, b1, c1) {};

float Square_Equation::Root(){cout<<«Решаем квадратное уравнение»<<endl;

float d; d=b*b-4.*a*c; return (-b+sqrt(d))/(2.*a);};

// Головная программа

main()

{

// Раннее связывание

Linear_Equation x(2., 2., 8.);

Square_Equation y(1., 4., 3.);

cout<<x.Root()<<endl;

cout<<y.Root()<<endl;

// Позднее связывание. вызов в иртуальных функций

Equation *w;

w = &x;

cout<<w->Root()<<endl;

w = &y;

cout<<w->Root()<<endl;

system(«pause»);

}

Вид экрана

Индивидуальные задания

Общая часть.

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

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

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

Вариант

Содержание

Вариант

Содержание

Вариант

Содержание

Вариант

Содержание

0

000

15

8

30

3

45

8

1

4

16

9

31

4

46

9

2

5

17

10

32

5

47

10

3

6

18

1

33

6

48

1

4

7

19

2

34

7

49

2

5

8

20

3

35

8

50

3

6

9

21

4

36

9

51

4

7

10

22

5

37

10

52

5

8

1

23

6

38

1

53

6

9

2

24

7

39

2

54

7

10

3

25

8

40

3

55

8

11

4

26

9

41

4

56

9

12

5

27

10

42

5

57

10

13

6

28

1

43

6

58

1

14

7

29

2

44

7

59

2

Содержание вариантов

Вариант

Базовый класс

Производные классы

Виртуальная функция

Перегружен-ная операция

1

Фигура

Квадрат.

Прямоугольник.

Треугольник.

Площадь

Больше

2

Тело

Шар.

Куб.

Параллелепипед.

Объем

Меньше

3

Числовой объект

Скаляр.

Двумерный вектор.

Трехмерный вектор.

Модуль

Умножение (скалярное)

4

Многочлен

а.

a+bx.

a+ bx+cx2

a+ bx+cx2+cx3

Сумма коэффициен-тов

Сложение

5

Числовой объект

Действительное число.

Комплексное число в алгебраической форме

Модуль

Умножение

6

Числовой объект

Действительное число.

Комплексное число в алгебраической форме

Модуль

Деление

7

Числовой объект

Действительное число.

Комплексное число в тригонометричес-кой форме

Модуль

Умножение

8

Правильный многоуголь-ник

Правильный треугольник.

Правильный четырехугольник.

Правильный пятиугольник

Площадь

Деление

9

Многочлен

а.

a+bx.

a+ bx+cx2

a+ bx+cx2+cx3

Сумма квадратов коэффициен-тов

Вычитание

10

Фигура

Окружность.

Параллелограмм. Трапеция.

Периметр

Равно

000

Числовой объект

Действительное число.

Квадратная матрица 2х2

Детерминант

Умножение

Пример выполнения индивидуального задания для варианта 000.

Постановка задачи.

Создать абстрактный базовый класс «Числовой объект» с чистой виртуальной функцией «Детерминант». С помощью метода наследования создать из базового класса производные классы «Действительное число» и «квадратная матрица 2*2». В каждом производном классе реализовать функцию «Детерминант». Для каждого производного класса переопределить операции «ввода-вывода», а также операцию умножения.

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

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

#include<iostream>

using namespace std;

class Number

{

public:

      Number();

      virtual float Determinant() = 0; 

};

class Real_Number: public Number

{

float a;

public:

      Real_Number(float); Real_Number();    

      float Determinant();

      Real_Number operator*(Real_Number);

friend ostream & operator<<(ostream & os, const Real_Number & t); 

       friend istream & operator>>(istream & is, Real_Number & t);

};

class Matrix2: public Number

{

float a11, a12, a21, a22;

public:

       Matrix2(float, float, float, float); Matrix2(){};

       float Determinant();

       Matrix2 operator*(Matrix2);

       friend ostream & operator<<(ostream & os, const Matrix2 & t); 

       friend istream & operator>>(istream & is, Matrix2 & t); 

};     

// Реализация функций

Number::Number(){};

Real_Number::Real_Number(float a1): Number() {a=a1;};

Real_Number::Real_Number(): Number() {};

float Real_Number::Determinant(){return a;};

Real_Number Real_Number::operator*(Real_Number b)

             {Real_Number c;

             c.a=b.a*a; 

             return c;};

Matrix2::Matrix2(float x1, float x2, float x3, float x4 ): Number()

       {a11=x1; a12=x2; a21=x3; a22=x4;};

float Matrix2::Determinant()  {return (a11*a22-a12*a21);};

Matrix2 Matrix2::operator*(Matrix2 b)

             {Matrix2 c;

c.a11=a11*b.a11 + a12*b.a21; c.a12=a11*b.a12 + a12*b.a22;

c.a21=a21*b.a11 + a22*b.a21; c.a22=a21*b.a12 + a22*b.a22;

             return c;

             };

ostream & operator<<(ostream & os, const Real_Number & t)

                 {os<<«Real_Number: «<< t.a<<endl;};

istream & operator>>(istream & is, Real_Number & t)

                 {cout<<«Введите a»<<endl; is>>t.a;};

ostream & operator<<(ostream & os, const Matrix2 & t)

 {os << «Matrix2: «<<t.a11 << «  «<<t.a12<<«  «<<t.a21<<«  «<<t.a22<<endl;};

istream & operator>>(istream & is, Matrix2 & t)

                 {cout<<«Введите a11»<<endl;  is >> t.a11;

                  cout<<«Введите a12»<<endl; is>>t.a12;

                  cout<<«Введите a21»<<endl; is>>t.a21;

                  cout<<«Введите a22»<<endl; is>>t.a22;

                  };

// Головная программа

main()

{

// Раннее связывание, перегрузка ввода-вывода

Real_Number t; cin>>t; cout<<t; cout<<t.Determinant()<<endl;

Matrix2 d; cin>>d; cout<<d; cout<<d.Determinant()<<endl;

// Позднее связывание

Number *x; ;

x=&t; x->Determinant();

x=&d; x->Determinant();

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

Real_Number a(2), b(3);

cout<<a*b<<endl;

Matrix2 s(2, 3, 4, 5), y(3, 2, 5, 2), g;

cout<<s*y<<endl;

system(«pause»);

}

Вид экрана

Дополнительные вопросы и задания

1.  Цель работы.

2.  Комментарии к произвольному месту кода.

3.  Количество членов, полей и функций для всех описанных классов.

4.  Позднее связывание.

5.  Раннее связывание.

6.  Дружественная функция.

7.  В каких случаях при перегрузке используется механизм дружественных функций?

8.  В каких случаях при перегрузке используется функция член класса?

9.  Объяснить разницу между поздним и ранним связыванием.

10.  Виртуальные функции.

11.  Абстрактные классы.


4 Лабораторная работа № 4. Многофайловые проекты Visual Studio

Цель работы: научиться разрабатывать многофайловые проекты С++ в среде Visual Studio, закрепить навыки использования абстрактных классов и виртуальных функций

Практическая  часть

Задание 1

Импортировать проект, созданный в предыдущей лабораторной работе в среду Visual Studio

Задание 2

Обеспечить вывод букв кириллицы.

Задание 3

Разместить описания классов в заголовочных файлах.

Не забыть о необходимости использования директив препроцессора:

//MyDll.h

#ifndef MYDLLH

#define MYDLLH

Описание классов

#endif

Задание 4

Отделить реализации функций от головной программы и разместить их в отдельном файле *.cpp

Индивидуальные задания

Общая часть.

Для своего варианта:

1)    Импортировать приложение, созданное в лабораторной работе №3 в среду Visual Studio.

2)    Решить проблему вывода символов кириллицы.

3)    Разместить описания классов в заголовочных файлах.

4)       Отделить реализации функций от головной программы и разместить их в отдельном файле *.cpp.

5)    На основе агрегирующего класса лабораторной работы №3 создать три класса:

- абстрактный класс (с чистыми  виртуальными функциями вывода на консоль, добавления объекта и удаления последнего объекта);

- производный агрегирующий класс, использующий массив объектов (с реализованными виртуальными функциями);

- производный агрегирующий класс, использующий массив указателей (с реализованными виртуальными функциями).

6) В головной программе показать использование созданных классов (раннее связывание, позднее связывание).      

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

0.  Библиотека– Книга - Печатное издание

1.  Военнослужащий-Офицер-Штаб

2.  Человек-Продавец-Магазин

3.  Дипломированный специалист-Врач-Больница

4.  Отделение-Врач-Поликлиника

5.  Постройка –Гараж -Гаражный кооператив

6.  Лечебное средство-Лекарство-Аптека

7.  Общественное объединение-Партия-Парламент

8.  Медицинский работник-Врач-Поликлиника

9.       Организация –Магазин -Торговая сеть

10.  Житель города -Работник-Организация

11.   Отдел – Сотрудник - Персона

12.  Сборная страны– Спортсмен - Персона

13.  Поликлиника - Врач- Выпускник медицинского Вуза

14.  Кафедра – Преподаватель - Персона

15.  Больница – Пациент - Персона

16.  Школа – Школьник - Персона

17.  Жилищный кооператив – Собственник жилья – Персона

18.  Призыв – Призывник-Выпускник школы

19.  Государство – Налогоплательщик  - Персона

20.  Организация-Библиотека-Библиотекарь

21.  Автомобиль-Автобус-Автопарк

22.  Шофер-Таксист-Таксопарк

23.  Инженер-Программист-Проект

24.  Механизм-Танк-Полк

25.  Солдат-Снайпер-Отделение

26.  Самолет-Истребитель-Эскадрилья

27.  Плавающее средство-Корабль-Флот

28.  Выпускник консерватории - Музыкант-Оркестр

29.  Выпускник ПТУ-Тракторист-Бригада

30.  Тракторист-Бригадир-Совет бригадиров

31.  Сотрудник-Бухгалтер-Бухгалтерия

32.  Выпускник АУЭС- Сотрудник- Организация

33.  Ребенок-Школьник-Школа

34.  Выпускник ВУЗа- Дипломат - Министерство иностранных дел

35.  Гражданин-Член партии -Партия

36.  Государство-Член Совета безопасности - Совет безопасности

37.  Картина - Выставка-Экспонат

38.  Академия-Ученый-Выпускник Вуза

39.  Университет-Преподаватель-Сотрудник

40.  Данные – Информация – Банк данных

41.  Музей-Экспонат-Предмет

42.  Корпорация-Фирма-Отдел

43.  Музыкант-Сотрудник-Оркестр

44.  Фильм-Киностудия-Мультфильм

45.  Актер-Сотрудник-Театр

46.  Магистратура-Учащийся-Магистрант

47.  Персона -Дворец школьников-Школьник

48.  Архитектура-Архитектор-Персона

49.  Официант-Ресторан-Работник Ресторана

50.  Профсоюзный комитет-Работник – Член профсоюза

51.  Постройка –Гараж -Гаражный кооператив

52.  Лечебное средство-Лекарство-Аптека

53.  Общественное объединение-Партия-Парламент

54.  Медицинский работник-Врач-Поликлиника

55.  Организация –Магазин -Торговая сеть

56.  Житель города -Работник-Организация

57.   Отдел – Сотрудник - Персона

58.  Сборная страны– Спортсмен - Персона

59.  Поликлиника - Врач- Выпускник медицинского Вуза

Пример выполнения индивидуального задания для варианта 000.

Постановка задачи.

Для своего варианта:

1)    Импортировать приложение, созданное в лабораторной работе №3 в среду Visual Studio.

2)    Решить проблему вывода символов кириллицы.

3)    Разместить описания классов в заголовочных файлах.

4)       Отделить реализации функций от головной программы и разместить их в отдельном файле *.cpp.

5)    На основе агрегирующего класса лабораторной работы №3 создать три класса:

- абстрактный класс (с чистыми  виртуальными функциями вывода на консоль, добавления объекта и удаления последнего объекта);

- производный агрегирующий класс, использующий массив объектов (с реализованными виртуальными функциями);

- производный агрегирующий класс, использующий массив указателей (с реализованными виртуальными функциями).

6) В головной программе показать использование созданных классов (раннее связывание, позднее связывание).      

7) Создать диаграмму классов.

Текст программы (фрагменты)

Вид экрана

Дополнительные вопросы и задания

1.  Цель работы.

2.  Комментарии к произвольному месту кода.

3.  Количество членов, полей и функций для всех описанных классов.

4.  Размеры экземпляров всех классов – с проверкой sizeof() – сравнить с размерами экземпляров классов, созданных в предыдущей лабораторной работе.

5.  Отношение наследования в UML.

6.  Отношение агрегации в  UML.

7.  Построить диаграмму классов (вручную) для произвольного варианта.

8.  Виртуальные функции.

9.  Чистые виртуальные функции.

10.  Абстрактные классы.

11.  Раннее связывание.

12.  Позднее связывание.

13.  Массивы объектов.

14.  Массивы указателей на объект.

15.  Указатели и объекты.

Список литературы

1. Шилдт  Г. Полный справочник по С++.  М.: Издательский дом «Вильямс», 2006. -800 с.

2.  Буч Г., Рамбо Д., Якобсон  И. Язык UML. Руководство пользователя. М: ДМК Пресс, 2006. -496 с.

 

Сводный план 2014 г., поз. 252

Турганбаев Ерик Сулейменович
Оразаева Айнур Ришатовна

ТЕХНОЛОГИИ ПРОГРАММИРОВАНИЯ
Методические указания по выполнению
лабораторных работ
для студентов специальности
5В070400 – Вычислительная техника и программное обеспечение

Редактор Л. Сластихина
Специалист по стандартизации Н.К. Молдабекова

Подписано в печать __.__.__
Формат 60x84 1/16
Тираж 50 экз.
Бумага типографская №1
Объем 2,6 уч.-изд.л.
Заказ ____ Цена 1300 тн

Копировательно-множительное бюро
Некоммерческое акционерное общество
«Алматинский университет энергетики и связи»
050013, Алматы, Байтурсынулы, 126