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

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

Комментарии

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

Прата С. Решение задач 6 главы

На решение этих задач у меня ушло 2 дня. Становится все интереснее и интереснее! и черт возьми, я наконец-то поняла работу с файлами! прошу прощения за корявые условия. просто в нормальном формате электронной книги у меня нет, потому скрины задач просто пропущены через Файнридер.

Прата С. решение задач 5 главы

Эта глава по циклам меня удивила. я  с неким пренебрежением отнеслась к ней, т.к. думала что и так все знаю по этой теме. но Прата так глубоко и в подробностях объяснил тему, что я заново переосмыслила циклы и выражения. было очень много интересных подробностей, которые мне никто не мог толком объяснить. и кстати, парочка задач была над которыми я поломала голову. особенно понравился такой акцент на указателях. как говорится, приучают с малых лет. понять - поняла, но путаюсь в них до сих пор нечеловечески.

Прата С. Решение 3 и 4 главы

Повторюсь, взяла только интересные мне задания, т.е. с элементами того что поняла плохо/не встречала ранее. Сделала за сегодня. с удовольствием отмечаю что сдвиги  в положительную сторону  хотя-бы в стиле есть . в 4 главе ясно объяснено почему при вводе нескольких строк начинаются проблемы, и как этого избежать, подробно описана работа с входным потоком. Как работать со строками стиля Си и класса String, разница. для себя я сделала выводы что лучше всего, конечно-же класс string. намного меньше мороки. и метод ввода getline в обоих случаях. в задачах разница проиллюстрирована. и кстати, указатели больше не вызывают у меня ужаса и трепета. много нового узнала о видах структур. эта глава расставила все по местам в моей голове. правда, зачем в задачи на СР втиснута работа с массивом array - загадка. он ведь толком не объяснен, но понять его интуитивно можно, правда, зачем его использовать не зная тонкостей, как обычный массив с немного иным объявле...