К основному контенту

6 глава, Лафоре Р

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



*2. Представьте пункт для взимания платежей за проезд по автостраде. Каж-
дая проезжающая машина должна заплатить за проезд 50 центов, однако
часть машин платит за проезд, а часть проезжает бесплатно. В кассе ведет-
ся учет числа проехавших машин и суммарная выручка от платы за проезд.
Создайте модель такой кассы с помощью класса tollBooth. Класс должен
содержать два поля. Одно из них, типа unsigned int, предназначено для
учета количества проехавших автомобилей, а второе, имеющее тип double,
будет содержать суммарную выручку от оплаты проезда. Конструктор дол-
жен инициализировать оба поля нулевыми значениями. Метод payingCar()
инкрементирует число машин и увеличивает на 0.50 суммарную выручку.
Другой метод, nopayCar(), увеличивает на единицу число автомобилей, но
оставляет без изменения выручку. Метод display() выводит оба значения
на экран. Там, где это возможно, сделайте методы константными.
Создайте программу, которая продемонстрирует работу класса. Програм-
ма должна предложить пользователю нажать одну клавишу для того, что-
бы сымитировать заплатившего автолюбителя, и другую клавишу, чтобы
сымитировать недобросовестного водителя. Нажатие клавиши Esc должно
привести к выдаче текущих значений количества машин и выручки и за-
вершению программы.

*3. Создайте класс с именем time, содержащий три поля типа int, предназна-
ченные для хранения часов, минут и секунд. Один из конструкторов клас-
са должен инициализировать поля нулевыми значениями, а другой конст-
руктор — заданным набором значений. Создайте метод класса, который
будет выводить значения полей на экран в формате 11:59:59, и метод,
складывающий значения двух объектов типа time, передаваемых в качест-
ве аргументов.
В функции main() следует создать два инициализированных объекта (по-
думайте, должны ли они быть константными) и один неинициализиро-
ванный объект. Затем сложите два инициализированных значения, а ре-
зультат присвойте третьему объекту и выведите его значение на экран.
Где возможно, сделайте методы константными.
4. Создайте класс employee, используя упражнение 4 главы 4. Класс должен
включать поле типа int для хранения номера сотрудника и поле типа float
для хранения величины его оклада. Методы класса должны позволять
пользователю вводить и отображать данные класса. Напишите функцию
main(), которая запросит пользователя ввести данные для трех сотрудни-
ков и выведет полученную информацию на экран.
5. Взяв в качестве основы структуру из упражнения 5 главы 4, создайте
класс date. Его данные должны размещаться в трех полях типа int: month,
day и year. Метод класса getdate() должен принимать значение для объекта
в формате 12/31/02, а метод showdate() — выводить данные на экран.
6. Расширьте содержание класса employee из упражнения 4, включив в него
класс date и перечисление etype (см. упражнение 6 главы 4). Объект клас-
са 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 главы 4 создайте класс
fraction. Данные класса должны быть представлены двумя полями: числи-
телем и знаменателем. Методы класса должны получать от пользователя
значения числителя и знаменателя дроби в форме 3/5 и выводить значе-
ние дроби в этом же формате. Кроме того, должен быть разработан метод,
складывающий значения двух дробей. Напишите функцию main(), которая
циклически запрашивает у пользователя ввод пары дробей, затем склады-
вает их и выводит результат на экран. После каждой такой операции про-
грамма должна спрашивать пользователя, следует ли продолжать цикл.
10. Создайте класс с именем ship, который будет содержать данные об учет-
ном номере корабля и координатах его расположения. Для задания номера
корабля следует использовать механизм, аналогичный описанному в уп-
ражнении 8. Для хранения координат используйте два поля типа angle
(см. упражнение 7). Разработайте метод, который будет сохранять в объек-
те данные о корабле, вводимые пользователем, и метод, выводящий данные
о корабле на экран. Напишите функцию main(), создающую три объекта
класса ship, затем запрашивающую ввод пользователем информации о каж-
дом из кораблей и выводящую на экран всю полученную информацию.

