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

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


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



*2. Создайте класс employee, который содержит имя (объект класса string) и но-
мер (типа long) служащего. Включите в него метод getdata(), предназна-
ченный для получения данных от пользователя и помещения их в объект,
и метод putdata(), для вывода данных. Предполагаем, что имя не может иметь
внутренних пробелов.
Напишите функцию main(), использующую этот класс. Вам нужно будет
создать массив типа employee, а затем предложить пользователю ввести
данные до 100 служащих. Наконец, вам нужно будет вывести данные всех
служащих.
*3. Напишите программу, вычисляющую среднее значение до 100 интервалов,
введенных пользователем. Создайте массив объектов класса Distance, как
это было сделано в примере ENGLARAY этой главы. Для вычисления сред-
него значения вы можете позаимствовать метод add_dist() из примера
ENGLCON главы 6. Вам также понадобится метод, который выделяет целую
часть из значения Distance. Вот одна из возможностей:
void Distance::div_dist(Distance d2, int divisor)
{
float fltfeet = d2.feet + d2.inches / 12.0;
float temp = fltfeet /= divisor;
feet = int(fltfeet);
inches = (temp - feet) * 12.0;
}


4. Начните с программы, которая позволяет пользователю вводить целые чис-
ла, а затем сохранять их в массиве типа int. Напишите функцию maxint(),
которая, обрабатывая элементы массива один за другим, находит наиболь-
ший. Функция должна принимать в качестве аргумента адрес массива и
количество элементов в нем, а возвращать индекс наибольшего элемента.
Программа должна вызвать эту функцию, а затем вывести наибольший
элемент и его индекс. (Смотрите программу SALES этой главы.)
5. Начните с класса fraction из упражнений 11 и 12 главы 6. Напишите
функцию main(), которая получает случайные дробные числа от пользова-
теля, сохраняет их в массиве типа fraction, вычисляет среднее значение и
выводит результат.
6. В игре бридж каждому из игроков раздают 13 карт, таким образом коло-
да расходуется полностью. Модифицируйте программу CARDARAY этой
главы так, чтобы после перемешивания колоды она делилась на четыре
части по 13 карт каждая. Каждая из четырех групп карт затем должна
быть выведена.
7. Одним из недостатков C++ является отсутствие для бизнес-программ
встроенного типа для денежных значений, такого, как $173 698 001.32.
Такой денежный тип должен иметь возможность для хранения числа с
фиксированной десятичной точкой точностью около 17 знаков, которого
было бы достаточно для хранения национального долга в долларах и цен-
тах. К счастью, встроенный тип C++ long double  имеет точность 19 цифр,
поэтому мы можем использовать его как базисный для класса money, даже
используя плавающую точку. Однако нам нужно будет добавить возмож-
ность ввода и вывода денежных значений с предшествующим им знаком
доллара и разделенными запятыми группы по три числа: так проще читать
большие числа. Первым делом при разработке такого класса напишем ме-
тод mstold(), который принимает денежную строку, то есть строку, пред-
ставляющую собой некоторое количество денег типа
"$1 234 567 890 123.99"
в качестве аргумента и возвращает эквивалентное ее значению число типа
long double.
Вам нужно будет обработать денежную строку как массив символов и,
просматривая ее символ за символом, скопировать из нее только цифры
(0-9) и десятичную точку в другую строку. Игнорируется все остальное,
включая знак доллара и запятые. Затем вы можете использовать биб-
лиотечную функцию _atold() (заметим, что здесь название функции на-
чинается с символа подчеркивания — заголовочные файлы STDLIB.H или
MATH.H) для преобразования новой строки к числу типа long double. Пред-
полагаем, что денежное значение не может быть отрицательным. Напи-
шите функцию main() для проверки метода mstold(), которая несколько
раз получает денежную строку от пользователя и выводит соответству-
ющее число типа long double.

