КС; ОПиБД
1. Выполнить лабораторную работу « Использование массивов объектов одного класса».
2. Отчет можно подготовить:
- либо в текстовом документе со скринами, соответствующими ходу работы. И прислать файл с заголовком:
«Фамилия; 06.04, 9КС, ОПиБД»,
- либо написать краткий ход работы. И прислать фотографию рукописной страницы с именем:
«Фамилия; 06.04, 9КС, ОПиБД».
- либо прислать скрины с телефона, фотографию с именем:
«Фамилия; 06.04, 9КС, ОПиБД».
Отчет нужно подготовить и прислать до 09.04 включительно.
Лабораторная работа № 23
Тема: Использование массивов объектов одного класса
Задание:
1. Создать класс, назначение которого покупка и продажа акций, обновление стоимости пакета.
2. Для инициализации использовать конструкторы
3. Программу организовать в виде трех модулей: заголовочного файла, файла методов, клиентского файла.
4. В клиентской программе инициализировать массив из 5 объектов, отобразить их содержание.
Теория:
Довольно часто, как показывает пример класса Stock, возникает необходимость иметь несколько объектов одного и того же класса. Вы можете создавать отдельные переменные типа объект, что мы и делали до сих пор в рассматриваемых выше примерах, однако гораздо целесообразнее создавать массивы объектов. Это можно сравнить с решительным скачком в неизведанное, однако в действительности вы объявляете массив объектов таким же способом, каким бы вы объявили массив любых других стандартных типов.:
Stock mystuff[4]; // создается массив из четырех объектов класса Stock
Напомним, что программа всегда обращается к конструкторам классов, определенным по умолчанию, когда она создает объекты класса, которые не инициализированы явно. Данное объявление требует либо чтобы класс вообще явно не определял никаких конструкторов, поскольку в этом случае используется неявно конструктор, определенный по умолчанию, но не выполняющий никаких действий, либо, как в данном случае, чтобы конструктор по умолчанию был определен явно. Каждый элемент — mystuff[0], mystuff[l] и т.п. — это объект класса Stock, и, следовательно, он. может быть использован с методами класса Stock:
mystuff[0].update();
mystuff [3].show();
Stock tops = mystuff[2].topval(mystuff[1]);
Вы можете использовать конструктор для инициализации элементов этого массива. В этом случае нужно вызывать конструктор для каждого отдельного элемента:
const int STKS = 4;
Stock stocks[STKS] =
{
Stock("NanoSmart", 12.5, 20),
Stock("Boffo Objects", 200, 2.0),
Stock("Monolithic Obelisks", 130, 3.25),
Stock("Fleep Enterprises", 60, 6.5)
};
В приведенном выше программном коде для инициализации массива используется стандартная форма: список значений, отделенных друг от друга запятыми и заключенных в фигурные скобки. В данном случает при вызове метода конструктора отображается каждое значение. Если у класса имеется несколько конструкторов, вы можете применять различные конструкторы для различных элементов:
const int STKS = 10;
Stock stocks[STKS] =
{
Stock("NanoSmart", 12.5, 20),
Stock (),
Stock("Monolithic Obelisks", 130, 3.25),
…
};
В данном случае инициализация объектов stocks[0] и stocks[2] выполняется с использованием конструктора Stock(const char * со, int n, double pr), а инициализация stocks[l] — с помощью конструктора Stock(). Поскольку такое объявление только частично инициализирует массив, остальные семь элементов инициализируются с помощью конструктора, заданного по умолчанию.
Схема инициализации массива объектов все еще использует конструктор, заданный по умолчанию, для создания элементов этого массива. Затем конструктор в фигурных скобках создает временный объекты, содержимое которых копируется в виде вектора. Таким образом, класс должен иметь конструктор, заданный по умолчанию, если вы хотите создавать массивы объектов класса.
Литература:
- Прата, Стивен. П70 Язык программирования С++. Лекции и упражнения,6-е изд.:: Пер. с англ.- М.: ООО "И.Д. Вильямс", 2012.-1248с.
- Страуструп, Бьярне. С83 Программирование: принципы и практика использования С++.: Пер. с англ.- М.: ООО "И.Д. Вильямс", 2011.-1248с.:
Заголовочный файл.
// stockl.h
#ifndef _STOCKl_H_
#define _STOCKl_H_
class Stock
{
private:
char company[30];
int shares;
double share_val;
double total_val;
void set_tot()
{ total_val = shares * share_val; }
public:
Stock(); // конструктор по умолчанию
Stock(const char * со,int n, double pr);
~Stock(); // деструктор
void buy(int num, double price);
void sell(int num, double price);
void update(double price);
void show();
>;
#endif
Листинг 2 Методы класса.
// stockl.cpp - методы класса Stock
«include <iostream>
«include <cstdlib>
«include <cstring>
using namespace std;
#include "stockl.h"
// конструкторы
Stock::Stock() // конструктор по умолчанию
{ strcpy(company, "no name");
shares = 0;
share_val = 0.0;
total_val = 0.0; }
Stock:: Stock (const char * со, int n, double pr)
{strncpy(company, со, 29);
company[29] = ' \0';
shares = n;
share_val = pr;
set_tot(); }
// деструктор класса
Stock::~Stock() // деструктор класса
{cout «"Bye, " «company «"! \n";}
// другие методы
void Stock::buy(int num, double price)
{
shares += num;
share_val = price;
set_tot(); }
void Stock::sell(int num, double price)
{if (num > shares)
{
cerr «"You can't sell more than you have! \n ";
exit(l);
}
shares -= num;
share_val = price;
set tot();
}
void Stock::update(double price)
{
share_val = price;
set_tot(); }
void Stock:: show ()
{
cout «"Company: " «company «"Shares: " «shares «'\n'
«"Share Price: " «share_val«"Total Worth: "
«total_val«'\n';
}
Клиентский файл
Листинг 3 Программа usestokl.cpp.
// usestokl.cpp — использование класса Stock
#include <iostream>
using namespace std;
#include "stockl.h"
int main()
{
const int STKS = 4;
Stock stocks [STKS] =
{
Stock("NanoSmart", 12.5, 20),
Stock("Boffo Objects", 200, 2.0),
Stock("Monolithic Obelisks", 130, 3.25),
Stock("Fleep Enterprises", 60, 6.5)
};
cout.setf(ios_base::fixed,ios_base::floatfield);// формат #.## cout.setf(ios_base::showpoint); //формат #.##
stocks[1].show();
stocks[2].show();
stocks[3].show();
stocks[4].show();
stocks[5].show();
return 0;
}