11. Модифицируйте калькулятор, созданный в упражнении 12 главы 5 так,
чтобы вместо структуры fraction использовался одноименный класс. Класс
должен содержать методы для ввода и вывода данных объектов, а также
для выполнения арифметических операций. Кроме того, необходимо вклю-
чить в состав класса функцию, приводящую дробь к несократимому виду.
Функция должна находить наибольший общий делитель числителя и зна-
менателя и делить числитель и знаменатель на это значение. Код функ-
ции, названной lowterms(), приведен ниже:
void fraction::lowterms()    // сокращение дроби
{
long tnum, tden, temp, gcd;
tnum = labs(num);            // используем неотрицательные 
tden = labs(den);            // значения (нужен cmath)
if(tden == 0)                // проверка знаменателя на 0
  { cout << "Недопустимый знаменатель!"; exit(1); }
else if(tnum == 0)           // проверка числителя на 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/6    1/3    1/2    2/3   5/6
-----------------------------------------
1/6   1/36   1/18   1/12   1/9   5/36
1/3   1/18   1/9    1/6    2/9   5/18
1/2   1/12   1/6    1/4    1/3   5/12
2/3   1/9    2/9    1/3    4/9   5/9
5/6   5/36   5/18   5/12   5/9   25/36





1)




#include "stdafx.h"
#include <iostream>
using namespace std;

class Int
{
private:
int num;
public:
Int() : num(0)
{}
Int (int n) : num(n)
{}
void disp_num()
{ cout << num << endl; }
void add_num (Int n1, Int n2)
{
num = n1.num + n2.num;
}
};
int main()
{
Int obj3;
Int obj1(3), obj2(5);
obj3.add_num(obj1, obj2);
cout << "\nobject 1 = "; obj1.disp_num();
cout << "\nobject 2 = "; obj2.disp_num();
cout << "\nobject 3 = "; obj3.disp_num();
system ("pause");
return 0;
}



2)





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

class tollBooth
{
private:
unsigned int car;
double cash;
public:
tollBooth() : car(-1), cash(0)
{}
void payingCar()
{ car ++; cash += 0.5; }
void nopayCar ()
{ car ++; }
void display ()const
{ cout << car << " car " << cash << " cash" << endl; }
};
int main()
{
tollBooth road;
char ch;
do
{
cout << "\nenter 'p' for paying car, enter 'n' for not paying car, enter 'ESC' to display cash and exit" << endl;

ch = _getche();
if (ch == 'p')
road.payingCar();
else road.nopayCar();
}
while (ch != 27);
road.display();
system ("pause");
return 0;
}




3)




#include "stdafx.h"
#include <iostream>
using namespace std;

class Time
{
private:
unsigned int hour, minutes, seconds;
public:
Time() : hour(0), minutes(0), seconds(0)
{}
Time (unsigned int h, unsigned int m, unsigned int s) : hour(h), minutes (m), seconds(s)
{}
void display()const
{ cout << hour << ":" << minutes << ":" << seconds << endl; };
void add_time (Time t1, Time t2)
{
long totalsecs = (t1.hour * 3600) + (t1.minutes * 60) + t1.seconds + (t2.hour * 3600) + (t2.minutes * 60) + t2.seconds;
hour = totalsecs/(60*60);
minutes = totalsecs % (60*60)/60;
seconds = totalsecs % (60*60) % 60;
}
};
int main()
{
const Time time_1(3,5,2), time_2(2,5,3);
Time time_sum;
time_sum.add_time(time_1, time_2);
time_1.display(); time_2.display(); time_sum.display();
system ("pause");
return 0;
}





4)





#include "stdafx.h"
#include <iostream>
using namespace std;