8. Другим недостатком C++ является отсутствие автоматической проверки
индексов массива на соответствие их границам массива (это делает дей-
ствия с массивами быстрыми, но менее надежными). Мы можем исполь-
зовать класс для создания надежного массива, который проверяет индек-
сы при любой попытке доступа к массиву.
Напишите класс safearay, который использует массив типа int фиксиро-
ванного размера (назовем его LIMIT) в качестве своей единственной пере-
менной. В классе будет два метода. Первый, putel(), принимает индекс и
значение типа int как аргументы и вставляет это значение в массив по за-
данному индексу. Второй, getel(), принимает индекс как аргумент и воз-
вращает значение типа int, содержащееся в элементе с этим индексом.
safearay sa1; // описываем массив
int temp = 12345; // описываем целое
sa1.putel(7, temp); // помещаем значение temp в массив
temp = sa1.getel(7); // получаем значение из массива
Оба метода должны проверять индекс аргумента, чтобы быть уверенны-
ми, что он не меньше 0 и не больше, чем LIMIT-1. Вы можете использовать
этот массив без опаски, что запись будет произведена в другие части па-
мяти.
Использование методов для доступа к элементам массива не выглядит
так наглядно, как использование операции []. В главе 8 мы увидим, как
перегрузить эту операцию, чтобы сделать работу нашего класса safearay
похожей на работу встроенных массивов.
9. Очередь — это устройство для хранения данных, похожее на стек. Отли-
чие в том, что в стеке последний сохраненный элемент будет первым
извлеченным, тогда как в очереди первый сохраненный элемент будет
первым извлеченным. То есть в стеке используется подход «последний
вошел — первый вышел» (LJFO), а в очереди используется подход «пер-
вый вошел — первый вышел» (FIFO). Очередь похожа на простую оче-
редь посетителей магазина: первый, кто встал в очередь, будет обслужен
первым.
Перепишите программу STAKARAY из этой главы, включив в нее класс
queue вместо класса stack. Кроме того, класс должен иметь два метода:
один, называемый put(), для помещения элемента в очередь; и другой, на-
зываемый get(), для извлечения элемента из очереди. Эти методы эквива-
лентны методам push() и pop() класса stack.
Оба класса, stack и queue, используют массив для хранения данных. Одна-
ко вместо одного поля top типа int, как в классе stack, вам понадобятся два
поля для очереди: одна, называемая head, указывающая на начало очере-
ди; и вторая, tail, указывающая на конец очереди. Элементы помещаются
в конец очереди (как посетители банка, становящиеся в очередь), а извле-
каются из начала очереди. Конец очереди перемещается к началу по мас-
сиву по мере того, как элементы добавляются и извлекаются из очереди.
Такие результаты добавляют сложности: если одна из двух переменных

head или tail примут значение конца массива, то следует вернуться на на-
чало. Таким образом, вам нужно выражение типа
if(tail == MAX - 1)
 tail = -1;
для возврата переменной tail и похожее выражение для возврата перемен-
ной head. Массив, используемый в очереди, иногда называют круговым
буфером, так как начало и конец очереди циркулируют по нему вместе с
ее данными.
10. Матрица — это двумерный массив. Создайте класс matrix, который пре-
доставляет те же меры безопасности, как и класс из упражнения 7, то есть
осуществляет проверку индексов массива на вхождение их в границы
массива. Полем класса matrix будет массив 10 на 10. Конструктор должен
позволять программисту определить реальный размер массива (допустим,
сделать его меньше, чем 10 на 10). Методам, предназначенным для досту-
па к членам матрицы, теперь нужны два индекса: по одному для каждой
размерности массива. Вот фрагмент функции main(), которая работает с
таким классом:
matrix m1(3, 4); // описываем матрицу
int temp = 12345; // описываем целое
ml.putel(7, 4, temp); // помещаем значение temp в матрицу
temp = m1.getel(7, 4); // получаем значение из матрицы
11. Вернемся к обсуждению денежных строк из упражнения 6. Напишите ме-
тод ldtoms() для преобразования числа типа long double  в денежную строку,
представляющую это число. Для начала вам нужно проверить, что значе-
ние long double  не очень большое. Мы предполагаем, что вы не будете пы-
таться преобразовать число, больше чем 9 999 999 999 999 990.00. Затем
преобразуем long double  в строку (без знака доллара и запятых), храня-
щуюся в памяти, используя объект ostrstream, как рассматривалось ранее
в этой главе. Получившаяся отформатированная строка может быть поме-
щена в буфер, называющийся ustring.
Затем вам нужно будет создать другую строку, начинающуюся со знака
доллара, далее копируем цифру за цифрой из строки ustring, начиная сле-
ва и вставляя запятые через каждые три цифры. Также вам нужно подав-
лять нули в начале строки. Например, вы должны вывести $3 124.95, а не
$0 000 000 000 003 124.95. Не забудьте закончить строку нулевым симво-
лом '\0'.
Напишите функцию main() для тестирования этой функции путем много-
кратного ввода пользователем чисел типа long double  и вывода результата
в виде денежной строки.
12. Создайте класс bMoney. Он должен хранить денежные значения как long
double. Используйте метод mstold() для преобразования денежной строки,
введенной пользователем, в long double, и метод ldtoms() для преобразова-
ния числа типа long double  в денежную строку для вывода (см. упражне-
ния 6 и 10). Вы можете вызывать для ввода и вывода методы getmoney()

