Форум программистов, компьютерный форум CyberForum.ru

Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 621, средняя оценка - 4.99
Kimel
15 / 15 / 0
Регистрация: 01.02.2012
Сообщений: 182
01.02.2012, 17:47     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #1
Хотя я и начинающий с++-шник. Хочу помочь другим людям. Здесь я буду выкладывать всё что мне удалось решить. В моих решениях будет много хедеров, делал я это в Dev C++. Ос Win 7 64 bit.

Начнём со второй главы:
Упражнение 1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream> 
 
using namespace std;
 
int main()
{
   setlocale(0,"Rus");
   float gallons, cufeet;
 
   cout << "Введите количество галоннов: \n";
   cin >> gallons;
   cufeet = gallons / 7.481;
   cout << "Еквивалент в футах = " << cufeet << endl;
    
   return 0;
}

Упражнение 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream> 
#include <iomanip>
 
using namespace std;
 
int main()
{
   setlocale(0,"Rus");
   
    cout << 1990 << setw(8) << 135 << endl
           << 1991 << setw(8) << 7290 << endl 
           << 1992 << setw(8) << 11300 << endl
           << 1993 << setw(8) << 16200 << endl;
  
   return 0;
}

Упражнение 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    int var = 10;
 
    cout << var << endl;      
    var *= 2;                 
    cout << var-- << endl;    
    cout << var << endl;      
    return 0;
}

Упражнение 4
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    cout<<"\nУ лукоморья дуб срубили\nКота на мясо порубили \nА по неведанным дорожкам\nШагали черти в босоножках\n"; 
    return 0;
}

Упражнение 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream> 
#include <ctype.h>
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    char ch;
    cin >> ch;
    cout << islower(ch);  // При вводе строчной буквы будет 2 при прописной 0. Но есть нюанс, поддерживаються только англ буквы 
    return 0;
}


Упражнение 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
 
    float a,b,c,d,f;
    cout << "Введите кол-во доларов"<<endl;
    cin >> f;
    b=f/1.487;
    c=f/0.172;
    a=f/0.584;
    d=f/0.00955;
    cout << f <<"доларов = "<< b<<" фунтов стерлинга"<<endl;
    cout << f <<"доларов = "<< c<<" франков"<<endl;
    cout << f <<"доларов = "<< a<<" немецких марок"<<endl;
    cout << f <<"доларов = "<< d<<" японских йен"<<endl;
    return 0;
}

Упражнение 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream> 
#include <iomanip>
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    double f,c;
    cout << "Введите количество градусов по Цельсию"<<endl;
    cin >> c;
    f=c*1.8+32;
    cout <<setprecision(3)<< f << " градусов по Фаренгейту "<< endl; // Регуляция кол-во символов после запятой
    return 0;
}

Упражнение 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream> 
#include <iomanip>
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    long pop1=2425785, pop2=47, pop3=9761;       
 
    cout << setfill('.') <<setw(8) << "LOCATION" << setw(12) // Обратите внимание на одинарные кавычки
           << "POPULATION" << endl
           <<setw(8) << "Portcity" << setw(12) << pop1 << endl
           << setw(8) << "Hightown" << setw(12) << pop2 << endl
           << setw(8) << "Lowville" << setw(12) << pop3 << endl;
    return 0;
}

Упражнение 9

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    char dummychar;
    double a,b,c,d,e,f;
    cout << "Введите а и b"<< endl;
    cin >>a>>dummychar>>b;
    cout << "Введите c и d"<<endl;
    cin >>c>>dummychar>>d;
    cout <<(b*c)+(d*a)<<dummychar<<(b*d)<<endl;
 
    return 0;
}

Упражнение 10 (Намучился с этой задачей)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    float a,b,c,f;
    cout << "Введите количество фунтов"<<endl;
    cin >> a;
    cout << "Введите количество шиллингов"<<endl;
    cin >> b;
    cout << "Введите количество пенсов"<<endl;
    cin >> c;
    f = a+(b+c/12)/20;
    cout << "Количество фунтов = " << f << endl;
    return 0;
}

Упражнение 11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream> 
#include <iomanip>
 
using namespace std;
 
int main() 
{
     setlocale(0,"Rus");
     cout << setiosflags(ios::left) <<setw(15) << "Фамилия"<< setw(15)<< "Имя"<<setw(15) << "Адресс"<<setw(15)<< "Город"<<endl
            <<setw(15)<< "Иванов"<<setw(15)<<"Петя"<<setw(15)<<"Кленовая 16"<<setw(10)<<"Москва"<<endl
            <<setw(15)<< "Иванов"<<setw(15)<<"Петя"<<setw(15)<<"Кленовая 16"<<setw(10)<<"Москва"<<endl
            <<setw(15)<< "Иванов"<<setw(15)<<"Петя"<<setw(15)<<"Кленовая 16"<<setw(10)<<"Москва"<<endl;
    return 0;
}

Упражнение 12 (это самая геморная программа на разработку которой ушло больше дня)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream> 
 
using namespace std;
 
int main() 
{
setlocale(0,"Rus");
float a,b,z;
int c,k;
cout << "Введите кол-во футов " << endl;
cin >> a;
c = static_cast<int>(a);
b = a - c;
b *= 20;
k = static_cast<int>(b);
z = b - k;
z = z*12;
z = static_cast<int>(z);
k = static_cast<int>(k);
cout << c <<"."<< k <<"."<< z << endl;
return 0;
}
Это конец второй главы, третюю сделаю позже если будет нужна
 Комментарий модератора 
Пост обновлен по просьбе ТС
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2012, 17:47     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Посмотрите здесь:

Объектно-ориентированное программирование C++
C++ Объектно-ориентированное программирование
C++ Объектно ориентированное программирование
Ищу ответы на задания из книги Лафоре Р. "Объектно-ориентированное программирование в С++" 4 издание. C++
C++ Объектно-ориентированное программирование C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kins
 Аватар для Kins
59 / 58 / 6
Регистрация: 03.02.2013
Сообщений: 167
19.03.2013, 21:55     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #41
Цитата Сообщение от IvanInanovich Посмотреть сообщение
Но суть задания так и осталась для меня загадкой
сделать аналог таблицы умножения для дробей ((чсл1/знм1)*(чсл2/знм2)=чсл3(равен произведению чсл1*чсл2)/знм3(равен произведению знм1*знм2)- тоесть 1/6 х 1/6 = 1/36, 1/6 х 2/6 = 2/36... Итак получается квадратная матрица размером (знм*знм) +первой строкамой и первым элементом в каждом столбце идут сами дроби, котрые перемножаются между собой(поумолчанию 1/6, 2/6, 3/6, 4/6, 5/6)

Добавлено через 11 минут
...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Рики
6 / 6 / 1
Регистрация: 27.02.2013
Сообщений: 23
19.03.2013, 22:39     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #42
Цитата Сообщение от Kins Посмотреть сообщение
Можно же присвоить static символьной переменной.
Не додумался)

Цитата Сообщение от IvanInanovich Посмотреть сообщение
Может вы сможете объяснить ?
Может так будет проще
табличка для 6-рки.
Кликните здесь для просмотра всего текста

---1 2 3 4 5
-----------------
1 1 2 3 4 5
2 2 4 6 8 10
3 3 6 9 12 15
4 4 8 12 16 20
5 5 10 15 20 25

А в нашем случае
Кликните здесь для просмотра всего текста

------1/6 2/6 3/6 4/6 5/6
-----------------
1/6 1/36..........
2/6 ..................
3/6 ..................
4/6 ....................
5/6 ..........................25/36

Когда в таком представлении записал, то более понятно стало. Первый раз когда читал,
не мог понять откуда взялись числа 61, 361, 181 и тд)

Добавлено через 22 минуты
Kins, у тебя какой компилятор? Я пользуюсь wxDev-C++. Возникли проблемы, когда понадобилось вводить с клавиатуры русские буквы. Проблема эта решается, но решил делать все на английском, чем постоянно вставлять в код костыли.
Kins
 Аватар для Kins
59 / 58 / 6
Регистрация: 03.02.2013
Сообщений: 167
19.03.2013, 22:55     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #43
Цитата Сообщение от Рики Посмотреть сообщение
Kins, у тебя какой компилятор?
VS12

Добавлено через 43 секунды
Цитата Сообщение от Рики Посмотреть сообщение
но решил делать все на английском, чем постоянно вставлять в код костыли.
аналогично местами)

Добавлено через 13 минут
Рикки, задания 7й главы не решал еще? Я только начал если что=)
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
20.03.2013, 02:51     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #44
Kins,
Рики,
Благодарю ребят. В книге пропущены пробелы + как я понял дробь с опечаткам записана.
Я даже толком не понимал с какой стороны подойти.
Только вот не могу еще один момент понять, откуда после 1/36 берется 1/18,1/12,1/9,1/36 (если брать первый столбик умножения), а где-то вообще 1/3... Целый день убил ради 3х задач.)) Последняя меня просто убила : ))) Хочется самому понять и написать код, а не копировать с форума. До этого момента часто сравнивал свои варианты с вашими. Топ для меня полезен : ))
Миниатюры
Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"  
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
20.03.2013, 02:59     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #45
Еще добавлю что не понятно как должны считаться не только знаменатели но и числители. по идее первый столбик ("умножения") должен выглядеть следующим образом:
1/36 ...
2/18 ...
3/12 ...
4/9 ...
5/36 ...
Рики
6 / 6 / 1
Регистрация: 27.02.2013
Сообщений: 23
20.03.2013, 03:19     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #46
Цитата Сообщение от IvanInanovich Посмотреть сообщение
а где-то вообще 1/3.
сокращения. 4/6*3/6=12/36=1/3 ; 4/6*1/6=4/36=1/9. За деревьями леса не видно)

Kins, добрался до 7.6)
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
20.03.2013, 15:44     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #47
Рики, Спасибо ! : ))
Kins
 Аватар для Kins
59 / 58 / 6
Регистрация: 03.02.2013
Сообщений: 167
25.03.2013, 20:04     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #48
Глава 7 Упражнение №4
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using namespace std;
 
static int n=0;
 
int maxint(int mas[])
{
    int max=0;//переменная для максимального значения массива
    static int ind=0;//перемення для значения индекса массива, содержащего макс элемент
    for(int j=0; j<n; j++)
    {if(mas[j]>max){max=mas[j];ind=j;}}
    return ind;
}       
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    int chsl[100];  
    char ch;
    do{
        cout <<"Введите элемент массива: ";
        cin >>chsl[n++];
        cout <<"Еще (y/n)?";
        cin >>ch;
    }while(ch!='n');
    int d=maxint(chsl);
    cout <<"Максимальный элемент: " <<chsl[d] <<" его индекс:" <<d <<endl;
    system("pause");