class Employee
{
private:
int number;
float salary;
public:
Employee() : number(0), salary(0)
{}
Employee(int num, float sal) : number(num), salary(sal)
{}
void get_empl()
{
cout << "number of the employee" << endl;
cin >> number;
cout << "salary" << endl;
cin >> salary;
}
void display()const
{ cout << "employee " << number << ", salary " << salary << "$" << endl; };
};
int main()
{
Employee empl_1, empl_2, empl_3;
empl_1.get_empl();
empl_2.get_empl();
empl_3.get_empl();
empl_1.display();
empl_2.display();
empl_3.display();
system ("pause");
return 0;
}




5)






#include "stdafx.h"
#include <iostream>
using namespace std;
char ch = '/';
class Date
{
private:
int day, month, year;
public:
Date() : month(0), day(0), year(0)
{}
Date(int d, int m, int y) : month(m), day(d), year(y)
{}
void getdate()
{
cout << "enter day, month and year (XX/XX/XXXX) " << endl;
cin >> day >> ch >> month >> ch >> year;
}
void showdate()const
{ cout << "You entered the date: " <<  day << ch << month << ch << year << endl; };
};
int main()
{
Date date;
date.getdate();
date.showdate();
system ("pause");
return 0;
}




6)







#include "stdafx.h"
#include <iostream>
using namespace std;
class Date
{
private:
public:
int day, month, year;
Date() : month(0), day(0), year(0)
{}
Date(int d, int m, int y) : month(m), day(d), year(y)
{}
};
class Employee
{
private:
int number;
float salary;
Date date;
enum etype {laborer, secretary, manager, accountant, executive, researcher};
etype post;
char letter;
public:
Employee() : number(0), salary(0)
{}
Employee(int num, float sal) : number(num), salary(sal)
{}
void get_empl()
{
char ch;
cout << "number of the employee" << endl;
cin >> number;
cout << "salary" << endl;
cin >> salary;
cout << "enter day, month and year of employment (XX/XX/XXXX) " << endl;
cin >> date.day >> ch >> date.month >> ch >> date.year;
cout << "enter first letter of post (laborer, secretary, manager, accountant, executive, researcher)" << endl;
cin >> letter;
switch (letter)
{
case 'l': post = laborer; break;
case 's': post = secretary; break;
case 'm': post = manager; break;
case 'a': post = accountant; break;
case 'e': post = executive; break;
case 'r': post = researcher; break;
}
 
}
void put_empl()const
{
cout << "employee " << number << ", salary " << salary << "$," << " date of employment " << date.day << "/" << date.month << "/" << date.year << ", post ";
switch(post)
{
case laborer: cout << "laborer" << endl; break;
case secretary: cout << "secretary" << endl; break;
case manager: cout << "manager" << endl; break;
case accountant: cout << "accountant" << endl; break;
case executive: cout << "executive" << endl; break;
case researcher: cout << "researcher" << endl; break;
}
};
};
int main()
{
Employee empl_1, empl_2, empl_3;
empl_1.get_empl();
empl_2.get_empl();
empl_3.get_empl();
empl_1.put_empl();
empl_2.put_empl();
empl_3.put_empl();
system ("pause");
return 0;
}




7)




#include "stdafx.h"
#include <iostream>
using namespace std;
class Angle
{
private:
int degree;
float min;
char dir;
public:
Angle() : degree(0), min(0), dir(0)
{}
Angle(int deg, float m, char d) : degree(deg), min(m), dir(d)
{}
void get_dir()
{
cout << "Enter degree" << endl; cin >> degree;
cout << "Enter minutes" << endl; cin >> min;
cout << "Enter direction (N, S, E, W)" << endl; cin >> dir;
}
void show_dir()
{
cout << degree << '\xF8' << min << "'" << dir << endl;
}

};
int main()
{
Angle angl_1(179, 59.9, 'E');
Angle angl_2;
char ch;
angl_1.show_dir();
do
{
angl_2.get_dir();
angl_2.show_dir();
cout << "repeat? (y/n)" << endl;
cin >> ch;
}
while (ch != 'n');
return 0;
}






8)




