*1. Добавьте в класс Distance из программы ENGLPLUS этой главы перегру-
женную операцию -, которая вычисляет разность двух интервалов. Она
должна позволять выполнение выражений типа dist3 = dist1-dist2;. Предпо-
лагаем, что эта операция никогда не будет использоваться для вычитания
большего интервала из меньшего (так как отрицательного интервала быть
не может).
*2. Напишите программу, которая заменяет перегруженную операцию + на
перегруженную операцию += в программе STRPLUS этой главы. Эта опера-
ция должна позволять записывать выражения типа:
s1 += s2;
где s2 прибавляется (объединяется) к строке s1, результат при этом оста-
ется в s1. Операция должна также позволять использовать результат для
других вычислений, например в выражениях типа
s3 = s1 += s2;
*3. Модифицируйте класс time из упражнения 3 главы 6 так, чтобы вместо
метода add_time() можно было использовать операцию + для складывания
двух значений времени. Напишите программу для проверки класса.
*4. Создайте класс Int, основанный на упражнении 1 из главы 6. Перегрузите
четыре целочисленных арифметических операции (+, -, * и /) так, чтобы
их можно было использовать для операций с объектами класса Int. Если
результат какой-либо из операций выходит за границы типа int (в 32-
битной системе), имеющие значение от 2 14 7 483 648 до -2 147 483 648,
то операция должна послать сообщение об ошибке и завершить про-
грамму. Такие типы данных полезны там, где ошибки могут быть вы-
званы арифметическим переполнением, которое недопустимо. Подсказ-
ка: для облегчения проверки переполнения выполняйте вычисления с ис-
пользованием типа long double. Напишите программу для проверки этого
класса.
5. Пополните класс time, рассмотренный в упражнении 3, перегруженными
операциями увеличения (++) и уменьшения (--), которые работают в обе-
их, префиксной и постфиксной, формах записи и возвращают значение.
Дополните функцию main(), чтобы протестировать эти операции.
6. Добавьте в класс time из упражнения 5 возможность вычитать значения
времени, используя перегруженную операцию -, и умножать эти значе-
ния, используя тип float и перегруженную операцию *.
7. Модифицируйте класс fraction в четырехфункциональном дробном каль-
куляторе из упражнения 11 главы 6 так, чтобы он использовал перегру-
женные операции сложения, вычитания, умножения и деления. (Вспом-
ните правила арифметики с дробями в упражнении 12 главы 3 «Циклы и
ветвления».) Также перегрузите операции сравнения == и != и используй-
те их для выхода из цикла, когда пользователь вводит 0/1, 0 и 1 значения
двух частей дроби. Вы можете модифицировать и функцию lowterms() так,
чтобы она возвращала значение ее аргумента, уменьшенное до несократи-
мой дроби. Это будет полезным в арифметических функциях, которые мо-
гут быть выполнены сразу после получения ответа.
8. Модифицируйте класс bMoney из упражнения 12 главы 7 «Массивы и стро-
ки», включив арифметические операции, выполненные с помощью пере-
груженных операций:
bMoney = bMoney + bMoney
bMoney = bMoney - bMoney
bМоnеу = bMoney * long double (цена за единицу времени, затраченного на изделие)
long double = bMoney / bMoney (общая цена, деленная на цену за изделие)
bMoney = bMoney / long double (общая цена, деленная на количество изделий)
Заметим, что операция / перегружена дважды. Компилятор может разли-
чить оба варианта, так как их аргументы разные. Помним, что легче вы-
полнять арифметические операции с объектами класса bMoney, выполняя
те же операции с его long double данными.
Убедитесь, что программа main() запросит ввод пользователем двух де-
нежных строк и числа с плавающей точкой. Затем она выполнит все пять
операций и выведет результаты. Это должно происходить в цикле, так,
чтобы пользователь мог ввести еще числа, если это понадобится.
Некоторые операции с деньгами не имеют смысла: bMoney*bMoney не пред-
ставляет ничего реального, так как нет такой вещи, как денежный квад-
рат; вы не можете прибавить bMoney к long double (что же будет, если рубли
сложить с изделиями?). Чтобы сделать это невозможным, скомпилируйте
такие неправильные операции, не включая операции преобразования для
bMoney в long double или long double в bMoney. Если вы это сделаете и запи-
шете затем выражение типа:
bmon2 = bmon1 + widgets; // это не имеет смысла
то компилятор будет автоматически преобразовывать widgets в bMoney и
выполнять сложение. Без них компилятор будет отмечать такие преобра-
зования как ошибки, что позволит легче найти концептуальные ошибки.
Также сделайте конструкторы преобразований явными.
Вот некоторые другие вероятные операции с деньгами, которые мы еще
не умеем выполнять с помощью перегруженных операций, так как они
требуют объекта справа от знака операции, а не слева:
long double * bMoney // Пока не можем это сделать: bMoney возможен только справа
long double / bMoney // Пока не можем это сделать: bMoney возможен только справа
Мы рассмотрим выход из этой ситуации при изучении дружественных
функций в главе 11.
9. Дополните класс safearay из программы ARROVER3 этой главы так, чтобы
пользователь мог определять и верхнюю, и нижнюю границы массива
(например, индексы, начинающиеся с 100 и заканчивающиеся 200). Име-
ем перегруженную операцию доступа к членам массива, проверяющую
индексы каждый раз, когда к массиву нужен доступ, для проверки того,
что мы не вышли за пределы массива. Вам понадобится конструктор с
двумя аргументами, который определяет верхнюю и нижнюю границы.
Так как мы еще не изучили, как выделять память динамически, то данные
класса все еще будут размещаться в массиве, состоящем из 100 элементов,
но вообще вы можете преобразовывать индексы массива safearay в индек-
сы реального массива целых чисел произвольным образом. Например, ес-
ли пользователь определил диапазон от 100 до 175, то вы можете преоб-
разовать его в диапазон от arr[0] до arr[75].
10. Только для любителей математики: создайте класс Polar, который предна-
значен для хранения полярных координат (радиуса и угла). Перегрузите
операцию + для выполнения сложения для объектов класса Polar. Сложе-
ние двух объектов выполняется путем сложения координат X объектов,
а затем координат Y. Результат будет координатами новой точки. Таким
образом, вам нужно будет преобразовать полярные координаты к прямо-
угольным, сложить их, а затем обратно преобразовать прямоугольные ко-
ординаты результата к полярным.
11. Помните структуру sterling? Мы встречались с ней в упражнении 10 гла-
вы 2 «Основы программирования на C++», в упражнении 11 главы 5 и
в других местах. Преобразуйте ее в класс, имеющий переменные для фун-
тов (типа long), шиллингов (типа int) и пенсов (типа int). Создайте в
классе следующие функции:
♦ конструктор без аргументов;
♦ конструктор с одним аргументом типа double (для преобразования от
десятичных фунтов);
♦ конструктор с тремя аргументами: фунтами, шиллингами и пенсами;
♦ метод getSterling() для получения от пользователя значений количества
фунтов, шиллингов и пенсов в формате £9.19.11;
♦ метод putSterling() для вывода значений количества фунтов, шиллин-
гов и пенсов в формате £9.19.11;
♦ метод для сложения (sterling + sterling), используя перегруженную операцию +;
♦ метод вычитания (sterling - sterling), используя перегруженную операцию -;
♦ метод умножения (sterling * double), используя перегруженную операцию *;
♦ метод деления (sterling / sterling), используя перегруженную операцию /;
♦ метод деления (sterling / double), используя перегруженную операцию /;
♦ операцию double (для преобразования к типу double)
Выполнять вычисления вы можете, например, складывая отдельно дан-
ные объекта: сложить сначала пенсы, затем шиллинги и т. д. Однако легче
использовать операцию преобразования для преобразования объекта клас-
са sterling к типу double, выполнить вычисления с типами double, а затем
преобразовать обратно к типу sterling. Таким образом, операция + выгля-
дит похожей на эту:
sterling sterling::operator+(sterling s2)
{
return sterling(double(sterling(pounds, shillings, pense)) + double(s2));
}
Так мы создадим две временных переменных типа double, одна происхо-
дит от объекта, который вызывает функцию, а другая от аргумента s2.
Эти переменные затем складываются, результат преобразовывается к ти-
пу sterling и возвращается.
Заметим, что мы использовали другой подход для класса sterling, нежели
для класса bMoney. В классе sterling мы используем операции преобразова-
ния, таким образом отказавшись от возможности поиска неправильных
операций, но получив простоту при записи перегружаемых математиче-
ских операций.
12. Напишите программу, объединяющую в себе классы bMoney из упражне-
ния 8 и sterling из упражнения 11. Напишите операцию преобразования
для преобразования между классами bMoney и sterling, предполагая, что
один фунт (£1.0.0) равен пятидесяти долларам ($50.00). Это приблизи-
тельный курс обмена для XIX века, когда Британская империя еще ис-
пользовала меру фунты-шиллинги-пенсы. Напишите программу main(),
которая позволит пользователю вводить суммы в каждой из валют и пре-
образовывать их в другую валюту с выводом результата. Минимизируйте
количество изменений в существующих классах bMoney и sterling.
1)
#include "stdafx.h"
#include <iostream>
using namespace std;
class Distance
{
private:
int feet;
float inches;
public:
Distance() : feet(0), inches(0.0)
{ }
Distance(int ft, float in) : feet(ft), inches(in)
{ }
void getdist()
{
cout << "\nEnter feets: "; cin >> feet;
cout << "Enter inches: "; cin >> inches;
}
void showdist()
{
cout << feet << "\'-" << inches << '\"';
}
Distance operator+(Distance d2) const
{
int f = feet + d2.feet;
float i = inches + d2.inches;
if(i >= 12.0)
{
i -= 12.0;
f++;
}
return Distance(f, i); // создаем и возвращаем временную переменную
}
Distance operator-(Distance d2) const
{
int f = feet - d2.feet;
float i = inches - d2.inches;
if (i < 0)
{
f--;
i +=12.0;
}
return Distance(f, i);
}
};
int main()
{
Distance dist1, dist3, dist4;
dist1.getdist();
Distance dist2(11, 6.25); // определяем переменную с конкретным значением
dist3 = dist1 - dist2;
dist4 = dist1 + dist2 + dist3;
cout << "dist1 = "; dist1.showdist(); cout << endl;
cout << "dist2 = "; dist2.showdist(); cout << endl;
cout << "dist3 = "; dist3.showdist(); cout << endl;
cout << "dist4 = "; dist4.showdist(); cout << endl;
system ("pause");
return 0;
}
2)
#include "stdafx.h"
#include <iostream>
#include <string.h> // для функций strcpy, strcat
#include <stdlib.h> // для функции exit
using namespace std;
class String // наш класс для строк
{
private:
enum { SZ = 80 }; // максимальный размер строки
char str[SZ]; // массив для строки
public:
String()
{
strcpy_s(str, "");
}
String(char s[])
{
strcpy_s(str, s);
}
void display() const
{
cout << str;
}
String operator += (String ss) const
{
String temp; // временная переменная
if(strlen(str) + strlen(ss.str) < SZ)
{
strcpy_s(temp.str, str); // копируем содержимое первой строки
strcat_s(temp.str, ss.str);// добавляем содержимое второй строки
}
else
{
cout << "\nПереполнение!";
exit(1);
}
return temp; // возвращаем результат
}
};
int main()
{
system("chcp 1251 > nul");
String s1 = "\nHappy New Year! "; // используем конструктор с параметром
String s2 = "Merry Christmas!"; // используем конструктор с параметром
String s3; // используем конструктор без параметров
s1.display();
s2.display();
s3.display();
s3 = s1 += s2;
s3.display();
cout << endl;
cin.get();
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; };
Time operator + (Time t2)
{
long totalsecs = (hour * 3600) + (minutes * 60) + seconds + (t2.hour * 3600) + (t2.minutes * 60) + t2.seconds;
int h = totalsecs/(60*60);
int m = totalsecs % (60*60)/60;
int s = totalsecs % (60*60) % 60;
return Time (h, m, s);
}
};
int main()
{
Time time_1(3,5,2), time_2(2,5,3);
Time time_sum;
time_sum = 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 Int
{
private:
long double num;
public:
Int() : num(0)
{}
Int (long double n) : num(n)
{}
void disp_num()
{
if (num < 2147483648.0L && num > -2147483648.0L)
{cout << num << endl;}
else
{
cout << "error" << endl;
exit(1);
}
}
Int operator + (Int bet)
{
return num + bet.num;
}
Int operator - (Int bet)
{
return num - bet.num;
}
Int operator / (Int bet)
{
return num / bet.num;
}
Int operator * (Int bet)
{
return num * bet.num;
}
};
int main()
{
Int gamma;
Int alpha(3), beta(5);
gamma = alpha + beta;
cout << "\nalpha = "; alpha.disp_num();
cout << "\nbeta = "; beta.disp_num();
cout << "\ngamma (alpha+beta) = "; gamma.disp_num();
gamma = alpha-beta;
cout << "\ngamma (alpha-beta) = "; gamma.disp_num();
gamma = alpha/beta;
cout << "\ngamma (alpha/beta) = "; gamma.disp_num();
gamma = alpha*beta;
cout << "\ngamma (alpha*beta) = "; gamma.disp_num();
system ("pause");
return 0;
}
5)
#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; };
Time operator + (Time t2)
{
long totalsecs = (hour * 3600) + (minutes * 60) + seconds + (t2.hour * 3600) + (t2.minutes * 60) + t2.seconds;
int h = totalsecs/(60*60);
int m = totalsecs % (60*60)/60;
int s = totalsecs % (60*60) % 60;
return Time (h, m, s);
}
Time operator ++ ()
{
return Time (++hour, ++minutes, ++seconds);
}
Time operator -- ()
{
return Time (--hour, --minutes, --seconds);
}
Time operator ++ (int)
{
return Time (hour++, minutes++, seconds++);
}
Time operator -- (int)
{
return Time (hour--, minutes--, seconds--);
}
};
int main()
{
Time time_1(3,5,2), time_2(2,5,3);
Time time_sum, temp;
time_sum = time_1 + time_2;
time_1.display();
time_2.display();
time_sum.display();
++time_sum; time_sum.display();
--time_sum; time_sum.display();
temp = time_sum++; temp.display();
temp = time_sum--; temp.display();
system ("pause");
return 0;
}
6)
#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; };
Time operator + (Time t2)
{
long totalsecs = (hour * 3600) + (minutes * 60) + seconds + (t2.hour * 3600) + (t2.minutes * 60) + t2.seconds;
int h = totalsecs/(60*60);
int m = totalsecs % (60*60)/60;
int s = totalsecs % (60*60) % 60;
return Time (h, m, s);
}
Time operator - (Time t2)
{
long totalsecs = ((hour * 3600) + (minutes * 60) + seconds) - ((t2.hour * 3600) + (t2.minutes * 60) + t2.seconds);
int h = totalsecs/(60*60);
int m = totalsecs % (60*60)/60;
int s = totalsecs % (60*60) % 60;
return Time (h, m, s);
}
Time operator * (Time t2)
{
long totalsecs = (hour * 3600) + ((minutes * 60) + seconds) * ((t2.hour * 3600) + (t2.minutes * 60) + t2.seconds);
int h = totalsecs/(60*60);
int m = totalsecs % (60*60)/60;
int s = totalsecs % (60*60) % 60;
return Time (h, m, s);
}
Time operator ++ ()
{
return Time (++hour, ++minutes, ++seconds);
}
Time operator -- ()
{
return Time (--hour, --minutes, --seconds);
}
Time operator ++ (int)
{
return Time (hour++, minutes++, seconds++);
}
Time operator -- (int)
{
return Time (hour--, minutes--, seconds--);
}
};
int main()
{
Time time_1(3,5,2), time_2(2,5,3);
Time time_sum, temp;
time_sum = time_1 + time_2;
time_1.display();
time_2.display();
time_sum.display();
++time_sum; time_sum.display();
--time_sum; time_sum.display();
temp = time_sum++; temp.display();
temp = time_sum--; temp.display();
time_sum = time_1 - time_2; time_sum.display();
time_sum = time_1 * time_2; time_sum.display();
system ("pause");
return 0;
}
7)
#include "stdafx.h"
#include <iostream>
#include <cmath>
using namespace std;
class Fraction
{
private:
int numerator, denominator;
public:
Fraction():numerator(0), denominator(0)
{}
Fraction (int num, int denom) : numerator(num), denominator(denom)
{}
void get_fr()
{
char ch;
cout << "enter fraction" << endl;
cin >> numerator >> ch >> denominator;
if (numerator == 0 && denominator ==0)
{
if (numerator == 1 && denominator ==1)
{
if (numerator == 0 && denominator ==1)
{
cout << "Error!" << endl;
exit (1);
}
}
}
}
Fraction operator + (Fraction f2)
{
int num = numerator * f2.denominator + denominator * f2.numerator;
int denom = denominator * f2.denominator;
return Fraction(num, denom);
}
Fraction operator - (Fraction f2)
{
int num = numerator * f2.denominator - denominator * f2.numerator;
int denom = denominator * f2.denominator;
return Fraction(num, denom);
}
Fraction operator * (Fraction f2)
{
int num = numerator * f2.denominator;
int denom = denominator * f2.denominator;
return Fraction(num, denom);
}
Fraction operator / (Fraction f2)
{
int num = numerator * f2.denominator;
int denom = denominator * f2.numerator;
return Fraction(num, denom);
}
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 = fr1 + fr2; break;
case '-': fr_sum = fr1 - fr2; break;
case '*': fr_sum = fr1 * fr2; break;
case '/': fr_sum = fr1 / fr2; break;
}
fr_sum.lowterms();
fr_sum.disp_fr();
cout << "repeat? (y/n)" << endl; cin >> zn;
}
while (zn != 'n');
return 0;
}
8)
#include "stdafx.h"
#include<iostream>
#include <string>
#include <stdlib.h>
#include <iomanip>
using namespace std;
class bMoney
{
private:
string strMon;
long double number;
public:
bMoney() : number(0)
{}
bMoney(long double num)
{
number = num;
}
operator long double () const
{
long double num = number;
return num;
}
void mstold()
{
cout << "Enter the amount in decimal point. End with a dollar sign" << endl;
getline(cin, strMon, '$');
int wlen = strMon.length();
int n=0;
string num;
for (int j = 0; j < wlen; j++)
if (strMon[j] != ',' && strMon[j] != '$')
num.push_back(strMon[j]); ;
number = stold(num);
}
bMoney operator + ( bMoney mon2)
{
return number + mon2.number;
}
bMoney operator - ( bMoney mon2)
{
return number - mon2.number;
}
bMoney operator * ( long double mon2)
{
return number * mon2;
}
bMoney operator / ( bMoney mon2)
{
return number / mon2.number;
}
bMoney operator / ( long double mon2)
{
return number / mon2;
}
void display()const
{
cout << setiosflags (ios::fixed)
<< setiosflags (ios::showpoint)
<<setprecision(2)
<< "\n" << number << '$' << endl;
}
};
int main()
{
bMoney money1, money2, moneysum;
long double num = 0;
do
{
money1.mstold();
money2.mstold();
moneysum = money1 + money2; moneysum.display();
moneysum = money1 - money2; moneysum.display();
num = money2;
moneysum = money1 * num; moneysum.display();
moneysum = money1 / money2; moneysum.display();
moneysum = money1 / num; moneysum.display();
cout << "\nrepeat?" << endl;
cin.get();
}
while (cin.get() !='n');
system ("pause");
return 0;
}
9)
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <process.h> // для функции exit
const int LIMIT = 100;
class safearray
{
private:
int arr[LIMIT];
public:
int& operator[](int n)// обратите внимание, что функция возвращает ссылку!
{
if(n < 0 || n >= LIMIT)
{
cout << "\nОшибочный индекс!"; exit(1);
}
return arr[n];
}
};
int main()
{
safearray sa1;
int up, down, down2, differ=0;
cout << "Enter upper limit araay" << endl; cin >> up;
cout << "Enter lower limit araay" << endl; cin >> down;
differ = up - 100;
down2 = down;
for(int i = down-differ; i < up-differ; i++)
sa1[i] = (down2++) * 10;
for( int i = down-differ; i < up-differ; i++)
{
int temp = sa1[i]; // используем функцию справа от знака =
cout << "Element " << down++ << " equal " << temp << endl;
}
system ("pause");
return 0;
}
10)
#include "stdafx.h"
#include<iostream>
#include <string>
#include <stdlib.h>
#include <iomanip>
#include <cmath>
using namespace std;
class Cartesian;
class Polar;
class Polar
{
private:
double corner;
double radius;
public:
Polar() : corner(0), radius (0)
{}
Polar (double cor, double rad) : corner(cor), radius(rad)
{}
Polar (const Cartesian& cartes);
void get ()
{
cout << "Enter polar coordinate. Enter corner: " << endl;
cin >> corner;
if (corner < 0)
if (corner > 360)
exit(1);
cout << "Enter radius: " << endl;
cin >> radius;
}
void display() const
{
cout << "The result of adding: " << endl
<< "corner: " << corner << endl
<< "radius: " << radius << endl;
}
double get_corner () const
{return corner; }
double get_radius () const
{return radius; }
};
class Cartesian
{
private:
double X;
double Y;
public:
Cartesian() : X(0), Y(0)
{}
Cartesian (double x, double y) : X(x), Y(y)
{}
Cartesian (const Polar& pol);
Cartesian operator + (Cartesian coord2)
{
double tempY = Y + coord2.Y;
double tempX = X + coord2.X;
return Cartesian( tempX, tempY);
}
double get_X () const
{ return X;}
double get_Y () const
{return Y;}
};
Cartesian::Cartesian(const Polar& pol)
{
double cor = pol.get_corner();
double rad = pol.get_radius();
X = rad * cos(cor);
Y = rad * sin(cor);
}
Polar::Polar(const Cartesian& cartes)
{
double x = cartes.get_X();
double y = cartes.get_Y();
corner = tan(y/x);
radius = hypot(x, y);
}
int main()
{
Polar coordinate1, coordinate2, result_coordinate;
Cartesian coord1, coord2, result_coord;
coordinate1.get();
coordinate2.get();
coord1 = coordinate1;
coord2 = coordinate2;
result_coord = coord1 + coord2;
result_coordinate = result_coord;
result_coordinate.display();
system ("pause");
return 0;
}
11)
#include "stdafx.h"
#include <iostream>
using namespace std;
class Sterling
{
private:
long pounds;
int shilling;
int pens;
public:
Sterling () : pounds(0), shilling(0), pens(0)
{}
Sterling (double funt)
{
pounds = static_cast<long> (funt);
long deschast = funt - pounds;
shilling = static_cast <int> (deschast*20);
pens = static_cast<int>((funt - pounds)*240-shilling*12);
}
Sterling (long po, int s, int pe) : pounds(po), shilling(s), pens(pe)
{}
void getSterling()
{
cout << "Enter pounds: "; cin >> pounds;
cout << "Enter shillings: "; cin >> shilling;
cout << "and pens: "; cin >> pens;
}
void putSterling() const
{
cout << "Result: J" << pounds << "." << shilling << "." << pens << endl;
}
Sterling operator + (Sterling str2)
{
int sumpens = (pounds *20*12 + shilling *12 + pens) + (str2.pounds *20*12 + str2.shilling *12 + str2.pens);
long po = sumpens/(20*12);
int s = sumpens % (20*12)/12;
int pe = sumpens%(20*12)%12;
return Sterling(po, s, pe);
}
Sterling operator - (Sterling str2)
{
int sumpens = (pounds *20*12 + shilling *12 + pens) - (str2.pounds *20*12 + str2.shilling *12 + str2.pens);
long po = sumpens/(20*12);
int s = sumpens % (20*12)/12;
int pe = sumpens%(20*12)%12;
return Sterling(po, s, pe);
}
Sterling operator * (double str2)
{
int sumpens = (pounds *20*12 + shilling *12 + pens) * (str2);
long po = sumpens/(20*12);
int s = sumpens % (20*12)/12;
int pe = sumpens%(20*12)%12;
return Sterling(po, s, pe);
}
Sterling operator / (Sterling str2)
{
int sumpens = (pounds *20*12 + shilling *12 + pens) / (str2.pounds *20*12 + str2.shilling *12 + str2.pens);
long po = sumpens/(20*12);
int s = sumpens % (20*12)/12;
int pe = sumpens%(20*12)%12;
return Sterling(po, s, pe);
}
Sterling operator / (double str2)
{
int sumpens = (pounds *20*12 + shilling *12 + pens) / (str2);
long po = sumpens/(20*12);
int s = sumpens % (20*12)/12;
int pe = sumpens%(20*12)%12;
return Sterling(po, s, pe);
}
operator double ()
{
float sum = pens + shilling*12 + (pounds*20) * 12;
double des_funt = (sum/2.4)/100;
return des_funt;
}
};
int main()
{
Sterling s1, s2, sum;
double decimal;
cout << "Enter decimal pounds" << endl;
cin >> decimal;
s1.getSterling();
s2.getSterling();
sum = s1+s2; sum.putSterling();
sum = s1-s2; sum.putSterling();
sum = s1*decimal; sum.putSterling();
sum = s1/s2; sum.putSterling();
sum = s1/decimal; sum.putSterling();
decimal = sum; cout << decimal << endl;
system ("pause");
};
12)
#include "stdafx.h"
#include<iostream>
#include <string>
#include <iomanip>
using namespace std;
class Sterling;
class bMoney;
class Sterling
{
private:
long pounds;
int shilling;
int pens;
public:
Sterling () : pounds(0), shilling(0), pens(0)
{}
Sterling (long po, int s, int pe) : pounds(po), shilling(s), pens(pe)
{}
Sterling (const bMoney& Mon);
void getSterling()
{
cout << "Enter pounds: "; cin >> pounds;
cout << "Enter shillings: "; cin >> shilling;
cout << "and pens: "; cin >> pens;
}
void putSterling() const
{
cout << "Result: J" << pounds << "." << shilling << "." << pens << endl;
}
long get_pounds () const
{ return pounds; }
int get_shilling () const
{ return shilling; }
int get_pens () const
{ return pens; }
};
class bMoney
{
private:
string strMon;
long double number;
public:
bMoney() : number(0)
{}
bMoney (const Sterling ster);
void mstold()
{
cout << "Enter the amount in decimal point. End with a dollar sign" << endl;
getline(cin, strMon, '$');
int wlen = strMon.length();
int n=0;
string num;
for (int j = 0; j < wlen; j++)
if (strMon[j] != ',' && strMon[j] != '$')
num.push_back(strMon[j]); ;
number = stold(num);
}
void display()const
{
cout << setiosflags (ios::fixed)
<< setiosflags (ios::showpoint)
<<setprecision(2)
<< "\n" << number << '$' << endl;
}
long double get_number () const
{ return number; }
};
Sterling :: Sterling (const bMoney& Mon)
{
long double dollar = Mon.get_number();
int sumpens = (dollar/50) *20*12;
pounds = sumpens/(20*12);
shilling = sumpens % (20*12)/12;
pens = sumpens%(20*12)%12;
}
bMoney :: bMoney (const Sterling ster)
{
long po = ster.get_pounds();
int s = ster.get_shilling();
int pe = ster.get_pens();
number = (po*50) + ((50/20)*s) + ((50*20*12)*pe);
}
int main()
{
Sterling sterling, rsterling;
bMoney dollars, rdollars;
sterling.getSterling();
dollars.mstold();
rsterling = dollars;
rdollars = sterling;
rsterling.putSterling();
rdollars.display();
system ("pause");
};
женную операцию -, которая вычисляет разность двух интервалов. Она
должна позволять выполнение выражений типа dist3 = dist1-dist2;. Предпо-
лагаем, что эта операция никогда не будет использоваться для вычитания
большего интервала из меньшего (так как отрицательного интервала быть
не может).
*2. Напишите программу, которая заменяет перегруженную операцию + на
перегруженную операцию += в программе STRPLUS этой главы. Эта опера-
ция должна позволять записывать выражения типа:
s1 += s2;
где s2 прибавляется (объединяется) к строке s1, результат при этом оста-
ется в s1. Операция должна также позволять использовать результат для
других вычислений, например в выражениях типа
s3 = s1 += s2;
*3. Модифицируйте класс time из упражнения 3 главы 6 так, чтобы вместо
метода add_time() можно было использовать операцию + для складывания
двух значений времени. Напишите программу для проверки класса.
*4. Создайте класс Int, основанный на упражнении 1 из главы 6. Перегрузите
четыре целочисленных арифметических операции (+, -, * и /) так, чтобы
их можно было использовать для операций с объектами класса Int. Если
результат какой-либо из операций выходит за границы типа int (в 32-
битной системе), имеющие значение от 2 14 7 483 648 до -2 147 483 648,
то операция должна послать сообщение об ошибке и завершить про-
грамму. Такие типы данных полезны там, где ошибки могут быть вы-
званы арифметическим переполнением, которое недопустимо. Подсказ-
ка: для облегчения проверки переполнения выполняйте вычисления с ис-
пользованием типа long double. Напишите программу для проверки этого
класса.
5. Пополните класс time, рассмотренный в упражнении 3, перегруженными
операциями увеличения (++) и уменьшения (--), которые работают в обе-
их, префиксной и постфиксной, формах записи и возвращают значение.
Дополните функцию main(), чтобы протестировать эти операции.
6. Добавьте в класс time из упражнения 5 возможность вычитать значения
времени, используя перегруженную операцию -, и умножать эти значе-
ния, используя тип float и перегруженную операцию *.
7. Модифицируйте класс fraction в четырехфункциональном дробном каль-
куляторе из упражнения 11 главы 6 так, чтобы он использовал перегру-
женные операции сложения, вычитания, умножения и деления. (Вспом-
ните правила арифметики с дробями в упражнении 12 главы 3 «Циклы и
ветвления».) Также перегрузите операции сравнения == и != и используй-
те их для выхода из цикла, когда пользователь вводит 0/1, 0 и 1 значения
двух частей дроби. Вы можете модифицировать и функцию lowterms() так,
чтобы она возвращала значение ее аргумента, уменьшенное до несократи-
мой дроби. Это будет полезным в арифметических функциях, которые мо-
гут быть выполнены сразу после получения ответа.
8. Модифицируйте класс bMoney из упражнения 12 главы 7 «Массивы и стро-
ки», включив арифметические операции, выполненные с помощью пере-
груженных операций:
bMoney = bMoney + bMoney
bMoney = bMoney - bMoney
bМоnеу = bMoney * long double (цена за единицу времени, затраченного на изделие)
long double = bMoney / bMoney (общая цена, деленная на цену за изделие)
bMoney = bMoney / long double (общая цена, деленная на количество изделий)
Заметим, что операция / перегружена дважды. Компилятор может разли-
чить оба варианта, так как их аргументы разные. Помним, что легче вы-
полнять арифметические операции с объектами класса bMoney, выполняя
те же операции с его long double данными.
Убедитесь, что программа main() запросит ввод пользователем двух де-
нежных строк и числа с плавающей точкой. Затем она выполнит все пять
операций и выведет результаты. Это должно происходить в цикле, так,
чтобы пользователь мог ввести еще числа, если это понадобится.
Некоторые операции с деньгами не имеют смысла: bMoney*bMoney не пред-
ставляет ничего реального, так как нет такой вещи, как денежный квад-
рат; вы не можете прибавить bMoney к long double (что же будет, если рубли
сложить с изделиями?). Чтобы сделать это невозможным, скомпилируйте
такие неправильные операции, не включая операции преобразования для
bMoney в long double или long double в bMoney. Если вы это сделаете и запи-
шете затем выражение типа:
bmon2 = bmon1 + widgets; // это не имеет смысла
то компилятор будет автоматически преобразовывать widgets в bMoney и
выполнять сложение. Без них компилятор будет отмечать такие преобра-
зования как ошибки, что позволит легче найти концептуальные ошибки.
Также сделайте конструкторы преобразований явными.
Вот некоторые другие вероятные операции с деньгами, которые мы еще
не умеем выполнять с помощью перегруженных операций, так как они
требуют объекта справа от знака операции, а не слева:
long double * bMoney // Пока не можем это сделать: bMoney возможен только справа
long double / bMoney // Пока не можем это сделать: bMoney возможен только справа
Мы рассмотрим выход из этой ситуации при изучении дружественных
функций в главе 11.
9. Дополните класс safearay из программы ARROVER3 этой главы так, чтобы
пользователь мог определять и верхнюю, и нижнюю границы массива
(например, индексы, начинающиеся с 100 и заканчивающиеся 200). Име-
ем перегруженную операцию доступа к членам массива, проверяющую
индексы каждый раз, когда к массиву нужен доступ, для проверки того,
что мы не вышли за пределы массива. Вам понадобится конструктор с
двумя аргументами, который определяет верхнюю и нижнюю границы.
Так как мы еще не изучили, как выделять память динамически, то данные
класса все еще будут размещаться в массиве, состоящем из 100 элементов,
но вообще вы можете преобразовывать индексы массива safearay в индек-
сы реального массива целых чисел произвольным образом. Например, ес-
ли пользователь определил диапазон от 100 до 175, то вы можете преоб-
разовать его в диапазон от arr[0] до arr[75].
10. Только для любителей математики: создайте класс Polar, который предна-
значен для хранения полярных координат (радиуса и угла). Перегрузите
операцию + для выполнения сложения для объектов класса Polar. Сложе-
ние двух объектов выполняется путем сложения координат X объектов,
а затем координат Y. Результат будет координатами новой точки. Таким
образом, вам нужно будет преобразовать полярные координаты к прямо-
угольным, сложить их, а затем обратно преобразовать прямоугольные ко-
ординаты результата к полярным.
11. Помните структуру sterling? Мы встречались с ней в упражнении 10 гла-
вы 2 «Основы программирования на C++», в упражнении 11 главы 5 и
в других местах. Преобразуйте ее в класс, имеющий переменные для фун-
тов (типа long), шиллингов (типа int) и пенсов (типа int). Создайте в
классе следующие функции:
♦ конструктор без аргументов;
♦ конструктор с одним аргументом типа double (для преобразования от
десятичных фунтов);
♦ конструктор с тремя аргументами: фунтами, шиллингами и пенсами;
♦ метод getSterling() для получения от пользователя значений количества
фунтов, шиллингов и пенсов в формате £9.19.11;
♦ метод putSterling() для вывода значений количества фунтов, шиллин-
гов и пенсов в формате £9.19.11;
♦ метод для сложения (sterling + sterling), используя перегруженную операцию +;
♦ метод вычитания (sterling - sterling), используя перегруженную операцию -;
♦ метод умножения (sterling * double), используя перегруженную операцию *;
♦ метод деления (sterling / sterling), используя перегруженную операцию /;
♦ метод деления (sterling / double), используя перегруженную операцию /;
♦ операцию double (для преобразования к типу double)
Выполнять вычисления вы можете, например, складывая отдельно дан-
ные объекта: сложить сначала пенсы, затем шиллинги и т. д. Однако легче
использовать операцию преобразования для преобразования объекта клас-
са sterling к типу double, выполнить вычисления с типами double, а затем
преобразовать обратно к типу sterling. Таким образом, операция + выгля-
дит похожей на эту:
sterling sterling::operator+(sterling s2)
{
return sterling(double(sterling(pounds, shillings, pense)) + double(s2));
}
Так мы создадим две временных переменных типа double, одна происхо-
дит от объекта, который вызывает функцию, а другая от аргумента s2.
Эти переменные затем складываются, результат преобразовывается к ти-
пу sterling и возвращается.
Заметим, что мы использовали другой подход для класса sterling, нежели
для класса bMoney. В классе sterling мы используем операции преобразова-
ния, таким образом отказавшись от возможности поиска неправильных
операций, но получив простоту при записи перегружаемых математиче-
ских операций.
12. Напишите программу, объединяющую в себе классы bMoney из упражне-
ния 8 и sterling из упражнения 11. Напишите операцию преобразования
для преобразования между классами bMoney и sterling, предполагая, что
один фунт (£1.0.0) равен пятидесяти долларам ($50.00). Это приблизи-
тельный курс обмена для XIX века, когда Британская империя еще ис-
пользовала меру фунты-шиллинги-пенсы. Напишите программу main(),
которая позволит пользователю вводить суммы в каждой из валют и пре-
образовывать их в другую валюту с выводом результата. Минимизируйте
количество изменений в существующих классах bMoney и sterling.
1)
#include "stdafx.h"
#include <iostream>
using namespace std;
class Distance
{
private:
int feet;
float inches;
public:
Distance() : feet(0), inches(0.0)
{ }
Distance(int ft, float in) : feet(ft), inches(in)
{ }
void getdist()
{
cout << "\nEnter feets: "; cin >> feet;
cout << "Enter inches: "; cin >> inches;
}
void showdist()
{
cout << feet << "\'-" << inches << '\"';
}
Distance operator+(Distance d2) const
{
int f = feet + d2.feet;
float i = inches + d2.inches;
if(i >= 12.0)
{
i -= 12.0;
f++;
}
return Distance(f, i); // создаем и возвращаем временную переменную
}
Distance operator-(Distance d2) const
{
int f = feet - d2.feet;
float i = inches - d2.inches;
if (i < 0)
{
f--;
i +=12.0;
}
return Distance(f, i);
}
};
int main()
{
Distance dist1, dist3, dist4;
dist1.getdist();
Distance dist2(11, 6.25); // определяем переменную с конкретным значением
dist3 = dist1 - dist2;
dist4 = dist1 + dist2 + dist3;
cout << "dist1 = "; dist1.showdist(); cout << endl;
cout << "dist2 = "; dist2.showdist(); cout << endl;
cout << "dist3 = "; dist3.showdist(); cout << endl;
cout << "dist4 = "; dist4.showdist(); cout << endl;
system ("pause");
return 0;
}
2)
#include "stdafx.h"
#include <iostream>
#include <string.h> // для функций strcpy, strcat
#include <stdlib.h> // для функции exit
using namespace std;
class String // наш класс для строк
{
private:
enum { SZ = 80 }; // максимальный размер строки
char str[SZ]; // массив для строки
public:
String()
{
strcpy_s(str, "");
}
String(char s[])
{
strcpy_s(str, s);
}
void display() const
{
cout << str;
}
String operator += (String ss) const
{
String temp; // временная переменная
if(strlen(str) + strlen(ss.str) < SZ)
{
strcpy_s(temp.str, str); // копируем содержимое первой строки
strcat_s(temp.str, ss.str);// добавляем содержимое второй строки
}
else
{
cout << "\nПереполнение!";
exit(1);
}
return temp; // возвращаем результат
}
};
int main()
{
system("chcp 1251 > nul");
String s1 = "\nHappy New Year! "; // используем конструктор с параметром
String s2 = "Merry Christmas!"; // используем конструктор с параметром
String s3; // используем конструктор без параметров
s1.display();
s2.display();
s3.display();
s3 = s1 += s2;
s3.display();
cout << endl;
cin.get();
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; };
Time operator + (Time t2)
{
long totalsecs = (hour * 3600) + (minutes * 60) + seconds + (t2.hour * 3600) + (t2.minutes * 60) + t2.seconds;
int h = totalsecs/(60*60);
int m = totalsecs % (60*60)/60;
int s = totalsecs % (60*60) % 60;
return Time (h, m, s);
}
};
int main()
{
Time time_1(3,5,2), time_2(2,5,3);
Time time_sum;
time_sum = 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 Int
{
private:
long double num;
public:
Int() : num(0)
{}
Int (long double n) : num(n)
{}
void disp_num()
{
if (num < 2147483648.0L && num > -2147483648.0L)
{cout << num << endl;}
else
{
cout << "error" << endl;
exit(1);
}
}
Int operator + (Int bet)
{
return num + bet.num;
}
Int operator - (Int bet)
{
return num - bet.num;
}
Int operator / (Int bet)
{
return num / bet.num;
}
Int operator * (Int bet)
{
return num * bet.num;
}
};
int main()
{
Int gamma;
Int alpha(3), beta(5);
gamma = alpha + beta;
cout << "\nalpha = "; alpha.disp_num();
cout << "\nbeta = "; beta.disp_num();
cout << "\ngamma (alpha+beta) = "; gamma.disp_num();
gamma = alpha-beta;
cout << "\ngamma (alpha-beta) = "; gamma.disp_num();
gamma = alpha/beta;
cout << "\ngamma (alpha/beta) = "; gamma.disp_num();
gamma = alpha*beta;
cout << "\ngamma (alpha*beta) = "; gamma.disp_num();
system ("pause");
return 0;
}
5)
#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; };
Time operator + (Time t2)
{
long totalsecs = (hour * 3600) + (minutes * 60) + seconds + (t2.hour * 3600) + (t2.minutes * 60) + t2.seconds;
int h = totalsecs/(60*60);
int m = totalsecs % (60*60)/60;
int s = totalsecs % (60*60) % 60;
return Time (h, m, s);
}
Time operator ++ ()
{
return Time (++hour, ++minutes, ++seconds);
}
Time operator -- ()
{
return Time (--hour, --minutes, --seconds);
}
Time operator ++ (int)
{
return Time (hour++, minutes++, seconds++);
}
Time operator -- (int)
{
return Time (hour--, minutes--, seconds--);
}
};
int main()
{
Time time_1(3,5,2), time_2(2,5,3);
Time time_sum, temp;
time_sum = time_1 + time_2;
time_1.display();
time_2.display();
time_sum.display();
++time_sum; time_sum.display();
--time_sum; time_sum.display();
temp = time_sum++; temp.display();
temp = time_sum--; temp.display();
system ("pause");
return 0;
}
6)
#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; };
Time operator + (Time t2)
{
long totalsecs = (hour * 3600) + (minutes * 60) + seconds + (t2.hour * 3600) + (t2.minutes * 60) + t2.seconds;
int h = totalsecs/(60*60);
int m = totalsecs % (60*60)/60;
int s = totalsecs % (60*60) % 60;
return Time (h, m, s);
}
Time operator - (Time t2)
{
long totalsecs = ((hour * 3600) + (minutes * 60) + seconds) - ((t2.hour * 3600) + (t2.minutes * 60) + t2.seconds);
int h = totalsecs/(60*60);
int m = totalsecs % (60*60)/60;
int s = totalsecs % (60*60) % 60;
return Time (h, m, s);
}
Time operator * (Time t2)
{
long totalsecs = (hour * 3600) + ((minutes * 60) + seconds) * ((t2.hour * 3600) + (t2.minutes * 60) + t2.seconds);
int h = totalsecs/(60*60);
int m = totalsecs % (60*60)/60;
int s = totalsecs % (60*60) % 60;
return Time (h, m, s);
}
Time operator ++ ()
{
return Time (++hour, ++minutes, ++seconds);
}
Time operator -- ()
{
return Time (--hour, --minutes, --seconds);
}
Time operator ++ (int)
{
return Time (hour++, minutes++, seconds++);
}
Time operator -- (int)
{
return Time (hour--, minutes--, seconds--);
}
};
int main()
{
Time time_1(3,5,2), time_2(2,5,3);
Time time_sum, temp;
time_sum = time_1 + time_2;
time_1.display();
time_2.display();
time_sum.display();
++time_sum; time_sum.display();
--time_sum; time_sum.display();
temp = time_sum++; temp.display();
temp = time_sum--; temp.display();
time_sum = time_1 - time_2; time_sum.display();
time_sum = time_1 * time_2; time_sum.display();
system ("pause");
return 0;
}
7)
#include "stdafx.h"
#include <iostream>
#include <cmath>
using namespace std;
class Fraction
{
private:
int numerator, denominator;
public:
Fraction():numerator(0), denominator(0)
{}
Fraction (int num, int denom) : numerator(num), denominator(denom)
{}
void get_fr()
{
char ch;
cout << "enter fraction" << endl;
cin >> numerator >> ch >> denominator;
if (numerator == 0 && denominator ==0)
{
if (numerator == 1 && denominator ==1)
{
if (numerator == 0 && denominator ==1)
{
cout << "Error!" << endl;
exit (1);
}
}
}
}
Fraction operator + (Fraction f2)
{
int num = numerator * f2.denominator + denominator * f2.numerator;
int denom = denominator * f2.denominator;
return Fraction(num, denom);
}
Fraction operator - (Fraction f2)
{
int num = numerator * f2.denominator - denominator * f2.numerator;
int denom = denominator * f2.denominator;
return Fraction(num, denom);
}
Fraction operator * (Fraction f2)
{
int num = numerator * f2.denominator;
int denom = denominator * f2.denominator;
return Fraction(num, denom);
}
Fraction operator / (Fraction f2)
{
int num = numerator * f2.denominator;
int denom = denominator * f2.numerator;
return Fraction(num, denom);
}
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 = fr1 + fr2; break;
case '-': fr_sum = fr1 - fr2; break;
case '*': fr_sum = fr1 * fr2; break;
case '/': fr_sum = fr1 / fr2; break;
}
fr_sum.lowterms();
fr_sum.disp_fr();
cout << "repeat? (y/n)" << endl; cin >> zn;
}
while (zn != 'n');
return 0;
}
8)
#include "stdafx.h"
#include<iostream>
#include <string>
#include <stdlib.h>
#include <iomanip>
using namespace std;
class bMoney
{
private:
string strMon;
long double number;
public:
bMoney() : number(0)
{}
bMoney(long double num)
{
number = num;
}
operator long double () const
{
long double num = number;
return num;
}
void mstold()
{
cout << "Enter the amount in decimal point. End with a dollar sign" << endl;
getline(cin, strMon, '$');
int wlen = strMon.length();
int n=0;
string num;
for (int j = 0; j < wlen; j++)
if (strMon[j] != ',' && strMon[j] != '$')
num.push_back(strMon[j]); ;
number = stold(num);
}
bMoney operator + ( bMoney mon2)
{
return number + mon2.number;
}
bMoney operator - ( bMoney mon2)
{
return number - mon2.number;
}
bMoney operator * ( long double mon2)
{
return number * mon2;
}
bMoney operator / ( bMoney mon2)
{
return number / mon2.number;
}
bMoney operator / ( long double mon2)
{
return number / mon2;
}
void display()const
{
cout << setiosflags (ios::fixed)
<< setiosflags (ios::showpoint)
<<setprecision(2)
<< "\n" << number << '$' << endl;
}
};
int main()
{
bMoney money1, money2, moneysum;
long double num = 0;
do
{
money1.mstold();
money2.mstold();
moneysum = money1 + money2; moneysum.display();
moneysum = money1 - money2; moneysum.display();
num = money2;
moneysum = money1 * num; moneysum.display();
moneysum = money1 / money2; moneysum.display();
moneysum = money1 / num; moneysum.display();
cout << "\nrepeat?" << endl;
cin.get();
}
while (cin.get() !='n');
system ("pause");
return 0;
}
9)
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <process.h> // для функции exit
const int LIMIT = 100;
class safearray
{
private:
int arr[LIMIT];
public:
int& operator[](int n)// обратите внимание, что функция возвращает ссылку!
{
if(n < 0 || n >= LIMIT)
{
cout << "\nОшибочный индекс!"; exit(1);
}
return arr[n];
}
};
int main()
{
safearray sa1;
int up, down, down2, differ=0;
cout << "Enter upper limit araay" << endl; cin >> up;
cout << "Enter lower limit araay" << endl; cin >> down;
differ = up - 100;
down2 = down;
for(int i = down-differ; i < up-differ; i++)
sa1[i] = (down2++) * 10;
for( int i = down-differ; i < up-differ; i++)
{
int temp = sa1[i]; // используем функцию справа от знака =
cout << "Element " << down++ << " equal " << temp << endl;
}
system ("pause");
return 0;
}
10)
#include "stdafx.h"
#include<iostream>
#include <string>
#include <stdlib.h>
#include <iomanip>
#include <cmath>
using namespace std;
class Cartesian;
class Polar;
class Polar
{
private:
double corner;
double radius;
public:
Polar() : corner(0), radius (0)
{}
Polar (double cor, double rad) : corner(cor), radius(rad)
{}
Polar (const Cartesian& cartes);
void get ()
{
cout << "Enter polar coordinate. Enter corner: " << endl;
cin >> corner;
if (corner < 0)
if (corner > 360)
exit(1);
cout << "Enter radius: " << endl;
cin >> radius;
}
void display() const
{
cout << "The result of adding: " << endl
<< "corner: " << corner << endl
<< "radius: " << radius << endl;
}
double get_corner () const
{return corner; }
double get_radius () const
{return radius; }
};
class Cartesian
{
private:
double X;
double Y;
public:
Cartesian() : X(0), Y(0)
{}
Cartesian (double x, double y) : X(x), Y(y)
{}
Cartesian (const Polar& pol);
Cartesian operator + (Cartesian coord2)
{
double tempY = Y + coord2.Y;
double tempX = X + coord2.X;
return Cartesian( tempX, tempY);
}
double get_X () const
{ return X;}
double get_Y () const
{return Y;}
};
Cartesian::Cartesian(const Polar& pol)
{
double cor = pol.get_corner();
double rad = pol.get_radius();
X = rad * cos(cor);
Y = rad * sin(cor);
}
Polar::Polar(const Cartesian& cartes)
{
double x = cartes.get_X();
double y = cartes.get_Y();
corner = tan(y/x);
radius = hypot(x, y);
}
int main()
{
Polar coordinate1, coordinate2, result_coordinate;
Cartesian coord1, coord2, result_coord;
coordinate1.get();
coordinate2.get();
coord1 = coordinate1;
coord2 = coordinate2;
result_coord = coord1 + coord2;
result_coordinate = result_coord;
result_coordinate.display();
system ("pause");
return 0;
}
11)
#include "stdafx.h"
#include <iostream>
using namespace std;
class Sterling
{
private:
long pounds;
int shilling;
int pens;
public:
Sterling () : pounds(0), shilling(0), pens(0)
{}
Sterling (double funt)
{
pounds = static_cast<long> (funt);
long deschast = funt - pounds;
shilling = static_cast <int> (deschast*20);
pens = static_cast<int>((funt - pounds)*240-shilling*12);
}
Sterling (long po, int s, int pe) : pounds(po), shilling(s), pens(pe)
{}
void getSterling()
{
cout << "Enter pounds: "; cin >> pounds;
cout << "Enter shillings: "; cin >> shilling;
cout << "and pens: "; cin >> pens;
}
void putSterling() const
{
cout << "Result: J" << pounds << "." << shilling << "." << pens << endl;
}
Sterling operator + (Sterling str2)
{
int sumpens = (pounds *20*12 + shilling *12 + pens) + (str2.pounds *20*12 + str2.shilling *12 + str2.pens);
long po = sumpens/(20*12);
int s = sumpens % (20*12)/12;
int pe = sumpens%(20*12)%12;
return Sterling(po, s, pe);
}
Sterling operator - (Sterling str2)
{
int sumpens = (pounds *20*12 + shilling *12 + pens) - (str2.pounds *20*12 + str2.shilling *12 + str2.pens);
long po = sumpens/(20*12);
int s = sumpens % (20*12)/12;
int pe = sumpens%(20*12)%12;
return Sterling(po, s, pe);
}
Sterling operator * (double str2)
{
int sumpens = (pounds *20*12 + shilling *12 + pens) * (str2);
long po = sumpens/(20*12);
int s = sumpens % (20*12)/12;
int pe = sumpens%(20*12)%12;
return Sterling(po, s, pe);
}
Sterling operator / (Sterling str2)
{
int sumpens = (pounds *20*12 + shilling *12 + pens) / (str2.pounds *20*12 + str2.shilling *12 + str2.pens);
long po = sumpens/(20*12);
int s = sumpens % (20*12)/12;
int pe = sumpens%(20*12)%12;
return Sterling(po, s, pe);
}
Sterling operator / (double str2)
{
int sumpens = (pounds *20*12 + shilling *12 + pens) / (str2);
long po = sumpens/(20*12);
int s = sumpens % (20*12)/12;
int pe = sumpens%(20*12)%12;
return Sterling(po, s, pe);
}
operator double ()
{
float sum = pens + shilling*12 + (pounds*20) * 12;
double des_funt = (sum/2.4)/100;
return des_funt;
}
};
int main()
{
Sterling s1, s2, sum;
double decimal;
cout << "Enter decimal pounds" << endl;
cin >> decimal;
s1.getSterling();
s2.getSterling();
sum = s1+s2; sum.putSterling();
sum = s1-s2; sum.putSterling();
sum = s1*decimal; sum.putSterling();
sum = s1/s2; sum.putSterling();
sum = s1/decimal; sum.putSterling();
decimal = sum; cout << decimal << endl;
system ("pause");
};
12)
#include "stdafx.h"
#include<iostream>
#include <string>
#include <iomanip>
using namespace std;
class Sterling;
class bMoney;
class Sterling
{
private:
long pounds;
int shilling;
int pens;
public:
Sterling () : pounds(0), shilling(0), pens(0)
{}
Sterling (long po, int s, int pe) : pounds(po), shilling(s), pens(pe)
{}
Sterling (const bMoney& Mon);
void getSterling()
{
cout << "Enter pounds: "; cin >> pounds;
cout << "Enter shillings: "; cin >> shilling;
cout << "and pens: "; cin >> pens;
}
void putSterling() const
{
cout << "Result: J" << pounds << "." << shilling << "." << pens << endl;
}
long get_pounds () const
{ return pounds; }
int get_shilling () const
{ return shilling; }
int get_pens () const
{ return pens; }
};
class bMoney
{
private:
string strMon;
long double number;
public:
bMoney() : number(0)
{}
bMoney (const Sterling ster);
void mstold()
{
cout << "Enter the amount in decimal point. End with a dollar sign" << endl;
getline(cin, strMon, '$');
int wlen = strMon.length();
int n=0;
string num;
for (int j = 0; j < wlen; j++)
if (strMon[j] != ',' && strMon[j] != '$')
num.push_back(strMon[j]); ;
number = stold(num);
}
void display()const
{
cout << setiosflags (ios::fixed)
<< setiosflags (ios::showpoint)
<<setprecision(2)
<< "\n" << number << '$' << endl;
}
long double get_number () const
{ return number; }
};
Sterling :: Sterling (const bMoney& Mon)
{
long double dollar = Mon.get_number();
int sumpens = (dollar/50) *20*12;
pounds = sumpens/(20*12);
shilling = sumpens % (20*12)/12;
pens = sumpens%(20*12)%12;
}
bMoney :: bMoney (const Sterling ster)
{
long po = ster.get_pounds();
int s = ster.get_shilling();
int pe = ster.get_pens();
number = (po*50) + ((50/20)*s) + ((50*20*12)*pe);
}
int main()
{
Sterling sterling, rsterling;
bMoney dollars, rdollars;
sterling.getSterling();
dollars.mstold();
rsterling = dollars;
rdollars = sterling;
rsterling.putSterling();
rdollars.display();
system ("pause");
};
Комментарии
Отправить комментарий