Лабораторная работа №5. Объекты и классы

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

Напишите программу, в которой будут созданы три объекта класса Int, два из которых будут инициализированы. Сложите два инициализированных объекта, присвойте результат третьему, а затем отобразите результат на экране.

// lab5_1.cpp

// uses a class to model an integer data type

#include <iostream>

using namespace std;

////////////////////////////////////////////////////////////////

class Int //(not the same as int)

{

private:

int i;

public:

Int() //create an Int

{ i = 0; }

Int(int ii) //create and initialize an Int

{ i = ii; }

void add(Int i2, Int i3) //add two Ints

{ i = i2.i + i3.i; }

void display() //display an Int

{ cout << i; }

};

////////////////////////////////////////////////////////////////

int main()

{

Int Int1(7); //create and initialize an Int

Int Int2(11); //create and initialize an Int

Int Int3; //create an Int

Int3.add(Int1, Int2); //add two Ints

cout << "\nInt3 = "; Int3.display(); //display result

cout << endl;

return 0;

}

2. Представьте пункт для взимания платежей за проезд по автостраде. Каждая проезжающая машина должна заплатить за проезд 50 центов, однако часть машин платит за проезд, а часть проезжает бесплатно. В кассе ведется учет числа проехавших машин и суммарная выручка от платы за проезд.

Создайте модель такой кассы с помощью класса toLLBooth. Класс должен содержать два поля. Одно из них, типа unsigned int, предназначено для учета количества проехавших автомобилей, а второе, имеющее тип double, будет содержать суммарную выручку от оплаты проезда. Конструктор должен инициализировать оба поля нулевыми значениями. Метод payingCar() инкрементирует число машин и увеличивает на 0,50 суммарную выручку. Другой метод, порауСаг(), увеличивает на единицу число автомобилей, но оставляет без изменения выручку. Метод display() выводит оба значения на экран. Там, где это возможно, сделайте методы константными.

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

// lab5_2.cpp

// uses class to model toll booth

#include <iostream>

using namespace std;

#include <conio.h>

const char ESC = 27; //escape key ASCII code

const double TOLL = 0.5; //toll is 50 cents

////////////////////////////////////////////////////////////////

class tollBooth

{

private:

unsigned int totalCars; //total cars passed today

double totalCash; //total money collected today

public: //constructor

tollBooth() : totalCars(0), totalCash(0.0)

{ }

void payingCar() //a car paid

{ totalCars++; totalCash += TOLL; }

void nopayCar() //a car didn't pay

{ totalCars++; }

void display() const //display totals

{ cout << "\nCars=" << totalCars

<< ", cash=" << totalCash

<< endl; }

};

////////////////////////////////////////////////////////////////

int main()

{

tollBooth booth1; //create a toll booth

char ch;

cout << "\nPress 0 for each non-paying car,"

<< "\n 1 for each paying car,"

<< "\n Esc to exit the program.\n";

do {

ch = getche(); //get character

if( ch == '0' ) //if it's 0, car didn't pay

booth1.nopayCar();

if( ch == '1' ) //if it's 1, car paid

booth1.payingCar();

} while( ch != ESC ); //exit loop on Esc key

booth1.display(); //display totals

return 0;

}

3. Создайте класс с именем time, содержащий три поля типа int, предназначенные для хранения часов, минут и секунд. Один из конструкторов класса должен инициализировать поля нулевыми значениями, а другой конструктор — заданным набором значений. Создайте метод класса, который будет выводить значения полей на экран в формате 11:59:59, и метод, складывающий значения двух объектов типа time, передаваемых в качестве аргументов.

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

// lab5_3.cpp

// uses class to model a time data type

#include <iostream>

using namespace std;

////////////////////////////////////////////////////////////////

class time

{

private:

int hrs, mins, secs;

public:

time() : hrs(0), mins(0), secs(0) //no-arg constructor

{ }

//3-arg constructor

time(int h, int m, int s) : hrs(h), mins(m), secs(s)

{ }

void display() const //format 11:59:59

{ cout << hrs << ":" << mins << ":" << secs; }

void add_time(time t1, time t2) //add two times

{

secs = t1.secs + t2.secs; //add seconds

if( secs > 59 ) //if overflow,

{ secs -= 60; mins++; } // carry a minute

mins += t1.mins + t2.mins; //add minutes

if( mins > 59 ) //if overflow,

{ mins -= 60; hrs++; } // carry an hour

hrs += t1.hrs + t2.hrs; //add hours

}

};

////////////////////////////////////////////////////////////////

int main()

{

const time time1(5, 59, 59); //creates and initialze

const time time2(4, 30, 30); // two times

time time3; //create another time

time3.add_time(time1, time2); //add two times

cout << "time3 = "; time3.display(); //display result

cout << endl;

return 0;

}

4. Создайте класс employee, используя упражнение 4 лабораторной работы №3. Класс должен включать поле типа int для хранения номера сотрудника и поле типа float для хранения величины его оклада. Методы класса должны позволять пользователю вводить и отображать данные класса. Напишите функцию main(), которая запросит пользователя ввести данные для трех сотрудников и выведет полученную информацию на экран.

5. Взяв в качестве основы структуру из упражнения 5 лабораторной работы №3, создайте класс date. Его данные должны размещаться в трех полях типа int: month, day и year. Метод класса getdate() должен принимать значение для объекта в формате 12/31/02, а метод showdate() — выводить данные на экран.