Добавлено через 35 секунд
Глава 7 Упражнение №5
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using namespace std;
static char ch;
////////////////////////////////////////////////////////////////
class fraction
{
private:
    int chsl, znam;
public:
    fraction(){chsl=0, znam=0;}     
    void getin()
    {cout <<"Введите числитель и знаменатель дроби: "; cin >>chsl >>ch >>znam;}
    void smm(fraction mass, fraction mas)
    {
        chsl=mass.chsl*mas.znam+mass.znam*mas.chsl;
        znam=mass.znam*mas.znam;
    }
    void dev(fraction smm, int sch)
    {
        fraction devi;
        devi.chsl=sch;
        devi.znam=1;
        chsl=smm.chsl*devi.znam;
        znam=smm.znam*devi.chsl;
    }
    void show()
        {cout <<"Среднее значение дроби: " <<chsl <<ch <<znam <<endl;}
};
///////////////////////////////////////////////////////////////
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    const int max=100;
    int n=0;
    char piu='a';
    fraction fr[max], summ;;
    do{
        fr[n++].getin();
        cout <<"Еще раз (д/н)?";
        cin >>piu;
    }while(piu!='n');
    for(int j=0; j<n; j++)
    {if(j>0)summ.smm(fr[j], fr[j-1]);}
    summ.dev(summ, n);
    summ.show();
    system("pause");


Добавлено через 42 секунды
Глава 7 Упражнение №6
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using namespace std;
 
//////////////////////////////////////////////////////////////////
enum Suit {clubs, diamonds, hearts, spades};
const int jack=11;//именованные достоинства карт
const int quin=12;
const int king=13;
const int ace=14;
////////////////////////////////////////////////
class card
{
private:
    int number;//достоинство карт
    Suit suit;//масть
public:
    card()//конструктор
    {}
    void set(int n, Suit s)//установка значения
    {suit=s; number=n;}
    void display();//показ карты
};
/////////////////////////////////////////////////////////////////
void card::display()
{
    if(number>=2 && number<=10)
        cout <<number;
    else
    {
        switch(number)
        {
        case jack: cout <<'J'; break;
        case quin: cout <<'Q'; break;
        case king: cout <<'K'; break;
        case ace: cout <<'A'; break;
        }
    }
    switch(suit)
    {
    case clubs: cout <<static_cast<char>(5); break;
    case diamonds: cout <<static_cast<char>(4); break;
    case hearts: cout <<static_cast<char>(3); break;
    case spades: cout <<static_cast<char>(6); break;
    }   
}
/////////////////////////////////////////////////////////////////
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "");
    card deck[52];
    int n=0;
    card pl1[13], pl2[13], pl3[13], pl4[13];
    int j;
 
    cout <<endl;
    for(j=0; j<52; j++)//сщздаем упорядоченную колоду карт
    {
        int num=(j%13)+2;
        Suit su=Suit(j/13);
        deck[j].set(num, su);
    }
 
    srand(time(NULL));//инициализируем генератор случайных чисел
    for(j=0; j<52; j++)
    {
        int k=rand()%52;//выбираем случайную карту
        card temp=deck[j];//и меняем ее с текущей
        deck[j]=deck[k];
        deck[k]=temp;
    }
    //показываем смешанную колоду
    for(j=0; j<52; j++)
    {
        int m=j%13;
        if(m==0)cout <<"\nКарты игрока № " <<++n <<endl;
        if(j<13) {pl1[m]=deck[j]; pl1[m].display(); cout <<" ";}
        else if(j>12 && j<26) {pl2[m]=deck[j]; pl2[m].display(); cout <<" ";}
        else if(j>25 && j<39) {pl3[m]=deck[j]; pl3[m].display(); cout <<" ";}
        else {pl3[m]=deck[j]; pl3[m].display();cout <<" ";}
        if(!((j+1)%13))cout <<endl; 
    }   
    system("pause >>void");


Добавлено через 42 секунды
Глава 7 Упражнение №7
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using namespace std;
 
////////////////////////////////////////////////////////////////
class money
{
private:
    long double cash;
    char in[80];
    char out[80];
public:
    money(){cash=0.0;}
    money(long double d):cash(d){}
    void input()
    {cout <<"Введите сумму: "; cin >>in;}
    void outg()
    {cout <<setiosflags(ios::fixed) <<setprecision(2) <<mstold(in) <<endl;}
    long double mstold(char mass[])
    {
        int n=0;
        for(int j=0; j<strlen(mass); j++)
        {
            if((mass[j]=='$')||(mass[j]==','))
                continue;
            out[n++]=mass[j];
        }
        //long double cash;
        //_atoldbl((_LDOUBLE*)(&cash),out);//не работает
        double cash=atof(out);//возвращение дабл хоть както
        return cash;        
    }
};
////////////////////////////////////////////////////////////////
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    int n=0;
    char ch;
    money m[100];
    do{
        m[n++].input();
        cout <<"Еще раз (д/н)?";
        cin >>ch;
    }while(ch!='n');
    for(int j=0; j<n; j++)
        m[j].outg();    
    system("pause");


Добавлено через 39 секунд
Глава 7 Упражнение №8
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using namespace std;
const int MAX=10;
////////////////////////////////////////////////////////////////
class safearray
{
private:
    int LIMIT[MAX];
public:
    safearray(){}
    void putel(int indx, int n)//индекс и значение, и вставлет это значение в массив по данному индексу
    {
        if((indx<0)||(indx>MAX))
        {cout <<"Введен некорректный индекс массива!"; getchar(); exit(1);}
        LIMIT[indx]=n;
    }
    int getel(int indx)//индекс, и возвращет значение элемента по данному индексу
    {
        if((indx<0)||(indx>MAX))
        {cout <<"Введен некорректный индекс массива!"; getchar(); exit(1);}
        return LIMIT[indx];
    }
};
////////////////////////////////////////////////////////////////
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    safearray sa1;
    int temp=12345;
    sa1.putel(7,temp);
    temp=sa1.getel(7);
    cout <<"Значение элемента массива: " <<temp <<endl;
    system("pause");


Добавлено через 21 час 29 минут
Глава 7 Упражнение №9
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
////////////////////////////////////////////////////////////////
class queue
{
    static const int MAX=4;
    int st[MAX];
    int head, tail;
public:
    queue(){head=MAX,tail=-1;}
    void put(int var)
    {
        st[++tail]=var;
        if(tail==MAX-1)
            tail=-1;
    }
    int get()
    {
        if(head==0)
            head=MAX;
        return st[MAX-head--];
    }
};
///////////////////////////////////////////////////////////////
 
int _tmain(int argc, _TCHAR* argv[])
{
    queue q1;
    q1.put(1);
    q1.put(2);
    q1.put(3);
    q1.put(4);
    q1.put(5);
    q1.put(6);
    cout <<q1.get() <<endl;
    cout <<q1.get() <<endl;
    cout <<q1.get() <<endl;
    cout <<q1.get() <<endl;
    system("pause");


Добавлено через 4 часа 8 минут
Глава 7 Упражнение №10
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class matrix
{
private:
    int str, stlb;
    int mass[10][10];
public:
    matrix(int r, int b) : str(r), stlb(b){}
    void putel(int i1, int i2, int n)
    {
        if(((i1<0)||(i1>str))||((i2<0)||(i2>stlb)))
        {cout <<"Введен некорректный индекс массива!"; getchar(); exit(1);}
        mass[i1][i2]=n;
    }
    int getel(int i1, int i2)
    {
        if(((i1<0)||(i1>str))||((i2<0)||(i2>stlb)))
        {cout <<"Введен некорректный индекс массива!"; getchar(); exit(1);}
        return mass[i1][i2];
    }
};
//////////////////////////////////////////////////////////////////////
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    matrix m1 (3, 4);
    int temp=12345;
    m1.putel(7, 4, temp);
    temp=m1.getel(7, 4);
    cout <<"Значение равно: " <<temp <<endl;
    system("pause");
Kins
 Аватар для Kins
59 / 58 / 6
Регистрация: 03.02.2013
Сообщений: 167
27.03.2013, 13:47     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #49
Глава 7 Упражнение №11
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/////////////////////////////////////////////////////////////////
class money
{
    static const int MAX=30;
    long double cash;
    char ustring[MAX];
    char out[MAX];
public:
    money(){cash=0.0; out[0]='$';}//конструктор, который добавляет в массив out символ '$' нулевым индексом
    void ldtoms()
    {
        setlocale(LC_ALL,"");
        cout <<"Введите число: "; cin >>cash;
        _gcvt_s(ustring, MAX, cash, 16);//КРИВОЕ! преобразование в массив: заместо десятичной точки выводит запятую
        cout <<"Массив ustring[]: " <<ustring <<endl;
        int i=strlen(ustring);
        int z=0, t=0;
        //(j-z)-разница длины out с поправкой на количество добавленных запятых
        for(int j=MAX; (j-z)>0; j--)//цикл заполнения массива out[] начиная с последнего индекса с поправкой на z-количество добавленных запятых
        { 
            if(i>=0) out[j-z]=ustring[i--];//копированеи элементов массива 
            else //если закончилось копирование символов в out[] из ustring[]
            {
                for(int jj=0; jj<=(strlen(ustring)+z); jj++)//цикл перемещения символов в массиве к началу
                {
                    int temp;
                    temp=out[j-z+jj];
                    out[j-z+jj]=out[j-z+jj+1];
                    out[j-z+jj+1]=temp;
                }
                continue;
            }
            if(i==(strlen(ustring)-7))//условие для постановки первой запятой при условии что число будет с двумя элементами после десятичной точки
            {
                ++z;//счетчик количества добавленных запятых в качестве элементов массива
                out[j-z]=',';//ставим первую запятую
            }
            if(i<(strlen(ustring)-7))//условие постановки остальных запятых
            {
                ++t;//счетчик символов после каждой добавленной запятой
                if(t==3)//если были скопированы три символа, то
                {
                    ++z;//счетчик очередной запятой +1
                    out[j-z]=',';//ставим запятую
                    t=0;//обнуляем счетчик подсчета символов между запятыми
                }
            }           
        }
        out[strlen(ustring)+1+z]='\0';//постановка после цикла перемещения символов символа окончания строки(z-количество добавленных запятых, +1-учет символа '$')
        cout <<"Массив out[]: " <<out <<endl;
    }
}; 
/////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    money m;
    m.ldtoms();
    system("pause");
    return 0;
}
Sabbat
 Аватар для Sabbat
135 / 23 / 1
Регистрация: 19.10.2012
Сообщений: 43
27.03.2013, 22:29     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #50
Рики а если я ввожу пенсов больше чем 12 (шиллингов больше чем 20) в несколько раз
C++
1
2
3
4
5
6
7
s3.pens= s1.pens + s2.pens;
    s3.shillings = 0;
    if (s3.pens >= 12)
       {
       s3.pens -= 12;
       s3.shillings++;     
       }
мой вариант:
Глава 5 упражнение 11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
using namespace std;
char d=':';
struct sterling
{
    int pounds;
    int shillings;
    int pence;
};
sterling insum();
sterling sumsum(sterling, sterling);
void outsum(sterling);
int main ()
{
    sterling sum1, sum2, sum12;
    cout<<"In 1 sum (p:s:p): ";    sum1 = insum();
    cout<<"In 2 sum (p:s:p): ";    sum2 = insum();
    sum12=sumsum(sum1, sum2);
    outsum(sum12);
    system("pause");
    return 0;
}
sterling insum()
{ 
   sterling insuma;
   cin>>insuma.pounds>>d>>insuma.shillings>>d>>insuma.pence;
   return insuma;      
}
sterling sumsum(sterling suma1, sterling suma2)
{
  sterling suma12;      
  suma12.pence=suma1.pence+suma2.pence;      
  if (suma12.pence>=12) 
  {
     suma12.shillings=(suma12.pence-suma12.pence%12)/12;                  
     suma12.pence=suma12.pence%12;
  } 
  suma12.shillings+=suma1.shillings+suma2.shillings;
  if (suma12.shillings>=20)
  {
     suma12.pounds=(suma12.shillings-suma12.shillings%20)/20;
     suma12.shillings=suma12.shillings%20;
  }       
  suma12.pounds+= suma1.pounds+ suma2.pounds;
  return suma12;       
}
void outsum(sterling suma12) 
{ 
     cout<<suma12.pounds<<d<<suma12.shillings<<d<<suma12.pence<<endl;   
}
Kins
 Аватар для Kins