#include "stdafx.h"
#include <iostream>
using namespace std;
class Amount
{
private:
int number;
static int amount;
public:
Amount()
{
amount++;
number = amount;
}
void disp_num()
{ cout << "My serial number " << number << endl; }
};
int Amount :: amount = 0;
int main()
{
Amount obj1, obj2, obj3;
obj1.disp_num();
obj2.disp_num();
obj3.disp_num();
system ("pause");
return 0;
}




9)



#include "stdafx.h"
#include <iostream>
using namespace std;
class Fraction
{
private:
int numerator, denominator;
public:
Fraction():numerator(0), denominator(0)
{}
Fraction(int num, int denom) : numerator(num), denominator(denom)
{}
char ch;
void get_fr()
{
cout << "enter fraction" << endl;
cin >> numerator >> ch >> denominator;
}
void add_fr(Fraction f1, Fraction f2)
{
numerator = f1.numerator * f2.denominator + f1.denominator * f2.numerator;
denominator = f1.denominator * f2.denominator;
}
void disp_fr()
{ cout << numerator << "/" << denominator << endl; }
};
int main()
{
Fraction fr1, fr2, fr_sum;
char ch;
do
{
fr1.get_fr();
fr2.get_fr();
fr_sum.add_fr(fr1, fr2);
fr_sum.disp_fr();
cout << "repeat? (y/n)" << endl; cin >> ch;
}
while (ch != 'n');
return 0;
}







10)





#include "stdafx.h"
#include <iostream>
using namespace std;
class Ship
{
private:
int number;
static int amount;
int degree;
float min;
char dir;
public:
Ship():number(0), degree(0), min(0), dir(0)
{
amount++;
number = amount;
}
Ship(int num, int deg, float m, char d) : number(num), degree(deg), min(m), dir(d)
{}
void get_sh()
{
cout << "Enter degree" << endl; cin >> degree;
cout << "Enter minutes" << endl; cin >> min;
cout << "Enter direction (N, S, E, W)" << endl; cin >> dir;
}
void disp_sh()
{ cout << "serial number: " << number << ", direction: " << degree << '\xF8' << min << "'" << dir << endl; }
};
int Ship :: amount = 0;
int main()
{
Ship ship1, ship2, ship3;
ship1.get_sh();
ship2.get_sh();
ship3.get_sh();
ship1.disp_sh();
ship2.disp_sh();
ship3.disp_sh();
system ("pause");
return 0;
}





11)






#include "stdafx.h"
#include <iostream>
#include <cmath>
using namespace std;
class Fraction
{
private:
int numerator, denominator;
public:
Fraction():numerator(0), denominator(0)
{}
void get_fr()
{
char ch;
cout << "enter fraction" << endl;
cin >> numerator >> ch >> denominator;
}
void add_fr(Fraction f1, Fraction f2)
{
numerator = f1.numerator * f2.denominator + f1.denominator * f2.numerator;
denominator = f1.denominator * f2.denominator;
}
void sub_fr (Fraction f1, Fraction f2)
{
numerator = f1.numerator * f2.denominator - f1.denominator * f2.numerator;
denominator = f1.denominator * f2.denominator;
}
void mul_fr (Fraction f1, Fraction f2)
{
numerator = f1.numerator * f2.denominator;
denominator = f1.denominator * f2.denominator;
}
void div_fr (Fraction f1, Fraction f2)
{
numerator = f1.numerator * f2.denominator;
denominator = f1.denominator * f2.numerator;
}
void lowterms ()
{
long tnum, tden, temp, gcd;
tnum = labs(numerator);            // используем неотрицательные
tden = labs(denominator);            // значения (нужен cmath)
if( tden == 0 )              // проверка знаменателя на 0
 { cout << "Недопустимый знаменатель!"; exit(1); }
else if( tnum == 0 )         // проверка числителя на 0
 { numerator=0; denominator = 1; return; }
// нахождение наибольшего общего делителя
while(tnum !=0)
{
 if( tnum < tden )          // если числитель больше знаменателя,
   { temp=tnum; tnum=tden; tden=temp; } //меняем их местами
tnum = tnum - tden;        // вычитание
}
gcd = tden;                  // делим числитель и знаменатель на
numerator = numerator / gcd;             // полученный наибольший общий делитель
denominator = denominator / gcd;
}
void disp_fr()const
{ cout << numerator << "/" << denominator << endl; }
};
int main()
{
char zn;
do
{
Fraction fr1, fr2, fr_sum;
fr1.get_fr();
cout << "Enter sign" << endl; cin >> zn;
fr2.get_fr();
switch (zn)
{
case '+': fr_sum.add_fr(fr1, fr2); break;
case '-': fr_sum.sub_fr(fr1, fr2); break;
case '*': fr_sum.mul_fr(fr1, fr2); break;
case '/': fr_sum.div_fr(fr1, fr2); break;
}
fr_sum.lowterms();
fr_sum.disp_fr();
cout << "repeat? (y/n)" << endl; cin >> zn;
}
while (zn != 'n');
return 0;
}