и putmoney(). Напишите другой метод класса для сложения двух объектов
типа bMoney и назовите его madd(). Сложение этих объектов легко произ-
вести: просто сложите переменную типа long double  одного объекта с та-
кой же переменной другого объекта. Напишите функцию main(), которая
просит пользователя несколько раз ввести денежную строку, а затем вы-
водит сумму значений этих строк. Вот как может выглядеть определение
класса:
class bMoney
{
private:
long double  money;
public:
bMoney();
bMoney(char s[]);
void madd(bMoney m1, bMoney m2);
void getmoney();
void putmoney();
};




1)




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

int main()
{
void reversit(char []);
const int MAX = 80;
char str [MAX];
cout << "\nEnter string: ";
cin.get(str, MAX);
reversit(str);
cout << "inverted string: " << str << endl;
system ("pause");
return 0;
}
void reversit (char s [])
{
int len = strlen(s);
for (int j = 0; j < len/2; j++)
{
char temp = s[j];
s [j] = s[len-j-1];
s [len-j-1] =temp;
}
}



2)



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

class Employee
{
private:
string name;
long number;
public:
void getdata()
{
cout << "\nEnter name: "; cin.ignore(); getline (cin, name);
cout << "\nEnter number: "; cin >> number;
}
void putdata()const
{
cout << "\nname: " << name << ", number: " << number;
}
};

int main()
{
Employee empl [100];
char ans;
int n=0;
do
{
cout << "Enter employee ";
empl [n++].getdata();
cout << "continue typing? (y/n): "; cin >> ans;
}
while ( ans != 'n' );

for (int j = 0; j<n; j++)
{
cout << "\nEmployee " << j+1 << " : ";
empl [j].putdata();
}
cout << endl;

system ("pause");
return 0;
}





3)





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

class Distance
{
private:
int feet;
double inches;
public:
void getdist()
{
cout << "\nEnter feet: "; cin >> feet;
cout << "\nEnter inches: "; cin >> inches;
inches +=  (feet*12);
feet = 0;
}
void avedist(double sm)
{
int mean = sm/10.0;
feet =  mean/12;
inches = mean % (12);
}

void showdist()const
{
cout << "the average value of 100 = " << feet << "\'-" << inches;
}

double add_dist()
{
return inches;
}
};

int main()
{
Distance dist [10], averdist;
int n=0;
double sum = 0;
int mean;
do
{
cout << "Enter distance ";
dist [n++].getdist();
}
while ( n != 10 );

for (int j = 0; j<10; j++)
{
sum += dist[j].add_dist();
}
averdist.avedist(sum);
averdist.showdist();
cout << endl;

system ("pause");
return 0;
}


4)




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

int main()
{
int maxint(int [], int);
int numbers [100];
int n=0;
char ans;
do
{
cout << "\nEnter number: "; cin >> numbers[n++];
cout << "\nContinue typing? "; cin >> ans;
}
while (ans != 'n');
cout << "\ngreatest value: " << numbers[maxint(numbers, n)] << ", index into the array: " << maxint(numbers, n) << endl;

system ("pause");
return 0;
}
int maxint(int num [], int n)
{
int max=0, index=0;

for (int j=0; j<n; ++j)
{
if (num[j]>max)
{
max = num[j];
index = j;
}
}
return index;
}



5)