59 / 58 / 6
Регистрация: 03.02.2013
Сообщений: 167
28.03.2013, 23:02     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #51
Глава 7 Упражнение №7 с рабочей самодельной формулой перевода из char в double
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
////////////////////////////////////////////////////////////////
class money
{
private:
    long double cash;
    char in[80];
    char out[80];
public:
    money(){cash=0.0;}
    money(long double d):cash(d){}
    void input(){
        cout <<"Введите сумму: ";
        cin >>in;
    }
    void outg()
    {cout <<setiosflags(ios::fixed) <<setprecision(2) <<mstold(in) <<endl;}
    double InD(char ch[])
    {
        double rez, rez1;
        int t, o, tt, bb;
        rez=0.0, rez1=0.0;
        o=0;
        const int n=strlen(ch);
        const int c=48;
        for(int p=0; p<n; p++){//узнаем на каком индексе находится точка
            if(ch[p]=='.'){
                t=p-1;//степень, в которую надо возводить числа, чтобы получить число до точки 
                tt=n-(p+1)-1;//степень, для расчета после точки, в которую нужно возвести 10
                bb=n-(p+1);//степень, в которую нужно возвести 10, чтобы потом разделить ее на rez1
                break;
            }
            else t=p, tt=n-(p+1)-1, bb=n-(p+1);//иначе число без точки и максимальная степень равна длине символьной строки
        }
        for(int j=0; j<n; j++){
            if(t>=0){
                o=ch[j]-c;
                rez+=o*pow(10,t);
                t--;
            }else if(tt>=0){
                o=ch[j+1]-c;
                rez1+=o*pow(10,tt);
                tt--;
            }
        }
        rez1/=pow(10,bb);
        rez+=rez1;
        return rez;
    }
    long double mstold(char mass[])
    {
        int n=0, v=0;
        for(int j=0; j<strlen(mass); j++){
            if((mass[j]=='$')||(mass[j]==',')){
                ++v;
                continue;
            }
            out[n++]=mass[j];
        }
        out[strlen(mass)-v]='\0';
        double cash=InD(out);
        return cash;        
    }
};
////////////////////////////////////////////////////////////////
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    int n=0;
    char ch;
    money m[100];
    do{
        m[n++].input();
        cout <<"Еще раз (д/н)?";
        cin >>ch;
    }while(ch!='n');
    for(int j=0; j<n; j++)
        m[j].outg();    
    system("pause");
    return 0;
}
Рики
6 / 6 / 1
Регистрация: 27.02.2013
Сообщений: 23
28.03.2013, 23:35     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #52
если я ввожу пенсов больше чем 12 (шиллингов больше чем 20) в несколько раз
я выходил из соображений, что 1 фунт и 25 шиллингов это 2 фунта и 5 шиллингов.
Если все работает, то выходит как и проверка есть)

Добавлено через 6 минут
Глава 7 Упражнение №4
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;
int maxint (int [], int);
int main ( )
{
  setlocale (LC_ALL, "russian");
  const int SIZE = 6;
  int sales [ SIZE ];
  int j;
  cout << "Введите шесть значений\n";
  for ( j = 0; j < SIZE; j++ )
    cin >> sales [ j ];
  cout << "Индекс наибольшего числа: " <<maxint(sales, SIZE)<<endl;
  system("pause");
  return 0;
}
//------------------------------------------------------------------------------
int maxint (int m [], int k)
  {
  int j, max=0;
  for ( j = 0; j < k; j++ )
    if (m [j] > m [max] )
       max = j;
  return max;
  }


Глава 7 Упражнение №5
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include<cmath>
using namespace std;
////////////////////////////////////////////////////////////////////////////////
class fraction
{
   private:
      int chis, znam;
   public:
      fraction(): chis(0), znam(0)
        {}
      fraction(int c, int z): chis(c), znam(z)
        {}  
     void set_drobi ()
        {
            char drob; 
            cout<< "Введите значение дроби в формате x/y: "<<endl;
            cin>>chis>>drob>>znam;
        }
      void show_drobi()const
        {
            cout<< chis<<"/"<<znam<<endl;
        }
      void add_drobi(fraction, fraction);  
      void lowterms (); 
      void average (fraction, int);
};
//------------------------------------------------------------------------------
void fraction::add_drobi (fraction d1, fraction d2)
    {
        chis = (d1.chis*d2.znam+d1.znam*d2.chis);
        znam = (d1.znam*d2.znam);  
    }
//------------------------------------------------------------------------------
    void fraction::lowterms ()
    {
        long tchis, tznam, temp, gcd;
        tchis = labs(chis);
        tznam = labs(znam);
        if (tznam == 0)
            { cout<<"Недопустимый знаменатель!"; exit(1);}
        else if (tchis == 0)
            { chis = 0; znam = 1; return;}
        while(tchis !=0)
            {
                if(tchis < tznam)
                    {temp = tchis; tchis = tznam; tznam = temp;}
                tchis = tchis - tznam;
            }
        gcd = tznam;
        chis = chis/gcd;
        znam = znam/gcd;
    }
//---------------------------------------------------------
void fraction::average (fraction d1, int n)
{
    chis = (d1.chis*1);
    znam = (d1.znam*n);  
}
////////////////////////////////////////////////////////////////////////////////
int main()
{
  setlocale (LC_ALL, "russian");
  fraction frac [100]; 
  fraction total, aver; 
  int n = 0;             // счетчик данных
  int j, i;
  char ans;              // ответ пользователя (д/н)
 
  cout << endl;
  do
  {
    frac [ n++ ].set_drobi();      // получаем и сохраняем 
    cout << "Продолжить ввод (y/n)?: ";
    cin >> ans;
  }
  while ( ans != 'n' );            // продолжать, пока не будет введено 'н'
  
  for ( int j = 0; j < n; j++ )
  {
    cout << "\nДробь номер " << j + 1 << " : ";
    frac [ j ].show_drobi ( );
  }
  total = frac [ 0 ];
  for ( i = 1; i < n; i++)
    total.add_drobi (frac [ i ], total);
  total.lowterms();
  aver.average(total, n);
  aver.lowterms();
  cout << "\nСреднее значение введенных дробей: ";
  aver.show_drobi ( );
  cout << endl;
system("pause");
return 0;
}


Глава 7 Упражнение №6
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
enum Suit { clubs, diamonds, hearts, spades };
// от 2 до 10 обычные числа
const int jack = 11;
const int queen = 12;
const int king = 13;
const int ace = 14;
/////////////////////////////////////////////////////////////
class card
{
  private:
    int number;
    Suit suit;
  public:
    card ( ) // конструктор
      { }
    void set ( int n, Suit s ) // установка значения
      { suit = s; number = n; }
    void display ( );          // показ карты
};
/////////////////////////////////////////////////////////////
void card::display ( )
{
  if ( number >= 2 && number <= 10 )
    cout << number;
  else
  {
    switch ( number )
    {
      case jack: cout << 'J'; break;
      case queen: cout << 'Q'; break;
      case king: cout << 'K'; break;
      case ace: cout << 'A'; break;
    }
  }
  switch ( suit )
  {
    case clubs: cout << static_cast<char>( 5 ); break;
    case diamonds: cout << static_cast<char>( 4 ); break;
    case hearts: cout << static_cast<char>( 3 ); break;
    case spades: cout << static_cast<char>( 6 ); break;
  }
}
/////////////////////////////////////////////////////////////
int main ( )
{
  setlocale (LC_ALL, "russian");
  card deck [ 52 ];
  const int MAX = 13;
  card p1 [MAX], p2 [MAX], p3 [MAX], p4 [MAX];
  int j;
 
  cout << endl;
  for ( j = 0; j < 52; j++ )   // создаем упорядоченную колоду карт
  {
    int num = ( j % 13 ) + 2;
    Suit su = Suit ( j / 13 );
    deck [ j ].set ( num, su );
  }
  // показываем исходную колоду
  cout << "Исходная колода:\n";
  for ( j = 0; j < 52; j++ )
  {
    deck [ j ].display ( );
    cout << "  ";
    if ( !( ( j + 1 ) % 13 ) ) // начинаем новую строку после каждой 13-й карты
      cout << endl;
  }
  srand ( time ( NULL ) );     // инициализируем генератор случайных чисел
  for ( j = 0; j < 52; j++ )
  {
    int k = rand ( ) % 52;     // выбираем случайную карту
    card temp = deck [ j ];    // и меняем ее с текущей
    deck [ j ] = deck [ k ];
    deck [ k ] = temp;
  }
  cout << endl;
  int i;
  cout << "После перемешивания.\n"<< endl;;
  cout << "Карты первого игрока:\n";
  for ( j = 0, i = 0; j < 13; i++, j++ )
  {     
        p1 [i] = deck [ j ];
        p1 [i].display ( );
        cout << "  ";
  }
  cout << endl;
  cout << "\nКарты второго игрока:\n";
  for ( j = 13, i = 0; j < 26; i++, j++ )
  {     
        p2 [i] = deck [ j ];
        p2 [i].display ( );
        cout << "  ";
  }
  cout << endl;
  cout << "\nКарты третьего игрока:\n";
  for ( j = 26, i = 0; j < 39; i++, j++ )
  {     
        p3 [i] = deck [ j ];
        p3 [i].display ( );
        cout << "  ";
  }
  cout << endl;
  cout << "\nКарты четвертого игрока:\n";
  for ( j = 39, i = 0; j < 52; i++, j++ )
  {     
        p4 [i] = deck [ j ];
        p4 [i].display ( );
        cout << "  ";
  }
  cout << endl;
  system("pause");
  return 0;
}


_atold так и не заработало.

Глава 7 Упражнение №7
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <cmath>
#include <stdlib.h> 
#include <cstring>
#include <cstdlib>
#include <stdio.h> 
using namespace std;
const int MAX = 50;
/////////////////////////////////////////////////////////////
class money
{
  private:
    long double longMoney;
  public:
    money ():longMoney(0.0) // конструктор
      { }
    void mstold ( char []);
    void display ( )const
      {
            cout << longMoney << endl; 
      }           
};
//-----------------------------------------------------------
    void money::mstold ( char s [])
      {
            int j, k = 0;
            char tolkoChisla [MAX];
            int l = strlen(s);
            for (j = 0; j<l; j++)
            {
               if (s [j]== '0' || s [j]== '1' || s [j]== '2'
               || s [j]== '3' || s [j]== '4' || s [j]== '5'
               || s [j]== '6' || s [j]== '7' || s [j]== '8'
               || s [j]== '9' || s [j]== '.' )
                    {
                        tolkoChisla [k]=s[j];
                        k++;
                    }                    
            }
            tolkoChisla [k]='\0';
            longMoney =strtold (tolkoChisla, NULL );
                   
      }  