12)




#include "stdafx.h"
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int number;
class Fraction
{
private:

public:
int numerator, denominator;
Fraction():numerator(0), denominator(0)
{}
void mul_fr (Fraction f1, Fraction f2)
{
numerator = f1.numerator * f2.numerator;
denominator = f1.denominator * f2.denominator;
}
void lowterms ()
{
long tnum, tden, temp, gcd;
tnum = labs(numerator);
tden = labs(denominator);
if( tden == 0 )
 { cout << "Недопустимый знаменатель!"; exit(1); }
else if( tnum == 0 )
 { numerator=0; denominator = 1; return; }
while(tnum !=0)
{
 if( tnum < tden )
   { temp=tnum; tnum=tden; tden=temp; }
tnum = tnum - tden;
}
gcd = tden;  
numerator = numerator / gcd;
denominator = denominator / gcd;
}
void disp_fr()const
{ cout << setw(5) << numerator  << "/" << denominator; }
};
int main()
{
Fraction fr1, fr2, fr3;
fr1.denominator = fr2.denominator = number;
cout << "enter denominator" << endl; cin >> number;
for (int j = 1; j<number; j++)
{
fr1.numerator = j;
fr1.denominator = number;
fr1.lowterms();
fr1.disp_fr();
}
cout << endl;
for(int i = 1; i < number; i++)
        {
fr2.numerator=i;
            fr2.denominator=number;
            fr2.lowterms();
fr2.disp_fr();

for(int j = 1; j < number; j++)
{
fr1.numerator=j;
fr1.denominator=number;
fr3.mul_fr(fr1, fr2);
fr3.lowterms();
fr3.disp_fr();
}
            cout<<endl;
}
system ("pause");
return 0;
}

Комментарии

  1. в 11 задании в методе умножения небольшая ошибка. нужно numerator на numerator умножать.

    ОтветитьУдалить

Отправить комментарий

Популярные сообщения из этого блога

ВОПРОС К ЧИТАТЕЛЯМ

Уважаемые читатели моего блога и просто проходящие мимо! У меня появилась идея заняться созданием уроков по интересующим вас темам. Предпочтительно на C++, но не ограничиваясь ими, я хочу поделиться своими знаниями не только в виде готового кода но и подробными объяснениями что к чему. Прошу вас, если вы имеете идею и хотели бы разобраться в какой-то теме - отпишитесь в комментариях, что было бы вам интересно. Постараюсь помочь. 

7 глава, Лафоре Р

*1. Напишите функцию reversit(), которая переворачивает строку (массив типа char). Используйте цикл for, который меняет местами первый и последний символы, затем следующие и т. д. до предпоследнего. Строка должна пере- даваться в функцию reversit() как аргумент. Напишите программу для выполнения функции reversit(). Программа долж- на принимать строку от пользователя, вызывать функцию reversit(), а за- тем выводить полученный результат. Используйте метод ввода, который позволяет использовать внутренние пробелы. Протестируйте программу на примере фразы «Аргентина манит негра».