6. Расширьте содержание класса employee из упражнения 4, включив в него класс date и перечисление etype (см. упражнение 6 лабораторной работы №3). Объект класса date будет использоваться для хранения даты приема сотрудника на работу. Перечисление будет использовано для хранения статуса сотрудника: лаборант, секретарь, менеджер и т. д. Последние два поля данных должны быть закрытыми в определении класса employee, как и номер и оклад сотрудника. Вам будет необходимо разработать методы getemploy() и putemploy(), предназначенные соответственно для ввода и отображения информации о сотруднике. Возможно, при создании методов вам понадобится ветвление switch для работы с перечисляемым типом etype. Напишите функцию main(), которая попросит пользователя ввести данные о трех сотрудниках, а затем выведет эти данные на экран.

7. В морской навигации координаты точки измеряются в градусах и минутах широты и долготы. Например, координаты бухты Панити на о. Таити равны 149 градусов 34.8 минут восточной долготы и 17 градусов 31.5 минут южной широты. Это записывается как 149°34.8' W, 17°31.5' S. Один градус равен 60 минутам (устаревшая система также делила одну минуту на 60 секунд, но сейчас минуту делят на обычные десятичные доли). Долгота измеряется величиной от 0 до 180 градусов восточнее или западнее Гринвича. Широта принимает значения от 0 до 90 градусов севернее или южнее экватора.

Создайте класс angle, включающий следующие три поля: типа int для числа градусов, типа float для числа минут и типа char для указания направления (N, S, Е или W). Объект этого класса может содержать значение как широты, так и долготы. Создайте метод, позволяющий ввести координату точки, направление, в котором она измеряется, и метод, выводящий на экран значение этой координаты, например 179°59.9' Е. Кроме того, напишите конструктор, принимающий три аргумента. Напишите функцию main(), которая сначала создает переменную с помощью трехаргументного конструктора и выводит ее значение на экран, а затем циклически запрашивает пользователя ввести значение координаты и отображает введенное значение на экране. Для вывода символа градусов (°) можно воспользоваться символьной константой '\xF8'.

8. Создайте класс, одно из полей которого хранит «порядковый номер» объекта, то есть для первого созданного объекта значение этого поля равно 1, для второго созданного объекта значение равно 2 и т. д.

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

В класс следует включить метод, который будет выводить на экран порядковый номер объекта. Создайте функцию main(), в которой будут созданы три объекта, и каждый объект выведет на экран свой порядковый номер, например: Мой порядковый номер: 2 и т. п.

9. На основе структуры fraction из упражнения 8 лабораторной работы №3 создайте класс fraction. Данные класса должны быть представлены двумя полями: числителем и знаменателем. Методы класса должны получать от пользователя значения числителя и знаменателя дроби в форме 3/5 и выводить значение дроби в этом же формате. Кроме того, должен быть разработан метод, складывающий значения двух дробей. Напишите функцию main(), которая циклически запрашивает у пользователя ввод пары дробей, затем складывает их и выводит результат на экран. После каждой такой операции программа должна спрашивать пользователя, следует ли продолжать цикл.

10. Создайте класс с именем ship, который будет содержать данные об учетном номере корабля и координатах его расположения. Для задания номера корабля следует использовать механизм, аналогичный описанному в упражнении 8. Для хранения координат используйте два поля типа angle (см. упражнение 7). Разработайте метод, который будет сохранять в объекте данные о корабле, вводимые пользователем, и метод, выводящий данные о корабле на экран. Напишите функцию main(), создающую три объекта класса ship, затем запрашивающую ввод пользователем информации о каждом из кораблей и выводящую на экран всю полученную информацию.

11. Модифицируйте калькулятор, созданный в упражнении 12 лабораторной работы №4 так, чтобы вместо структуры fraction использовался одноименный класс. Класс должен содержать методы для ввода и вывода данных объектов, а также для выполнения арифметических операций. Кроме того, необходимо включить в состав класса функцию, приводящую дробь к несократимому виду. Функция должна находить наибольший общий делитель числителя и знаменателя и делить числитель и знаменатель на это значение. Код функции, названной lowterms(), приведен ниже:

void fraction::lowterms() // Сокращение дроби

{

long tnum, tden, temp,gcd;

tnum = labs(num); // Используем неотрицательные значения

tden = labs(den); // Нужен cmath

if(tden == 0) { // Проверка знаменателя

cout << “Недопустимый знаменатель”; exit(1);

} else if(tnum == 0) {

num = 0;

den = 1;

return;

}

// Нахождение наибольшего общего делителя

while(tnum != 0) {

if(tnum < tden) { // Если числитель больше знаменателя, меняем их местами.

temp = tnum;

tnum = tden;

tden = temp;

}

tnum = tnum – tden;

}

gcd = tden;// Делим числитель и знаменатель на НОД.

num = num / gcd;

den = den / gcd;

}

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

12. Используйте преимущество ООП, заключающееся в том, что однажды созданный класс можно помещать в другие программы. Создайте новую программу, которая будет включать класс fraction, созданный в упражнении 11. Программа должна выводить аналог целочисленной таблицы умножения для дробей. Пользователь вводит знаменатель, а программа должна подобрать всевозможные целые значения числителя так, чтобы значения получаемых дробей находились между 0 и 1. Дроби из получившегося таким образом набора перемножаются друг с другом во всевозможных комбинациях, в результате чего получается таблица следующего вида (для знаменателя, равного 6):

1/61/31/22/35/6

1/61/361/181/121/95/36

1/31/181/91/62/95/18

1/21/121/61/41/35/12

2/31/92/91/34/95/9

5/65/365/185/125/925/36

Наши рекомендации