/////////////////////////////////////////////////////////////
int main ( )
{
  setlocale (LC_ALL, "russian");
  money m1;
  char stringMoney[MAX];
  cout << "Введите денежную сумму в формате \"$xxx,xxx,xxx.xx\"" << endl;
  cin >>  stringMoney;
  m1.mstold(stringMoney);
  m1.display ( );
  system("pause");
  return 0;
}


Глава 7 Упражнение №8
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <process.h>
using namespace std;
/////////////////////////////////////////////////////////////
class safearay
{
  private:
    static const int MAX = 50;
    int limit [MAX];
  public:
    void putel ( int, int);
    int getel ( int );
};
//-----------------------------------------------------------
    void safearay::putel ( int j, int k)
      {
            if (j > 0 && j<MAX)
                limit [j] = k;
            else
                {cout << "Вы вышли за границы массива" << endl; exit (1);}         
      } 
//-----------------------------------------------------------
    int safearay::getel ( int j)  
      {
            if (j > 0 && j<MAX)
                return limit [j];                
            else
                {cout << "Вы вышли за границы массива" << endl; exit (1);}                         
      }      
/////////////////////////////////////////////////////////////
int main ( )
{
  setlocale (LC_ALL, "russian");
  safearay sa1;
  int temp;
  int index;
  cout << "Введите значение помещаемое в массив:" << endl;
  cin >> temp;
  cout << "Введите индекс массива:" << endl;
  cin >> index;
  sa1.putel (index, temp);
  temp = sa1.getel (index);
  cout << temp << endl;
  system("pause");
  return 0;
}


Глава 7 Упражнение №9
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////////
class Queue
{
  private:
    static const int MAX = 10; 
    int st [ MAX ];    
    int head, tail;           
  public:
    Queue ( ) // конструктор
      { tail = 0; head = 0;  }
      //tail = MAX;
    void put ( int var ) // поместить в очередь
      {
            if (tail == MAX - 1)
                {tail = 0;
                st [ tail++ ] = var;}
            else st [ tail++ ] = var;
      }
    int get ( ) // взять из стека
      {
            if (head == MAX - 1)
                {head = 0;
                return st [ head++ ];}
            else return st [ head++ ];
      }
};
///////////////////////////////////////////////////////////
int main ( )
{
  setlocale (LC_ALL, "russian");
  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 );
  s1.put ( 77 );
  s1.put ( 88 );
  s1.put ( 99 );
  s1.put ( 100 );
  s1.put ( 110 );
  cout << "3: " << s1.get ( ) << endl;
  cout << "4: " << s1.get ( ) << endl;
  cout << "5: " << s1.get ( ) << endl;
  cout << "6: " << s1.get ( ) << endl;
  cout << "7: " << s1.get ( ) << endl;
  cout << "8: " << s1.get ( ) << endl;
  cout << "9: " << s1.get ( ) << endl;
  cout << "10: " << s1.get ( ) << endl;
  cout << "11: " << s1.get ( ) << endl;
  system("pause");
  return 0;
}


Глава 7 Упражнение №10
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <process.h>
using namespace std;
/////////////////////////////////////////////////////////////
class matrix
{
  private:
    static const unsigned int row = 10;
    static const unsigned int column = 10;
    int limit [row] [column];
  public:
  //  matrix ( int x, int y): row(x), column(y) // конструктор
   //   {}    
    void putel ( int, int, int);
    int getel ( int, int );
};
//-----------------------------------------------------------
    void matrix::putel ( int i, int j, int k)
      {
            if ((i > 0 && i<row) && (j > 0 && j<column))
                limit [i][j] = k;
            else
                {cout << "Вы вышли за границы массива" << endl; exit (1);}         
      } 
//-----------------------------------------------------------
    int matrix::getel ( int i, int j)  
      {
            if ((i > 0 && i<row) && (j > 0 && j<column))
                return limit [i][j];                
            else
                {cout << "Вы вышли за границы массива" << endl; exit (1);}                         
      }      
/////////////////////////////////////////////////////////////
int main ( )
{
  setlocale (LC_ALL, "russian");
  //matrix m1 (5, 5);
  matrix m1;
  int temp;
  int row, column;
  cout << "Введите значение помещаемое в массив:" << endl;
  cin >> temp;
  cout << "Введите индекс строки :" << endl;
  cin >> row;
  cout << "Введите индекс столбца :" << endl;
  cin >> column;
  m1.putel (row, column, temp);
  temp = m1.getel (row, column);
  cout << temp << endl;
  system("pause");
  return 0;
}


Одиннадцатое задание -просто разрыв шаблона.
Kins
 Аватар для Kins
59 / 58 / 6
Регистрация: 03.02.2013
Сообщений: 167
29.03.2013, 20:31     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #53
Глава 7 Упражнение №11 Исправлено: заполнение запятыми после формулы перевода; производится замена запятой на точку.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/////////////////////////////////////////////////////////////////
class money
{
    static const int MAX=30;
    long double cash;
    char ustring[MAX];
    char out[MAX];
public:
    money(){cash=0.0; out[0]='$';}//конструктор, который добавляет в массив out символ '$' нулевым индексом
    void ldtoms()
    {
        setlocale(LC_ALL,"");
        cout <<"Введите число: "; cin >>cash;
        _gcvt_s(ustring, MAX, cash, 16);//КРИВОЕ! преобразование в массив: заместо десятичной точки выводит запятую
        cout <<"Массив ustring[]: " <<ustring <<endl;
        int i=strlen(ustring);
        int g;//индекс символа запятой
        int z=0;//счетчик поставленных запятых
        int t=0;//счетчик символов между запятыми
        for(int v=0; v<i; v++){//цикл нахождения индекса запятой
            if(ustring[v]==','){
                g=v-1;
                break;
            }else{
                g=v;//не требуется
            }
        }
        for(int j=MAX; (j-z)>0; j--){//цикл заполнения массива out[] начиная с последнего индекса с поправкой на z-количество добавленных запятых
                if(i>=0){//замена запятой после формулы на точку
                if(i==g+1){
                    out[j-z]='.';
                    i--;
                    continue;
                }
                out[j-z]=ustring[i];//копированеи элементов массива
            }else{//если закончилось копирование символов в out[] из ustring[]
                for(int jj=0; jj<=(strlen(ustring)+z); jj++){//цикл перемещения символов в массиве к началу
                    int temp;
                    temp=out[j-z+jj];
                    out[j-z+jj]=out[j-z+jj+1];
                    out[j-z+jj+1]=temp;
                }
                continue;
            }
            if(i<=g){//если достигли индекса расположения запятой или дальше 
                ++t;//счетчик символов после запятой +1
                if((t==3)&&(i>0)){//если прошло три символа, пора ставить запятую
                    ++z;//поставленых запятых +1
                    out[j-z]=',';//ставим запятую
                    t=0;//обнуляем счетчик символов                 
                }
            }
            i--;
        }
        out[strlen(ustring)+1+z]='\0';//постановка после цикла перемещения символов символа окончания строки(z-количество добавленных запятых, +1-учет символа '$')
        cout <<"Массив out[]: " <<out <<endl;
    }
}; 
/////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    money m;
    m.ldtoms();
    system("pause");
    return 0;
}


Добавлено через 1 час 24 минуты
Глава 7 Упражнение №12
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include "stdafx.h"
#include <iostream>
#include <clocale>
 
using namespace std;
static const int MAX=30;
//////////////////////////////////////////////////////////////////
class bMoney
{
private:
    long double money;
public:
    bMoney(){money=0.0;}
    bMoney(char s[]){}
    void madd(bMoney m1, bMoney m2);
    void getmoney();
    void putmoney();
    double InD(char ch[]);
};
//////////////////////////////////////////////////////////////////
void bMoney::getmoney()
{
    char gIN[MAX], gOUT[MAX];
    cout <<"Введите число: "; 
    cin >>gIN;
    int n=0, v=0;
    for(int j=0; j<strlen(gIN); j++){
        if((gIN[j]=='$')||(gIN[j]==',')){
            ++v;
            continue;
        }
        gOUT[n++]=gIN[j];
    }
    gOUT[strlen(gIN)-v]='\0';
    money=InD(gOUT);
}
void bMoney::putmoney()
{
    char pIN[MAX], pOUT[MAX];
    pOUT[0]='$';
    _gcvt_s(pIN, MAX, money, 16);
    int i=strlen(pIN);
        int g;
        int z=0;
        int t=0;
        for(int v=0; v<i; v++){
            if(pIN[v]==','){
                g=v-1;
                break;
            }else{
                g=v;
            }
        }
        for(int j=MAX; (j-z)>0; j--){
                if(i>=0){
                if(i==g+1){
                    pOUT[j-z]='.';
                    i--;
                    continue;
                }
                pOUT[j-z]=pIN[i];
            }else{
                for(int jj=0; jj<=(strlen(pIN)+z); jj++){
                    int temp;
                    temp=pOUT[j-z+jj];
                    pOUT[j-z+jj]=pOUT[j-z+jj+1];
                    pOUT[j-z+jj+1]=temp;
                }
                continue;
            }
            if(i<=g){
                ++t;
                if((t==3)&&(i>0)){
                    ++z;
                    pOUT[j-z]=',';
                    t=0;            
                }
            }
            i--;
        }
    cout <<"Сумма равна: " <<pOUT <<endl;
}
void bMoney::madd(bMoney m1, bMoney m2)
{
    money=m1.money+m2.money;
}
double bMoney::InD(char ch[])
{
    double rez, rez1;
    int t, b, o, tt, bb;
    rez=0.0, rez1=0.0;
    o=0;
    const int n=strlen(ch);
    const int c=48;
    for(int p=0; p<n; p++){
            if(ch[p]=='.'){
                t=p-1;
                tt=n-(p+1)-1;
                bb=n-(p+1);
                break;
            }
            else t=p, tt=n-(p+1)-1, bb=n-(p+1);
    }
    for(int j=0; j<n; j++){
        if(t>=0){
            o=ch[j]-c;
            rez+=o*pow(10,t);
            t--;
        }else if(tt>=0){
            o=ch[j+1]-c;
            rez1+=o*pow(10,tt);
            tt--;
        }
    }
    rez1/=pow(10,bb);
    rez+=rez1;
    return rez;
}
//////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    bMoney s[100];
    int i=0;
    char ch='a';
    do{
        s[i].getmoney();
        if(i>0){
            s[i].madd(s[i], s[i-1]);            
            cout <<"Еещ раз (y/n)?";
            cin >>ch;
        }
        if(ch!='n'){
            i++;
        }
    }while(ch!='n');
    s[i].putmoney();
    system("pause");
    return 0;
}
Kins
 Аватар для Kins
