Вы находитесь на странице: 1из 15

ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ

Отчет
по лабораторной работе № 2
по дисциплине «Алгоритмизация и компьютерное программирование»
Тема: «Разработка программ с использованием базовых конструкций С++»
Цель: научиться использовать средства ввода/вывода данных управляющие
конструкции (условные, циклические) языка С++; научиться разрабатывать и
вызывать пользовательские функции, в том числе с использованием массивов
и указателей.
Модуль 1а
1. Условие задачи.

Создать класс, описывающий объект «автомобиль», создать массив


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

2.Программный код
#include <iostream>
using namespace std;
class Car
{
public:
void input();
void output();
int getPrice();
private:
string mark;
int price;

};
class Buyer
{
public:
int getMoney();
Buyer(int money)
{
this->money = money;
}
private:
int money;

};
int Buyer::getMoney()
{
return money;
}
void Car::input()
{
cout << "Введите марку автомобиля: " << endl;
cin >> this->mark;
cout << "Введите стоимость автомобиля в у.е.: " << endl;
cin >> this->price;
}
void Car::output()
{
cout << "Автомобиль марки " << mark << " который стоит " << price << " у.е." <<
endl;
}
int Car::getPrice()
{
return price;
}
int main()
{
setlocale(LC_ALL, "Russian");
Car Cars[3];
for (Car& theCar : Cars) {
theCar.input();
}
cout << "Вы успешно ввели данные об автомобиле!" << endl;
for (Car& theCar : Cars) {
theCar.output();
}
Buyer A(6000);
for (Car& theCar : Cars) {
if (theCar.getPrice() <= A.getMoney()) {
cout << "Покупатель может приобрести следующие автомобили: " << endl;
theCar.output();
}
}
cout << "Нажмите любую кнопку для продолжения!" << endl;
return 0;

}3. Тестирование работы программы.

Тест
1 Анализ простой дроби
Шаги:
1 Запустить программу
2 6000-Вы ввели количество вашей суммы
3 Введите марку автомобиля:
BMW
4 Введите стоимость автомобиля в у.е.:
15500
3 Введите марку автомобиля:
Citroen
4 Введите стоимость автомобиля в у.е.:
7500
3 Введите марку автомобиля:
Lada
4 Введите стоимость автомобиля в у.е.:
4500
4 Введите стоимость автомобиля в у.е.:
Ожидаемый результат
На экран должно быть выведено:
Автомобиль марки BMW стоит 15500 у.е.
Автомобиль марки Citroen стоит 7500 у.е.
Автомобиль марки Lada стоит 4500 у.е.
Фактический результат:
Модуль 1

1. Условие задачи
Разработать программу согласно варианту задания. Добавить в
класс и показать использование в главной программе конструктора,
get- и set- методов.
2. Описать объект «правильный шестиугольник» в виде класса
RegularHexagon. Свойства: длина стороны. Методы: ввести, вывести
значения свойств, вычислить периметр. Использовать созданный класс
для написания программы вычисления периметра по заданному
значению длины стороны.
3. Программный код
#include <iostream>
using namespace std;

class RegularHexgon
{
public:
void input();
void output() const;
float getPerimiter() const;
private:
int length;

};
void RegularHexgon::input()
{
cout << "Ввод значения шестиуголника:" << endl;
cout << "Введите длину ";
cin >> this->length;

void RegularHexgon::output() const


{
cout << this->length;
}

float RegularHexgon::getPerimiter() const {


return (float)this->length * 6;
}

int main()
{
setlocale(LC_ALL, "Russian");
RegularHexgon A;
A.input();
cout << "Вы ввели длину: ";
A.output();
cout << endl;
cout << "Периметр: " << A.getPerimiter() << endl;

}
}3. Тестирование работы программы.

Тест
1 Анализ простой дроби
Шаги:
1 Запустить программу
2 Введите длину:5
Ожидаемый результат
На экран должно быть выведено:
Периметр = 30

