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

8 глава, Лафоре Р.

*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");
};

Комментарии

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

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

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

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

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

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

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