59 / 58 / 6
Регистрация: 03.02.2013
Сообщений: 167
12.04.2013, 20:08     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #54
Глава 8 Упражнение №5
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
///////////////////////////////////////////////////////////////
class Time
{
private:
    int hrs;
    int min;
    int sec;
public:
    Time(): hrs(0), min(0), sec(0) {}
    Time(int(h), int(m), int(s)): hrs(h), min(m), sec(s) {}
    void show()const
    {
        cout <<"Время: ";
        if(hrs<10){cout <<"0";}
        cout <<hrs <<":";
        if(min<10){cout <<"0";}
        cout <<min <<":";
        if(sec<10){cout <<"0";}
        cout <<sec <<endl;}
    Time operator+(Time T2)const
    {
        int h=hrs+T2.hrs;
        int m=min+T2.min;
        if(m>=60) {h++; m-=60;}
        int s=sec+T2.sec;
        if(s>=60) {m++; s-=60;}
        return Time(h,m,s);
    }
    Time operator++()
    {
        ++hrs;
        ++min;
        if(min>=60){hrs++; min-=60;}
        ++sec;
        if(sec>=60){min++; sec-=60;}
        return Time(hrs,min,sec);
    }
    Time operator--()
    {
        --hrs;
        --min;
        if(min<0){hrs--; min+=60;}
        --sec;
        if(sec<0){min--; sec+=60;}
        return Time(hrs,min,sec);
    }
    Time operator++(int)
    {
        hrs++;
        min++;
        if(min>=60){hrs++; min-=60;}
        sec++;
        if(sec>=60){min++; sec-=60;}
        return Time(hrs,min,sec);
    }
    Time operator--(int)
    {
        hrs--;
        min--;
        if(min<0){hrs--; min+=60;}
        sec--;
        if(sec<0){min--; sec+=60;}
        return Time(hrs,min,sec);
    }
 
};
////////////////////////////////////////////////////////////////
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    const Time t1(10, 15, 45);
    const Time t2(1, 58, 22);
    Time t;
    t=t1+t2;
    t.show();
    ++t;
    t.show();
    t++;
    t.show();
    --t;
    t.show();
    t--;
    t.show();
    system("pause");
    return 0;
}


Добавлено через 3 минуты
Глава 8 Упражнение №6

не понятно было про умножения значений и использование типа float - все и без этого работает
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
///////////////////////////////////////////////////////////////
class Time
{
private:
    int hrs;
    int min;
    int sec;
public:
    Time(): hrs(0), min(0), sec(0) {}
    Time(int(h), int(m), int(s)): hrs(h), min(m), sec(s) {}
    void show()const
    {
        cout <<"Время: ";
        if(hrs<10){cout <<"0";}
        cout <<hrs <<":";
        if(min<10){cout <<"0";}
        cout <<min <<":";
        if(sec<10){cout <<"0";}
        cout <<sec <<endl;}
    Time operator+(Time T2)const
    {
        int h=hrs+T2.hrs;
        int m=min+T2.min;
        if(m>=60) {h++; m-=60;}
        int s=sec+T2.sec;
        if(s>=60) {m++; s-=60;}
        return Time(h,m,s);
    }
    Time operator-(Time T2)const
    {
        int h=hrs-T2.hrs;
        int m=min-T2.min;
        if(m<0) {h--; m+=60;}
        int s=sec-T2.sec;
        if(s<0) {m--; s+=60;}
        return Time(h,m,s);
    }
    Time operator*(Time T2)const
    {
        int h=hrs*T2.hrs;
        int m=min*T2.min;
        if(m>=60) {h+=m/60; m%=60;}
        int s=sec*T2.sec;
        if(s>=60) {m+=s/60; s%=60;}
        return Time(h,m,s);
    }
    Time operator++()
    {
        ++hrs;
        ++min;
        if(min>=60){hrs++; min-=60;}
        ++sec;
        if(sec>=60){min++; sec-=60;}
        return Time(hrs,min,sec);
    }
    Time operator--()
    {
        --hrs;
        --min;
        if(min<0){hrs--; min+=60;}
        --sec;
        if(sec<0){min--; sec+=60;}
        return Time(hrs,min,sec);
    }
    Time operator++(int)
    {
        hrs++;
        min++;
        if(min>=60){hrs++; min-=60;}
        sec++;
        if(sec>=60){min++; sec-=60;}
        return Time(hrs,min,sec);
    }
    Time operator--(int)
    {
        hrs--;
        min--;
        if(min<0){hrs--; min+=60;}
        sec--;
        if(sec<0){min--; sec+=60;}
        return Time(hrs,min,sec);
    }
 
};
////////////////////////////////////////////////////////////////
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    const Time t1(10, 15, 45);
    const Time t2(1, 58, 22);
    Time t;
    t=t1+t2;
    t.show();
    ++t;
    t.show();
    t++;
    t.show();
    --t;
    t.show();
    t--;
    t.show();
    t=t1-t2;
    t.show();
    t=t1*t2;
    t.show();
    system("pause");
    return 0;
}


Добавлено через 2 минуты
Глава 8 Упражнение №7

не перегружал операции == и != -ибо не считаю нужным, с удовольствием посмотрю на реализацию перегрузки этих операторов в данном случае)

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/////////////////////////////////////////////////////////////////
class fraction
{
private:
    int chsl;
    int znam;
public:
    fraction(): chsl(0), znam(0) {}
    fraction(int c, int z):chsl(c), znam(z)
    {}
    static char sl;
    void get(){
        cout <<"введите числитель и знаменатель: ";
        cin >>chsl >>sl >>znam;
        if((chsl==0)||(znam==0))exit(1);//хз зачем перегружать == и !=
    }
//---------------------OPER---------------------------------------------
    fraction operator+(fraction f2)
    {
        int ch=chsl*f2.znam+znam*f2.chsl;
        int zn=znam*f2.znam;
        lowterms(ch,zn);
        return fraction(ch,zn);
    }
    fraction operator-(fraction f2)
    {
        int ch=chsl*f2.znam-znam*f2.chsl;
        int zn=znam*f2.znam;
        lowterms(ch,zn);
        return fraction(ch,zn);
    }
    fraction operator*(fraction f2)
    {
        int ch=chsl*f2.chsl;
        int zn=znam*f2.znam;
        lowterms(ch,zn);
        return fraction(ch,zn);
    }
    fraction operator/(fraction f2)
    {
        int ch=chsl*f2.znam;
        int zn=znam*f2.chsl;
        lowterms(ch,zn);
        return fraction(ch,zn);
    }
//-----------------------------------------------------------------------
//====================сокращение дробей=============================================
    void lowterms(int &chsl, int &znam)
    {
        long tnum, tden, temp, gcd;
        tnum=labs(chsl);
        tden=labs(znam);
        while(tnum!=0)
        {
            if(tnum<tden){temp=tnum; tnum=tden; tden=temp;}
            tnum-=tden;
        }
        gcd=tden;
        chsl/=gcd;
        znam/=gcd;
    }
//====================END_OF_сокращение дробей)======================================
    void show()
    {cout <<"Ответ: " <<chsl <<sl <<znam <<endl;}
};
/////////////////////////////////////////////////////////////////
char fraction::sl='/';
//---------------------------------------------------------------
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    fraction f, f1, f2;
    static char ch;
    cout <<"Чтобы ввести первую дробь, "; f1.get();
    cout <<"Введите символ операции: "; cin >>ch;
    cout <<"Чтобы ввести вторую дробь, "; f2.get();
    switch(ch)
    {
    case '+': f=f1+f2;
        break;
    case '-': f=f1-f2;
        break;
    case '*': f=f1*f2;
        break;
    case '/': f=f1/f2;
        break;
    }
    f.show();
    system("pause");
    return 0;
}


Добавлено через 53 секунды
Глава 8 Упражнение №8
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
static const int MAX=30;
//////////////////////////////////////////////////////////////////
class bMoney
{
private:
    long double money;
public:
    bMoney()
    {money=0.0;}
    explicit bMoney(long double m):money(m)//преобразование long double в bMoney
    {}
    operator long double()//преобразование bMoney в long double
    {return money;}
    void getmoney();
    void putmoney();
    double InD(char ch[]);
    bMoney operator+(bMoney m2)
    {return bMoney(money+m2.money);}
    bMoney operator-(bMoney m2)
    {return bMoney(money-m2.money);}
    bMoney operator*(long double cet)//цена за единицу времени, затраченного на изделие
    {return bMoney(money*cet);}
    long double operator/(bMoney m2)//общая цена, деленная на цену за изделие
    {return (money/m2.money);}
    bMoney operator/(long double cet)//общая цена, деленная на количество изделий
    {return bMoney(money/cet);}
};
//////////////////////////////////////////////////////////////////
void bMoney::getmoney()
{
    char gIN[MAX], gOUT[MAX];
    cout <<"Введите число: "; 
    cin >>gIN;
    int n=0, v=0;
    for(int j=0; j<strlen(gIN); j++){
        if((gIN[j]=='$')||(gIN[j]==',')){
            ++v;
            continue;
        }
        gOUT[n++]=gIN[j];
    }
    gOUT[strlen(gIN)-v]='\0';
    money=InD(gOUT);
}
//////////////////////////////////////////////////////////////////
double bMoney::InD(char ch[])
{
    double rez, rez1;
    int t, o, tt, bb;
    rez=0.0, rez1=0.0;
    o=0;
    const int n=strlen(ch);
    const int c=48;
    for(int p=0; p<n; p++){
            if(ch[p]=='.'){
                t=p-1;
                tt=n-(p+1)-1;
                bb=n-(p+1);
                break;
            }
            else t=p, tt=n-(p+1)-1, bb=n-(p+1);
    }
    for(int j=0; j<n; j++){
        if(t>=0){
            o=ch[j]-c;
            rez+=o*pow(10,t);
            t--;
        }else if(tt>=0){
            o=ch[j+1]-c;
            rez1+=o*pow(10,tt);
            tt--;
        }
    }
    rez1/=pow(10,bb);
    rez+=rez1;
    return rez;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    char ch='a';
    do{
        bMoney m, m1, m2;
        
        long double z=0, p=0;
        m1.getmoney();
        m2.getmoney();
        cout <<"Введите число с плавающей точкой: "; cin >>z;
        m=m1+m2;
        cout <<"Сумма " <<m1 <<" и " <<m2 <<" равна: " <<m <<endl;
        m=m1-m2;
        cout <<"Разность " <<m1 <<" и " <<m2 <<" равна: " <<m <<endl;
        m=m1*z;
        cout <<"Цена за единицу времени, затраченного на изделие (" <<m1 <<"*" <<z <<"): " <<m <<endl;
        p=m1/m2;
        cout <<"Общая цена, деленная на цену за изделие (" <<m1 <<"/" <<m2 <<"): " <<p <<endl;
        m=m1/z;
        cout <<"Общая цена, деленная на количество изделий (" <<m1 <<"/" <<z <<"): " <<m <<endl;
        cout <<"Еще раз?(y/n)";
        cin >>ch;
    }while(ch!='n');
    return 0;
}


Добавлено через 44 секунды
Глава 8 Упражнение №9
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
const int LIMIT=100;
//////////////////////////////////////////////////////////////////
class safearray
{
private:
    int min;
    int max;
    int arr[LIMIT];
public:
    safearray()
    {min=0, max=0;}
    safearray(int mn, int mx):min(mn), max(mx)
    {}
    void getin(){
        cout <<"Введите min элемент массива: ";
        cin >>min;
        cout <<"Введите max элемент массива: ";
        cin >>max;
        int puk=max-min;
        if(puk>100)exit(1);
        //задаем значения элементов     
        for(int j=0; j<=puk; j++)
        arr[j]=j*10;//используем ф-ию слева от знака
        //показываем элементы
        for(int j=0; j<=puk; j++){
        int temp=arr[j];//используем ф-ию справа от знака
        cout <<"Элемент " <<j+min <<" равен " <<temp <<endl;
        }
    }
    //функция возвращает ссылку
    int& operator[](int n)
    {
        if(n<min||n>=max){
            cout <<"Ошибочный индекс!";
            exit(1);
        }
        return arr[n];
    }
};
/////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    safearray sa;
    sa.getin();
    system("pause");
    return 0;
}