Фактический результат:
Модуль 2

1. Условие задачи.

Разобрать и запустить программный код, реализующий подсчет цены


объекта отвертка. Произвести декомпозицию объекта. Спроектировать
UML-диаграмму и написать программное обеспечение для выбора
комплектующих и расчета стоимости объекта. Комод.

2. UML-диаграмма классов.
3. Программный код.
# #include <iostream>

using namespace std;

class Сorpus {
public:
Сorpus(int price) :price{ price } {}
int getPrice() const
{
return price;
}
private:

int price = 0;

};
class Handle{
public:
Handle(int price) :price{ price } {}
int getPrice() const

{
return price;
}
private:

int price = 0;

};

class Shelves {
public:
Shelves(int price) :price{ price } {}
int getPrice() const

{
return price;
}
private:

int price = 0;

};
class Komod {
public:
Komod(Сorpus* exСorpus, Handle* exHandle, Shelves* exShelves)

:theСorpus{ exСorpus }, theHandle{ exHandle }, theShelves{ exShelves } {};

int getPrice() const;

private:
Сorpus* theСorpus;
Handle* theHandle;
Shelves* theShelves;

};
int Komod::getPrice() const

{
return theСorpus->getPrice() + theHandle->getPrice() + theShelves->getPrice();
}

int main()
{
setlocale(LC_ALL, "Russian");
Сorpus СorpusA(120), СorpusB(135), СorpusC(180), * pСorpus;
Handle HandleA(15), HandleB(20), HandleС(30), * pHandle;
Shelves ShelvesA(45), ShelvesB(60), ShelvesC(75), * pShelves;
int type;

cout << "Выберите тип корпуса " << endl;


cin >> type;

switch (type) {

case 1: pСorpus = &СorpusA;


break;
case 2: pСorpus = &СorpusB;
break;
case 3: pСorpus = &СorpusC;
break;
default: pСorpus = nullptr;
}
cout << "Выберите тип ручки " << endl;
cin >> type;

switch (type) {

case 1: pHandle = &HandleA;


break;
case 2: pHandle = &HandleB;
break;
case 3: pHandle = &HandleС;
break;
default: pHandle = nullptr;
}

cout << "Выберите тип полок " << endl;


cin >> type;

switch (type) {

case 1: pShelves = &ShelvesA;


break;
case 2: pShelves = &ShelvesB;
break;
case 3: pShelves = &ShelvesC;
break;
default: pShelves = nullptr;
}
Komod firstKomod(pСorpus, pHandle, pShelves);
cout << "Стоимость комода: " << firstKomod.getPrice();
return 0;

}
1. }Тестирование работы программы.

Пример
1 Анализ простой дроби
Шаги:
1 Выберите тип корпуса 1
2 Выберите тип ручки 2
3 Выберите тип полок 3
Ожидаемый результат
На экран должно быть выведено:
Стоимость комода:215
Фактический результат:

Контрольные вопросы

1. Объясните суть и отличительные черты объектно-


ориентированной методологии программирования. Приведите примеры,
где ее целесообразно, а где нецелесообразно использовать.

Объектно-ориентированное программирование – это подход, при котором


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

2. Перечислите, из чего состоит класс в С++? Объясните разницу в


терминах «объект» и «класс»?
Методы — это функции, которые могут выполнять какие-либо действия
над данными (свойствами) класса. Методы класса — это его функции.
Свойства класса — его переменные. Классы - это структуры, в которые
добавили функции. А объекты - это структурные переменные.

3. Как представляются классы на UML-диаграммах?


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

4. Приведите синтаксис определения класса и описания методов,


включая рекомендации по именованию, порядку перечисления членов.

class имя {

тип1 переменная-свойство1;

тип2 переменная-свойство2;

public :

тип функция-метод1(параметры);

тип функция-метод2(параметры);

};

Называйте функцию/переменную/структуру/класс так, чтобы было