#include "stdafx.h"
#include <iostream>
#include <cmath>
using namespace std;
class Fraction
{
private:
int numerator, denominator;
public:
Fraction():numerator(0), denominator(0)
{}
void get_fr() //метод получания дроби
{
char ch;
cout << "enter fraction" << endl;
cin >> numerator >> ch >> denominator;
}
void add_fr(Fraction f1, Fraction f2) //метод сложения двух дробей
{
numerator = f1.numerator * f2.denominator + f1.denominator * f2.numerator;
denominator = f1.denominator * f2.denominator;
}
void mul_fr (Fraction f1, int n) //метод деления суммы дробей на количество их самих (умножение знаменателя на это число)
{
denominator = f1.denominator * n;
}

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 << "\nthe average is " << numerator << "/" << denominator << endl; }
};
int main()
{
Fraction fraction [100];
Fraction frtemp, frsum;
char ans;
int n=0;
do //ввод дробей в массив
{
fraction[n++].get_fr();
cout << "continue typing? (y/n)" << endl; cin >> ans;
}
while (ans != 'n');
for (int j = 0; j<n; j++) //сложение дробей
{
frtemp.add_fr(fraction[j], fraction[j++]);
j++;
frsum.add_fr(frtemp, frsum);
}
frsum.mul_fr(frsum, n+1); //деление на их кол-во

frsum.disp_fr(); //вывод на экран
system("pause");
return 0;
}





7)






#include "stdafx.h"
#include<iostream>
#include <string>
#include <stdlib.h>
#include <iomanip>
using namespace std;
class Money
{
private:
    string strMon;
    long double summ;
public:
    long double 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 number;

        for (int j = 0; j < wlen; j++)
if (strMon[j] != ',' && strMon[j] != '$')
                number.push_back(strMon[j]); ;
        summ = stold(number);  
        return summ;
    }
    void display()const
    {
        cout << setiosflags (ios::fixed)
<< setiosflags (ios::showpoint)
<<setprecision(2)
<< "\n" << summ << endl;
    }
};

int main()
{
    Money money;
    money.mstold();
    money.display();
    system ("pause");
    return 0;
}



8)






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

const int LIMIT = 100;

class Safearay
{
private:
int array[LIMIT];
public:
void putel(int n, int temp)
{
if (n<0 || n>LIMIT-1)
{
cout << "Warning! overflow array!" << endl;;
system ("pause");
exit(1);
}
array[n] = temp;
}
int getel(int n)
{
if (n<0||n>LIMIT-1)
{
cout << "Warning! overflow array!" << endl;;
system ("pause");
exit(1);
}
return array[n];
}
};
int main()
{
Safearay sal;
int temp = 12345;
sal.putel (7, temp);
temp = sal.getel (7);
cout << temp << endl;
system ("pause");
    return 0;
}




9)






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

class Queue
{
private:
    enum { MAX = 10 }; // немного нестандартный синтаксис
    int st[MAX];       // стек в виде массива
    int head;
    int tail;           // вершина стека
public:

    Queue()            // конструктор
    {

       head = tail = 0;
    }
    void put(int var) // поместить в стек
    {
        st[tail++] = var;
        if(head > 0) head--;

    }
    int get()          // взять из стека
    {
        if(tail > 0)tail--;
        return st[head++];

    }
};

int main()
{
    Queue s1;

    s1.put(11);
    s1.put(22);
    cout << "1: " << s1.get() << endl;
    cout << "2: " << s1.get() << endl;

    s1.put(33);
    s1.put(44);
    s1.put(55);
    s1.put(66);
    cout << "3: " << s1.get() << endl;
    cout << "4: " << s1.get() << endl;
    cout << "5: " << s1.get() << endl;
    cout << "6: " << s1.get() << endl;
    cin.get();
    return 0;
}



10)





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

const int LIMIT = 10;