Добавлено через 1 минуту
Глава 8 Упражнение №10
я не фанат математики- формулы перевода на вики нарыл, так что если что не так, прошу меня не винить, но все вроде нормально работает)

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
const double Pi = 3.14159265;
 
//////////////////////////////////////////////////////////////////
class Polar
{
private:
    double radial_koord;
    double uglov_koord;
public:
    Polar()
    {radial_koord=0, uglov_koord=0;}
    Polar(double r, double u):radial_koord(r), uglov_koord(u)
    {}
    Polar operator+(Polar po2)
    {
        double x=radial_koord*cos(uglov_koord);//получаем декартовые X
        double y=radial_koord*sin(uglov_koord);//и Y для переменной вызвавшей операцию
        double x_po2=po2.radial_koord*cos(po2.uglov_koord);//и для
        double y_po2=po2.radial_koord*sin(po2.uglov_koord);//аргумента
        x+=x_po2;
        y+=y_po2;
        radial_koord=pow((x*x+y*y),0.5);//получение радиальной координаты
        if(x==0){//получение уголвой координаты в интервале [0,2Pi) [url]http://upload.wikimedia.org/math/2/8/3/283fba64830216114c262ae19b41d9b6.png[/url]
            if(y<0)uglov_koord=(3*Pi)/2;
            else if(y>0)uglov_koord=Pi/2;
            else if(y==0)uglov_koord=0;
        }else{
            uglov_koord=atan(y/x);
            if(x>0 && y<0)uglov_koord+=2*Pi;
            if(x<0)uglov_koord+=Pi;
        }
        return Polar(radial_koord, uglov_koord);
    }
    void show()
    {
        cout <<"Радиальная координата равна: " <<radial_koord;
        cout <<"\nУгловая координата равна: " <<uglov_koord <<endl;
    }
};
////////////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    Polar p, p1(10,15), p2(5,12);
    p=p1+p2;
    p.show();
    system("pause");
    return 0;
}
Kins
 Аватар для Kins
59 / 58 / 6
Регистрация: 03.02.2013
Сообщений: 167
13.04.2013, 21:44     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #55
Глава 8 Упражнение №11
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using namespace std;
static char ch='.';
//////////////////////////////////////////////////////////////////////
class sterling
{
private:
    long ft;
    int sh;
    int pn;
public:
    sterling()
    {ft=0, sh=0, pn=0;}
    sterling(double FT)
    {
       ft=(long)FT;
       sh=(int)((FT-ft)*20);
       pn=(int)((((FT-ft)*20)-sh)*12);
    }
    sterling(long f, int s, int p):ft(f), sh(s), pn(p)
    {}
    operator double()
    {return (ft*240+sh*12+pn)/240.0;}
    void getsterling()
    {
        cout <<"Введите значения фунтов, шиллингов и пенсов: \x9C";
        cin >>ft >>ch >>sh >>ch >>pn;
    }
    void putsterling()
    {cout <<"\x9C" <<ft <<ch <<sh <<ch <<pn ;}
    sterling operator+(sterling s2)
    {return sterling(double(sterling(ft,sh,pn))+double(s2));}
    sterling operator-(sterling s2)
    {return sterling(double(sterling(ft,sh,pn))-double(s2));}
    sterling operator*(double s2)
    {return sterling(double(sterling(ft,sh,pn))*s2);}
    sterling operator/(sterling s2)
    {return sterling(double(sterling(ft,sh,pn))/double(s2));}
    sterling operator/(double s2)
    {return sterling(double(sterling(ft,sh,pn))/s2);}
};
//////////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    sterling s, s1(4,5,7), s2(2,9,8);
    double d=3.1254;
    //s1.getsterling();
    //s2.getsterling();
    s=s1+s2;
    cout <<"Сумма "; s1.putsterling(); cout <<" и "; s2.putsterling();  cout <<" равна: "; s.putsterling(); cout <<endl;
    s=s1-s2;
    cout <<"Разность "; s1.putsterling(); cout <<" и "; s2.putsterling();  cout <<" равна: "; s.putsterling(); cout <<endl;
    s=s1*d;
    cout <<"Произведение "; s1.putsterling(); cout <<" на " <<d <<" равно: "; s.putsterling(); cout <<endl;
    s=s1/s2;
    cout <<"Деление "; s1.putsterling(); cout <<" на "; s2.putsterling();  cout <<" равно: "; s.putsterling(); cout <<endl;
    s=s1/d;
    cout <<"Деление "; s1.putsterling(); cout <<" на " <<d <<" равно: "; s.putsterling(); cout <<endl;
    system("pause>>void");
    return 0;
}
Kins
 Аватар для Kins
59 / 58 / 6
Регистрация: 03.02.2013
Сообщений: 167
16.04.2013, 12:32     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #56
Глава 8 Упражнение №12
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using namespace std;
//////////////////////////////////////////////////////////////////////
class sterling
{
private:
    long ft;
    int sh;
    int pn;
public:
    sterling()
    {ft=0, sh=0, pn=0;}
    sterling(long f, int s, int p):ft(f), sh(s), pn(p)
    {}
    void showster()
    {cout <<"\x9C" <<ft <<"." <<sh <<"." <<pn <<endl;}
    sterling(double FT)//преобразование дабл в стерлинг
    {
        FT/=50;
        ft=(long)FT;
        sh=(int)((FT-ft)*20);
        pn=(int)((((FT-ft)*20)-sh)*12);
    }
    long getFnt()const
    {return ft;}
    int getShg()const
    {return sh;}
    int getPen()const
    {return pn;}
};
//////////////////////////////////////////////////////////////////////
class bMoney
{
private:
    long double money;
public:
    bMoney()
    {money=0.0;}
    bMoney(long double m):money(m)
    {}
    operator long double()//преобразование bMoney в long double
    {return money;}
    void showMoney()
    {cout <<money <<endl;}
    bMoney(sterling ss)//преобразование sterling в bMoney
    {
        long ft=ss.getFnt();
        int sh=ss.getShg();
        int pn=ss.getPen();
        money=((ft*240+sh*12+pn)/240.0)*50;
    }
};
//////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    sterling s(7,8,5);
    bMoney d(371.042);
    bMoney b=s;
    b.showMoney();//вывод преобразования sterling в bMoney
    sterling st=d;
    st.showster();//вывод преобразования bMoney в sterling
    system("pause");
    return 0;
}
Kins
 Аватар для Kins
59 / 58 / 6
Регистрация: 03.02.2013
Сообщений: 167
25.04.2013, 13:44     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #57
Глава 9 Упражнение №4
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
using namespace std;
 
///////////////////////////////////////////////////////////////
class publication
{
private:
    string name;
    float price;
public:
    publication():name("N/A"), price(0.0)
    {}
    publication(string n, float p):name(n), price(p)
    {}
    void getdata()
    {
        cout <<"\nВведите название книги: "; cin >>name;
        cout <<"Введите цену книги: "; cin >>price;
    }
    void putdata()
    {
        cout <<"\nНазвание книги: " <<name;
        cout <<"\nЦена книги: " <<price;
    }
};
////////////////////////////////////////////////////////////////
class sales
{
private:
    static const int MAX=3;
    float summ[MAX];
public:
    sales():summ()
    {}
    sales(float su):summ()
    {}
    void getdata()
    {
        for(int j=0; j<MAX; j++){
            cout <<"Введите суммарную прибыль за " <<j+1 <<"-й месяц: ";
            cin >>summ[j];
        }
    }
    void putdata()
    {
        for(int j=0; j<MAX; j++){
            cout <<"\nСуммарная прибыль за " <<j+1 <<"-й месяц: " <<summ[j] <<" рубл.";
        }
    }
};
////////////////////////////////////////////////////////////////
class book:private publication, private sales
{
private:
    int number_pages;
public:
    book():publication(), sales(), number_pages(0)
    {}
    book(string n, float p, int np, float su):publication(n, p), sales(su), number_pages(np)
    {}
    void getdata()
    {
        publication::getdata();
        cout <<"Введите количество страниц: "; cin >>number_pages;
        sales::getdata();
    }
    void putdata()
    {
        publication::putdata();
        cout <<"\nКоличество страниц: " <<number_pages;
        sales::putdata();
    }
};
////////////////////////////////////////////////////////////////
class type:private publication, private sales
{
private:
    float time_rec;
public:
    type():publication(), sales(), time_rec(0.0)
    {}
    type(string n, float p, float tr, float su):publication(n, p), sales(su), time_rec(tr)
    {}
    void getdata()
    {
        publication::getdata();
        cout <<"Введите время записи аудиокниги в минутах: "; cin >>time_rec;
        sales::getdata();
    }
    void putdata()
    {
        publication::putdata();
        cout <<"\nВремя записи аудиокниги в минутах: " <<time_rec;
        sales::putdata();
    }
};
////////////////////////////////////////////////////////////////
class disk:private publication
{
private:
    enum disc_type{cd, dvd};
public:
    disc_type d1;
    char dd;
    void getdata()
    {
        publication::getdata();
        cout <<"Введите тип диска, на котором находится книга(c/d):";
        cin >>dd;
    }
    void putdata()
    {
        publication::putdata();
        if(dd=='c'){d1=cd;}
        if(dd=='d'){d1=dvd;}
        switch (d1){
        case 0: cout <<"\nТип диска CD"; break;
        case 1: cout <<"\nТип диска DVD"; break;
        }
    }
};
////////////////////////////////////////////////////////////////        
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    book b;
    type t;
    disk d;
    cout <<"\nВведите данные на книгу";
    b.getdata();
    cout <<"\nВведите данные на аудиокнигу";
    t.getdata();
    cout <<"\nВведите данные на диск";
    d.getdata();
    cout <<"\nДанные на книгу";
    b.putdata();
    cout <<"\nДанные на аудиокнигу";
    t.putdata();
    cout <<"\nДанные на диск";
    d.putdata();
    cout <<endl;
    system("pause");
    return 0;
}