понятно, что он/она выполняет, какую роль играет и за что отвечает.

5. Как объекты хранятся в памяти?

Память, выделяемая в процессе выполнения программы, называется


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

Если динамическая память не освобождена до окончания программы, то она


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

6. Как в главной программе объявить объект и вызвать метод?

Для того чтобы объявить объект в главной программе нужно написать


имя
класса, а затем через пробел название объекта. Чтобы вызвать метод класса
нужно написать имя объекта класса, далее через точку написать название
метода
7. Объясните назначение указателя this.
Ключевое слово this представляет собой неявно определенный указатель
на сам объект. С его помощью метод класса определяет, с данными какого
объекта ему предстоит работать.

8. На что влияет режим доступа к элементам объекта?

Ключевые слова private, protected, public определяют режим


доступа (access mode) к членам класса. Они могут быть использованы в
определении класса многократно и в произвольном порядке. Однако
хорошим стилем программирования считается использование каждого
из этих ключевых слов один раз.

9. Как объявить массив объектов и получить доступ к его элементам,


а также их свойствам и методам?

Пример.

fraction B[4]; // массив дробей

// ввод массива дробей


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

B[i].input();

// вывод массива дробей

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

B [ i ]. output ();

Доступ к объектам, находящимся в массиве осуществляется через


индексные имена, и далее через точку можно обращаться к
компонентам объекта.

Доступ к объектам можно получить через указатель. В этом случае к


элементам объекта обращаются с помощью оператора ->.

fraction A; // дробь
// объявляем указатель типа fraction и присваиваем ему адрес дроби A
fraction* p=&A;
p->input();// ввод дроби

p -> output (); // вывод дроби

10. Как получить доступ к элементам объекта через указатели?

Унарный оператор * есть оператор косвенного доступа. Примененный к


указателю он выдает объект, на который данный указатель указывает.
Предположим, что x и y имеют тип int, а ip – укаэатель на int. Следующие
несколько строк придуманы специально для того, чтобы показать, каким
образом объявляются указатели и как используются операторы & и *.

int х = 1, у = 2, z[10];
int *ip; /* ip - указатель на int */

ip = &x; /* теперь ip указывает на x */


y = *ip; /* y теперь равен 1 */
*ip = 0; /* x теперь равен 0 */
ip = &z[0]; /* ip теперь указывает на z[0] */

11. Какие действия необходимо произвести, чтобы добавить в класс


новый метод?

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

public: // спецификатор доступа public


// структура объявления функций не возвращающих значений
void /*имя функции*/(/*параметры функции*/) //функция (метод
класса)
{
// тело функции
}

12. Какие названия должны иметь функция-конструктор и функция-


деструктор? Каково их назначение и как их вызвать в главной
программе?

Конструктор — это функция, которая имеет то же имя, что и класс и


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

class cl {

int num;

public:

void set (int i) { num = i; }

void show ( ) { cout <<"Число: " << num <<'\n'; }

};

Деструктор — это функция, которая имеет то же имя, что и класс, но со


знаком «~» (тильда) в начале. В деструкторе нужно уничтожить все
динамические объекты, которые были созданы в конструкторе.
Деструктор не принимает никаких параметров и не возвращает никаких
значений.

class string { . . .

public:

~ string ( ) { delete str; }

...

};

13. Какие виды конструкторов могут быть в классе? Поясните


назначение и принцип работы конструктора копирования.

Конструктор по умолчанию.
Это конструктор без аргументов. Попробуем привести пример. Создадим
класс String, а в нем создадим конструктор по умолчанию и посмотрим
когда он вызовется.

Как мы видим при вызове String a; вызывается конструктор по умолчанию,