class Matrix
{
private:
int array [10] [10];

public:
int rows, colums;
Matrix(int r, int k) :  rows(r), colums(k)
{}

void putel(int r, int k, int temp)
{
if (r<0 || r>LIMIT-1 || k<0 || k>LIMIT-1)
{
cout << "Warning! overflow array!" << endl;;
system ("pause");
exit(1);
}
array[r][k] = temp;
}
int getel(int r, int k)
{
if (r<0 || r>LIMIT-1 || k<0 || k>LIMIT-1)
{
cout << "Warning! overflow array!" << endl;;
system ("pause");
exit(1);
}
return array[r][k];
}
};
int main()
{
Matrix m1 (3,4);
int temp = 12345;
m1.putel (7, 4, temp);
temp = m1.getel (7, 4);
cout << temp << endl;
system ("pause");
    return 0;
}





11)---------------






#include "stdafx.h"
#include<iostream>
#include <string>
#include <sstream>
#include <iomanip>
using namespace std;
class Money
{
private:
    string strMon;
string strMon1;
    long double summ;
public:
void ldtoms()
{
stringstream conv;
conv << summ;
conv >> strMon;
}
    void getmoney()
    {
cout << "Enter the amount" << endl;
cin >> summ;
if (summ > 9999999999999990.00)
{
cout << "\nError. Try Again";
system ("pause");
exit(1);
}
    }
void strings ()
{
string doll ("$");
strMon1 = strMon;
strMon1 = doll+strMon1;
int x = strMon1.find ('.');
strMon1.erase (x, 1);
reverse(strMon1.begin(), strMon1.end());
strMon1.insert (5, " ");
strMon1.insert (8, " ");
strMon1.insert (11, " ");
strMon1.insert (14, " ");
strMon1.insert (17, " ");
strMon1.insert (2, ".");
reverse(strMon1.begin(), strMon1.end());
}
    void display()const
    {
cout << "\n" << strMon1 << endl;
    }
};

int main()
{
    Money money;
money.getmoney();
money.ldtoms();
money.strings();
    money.display();
    system ("pause");
    return 0;
}




#include "stdafx.h"
#include <string>
#include <sstream>
#include <iomanip>
#include <iostream>
#include <algorithm>
using namespace std;


class Money
{
protected:
    long double value; //значение с десятичной точкой
    long long   ipart; //значение без десятичной точки, первая часть выражения до точки
    long double fpart; //значение с десятичной точкой, вторая часть выражения, после точки
    string result; //строка
public:
    Money() //конструктор
{
        value = 0;
        ipart = 0;
        fpart = 0;
    }
    bool getmoney() //получение значения
    {
        bool bFlag = false;
        cout << "Enter the amount without decimal point" << endl;
        if ( !(cin >> value) || cin.get() != '\n' )
            cout<<"Input error"<<endl;
        else
        if( bFlag = true )
        {
            ipart = long long(value);
            fpart = value - ipart;
        }
        cin.clear(); //очистка буфера
        cin.sync(); //сброс флага ошибки
        return bFlag;
    }
    string ldtoms()
    {
        int i, j;
        string ibuffer; //строка
        string fbuffer; //строка
        stringstream is; //строковая операция ввода
        stringstream fs;
        result = "error";
        if( is<<fixed<<ipart )
        if( is>>ibuffer )
        if( fs<<fixed<<fpart )
        if( fs>>fbuffer )
        {
            result = "";
            reverse(ibuffer.begin(), ibuffer.end()); //переворот строки
            for( i = 0; i < ibuffer.size(); i += 3 )
            {
                for( j = 0; j < 3 && i + j < ibuffer.size(); j++ )
                    result += ibuffer[i + j];
                result += " ";
            }
            reverse(result.begin(), result.end());
            result  = "$" + result + ".";
            fbuffer.erase(0, 1);
            fbuffer.erase(0, 1);
            result += fbuffer;

        }
        return result;
    }
};

int main()
{
    Money money;
    while( true )
    {
        money.getmoney();
        cout<<"ldoms : "<<money.ldtoms()<<endl;
        system ("pause");
    }
    return 0;
}





12)







#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)
{}
    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 madd (bMoney mon1, bMoney mon2)
{
number = mon1.number + mon2.number;
}
    void display()const
    {
        cout << setiosflags (ios::fixed)
<< setiosflags (ios::showpoint)
<<setprecision(2)
<< "\n" << number << '$' << endl;
    }
};

int main()
{
    bMoney money1, money2, moneysum;
char ans;
do
{
money1.mstold();
money2.mstold();
moneysum.madd(money1, money2);
moneysum.display();
cout << "\nrepeat?" << endl;
cin.get();
}
while (cin.get() !='n');
    system ("pause");
    return 0;
}