Добавлено через 59 секунд
Глава 9 Упражнение №5
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
using namespace std;
const int LEN=80;
////////////////////////////////////////////////////////////////////
class employee
{
private:
    char name[LEN];//имя сотрудника
    unsigned long number;//номер сотрудника
public:
    void getdata()
    {
        cout <<"\nВведите фамилию: "; cin >>name;
        cout <<"Введите номер: "; cin >>number;
    }
    void putdata()
    {
        cout <<"\nФамилия: " <<name;
        cout <<"\nНомер: " <<number;
    }
};
///////////////////////////////////////////////////////////////////
class compensation
{
private:
    double compensations;
    enum period{hrs, week, mnts};
public:
    period per;
    char ch;
    void getdata()
    {
        cout <<"Введите вознаграждение за работу: "; cin >>compensations;
        cout <<"Введите тип оплаты (h/w/m)"; cin >>ch;
    }
    void putdata()
    {
        cout <<"\nВознаграждение за работу составляет: " <<compensations <<" руб.";
        cout <<"\nТип оплаты: ";
        if(ch=='h'){per=hrs;}
        else if(ch=='w'){per=week;}
        else if(ch=='m'){per=mnts;}
        switch(per){
        case 0: cout <<"почасовая"; break;
        case 1: cout <<"еженедельная"; break;
        case 2: cout <<"ежемесячная"; break;
        }
    }
};
///////////////////////////////////////////////////////////////////
class manager:public employee//менеджер
{
private:
    char title[LEN];//должность, например вице-президент
    double dues;//сумма взносов в гольф-клуб
public:
    void getdata()
    {
        employee::getdata();
        cout <<"Введите должность: "; cin >>title;
        cout <<"Введите сумму взносов в гольф-клуб: "; cin >>dues;
    }
    void putdata()
    {
        employee::putdata();
        cout <<"\nДолжность: " <<title;
        cout <<"\nСумма взносов в гольф-клуб: " <<dues;
    }
};
///////////////////////////////////////////////////////////////////
class scientist:public employee
{
private:
    int pubs;//количество публикаций
public:
    void getdata()
    {
        employee::getdata();
        cout <<"Введите количество публикаций: "; cin >>pubs;
    }
    void putdata()
    {
        employee::putdata();
        cout <<"\nКоличество публикаций: " <<pubs;
    }
};
//////////////////////////////////////////////////////////////////
class laborer:public employee//класс рабочий
{
};
//////////////////////////////////////////////////////////////////
class manager2: private manager, private compensation
{
public:
    void getdata()
    {
        manager::getdata();
        compensation::getdata();
    }
    void putdata()
    {
        manager::putdata();
        compensation::putdata();
    }
};
/////////////////////////////////////////////////////////////////
class scientist2: private scientist, private compensation
{
public:
    void getdata()
    {
        scientist::getdata();
        compensation::getdata();
    }
    void putdata()
    {
        scientist::putdata();
        compensation::putdata();
    }
};
//////////////////////////////////////////////////////////////////
class laborer2: private laborer, private compensation
{
public:
    void getdata()
    {
        laborer::getdata();
        compensation::getdata();
    }
    void putdata()
    {
        laborer::putdata();
        compensation::putdata();
    }
};
//////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    manager2 m1, m2;
    scientist2 s1;
    laborer2 l1;
    //введем информацию о нескольких сотрудниках
    cout <<endl;
    cout <<"Ввод информации о первом менеджере";
    m1.getdata();
    cout <<"\nВвод информации о втором менеджере";
    m2.getdata();
    cout <<"\nВвод информации о первом ученом";
    s1.getdata();
    cout <<"\nВвод информации о первом рабочем";
    l1.getdata();
    //выведем полученую информацию на экран
    cout <<"\nИнформация о первом менеджере";
    m1.putdata();
    cout <<"\nИнформация о втором менеджере";
    m2.putdata();
    cout <<"\nИнформация о первом ученом";
    s1.putdata();
    cout <<"\nИнформация о первом рабочем";
    l1.putdata();
    system("pause");
    return 0;
}


Добавлено через 46 секунд
Глава 9 Упражнение №6
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using namespace std;
 
const int LIMIT=100;
//////////////////////////////////////////////////////////////////
class safearray
{
protected:
    int arr[LIMIT];
public:
    //функция возвращает ссылку
    int& operator[](int n)
    {
        if(n<0||n>=LIMIT){
            cout <<"Ошибочный индекс!";
            exit(1);
        }
        return arr[n];
    }
};
/////////////////////////////////////////////////////////////////
class safehilo: private safearray
{
private:
    int min;
    int max;
public:
    safehilo():min(0), max(0)
    {}
    safehilo(int mn, int mx):min(mn), max(mx)
    {}
    void getin()
    {
        cout <<"Введите min массива: "; cin >>min;
        cout <<"Введите max массива: "; cin >>max;
    }
    void zap_mass()
    {
        int puk=max-min;
        if(puk>LIMIT)exit(1);
        for(int j=0; j<=puk; j++){
            arr[j]=j*10;
        }
    }
    void show_arr()
    {
        int puk=max-min;
        for(int j=0; j<=puk; j++){
            int temp=arr[j];
            cout <<"Элемент " <<j+min <<" равен " <<temp <<endl;
        }
    }
};
//////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    safehilo sh1;
    sh1.getin();
    sh1.zap_mass();
    sh1.show_arr();
    system("pause");
    return 0;
}


Добавлено через 1 минуту
Глава 9 Упражнение №7
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using namespace std;
 
//////////////////////////////////////////////////////////////////
class Counter//базовый класс
{
protected:
    unsigned int count;//счетчик
public:
    Counter():count(0)
    {}
    Counter(int c):count(c)
    {}
    unsigned int get_count()const
    {return count;}//возвращает з начение счетчика
    Counter operator++()//увеличивает значение счетчика
    {return Counter(++count);}
 
};
////////////////////////////////////////////////////////////////
class CountDn:public Counter//производный класс
{
public:
    CountDn():Counter()//конструктор без параметров
    {}
    CountDn(int c):Counter(c)//конструктор с одним параметром
    {}
    CountDn operator--()//уменьшает значение счетчика
    {return CountDn(--count);}
};
////////////////////////////////////////////////////////////////
class CountPosx:public CountDn
{
public:
    CountPosx():CountDn()
    {}
    CountPosx(int c):CountDn(c)
    {}
    CountDn::operator++;
    CountDn::operator--;
    CountPosx operator++(int)
    {return CountPosx(count++);}
    CountPosx operator--(int)
    {return CountPosx(count--);}
};
////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    CountPosx c1;//объекс с1
    CountPosx c2(100);
    cout <<"\n c1=" <<c1.get_count();//вывод на печать
    cout <<"\n c2=" <<c2.get_count();//вывод на печать
    ++c1; ++c1; c1++;//увеличиваем три раза с1
    cout <<"\n c1=" <<c1.get_count();//выводим на печать
    --c2; --c2;//уменьшаем два раза с2
    cout <<"\n c2=" <<c2.get_count();//выводим на печать
    CountDn c3=c2--;//создаем переменную с3 на основе с2
    cout <<"\n c3=" <<c3.get_count();//выводим на печать
    cout <<endl;
    system("pause");
    return 0;
}


Добавлено через 5 минут
Глава 9 Упражнение №8
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
using namespace std;
 
////////////////////////////////////////////////////////////////
class String
{
protected:
    static const int SZ=18;//максимальный размер строки
    char str[SZ];//сама строка
public:
    String()//конструктор без параметров
    {str[0]='\x0';}
    String(char s[])//конструктор с одним параметром
    {strcpy_s(str, s);}
    void display()//показ строки
    {
        cout <<str <<endl;
    }
    //перевод строки к обычному типу
    operator char*()
    {return str;}
};
///////////////////////////////////////////////////////////////
class Pstring:public String
{
public:
    Pstring():String()
    {}
    Pstring(char s[])
    {
        if(strlen(s)<SZ){
            strcpy_s(str, s);}
        if(strlen(s)>=SZ){
            for(int j=0; j<SZ; j++){
                if(j==(SZ-1)){
                    str[j]='\0';
                    continue;
                }
                str[j]=s[j];                
            }
        }
    }
    void display()
    {String::display();}
};
///////////////////////////////////////////////////////////////
class Pstring2: public Pstring
{
private:
    int number;//номер символа
    char simbol;//символ строки
public:
    Pstring2():Pstring()
    {}
    Pstring2(char s[]):Pstring(s)
    {}
    Pstring2& left(Pstring p2, int number)//в строку s2 помещаются n самых левых символов строки s1
    {
        for(int j=0; j<=number; j++){
            str[j]=p2[j];
            if(j==number){
                str[j]='\0';
            }
        }
        return Pstring2(str);
    }
    Pstring2& mid(Pstring p2, char sl, int n)//в строку s2 помещаются n символов строки s1 начиная с символа s
    {
        for(int j=0; j<strlen(p2); j++){
            if(p2[j]!=sl){
                continue;
            }else{
                for(int i=0; i<=n; i++){
                    str[i]=p2[j+i];
                    if(i==n){
                        str[i]='\0';
                        break;
                    }
                }
            }
        }
        return Pstring2(str);
    }
    Pstring2& right(Pstring p2, int n)//в строку s2 помещаются n самых правых символов строки s1
    {
        int t=strlen(p2)-n;
        for(int j=0; j<=strlen(p2); j++){
            str[j]=p2[j+t];
            if(j==strlen(p2)){
                str[j]='\0';
            }
        }
        return Pstring2(str);
    }
};
///////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    Pstring s, s1;
    s="Шла саша по шоссе";  
    s.display();
    s1="Асталависта бэйби нау";
    s1.display();
    Pstring2 s2, s3, s4;
    s3.left(s1, 5);//пять символов слева
    s3.display();
    s2=s3.mid(s1, 'в', 7);//семь символов начиная с символа 'в'
    s2.display();
    s4.right(s1, 9);//девять крайних правых символов
    s4.display();
    cout <<endl;
    system("pause");
    return 0;
}


Добавлено через 1 минуту
Глава 9 Упражнение №9
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
using namespace std;
 
///////////////////////////////////////////////////////////////
class publication
{
private:
    string name;
    float price;
public:
    publication():name("N/A"), price(0.0)
    {}
    publication(string n, float p):name(n), price(p)
    {}
    void getdata()
    {
        cout <<"\nВведите название книги: "; cin >>name;
        cout <<"Введите цену книги: "; cin >>price;
    }
    void putdata()const
    {
        cout <<"\nНазвание книги: " <<name;
        cout <<"\nЦена книги: " <<price;
    }
};
////////////////////////////////////////////////////////////////
class publication2: private publication
{
private:
    int month, day, year;
public:
    char ch;
    publication2(){month=0, day=0, year=0;}
    publication2(int mn, int dy, int yr, string n, float p):month(mn), day(dy), year(yr), publication(n, p)
    {}
    void getdata()
    {
        publication::getdata();
        cout <<"Введите дату издания книги (мм/дд/гггг): ";
        cin >>month >>ch >>day >>ch >>year;
    }
    void putdata()const
    {
        publication::putdata();
        cout <<"\nДата издания книги: " <<month <<ch <<day <<ch <<year;
    }
 
};
///////////////////////////////////////////////////////////////
class book:private publication2
{
private:
    int number_pages;
public:
    book():publication2(), number_pages(0)
    {}
    book(int np, int mn, int dy, int yr, string n, float p):number_pages(np), publication2(mn, dy, yr, n, p)
    {}
    void getdata()
    {
        publication2::getdata();
        cout <<"Введите количество страниц: "; cin >>number_pages;
    }
    void putdata()const
    {
        publication2::putdata();
        cout <<"\nКоличество страниц: " <<number_pages;
    }
};
////////////////////////////////////////////////////////////////
class type:private publication2
{
private:
    float time_rec;
public:
    type():publication2(), time_rec(0.0)
    {}
    type(float tr, int mn, int dy, int yr, string n, float p):time_rec(tr), publication2(mn, dy, yr, n, p) 
    {}
    void getdata()
    {
        publication2::getdata();
        cout <<"Введите время записи аудиокниги в минутах: "; cin >>time_rec;
    }
    void putdata()const
    {
        publication2::putdata();
        cout <<"\nВремя записи аудиокниги в минутах: " <<time_rec;
    }
};
////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    book b;
    type t;
    cout <<"\nВведите данные на книгу";
    b.getdata();
    cout <<"\nВведите данные на аудиокнигу";
    t.getdata();
    cout <<"\nДанные на книгу";
    b.putdata();
    cout <<"\nДанные на аудиокнигу";
    t.putdata();
    cout <<endl;
    system("pause");
    return 0;
}