а при вызове String b(); со скобками уже конструктор по умолчанию не
вызывается, так разобрались, но вызываться должен в любом случае
конструктор при создании объекта токо какой? хз. (не вызывается
потому, что Strhing b() — это декларация функции b() ). Да такую запись
String b(); не стоить использовать потому, что она ничего не делает. Это
просто декларация функции. Инициализацию с пустыми скобками не
используйте, только передавайте какое нить значение обязательно потому,
что ничего не вызывается если не передаешь.

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

Это конструктор который принимает ссылку на тот же объект и создает


еще один объект копию переданного по ссылке. Например:

Конструктор преобразования.

это конструктор который принимает один аргумент и преобразует его к


типу конструктора, в данном примере это конструктор String(const char*
a); , как бы принимает строку char* и создает из нее уже объект String.

14. Может ли в классе быть несколько конструкторов и


деструкторов?

Имя деструктора идентично имени конструктора, но с приставкой ~.

В классе допустимо создавать несколько конструкторов, если это


необходимо. в классе может быть объявлен только один деструктор.

15. Каково назначение методов доступа к закрытым членам класса?


Какие существуют требования при их разработке? Обязательно ли для
каждого свойства класса создавать getter и setter-методы?
Разделение интерфейса и реализации чрезвычайно полезно, поскольку
оно позволяет использовать объекты, без необходимости понимания их
реализации. Это значительно снижает сложность использования этих
устройств и значительно увеличивает их количество (устройства с
которыми можно взаимодействовать).
Функции доступа обычно бывают двух типов:

   геттеры — это функции, которые возвращают значения закрытых


переменных-членов класса;

   сеттеры — это функции, которые позволяют присваивать значения


закрытым переменным-членам класса.

16. Что такое встраиваемые функции? Какие существуют


ограничения по их использованию?
Функция, определенная в теле объявления класса, является встроенной.
Использование функций снижает быстродействие программы. Затратами
времени на вызов функций (работа со стеком программы). Если в
программе используется большое количество вызовов небольших
функций, то быстродействие программы может существенно снизиться.
Обычно в качестве встраиваемых функций используются часто
вызываемые небольшие по объему функции. Использование больших по
объему часто вызываемых встраиваемых функций может привести к
чрезмерному росту объема программы, что тоже может быть
нежелательно.
Что такое статические данные класса?
Мы можем использовать статический ключевое слово для членов класса
определяется как статические. Когда мы объявляем член класса является
статическим, что означает, что независимо от того, сколько классов
объектов, созданных, статические члены имеют только одну копию.
Статические члены во всех классах объектов являются общими. Если
другой инициализации оператор не существует, когда создается первый
объект, все статические данные будут инициализируется нулем. Мы не
можем иметь место в определении статического члена класса, но класс
может быть решена извне с помощью оператора диапазона:: повторно
объявить статическую переменную , так она инициализируется.
17. Что такое константные свойства, методы, объекты?
Константные методы служат для определения того, что можно сделать с
классом без побочного действия на его состояние, и что изменяет его
состояние. Пользователю класса, в котором правильно
расставлены const, в некоторых случаях, например, удаётся избежать
лишнего копирования объектов без потери данных. Также при правильном
использовании const на уровне компиляции исключается случайное
изменение объекта в методе, который не должен ничего в объекте менять
18. Приведите рекомендации по хранению программного кода.

19. Объясните принципы объектно-ориентированного


программирования. Поясните принципы абстрагирования,
ортогональности, приведите примеры.

Объектно-ориентированное программирование обладает рядом принципов.


Представление об их количестве расходится. Кто-то утверждает, что их три
(старая школа программистов), кто-то, что их четыре (новая школа
программистов):

1. Абстрация

Абстра́кция — в объектно-ориентированном программировании


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

2. Инкапсуляция

Инкапсуляция — свойство языка программирования, позволяющее


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

3. Наследование

Наследование — один из четырёх важнейших механизмов объектно-


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

4. Полиморфизм

Полиморфи́зм — возможность объектов с одинаковой спецификацией


иметь различную реализацию.

Вам также может понравиться