Комментарии

  1. Этот комментарий был удален автором.

    ОтветитьУдалить
  2. Решение 7.11. не сильный говнокод получился? Нужен взгляд со стороны.
    #include "iostream"
    #include "string"
    #include "cstdlib" // специально в кавычки поставил, блог не пропускает почему то.

    using namespace std;

    class Money
    {
    public:
    void ldtoms(long double m)
    {
    string old_string = to_string(m);
    string new_string = "$";
    for (int index = 0; index < 4; index++) // cтираем последние 4 нуля.
    old_string.erase(old_string.length() - 1, 1); // в строке оставляем только сотые.
    int tail = old_string.find('.');
    switch (tail % 3)
    {
    case 0:
    for (int index = 0, n = 3; index < tail; index++) // если остаток 0, то с третей позиции.
    if (index == n)
    {
    n += 3;
    new_string.append(1, ' ');
    new_string.append(1, old_string.at(index));
    }
    else
    new_string.append(1, old_string.at(index));
    break;
    case 1:
    for (int index = 0, n = 1; index < tail; index++) // если остаток 1, то с первой позиции.
    if (index == n)
    {
    n += 3;
    new_string.append(1, ' ');
    new_string.append(1, old_string.at(index));
    }
    else
    new_string.append(1, old_string.at(index));
    break;
    case 2:
    for (int index = 0, n = 2; index < tail; index++) // если остаток 2, то со второй позиции.
    if (index == n)
    {
    n += 3;
    new_string.append(1, ' ');
    new_string.append(1, old_string.at(index));
    }
    else
    new_string.append(1, old_string.at(index));
    break;
    }
    old_string.erase(0, tail); // стираем все, что мы перекопировали.
    new_string += old_string; // добавляем в конец дробную часть.
    tail = new_string.length();
    new_string[tail] = '\0';
    cout << new_string << endl;
    }
    };

    int main ()
    {
    Money new_money;
    long double m;
    cout << "Введите число: ";
    cin >> m;
    if(m > 9999999999999990.00)
    {
    cout << "Вы ввели недопустимое значение.\n";
    exit(1);
    }
    new_money.ldtoms(m);

    return 0;
    }

    ОтветитьУдалить
  3. 11 задание. Лютый говнокод, но работает лучше кода из ответа. Тут хотя long произвольной длины можно писать.

    #include
    #include
    #include
    #include
    #include

    using namespace std;

    class Money
    {
    private:
    string string_money;
    string string_money_res;
    long double number_money = 0;
    void convert_to_format()
    {
    string_money_res = ""; //делаю строку с результатом пустой
    //Запоминаю часть числа с точкой
    string money_after_dot = ".";
    money_after_dot.push_back(string_money[string_money.length()-2]);
    money_after_dot.push_back(string_money[string_money.length()-1]);
    //
    int index = string_money.find('.', 1); // нахожу индекс точки
    string_money.erase(index); // удаляю точку и все после нее
    reverse(string_money.begin(), string_money.end());
    for(int i =0; i < string_money.length(); ++i)
    {
    if (i % 3 == 0 && i != 0)
    {
    string_money_res.push_back(' ');
    }
    string_money_res.push_back(string_money[i]);
    }
    string_money_res.push_back('$');
    reverse(string_money_res.begin(), string_money_res.end());
    string_money_res+=money_after_dot;
    }
    public:
    void ldtoms()
    {
    stringstream conv;
    conv << setiosflags (ios::fixed) << setiosflags (ios::showpoint) <> string_money;
    convert_to_format();
    }
    void getmoney()
    {
    cout << "Enter the amount of money" << endl;
    cin >> number_money;
    if (number_money > 9999999999999990.00 || number_money < 0)
    {
    cout << "\nError!";
    exit(1);
    }
    }
    void display()const
    {
    cout << "\n" << string_money_res << endl;
    }
    };

    int main()
    {
    Money money;
    int n = 10;
    do
    {
    money.getmoney();
    money.ldtoms();
    money.display();
    n--;
    }
    while(n<10);
    }

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

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

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

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

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

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

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