Добавлено через 53 секунды
Глава 9 Упражнение №10
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
using namespace std;
const int LEN=80;
////////////////////////////////////////////////////////////////////
class student//сведения об образовании
{
private:
    char scool[LEN];//название учебного заведения
    char degree[LEN];//уровень образования
public:
    void getedu()
    {
        cout <<"Введите название учебного заведения: "; cin >>scool;
        cout <<"Введите степень высшего образования: "; cin >>degree;
    }
    void putedu()
    {
        cout <<"\nУчебное заведение: " <<scool;
        cout <<"\nУченая степень: " <<degree;
    }
};
////////////////////////////////////////////////////////////////////
class employee
{
private:
    char name[LEN];//имя сотрудника
    unsigned long number;//номер сотрудника
public:
    void getdata()
    {
        cout <<"\nВведите фамилию: "; cin >>name;
        cout <<"Введите номер: "; cin >>number;
    }
    void putdata()
    {
        cout <<"\nФамилия: " <<name;
        cout <<"\nНомер: " <<number;
    }
};
///////////////////////////////////////////////////////////////////
class manager:private employee, private student//менеджер
{
private:
    char title[LEN];//должность, например вице-президент
    double dues;//сумма взносов в гольф-клуб
public:
    void getdata()
    {
        employee::getdata();
        cout <<"Введите должность: "; cin >>title;
        cout <<"Введите сумму взносов в гольф-клуб: "; cin >>dues;
        student::getedu();
    }
    void putdata()
    {
        employee::putdata();
        cout <<"\nДолжность: " <<title;
        cout <<"\nСумма взносов в гольф-клуб: " <<dues;
        student::putedu();
    }
};
///////////////////////////////////////////////////////////////////
class scientist:private employee, private student
{
private:
    int pubs;//количество публикаций
public:
    void getdata()
    {
        employee::getdata();
        cout <<"Введите количество публикаций: "; cin >>pubs;
        student::getedu();
    }
    void putdata()
    {
        employee::putdata();
        cout <<"\nКоличество публикаций: " <<pubs;
        student::putedu();
    }
};
//////////////////////////////////////////////////////////////////
class laborer:public employee//класс рабочий
{
};
//////////////////////////////////////////////////////////////////
class foreman:public laborer//бригадир
{
private:
    float quotas;//норма выработки
public:
    void getdata()
    {
        laborer::getdata();
        cout <<"Введите норму выработки: "; cin >>quotas;
    }
    void putdata()
    {
        laborer::putdata();
        cout <<"Норма выработки: " <<quotas;
    }
};
//////////////////////////////////////////////////////////////////
class executive:private manager
{
private:
    double yr_bonus;
    int n_of_shares;
public:
    void getdata()
    {
        manager::getdata();
        cout <<"Введите годовую премию: "; cin >>yr_bonus;
        cout <<"Введите количество акций: "; cin >>n_of_shares; 
    }
    void putdata()
    {
        manager::putdata();
        cout <<"\nГодовая премия: " <<yr_bonus;
        cout <<"\nКоличество акций: " <<n_of_shares;
    }
};
///////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    manager m1;
    scientist s1;
    laborer l1;
    executive ex1;
    //введем информацию о нескольких сотрудниках
    cout <<endl;
    cout <<"Ввод информации о первом менеджере: ";
    m1.getdata();
    cout <<"Ввод информации о первом ученом: ";
    s1.getdata();
    cout <<"Ввод информации о первом рабочем: ";
    l1.getdata();
    cout <<"Ввод информации о управляющем: ";
    ex1.getdata();
 
    //выведем полученую информацию на экран
    cout <<"Информации о первом менеджере: ";
    m1.putdata();
    cout <<"Информации о первом ученом: ";
    s1.putdata();
    cout <<"Информации о первом рабочем: ";
    l1.putdata();
    cout <<"Информация о первом управляющем: ";
    ex1.putdata();
    cout <<endl;
    system("pause");
    return 0;
}


Добавлено через 1 минуту
Глава 9 Упражнение №11
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using namespace std;
 
//////////////////////////////////////////////////////////////////
class Stack
{
protected:
    static const int MAX=10;//размер стека
    //enum {MAX=10};
    int st[MAX];//данные, хранящиеся в стеке
    int top;//индекс последнего элемента в стеке
public:
    Stack()//конструктор
    {top=-1;}
    void push(int var)//поместить в стек
    {st[++top]=var;}
    int pop()//взять из стека
    {return st[top--];}
};
/////////////////////////////////////////////////////////////////
class Stack2:public Stack
{
public:
    void push(int var)
    {
        if(top>=MAX-1)//если стек полон, то ошибка
        {cout <<"\nОшибка! Стек полон!"; exit(1);}
        Stack::push(var);//вызов функции push класса Stack
    }
    int pop()//извлечение числа из стека
    {
        if(top<0)//если стек пуст, то ошибка
        {cout <<"\nОшибка! Стек пуст!"; exit(1);}
        return Stack::pop();//вызов функции pop класса Stack
    }
};
//////////////////////////////////////////////////////////////////
class pairStack:private Stack2
{
public:
    void push(int var, int var2)
    {
        Stack2::push(var);
        Stack2::push(var2);
    }
    void pop()
    {cout <<Stack2::pop() <<" " <<Stack2::pop() <<endl;}
};
//////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    pairStack ps;
    ps.push(11, 12);
    ps.push(21, 22);
    ps.push(31, 32);
    ps.pop();
    ps.pop();
    ps.pop();
    system("pause");
    return 0;
}
Kins
 Аватар для Kins
59 / 58 / 6
Регистрация: 03.02.2013
Сообщений: 167
30.04.2013, 09:36     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #58
Глава 9 Упражнение №12
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
using namespace std;
///////////////////////////////////////////////////////////////////
class sterling
{
protected:
    long ft;
    int sh;
    int pn;
public:
    char ch;
    sterling():ft(0L), sh(0), pn(0)
    {}
    sterling(long f, int s, int p):ft(f), sh(s), pn(p)
    {}
    sterling(double FT)
    {
       ft=(long)FT;
       sh=(int)((FT-ft)*20);
       pn=(int)((((FT-ft)*20)-sh)*12);
    }
    operator double()
    {return (ft*240+sh*12+pn)/240.0;}
    void getin()
    {
        cout <<"Введите фунты, шиллинги и пенсы через точку: ";
        cin >>ft >>ch >>sh >>ch >>pn;
    }
    void show()
    {cout <<"Введена сумма: " <<ft <<"." <<sh <<"." <<pn;}
    sterling operator+(sterling s2)
    {return sterling(double(sterling(ft,sh,pn))+double(s2));}
    sterling operator-(sterling s2)const
    {return sterling(double(sterling(ft,sh,pn))-double(s2));}
    sterling operator*(double s2)const
    {return sterling(double(sterling(ft,sh,pn))*s2);}
    sterling operator/(sterling s2)const
    {return sterling(double(sterling(ft,sh,pn))/double(s2));}   
};
//////////////////////////////////////////////////////////////////
class sterfrac:private sterling
{
private:
    int eighths;
    int znam;
public:
    sterfrac():sterling(), eighths(0), znam(0)
    {}
    sterfrac(long f, int s, int p, int e, int z):sterling(f, s, p), eighths(e), znam(z)
    {}
    sterfrac(double FT)
    {
       ft=(long)FT;
       sh=(int)((FT-ft)*20);
       pn=(int)((((FT-ft)*20)-sh)*12);
    }
    operator double()
    {return (ft*240+sh*12+pn)/240.0;}
    void getin()
    {
        sterling::getin();
        cout <<"Введите восьмую часть: ";
        cin >>eighths;
        znam=8;
    }
//-----------------------------------------------------------------------
    sterfrac operator+(sterfrac s2)
    {
        sterfrac  sf=((ft*240+sh*12+pn)/240.0)+s2;
        sf.eighths=eighths*s2.znam+znam*s2.eighths;
        sf.znam=znam*s2.znam;
        return sf;
    }
    sterfrac operator-(sterfrac s2)
    {
        sterfrac  sf=((ft*240+sh*12+pn)/240.0)-s2;
        sf.eighths=eighths*s2.znam-znam*s2.eighths;
        sf.znam=znam*s2.znam;
        return sf;
    }
    sterfrac operator*(double s2)
    {
        sterfrac sf=((ft*240+sh*12+pn)/240.0)*s2;
        sf.eighths=eighths;
        sf.znam=znam;
        return sf;
    }
    sterfrac operator/(sterfrac s2)
    {
        sterfrac sf=((ft*240+sh*12+pn)/240.0)/((s2.ft*240+s2.sh*12+s2.pn)/240.0);
        sf.eighths=eighths*s2.znam;
        sf.znam=znam*s2.eighths;
        return sf;
    }
//-----------------------------------------------------------------------
    void show()
    {
        long tnum, tden, temp, gcd;
        tnum=labs(eighths);
        tden=labs(znam);
        while(tnum!=0){
            if(tnum<tden){temp=tnum; tnum=tden; tden=temp;}
            tnum-=tden;
        }
        gcd=tden;
        int ei=eighths/gcd;
        int zn=znam/gcd;
        if(ei>zn){
            ei=zn-ei;
            pn++;
            if(pn>11){
                pn-=12;
                sh++;
            }
            if(sh>19){
                sh-=20;
                ft++;
            }
        }
        sterling::show();
        cout <<"-"<<ei <<"/" <<zn <<endl;
    }
};
//////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"");
    sterfrac s, s1(4, 5, 6, 7, 8), s2(1, 2, 3, 4, 8);
    double d=3.1254;
    //s1.getin();
    //s2.getin();
    if(s1<s2){exit(1);}
    s=s1+s2;
    s.show();
    s=s1-s2;
    s.show();
    s=s1*d;
    s.show();
    s=s1/s2;
    s.show();
    cout <<endl;
    system("pause");
    return 0;
}
Mordsit
Сообщений: n/a
13.06.2013, 21:58     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #59
Доброе время суток, а решений из 10 главы нет еще ненароком?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2013, 20:23     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Еще ссылки по теме:

Объектно-ориентированное программирование C++
Разобраться в примерх к книге Лафоре "Обьектно-ориентированое программирование в С++" C++
C++ Объектно-ориентированное приложение: "Эмулятор банкомата"

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kins
 Аватар для Kins
59 / 58 / 6
Регистрация: 03.02.2013
Сообщений: 167
27.06.2013, 20:23     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #60
Цитата Сообщение от Mordsit Посмотреть сообщение
Доброе время суток, а решений из 10 главы нет еще ненароком?
есть, 10я глава до 10го вроде задания. 11я глава до 8го. Времени нет просто запостить.
Yandex
Объявления
27.06.2013, 20:23     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Ответ Создать тему
Опции темы

Текущее время: 02:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru