Форум программистов, компьютерный форум 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++ Объектно ориентированное программирование
C++ Объектно ориентированное программирование.
Ищу ответы на задания из книги Лафоре Р. "Объектно-ориентированное программирование в С++" 4 издание. C++
C++ Объектно-ориентированное программирование C++
C++ Объектно-ориентированное программирование в С++ ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tiki-Tiki
0 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 3
08.11.2013, 01:05     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #101
Цитата Сообщение от Sabbat Посмотреть сообщение
кстати в функции mid(), там же вроде с номера символа а не из самого значения символа, если я правильно понял?
у меня только в студии компилирует и больше ни в чем(CodeBlocks,Dev-C++)
ругается на return Pstring2(str);

кто-то ещё делал?
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
#include <iostream>
#include <iomanip>
#include <clocale>
#include <conio.h>
#include <cmath>
#include <string>
#include <stdlib.h>
#include <process.h>
using namespace std;
//static int SZ=30
static int j;
class String
{
protected:
    enum{SZ=30};
    char str[SZ];
public:
    String()
    {str[0]='\x0';}
    String(char s[])
    {strcpy(str,s);}
    void display()const
    {cout<<str<<endl;}
    operator char*()
    {return str;}
};
class Pstring:public String
{
public:
    Pstring():String()
    {}
    Pstring(char s[])
    {
        if(strlen(s)>SZ-1)
        {
            for(j=0;j<SZ-1;j++)
                str[j]=s[j];
                str[j]='\0';
        }
        else
            strcpy(str,s);      
    }
    void display()const
    {String::display();}
};
//////////////////////////////////////////////////////////////
class Pstring2:public Pstring
{
private:
    int n;
    int simbol;
public:
    Pstring2():Pstring()
    {}
    Pstring2(char s[]):Pstring(s)
    {}
    Pstring2& left(Pstring s1,int n)
    {
        for(j=0;j<=n;j++)
        {
            str[j]=s1[j];
            if(j==n){
                str[j]='\0';}
        }
        return Pstring2(str);       
    }
    Pstring2& mid(Pstring s1,int simbol,int n)
    {
        int t=simbol+n;
        for(j=simbol;j<=t;j++)
        {
            str[j]=s1[j];
            if(j==t){
                str[j]='\0';}
        }
            return Pstring2(str);
    }
    Pstring2& right(Pstring s1,int n)
    {
 
        int t=strlen(s1)-n;
        for(int j=0; j<=strlen(s1); j++){
            str[j]=s1[j+t];
            if(j==strlen(s1)){
                str[j]='\0';
            }
        }
        return Pstring2(str);
    }
};
int main()
{
setlocale(LC_ALL, "");
//Pstring s1="Это ахренеть какая длинная строка и врядли она сможет влезть в это долбанный массив,который в край меня задолбал!";
//s1.display();
//Pstring s2="А это вероятно влезет";
//s2.display();
Pstring s1="Это ахренеть какая длинная строка";
Pstring2 s2,s3,s4;
s2.left(s1,5);
s2.display();
s3.mid(s1,4,10);
s3.display();
s4.right(s1,6);
s4.display();
return 0;
}

У меня так
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MA4ETE44
11 / 1 / 1
Регистрация: 06.08.2012
Сообщений: 14
08.11.2013, 12:29     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #102
Цитата Сообщение от Tiki-Tiki Посмотреть сообщение

С какими конкретно задачами беда?
Сам пример в пункте "Структура circle" задачка circstrc.cpp, при компиляции выдает следующее

Кликните здесь для просмотра всего текста
1. error C2664: CreateFileW: невозможно преобразовать параметр 1 из "const char [8]" в "LPCWSTR"
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции

2. error C2065: j: необъявленный идентификатор


на п.2 я как бы вроде нашел нюанс с j , а вот на п.1 хз, я ничего в коде не менял, взял 3 исходника с книги.
Tiki-Tiki
0 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 3
08.11.2013, 12:49     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #103
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
#include <iostream>
//#include <iomanip>
#include <clocale>
#include <conio.h>
//#include <cmath>
//#include <string>
#include <stdlib.h>
#include <process.h>
using namespace std;
//static int SZ=30
static int j;
class String
{
protected:
    enum{SZ=30};
    char str[SZ];
public:
    String()
    {str[0]='\x0';}
    String(char s[])
    {strcpy(str,s);}
    void display()const
    {cout<<str<<endl;}
    operator char*()
    {return str;}
};
class Pstring:public String
{
public:
    Pstring():String()
    {}
    Pstring(char s[])
    {
        if(strlen(s)>SZ-1)
        {
            for(j=0;j<SZ-1;j++)
                str[j]=s[j];
                str[j]='\0';
        }
        else
            strcpy(str,s);      
    }
    void display()const
    {String::display();}
};
//////////////////////////////////////////////////////////////
class Pstring2:public Pstring
{
private:
    int n;
    int simbol;
public:
    Pstring2():Pstring()
    {}
    Pstring2(char s[]):Pstring(s)
    {}
    Pstring2& left(Pstring s1,int n)
    {
        for(j=0;j<=n;j++)
        {
            str[j]=s1[j];
            if(j==n){
                str[j]='\0';}
        }
        return Pstring2(str);       
    }
    Pstring2& mid(Pstring s1,int simbol,int n)
    {
        int t=simbol+n;
        for(j=simbol;j<=t;j++)
        {
            str[j]=s1[j];
            if(j==t){
                str[j]='\0';}
        }
            return Pstring2(str);
    }
    Pstring2& right(Pstring s1,int n)
    {
 
        int t=strlen(s1)-n;
        for(int j=0; j<=strlen(s1); j++){
            str[j]=s1[j+t];
            if(j==strlen(s1)){
                str[j]='\0';
            }
        }
        return Pstring2(str);
    }
};
int main()
{
setlocale(LC_ALL, "");
//Pstring s1="Это ахренеть какая длинная строка и врядли она сможет влезть в это долбанный массив,который в край меня задолбал!";
//s1.display();
//Pstring s2="А это вероятно влезет";
//s2.display();
Pstring s1="Это ахренеть какая длинная строка";
Pstring2 s2,s3,s4;
s2.left(s1,5);
s2.display();
s3.mid(s1,4,10);
s3.display();
s4.right(s1,6);
s4.display();
return 0;
}
у меня 9.8 такой
Sabbat
 Аватар для Sabbat
135 / 23 / 1
Регистрация: 19.10.2012
Сообщений: 43
08.11.2013, 20:54     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #104
Цитата Сообщение от Tiki-Tiki Посмотреть сообщение
Кликните здесь для просмотра всего текста
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
#include <iostream>
//#include <iomanip>
#include <clocale>
#include <conio.h>
//#include <cmath>
//#include <string>
#include <stdlib.h>
#include <process.h>
using namespace std;
//static int SZ=30
static int j;
class String
{
protected:
    enum{SZ=30};
    char str[SZ];
public:
    String()
    {str[0]='\x0';}
    String(char s[])
    {strcpy(str,s);}
    void display()const
    {cout<<str<<endl;}
    operator char*()
    {return str;}
};
class Pstring:public String
{
public:
    Pstring():String()
    {}
    Pstring(char s[])
    {
        if(strlen(s)>SZ-1)
        {
            for(j=0;j<SZ-1;j++)
                str[j]=s[j];
                str[j]='\0';
        }
        else
            strcpy(str,s);      
    }
    void display()const
    {String::display();}
};
//////////////////////////////////////////////////////////////
class Pstring2:public Pstring
{
private:
    int n;
    int simbol;
public:
    Pstring2():Pstring()
    {}
    Pstring2(char s[]):Pstring(s)
    {}
    Pstring2& left(Pstring s1,int n)
    {
        for(j=0;j<=n;j++)
        {
            str[j]=s1[j];
            if(j==n){
                str[j]='\0';}
        }
        return Pstring2(str);       
    }
    Pstring2& mid(Pstring s1,int simbol,int n)
    {
        int t=simbol+n;
        for(j=simbol;j<=t;j++)
        {
            str[j]=s1[j];
            if(j==t){
                str[j]='\0';}
        }
            return Pstring2(str);
    }
    Pstring2& right(Pstring s1,int n)
    {
 
        int t=strlen(s1)-n;
        for(int j=0; j<=strlen(s1); j++){
            str[j]=s1[j+t];
            if(j==strlen(s1)){
                str[j]='\0';
            }
        }
        return Pstring2(str);
    }
};
int main()
{
setlocale(LC_ALL, "");
//Pstring s1="Это ахренеть какая длинная строка и врядли она сможет влезть в это долбанный массив,который в край меня задолбал!";
//s1.display();
//Pstring s2="А это вероятно влезет";
//s2.display();
Pstring s1="Это ахренеть какая длинная строка";
Pstring2 s2,s3,s4;
s2.left(s1,5);
s2.display();
s3.mid(s1,4,10);
s3.display();
s4.right(s1,6);
s4.display();
return 0;
}


у меня 9.8 такой
Всё равно только в студии компилирует, а так ошибка
D:\Other\Cpp_les_lafore\work.cpp In member function `Pstring2& Pstring2::left(Pstring, int)':
65 D:\Other\Cpp_les_lafore\work.cpp invalid initialization of non-const reference of type 'Pstring2&' from a temporary of type 'Pstring2'
D:\Other\Cpp_les_lafore\work.cpp In member function `Pstring2& Pstring2::mid(Pstring, int, int)':
76 D:\Other\Cpp_les_lafore\work.cpp invalid initialization of non-const reference of type 'Pstring2&' from a temporary of type 'Pstring2'
D:\Other\Cpp_les_lafore\work.cpp In member function `Pstring2& Pstring2::right(Pstring, int)':
88 D:\Other\Cpp_les_lafore\work.cpp invalid initialization of non-const reference of type 'Pstring2&' from a temporary of type 'Pstring2'
если в компиляторе проблема то ладно, но а если в самой реализации то как бы интересен вариант который будет работать не только в студии.
halmikar
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 3
13.11.2013, 11:53     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #105
Подскажите пожалуйста. В примере strconv главы 8 используется перечисление. Если вместо перечисления использовать константу, то выдает ошибку. Не могу понять в этом примере перечисление обязательное условие или проблема в компиляторе. Использую VS 2010

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
#include <iostream>
#include <string.h>
#include <Windows.h>
 
using namespace std;
 
class String
{
private:
    const int SZ = 80;
    char str[SZ];
public:
    String()
    {str[0] = '\0';}
    String(char s[])
    {strcpy(str, s);}
 
    void display()const
    {
        cout << str;
    }
    operator char*()
    {
        return str;
    }
};
 
int main()
{
    SetConsoleOutputCP(1251);
    String s1;
 
    char xstr[] = "Ура товарищи!!!";
    s1 = xstr;
 
    s1.display();
    String s2 = "Мы победим";
    cout << static_cast<char*>(s2);
    cout << endl;
 
    system("PAUSE");
    return 0;
}
Sabbat
 Аватар для Sabbat
135 / 23 / 1
Регистрация: 19.10.2012
Сообщений: 43
18.11.2013, 21:30     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #106
halmikar возможно
C++
1
static const int SZ = 80;
MA4ETE44
11 / 1 / 1
Регистрация: 06.08.2012
Сообщений: 14
08.12.2013, 19:03     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #107
Всем привет, сегодня закончи 6ую главу и так же как и многие мучился с задачей 12

разбирал код Рики и Kins, в итоге сделал свой вариант, выложу, может кому интересно будет
Кликните здесь для просмотра всего текста

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
main.cpp
#include <iostream>
#include <cmath>
#include "fraction.h"
 
 
 
int main()
{
    setlocale(LC_ALL,"");
    fraction fr1;
    fr1.get_devidend();
    return 0;
}
 
fraction.h
 
#include <iomanip>
class fraction
{
private:
    int devider, devidend;
public:
    fraction(): devider(0), devidend(0)
    {}
    fraction(int x, int y):devider(x), devidend(y)
    {}
    void get();
    void show() const;
    void add(fraction fr1, fraction fr2);
    void sub(fraction fr1, fraction fr2);
    void mul(fraction fr1, fraction fr2);
    void div(fraction fr1, fraction fr2);
    void lowterns(int, int);
    void tableMul();
    void get_devidend();
};
void fraction::get()
{
    char ch;
    std::cin >> devider >> ch >> devidend;
}
void fraction::show() const
{
    std::cout << devider << "/" << devidend << std::endl;
}
void fraction::add(fraction fr1, fraction fr2)
{
    devider = (fr1.devider * fr2.devidend + fr1.devidend * fr2.devider);
    devidend = (fr1.devidend * fr2.devidend);
 
}
void fraction::sub(fraction fr1, fraction fr2)
{
    devider = (fr1.devider * fr2.devidend - fr2.devidend * fr2.devider);
    devidend = (fr2.devidend * fr2.devidend);
 
}
void fraction::mul(fraction fr1, fraction fr2)
{
    devider = (fr1.devider *  fr2.devider);
    devidend = (fr1.devidend * fr2.devidend);
 
}
void fraction::div(fraction fr1, fraction fr2)
{
    devider = (fr1.devider *  fr2.devidend);
    devidend = (fr1.devidend * fr2.devider);
}
void fraction::lowterns(int x, int y)
{
    long tnum, tden, temp, gcd;
    tnum = labs(x);
    tden = labs(y);
    if (tden == 0)      //проверка знаменателя на 0
    {
        std::cout << "Недопустимый знаменатель!";
        exit(1);
    }
    else if (tnum == 0)     //проверка числителя на 0
    {
        x = 0; y = 1; return;
    }
    //нахождение наибольшего общего делителя
    while (tnum != 0)
    {
        if (tnum < tden)
        {
            temp = tnum; tnum = tden; tden = temp;
        }
        tnum = tnum - tden;
        gcd = tden;
        x = x / gcd;
        y = y / gcd;
    }
}
void fraction::tableMul()
{
    for ( int j = 1 ; j < devidend ; j++)
    {
        std::cout << std::endl;
        for (int i = 1 ; i < devidend; i++)
        {
            int x, y;
            x = i * j;
            y = devidend * devidend;
            lowterns(x, y);
            std::cout << std::setw(3) << x << "/" << y << " ";
            
        }
    }
}
void fraction::get_devidend()
{
    std::cout << "Введите знаменатель ";
    std::cin >> devidend;
    tableMul();
}


Добавлено через 2 часа 1 минуту
сначала добавил, потом понял что lowterns() работает некорректно , подправил вот так:
Кликните здесь для просмотра всего текста

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
main.cpp
#include <iostream>
#include <cmath>
#include "fraction.h"
 
 
 
int main()
{
    setlocale(LC_ALL,"");
    fraction fr1;
    fr1.get_devidend();
    
    return 0;
}
 
fraction.h
 
#include <iomanip>
class fraction
{
private:
    int devider, devidend, devider1, devidend1;
    
public:
    fraction(): devider(0), devidend(0)
    {}
    fraction(int x, int y):devider(x), devidend(y)
    {}
    void get();
    void show() const;
    void add(fraction fr1, fraction fr2);
    void sub(fraction fr1, fraction fr2);
    void mul(fraction fr1, fraction fr2);
    void div(fraction fr1, fraction fr2);
    inline void lowterns();
    void tableMul();
    void get_devidend();
};
 
void fraction::get()
{
    char ch;
    std::cin >> devider >> ch >> devidend;
}
void fraction::show() const
{
    std::cout << devider << "/" << devidend << std::endl;
}
void fraction::add(fraction fr1, fraction fr2)
{
    devider = (fr1.devider * fr2.devidend + fr1.devidend * fr2.devider);
    devidend = (fr1.devidend * fr2.devidend);
 
}
void fraction::sub(fraction fr1, fraction fr2)
{
    devider = (fr1.devider * fr2.devidend - fr2.devidend * fr2.devider);
    devidend = (fr2.devidend * fr2.devidend);
 
}
void fraction::mul(fraction fr1, fraction fr2)
{
    devider = (fr1.devider *  fr2.devider);
    devidend = (fr1.devidend * fr2.devidend);
 
}
void fraction::div(fraction fr1, fraction fr2)
{
    devider = (fr1.devider *  fr2.devidend);
    devidend = (fr1.devidend * fr2.devider);
}
inline void fraction::lowterns()
{
    long tnum, tden, temp, gcd;
    tnum = labs(devider1);
    tden = labs(devidend1);
    if (tden == 0)      //проверка знаменателя на 0
    {
        std::cout << "Недопустимый знаменатель!";
        exit(1);
    }
    else if (tnum == 0)     //проверка числителя на 0
    {
        devider1 = 0; devidend1 = 1; return;
    }
    //нахождение наибольшего общего делителя
    while (tnum != 0)
    {
        if (tnum < tden)
        {
            temp = tnum; tnum = tden; tden = temp;
        }
        tnum = tnum - tden;
    }
        gcd = tden;
        devider1 = devider1 / gcd;
        devidend1 = devidend1 / gcd;
        
        
    
}
    
void fraction::tableMul()
{
 
    for ( int j = 1 ; j < devidend ; j++)
    {
        
        std::cout << std::endl;
        for (int i = 1 ; i < devidend; i++)
        {
            
            devider1 = i * j;
            devidend1 = devidend * devidend;
            lowterns();
            std::cout << std::setw(2) << devider1 << "/" << std::setw(2) << devidend1 << " ";
            
        }
    }
}
void fraction::get_devidend()
{
    std::cout << "Введите знаменатель ";
    std::cin >> devidend;
    tableMul();
}
Chudakulli
1 / 1 / 0
Регистрация: 16.02.2013
Сообщений: 49
18.01.2014, 02:08     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #108
Ребята, не работает код для главы 11 задание 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
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
// Parsirovka strok.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
using namespace std;
 
 
class Token
{
public:
    virtual long double getNumber()=0;
    virtual wchar_t getOperator()=0;
};
 
class Operator:public Token
{
private:
    wchar_t oper;
public:
    Operator(){};
    void setop(wchar_t s)
    {oper=s;}
    wchar_t getOperator(){return oper;}
    long double getNumber(){return 0.0;}
};
 
class Number:public Token
{
private:
    long double num;
public:
    Number():num(0.0){};
    void setnum(long double n){num=n;}
    wchar_t getOperator(){return 'a';}
    long double getNumber(){return num;}
};
 
class Stack
{
private:
    Token **ptr;
    int top;
public:
    Stack()
    {ptr=new Token*[20]; top=0;}
    void push(Token* t)
    {
        *(ptr+top)=t;
        top++;
    }
    Token* pop()
    {
        top--;
        Token *t=*(ptr+top);
        return t;
    }
    int gettop()
    {return top;}
};
 
class Parser
{
private:
    wchar_t* str;
    Stack buffer;
public:
    Parser():str(NULL){}
    Parser(wchar_t *s)
    {str=s;}
    void expresspars()
    {
        Number *lastval=new Number;
        Operator *lastop= new Operator;
        wchar_t oper=NULL;
        long double numeric;        
        bool flagNUM=true;
        for (int i=0;i<1+strlen(reinterpret_cast<char*>(str));)
        {
            if(buffer.gettop() && !flagNUM) //получаем операцию
            {
                oper=*(str+i);
                flagNUM=true;
                i++;
            }
 
            if (flagNUM)
            {
                numeric=0.0;
                while (*(str+i)>='0' && *(str+i)<='9' || *(str+i)=='.') //обрабатываем число
                {
                    if (*(str+i)=='.')
                    {
                        i++;    //пропускаем точку
                        int frac=10;
                        while(*(str+i)>='0' && *(str+i)<='9')
                        {
                            numeric=numeric+((long double)(*(str+i)-'0'))/frac;
                            frac*=10;i++;
                        }
                        break;
                    }
                    numeric=numeric*10+(long double)(*(str+i)-'0');
                    i++; flagNUM=false;
                }
                
                if (oper==NULL) //если это первое число => и операции нет
                {
                    lastval->setnum(numeric);
                    buffer.push(lastval);
                    continue;
                }
 
                switch (oper)
                {
                case '*': lastval->setnum(buffer.pop()->getNumber()*numeric); buffer.push(lastval);break;
                case '/': lastval->setnum(buffer.pop()->getNumber()/numeric); buffer.push(lastval);break;
                case '-':case'+':lastop->setop(oper);lastval->setnum(numeric);buffer.push(lastop);buffer.push(lastval);break;
                default:wcout<<L"Неправильный ввод оператора!!!\n";system("pause");exit(0);//хрень какая-то
                }
                continue;
            }
            
            wcout<<L"Неправильный ввод!!!\n";system("pause");exit(0);//хрень какая-то
        }
    }
    long double sumraz()
    {
        Number* secondVal=new Number;
        Operator* oper=new Operator;
        while (buffer.gettop()-1)
        {
            secondVal->setnum(buffer.pop()->getNumber());
            switch(buffer.pop()->getOperator())
            {
            case '-':secondVal->setnum(buffer.pop()->getNumber()-secondVal->getNumber());break;
            case '+':secondVal->setnum(buffer.pop()->getNumber()+secondVal->getNumber());break;
            default: wcout<<L"Неправильный ввод в сумраз!!!\n";system("pause");exit(0);//хрень какая-то
            }
            buffer.push(secondVal);
        }
        return buffer.pop()->getNumber();
    }
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale (0,".866");
    wchar_t *c=new wchar_t[80];
    wcout<<L"Введите строку >";
    wcin>>c;
    Parser pars(c);
    pars.expresspars();
    wcout<<endl<<L"Результат вычислений узрите: "<<pars.sumraz();
    return 0;
}


Добавлено через 14 минут
Погорячился. Пример из ответов работает.

Добавлено через 13 часов 44 минуты
Сам нашел все ошибки))) Вроде, работает
MA4ETE44
11 / 1 / 1
Регистрация: 06.08.2012
Сообщений: 14
21.01.2014, 13:51     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #109
всегда радует когда сам находишь ошибки
Purcell
 Аватар для Purcell
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 20
22.01.2014, 12:45     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #110
Глава 6. Упражнение 10. Мой вариант решения:
1. Разделил функцию ввода координат в классе Angle на две, так как у широты и у долготы свои особенности (например, 160 градусов широты вы никогда не найдете на карте).
2. Попытался учесть многие мелочи: например, ввод многих недопустимых значений.

Если кто знает, как сократить объем этого кода, сохранив существующую функциональность, буду рад воспринять критику.
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
// класс "Судно"
 
# include <iostream>
 
using namespace std;
////////////////////////////////////////////////////////////////////////////
// класс географических координат
class Angle
{
    private:
        unsigned int degree;      // градусы
        float minute;                // минуты
        char course;                // направление по сторонам света
    public:
        void lat_input()             // ввод данных по широте
        {
            do
            {
                cout << "Введите количество градусов широты: ";
                cin >> degree;
                if (degree > 90)
                {
                    cout << "Вы ввели неправильное значение! Не может быть "
                    << "больше 90 градусов широты." << endl;
                }
            }
            while (degree > 90);
 
            if (degree == 90)
            {
                minute = 0.0;
            }
 
            if (degree != 90)
            {
                do
                {
                    cout << "Введите количество минут в формате '12.5': ";
                    cin >> minute;
                    if (minute > 60.0 || minute < 0.0)
                    {
                        cout << "Вы ввели неправильное значение! Не может быть "
                        << "больше либо равно 60 и меньше 0 минут." << endl;
                    }
                }
                while (minute > 60.0 || minute < 0.0);
            }
 
            if (degree == 0 && minute == 0.0)
            {
                course = 0;
            }
            else
            {
                bool ch;
                do
                {
                    cout << "Введите направление (N или S): ";
                    cin >> course;
                    if (course == 'N')
                    {
                        ch = true;
                    }
                    else if (course == 'S')
                    {
                        ch = true;
                    }
                    else
                    {
                        ch = false;
                        cout << "Неправильное значение!" << endl;
                    }
                }
                while (ch != true);
            }
        }
        void long_input()          // ввод данных по долготе
        {
            do
            {
                cout << "Введите количество градусов долготы: ";
                cin >> degree;
                if (degree > 180)
                {
                    cout << "Вы ввели неправильное значение! Не может быть "
                    << "больше 180 градусов долготы." << endl;
                }
            }
            while (degree > 180);
 
            if (degree == 180)
            {
                minute = 0.0;
            }
 
            if (degree != 180)
            {
                do
                {
                    cout << "Введите количество минут в формате '12.5': ";
                    cin >> minute;
                    if (minute > 60.0 || minute < 0.0)
                    {
                        cout << "Вы ввели неправильное значение! Не может быть "
                        << "больше либо равно 60 и меньше 0 минут." << endl;
                    }
                }
                while (minute > 60.0 || minute < 0.0);
            }
 
            if ((degree == 0 && minute == 0) || degree == 180)
            {
                course = 0;
            }
            else
            {
                bool ch;
                do
                {
                    cout << "Введите направление (W или E): ";
                    cin >> course;
                    if (course == 'W')
                    {
                        ch = true;
                    }
                    else if (course == 'E')
                    {
                        ch = true;
                    }
                    else
                    {
                        ch = false;
                        cout << "Неправильное значение!" << endl;
                    }
                }
                while (ch != true);
            }
        }
 
        int get_degree()          // значение градусов
        {
            return degree;
        }
 
        void coord_output()      // вывод географических координат
        {
            if (course == 0)
            {
                cout << degree << "\u00b0" << minute << "'";
            }
            else
            {
                cout << degree << "\u00b0" << minute << "'" << course;
            }
        }
};
//---------------------------------------------------------------------------
// класс "Судно"
class Ship
{
    private:
        int ship_num;                 // порядковый номер судна
        static int all_ships;         // общее количество созданных суден
        Angle latitude;               // широта местоположения судна
        Angle longitude;              // долгота местоположения судна
    public:
        Ship() : ship_num(0)          // присвоение создаваемому судну
        {                             // порядкового номера
            ship_num = ++all_ships;
        }
 
        void input()                  // ввод координат местоположения судна
        {
            cout << "Введите координаты местоположения судна.\n";
            latitude.lat_input();
            // если широта - полюс, то нет смысла вводить данные по долготе
            if (latitude.get_degree() != 90)
            {
                longitude.long_input();
            }
            for (int i = 0; i < 40; i++)
            {
                cout << "-";
            }
            cout << endl;
        }
        void output()                // вывод координат местоположения судна
        {
            cout << "Судно №" << ship_num << ".\n" <<
            "Координаты его местоположения: ";
            latitude.coord_output();
            // если широта - полюс, то нет смысла выводить пустые поля
            // долготы
            if (latitude.get_degree() != 90)
            {
                cout << ", ";
                longitude.coord_output();
            }
            cout << endl;
            for (int i = 0; i < 40; i++)
            {
                cout << "-";
            }
            cout << endl;
        }
};
//---------------------------------------------------------------------------
int Ship::all_ships = 0;      // вначале ни одно судно ещё не создано
//////////////////////////////////////////////////////////////////////////////
int main()
{
    Ship obj_1, obj_2, obj_3;
    obj_1.input();
    obj_2.input();
    obj_3.input();
    obj_1.output();
    obj_2.output();
    obj_3.output();
    return 0;
}
Chudakulli
1 / 1 / 0
Регистрация: 16.02.2013
Сообщений: 49
22.01.2014, 14:11     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #111
Ребята, кто-нибудь решил задачу 9 из 11 главы "по условию"? Сколько думаю над ней, никак не могу ничего придумать. Ведь по условию нельзя изменять существующие классы, нужно все организовать потомками? Это вот "классу comhorse необходимо перегрузить hArray" совсем с толку сбивает.
Chudakulli
1 / 1 / 0
Регистрация: 16.02.2013
Сообщений: 49
27.01.2014, 00:00     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #112
Ребята, вот что-то похожее замутил. Задача 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
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include "msoftcon.h"
using namespace std;
const int CPF = 5;
const int maxHorses = 7;
class track;
////////////////////////////////////////////////////////////////////
class horse
{
protected:
    const track* ptrTrack;
    const int horse_number;
    float finish_time;
    float distance_run;
public:
    horse (const int n, const track* ptrT):horse_number (n), ptrTrack(ptrT), distance_run(0.0){};
    ~horse (){};
    void display_horse (const float elapsed_time);
};
 
class comhorse:private horse
{
 
public:
    comhorse(const int n, const track* ptrT):horse(n, ptrT){}
 
    void display_horse (const float elapsed_time)
    {
        horse::display_horse(elapsed_time);
    }
 
    float get_distance()
    {return distance_run;}
 
    void horse_tick()
    {
        set_cursor_pos (1+int(distance_run*CPF), 2+horse_number*2);
        set_color(static_cast<color>(cBLUE + horse_number));
        char horse_char='0'+static_cast<char>(horse_number);
        cout<<' '<<'\xDB'<<horse_char<<'\xDB';
        distance_run+=0.2F;}
};
///////////////////////////////////////////////////
class track
{
protected:
    horse *hArray[maxHorses];
    int total_horses;
    int horse_count;
    const float track_length;
    float elapsed_time;
public:
    track(float lenT, int nH);
    ~track();
    void display_track();
    void run();
    float get_track_len()const;
};
 
class comtrack:public track
{
private:
    comhorse *hArray[maxHorses];
public:
    comtrack(float lenT, int nH):track(lenT,nH)
    {
        horse_count=0;
        for(int j=0;j<total_horses;j++)
            hArray[j]=new comhorse (horse_count++, this);
    }
    void run()
    {
        while(!_kbhit())
    {
        int horse_leader=0;
        float otryv=0.0;
        
        elapsed_time+=1.75;
        for(int j=0;j<total_horses;j++)
            hArray[j]->display_horse (elapsed_time);
                
        for(int j=0;j<total_horses;j++)
        {
            if (hArray[horse_leader]->get_distance()<hArray[j]->get_distance())//определяем лидера
                horse_leader=j;
        }
 
        set_cursor_pos (2,20);
        cout<<horse_leader;
 
        for(int j=0;j<total_horses;j++)
        {
            if (hArray[horse_leader]->get_distance()-hArray[j]->get_distance()>otryv)//измеряем отрыв
                otryv=hArray[horse_leader]->get_distance()-hArray[j]->get_distance();
        }
        set_cursor_pos (2,21);
        cout<<otryv;
 
        if ((hArray[horse_leader]->get_distance()>(track_length+1.0/CPF)/2) && (hArray[horse_leader]->get_distance()<(track_length+1.0/CPF)) && (otryv<=2.2F))
        {hArray[horse_leader]->horse_tick();cout<<"\a";}
        
        wait (100);
    }
    _getch();
    cout<<endl;
    }
};
////////////////////////////////////////////////////
void horse::display_horse(float elapsed_time)
{
    set_cursor_pos (1+int(distance_run*CPF), 2+horse_number*2);
    set_color(static_cast<color>(cBLUE + horse_number));
    char horse_char='0'+static_cast<char>(horse_number);
    cout<<' '<<'\xDB'<<horse_char<<'\xDB';
    if (distance_run<ptrTrack->get_track_len()+1.0/CPF)
    {
        if (rand()%3)
            distance_run+=0.2F;
        finish_time=elapsed_time;
    }else
    {
        int mins=int(finish_time)/60;
        int secs=int(finish_time)-mins*60;
        wcout<<L" Время = "<<mins<<L":"<<secs;
    }
}
/////////////////////////////////////////////////////
track::track(float lenT,int nH): track_length(lenT),total_horses(nH), horse_count(0), elapsed_time(0.0)
{
    wcout<<L"track\n";
    init_graphics();
    total_horses=(total_horses>maxHorses)?maxHorses:total_horses;
    for(int j=0;j<total_horses;j++)
        hArray[j]=new horse (horse_count++, this);
    time_t aTime;
    srand (static_cast<unsigned>(time(&aTime)));
    display_track();
}
////////////////////////////////////////////////////
track::~track()
{
    for(int j=0;j<total_horses;j++)
        delete hArray[j];
}
/////////////////////////////////////////////////
void track::display_track()
{
    clear_screen();
 
    for (int f=0;f<=track_length;f++)
        for (int r=1;r<=total_horses*2+1;r++)
        {
                set_cursor_pos (f*CPF+5,r);
                if (f==0||f==track_length)
                    cout<<'\xDE';
                else
                    cout<<'\xB3';
        }
}
/////////////////////////////////////////////////
void track::run()
{
    while(!_kbhit())
    {
        elapsed_time+=1.75;
 
        for(int j=0;j<total_horses;j++)
            hArray[j]->display_horse (elapsed_time);
        wait (250);
    }
    _getch();
    cout<<endl;
}
/////////////////////////////////////////////////
float track::get_track_len()const
{return track_length;}
/////////////////////////////////////////////////
int main()
{
    setlocale(LC_CTYPE,".866");
    float length;
    int total;
 
    wcout<<L"\nВведите длину дистанции: ";
    cin>>length;
    wcout<<L"\nВведите количество лошадей (от 1 до 7): ";
    cin>>total;
    comtrack theTrack(length, total);
    theTrack.run();
 
 
 
    return 0;
}
Chudakulli
1 / 1 / 0
Регистрация: 16.02.2013
Сообщений: 49
19.02.2014, 09:42     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #113
Это пример из Лафоре. Программа запрашивает и сохраняет данные о работниках. Баг у меня заключается в том, что при завершении программы, последующем ее запуске, чтении из файла возникает ошибка при выводе данных всех работников. Хотя если не выходить из программы, то и записываются, и считываются, и выводятся данные без проблем. Что может быть причиной?

Кликните здесь для просмотра всего текста
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
#include <fstream>
#include <iostream>
#include <typeinfo>
#include <process.h>
using namespace std;
 
const int LEN = 32; //длина фамилий
const int MAXEM = 100; //максимальное число работников
 
enum employee_type {tmanager, tscientist, tlaborer};
 
class employee
{
private:
    wchar_t name[LEN];
    unsigned long number;
    static int n; //текущее число работников
public:static employee* arrap[];
public:
    virtual void getdata()
    {
        //wcin.ignore(numeric_limits<streamsize>::max(),'n');
        wcout<<L"Введите фамилию: ";wcin>>name;
        wcout<<L"Введите номер: ";wcin>>number;
    }
    virtual void putdata()
    {
        wcout<<L"\n Фамилия: "<<name;
        wcout<<L"\n Номер: "<<number;
    }
    virtual employee_type get_type();
    static void add();
    static void display();
    static void read();
    static void write();
};
 
//Статические переменные:
int employee::n=0;
employee* employee::arrap[MAXEM];
 
/////////////потомки////////////////////////
class manager:public employee
{
private:
    wchar_t title[LEN];
    double nalogi_golf;
public:
    void getdata()
    {
        employee::getdata();
        wcout<<L"Введите титул: "; wcin>>title;
        wcout<<L"Введите налоги за гольф: "; wcin>>nalogi_golf;
    }
    void putdata()
    {
        employee::putdata();
        wcout<<L"\n Титул: "<<title;
        wcout<<L"\n Налоги за гольф: "<<nalogi_golf;
    }
};
 
class scientist:public employee
{
private:
    int pubs;
public:
    void getdata()
    {
        employee::getdata();
        wcout<<L"Введите число публикаций: ";wcin>>pubs;
    }
    void putdata()
    {
        employee::putdata();
        wcout<<L"\n Число публикаций: "<<pubs;
    }
};
 
class laborer:public employee
{};
////////////////////////////////////////////
//Добавить работника в список
void employee::add()
{
    char ch;
    wcout<<L"'m' для добавления менеджера"
        L"\n's' для добавления ученого"
        L"\n'l' для добавления рабочего"
        L"\nВаш выбор: ";
    cin>>ch;
    switch (ch)
    {
    case 'm': arrap[n]=new manager;break;
    case 's': arrap[n]=new scientist;break;
    case 'l': arrap[n]=new laborer;break;
    default: wcout<<L"\nНеизвестный тип работника\n";return;
    }
    arrap[n]->getdata();
    n++;
}
 
void employee::display()
{
    for (int i=0;i<n;i++)
    {
        cout<<i+1;
        switch(arrap[i]->get_type()) // ВОТ В ЭТОМ МЕСТЕ ОШИБКА ПРИ ОБРАЩЕНИИ ПО УКАЗАТЕЛЮ
        {
        case tmanager: wcout<<L". Тип: Менеджер\n";break;
        case tscientist: wcout<<L". Тип: Ученый\n";break;
        case tlaborer: wcout<<L". Тип: Рабочий\n";break;
        default: wcout<<L". Неизвестный тип работника!\n";return;
        }
        arrap[i]->putdata();
        cout<<endl;
    }
}
 
 
//Определение типа
employee_type employee::get_type()
{
    if (typeid(*this)==typeid(manager))
        return tmanager;
    else if (typeid(*this)==typeid(scientist))
        return tscientist;
    else if (typeid(*this)==typeid(laborer))
        return tlaborer;
    else {wcerr<<L"\nНеправильный тип работника!\n"; exit(1);}
    return tmanager;
}
 
//Запись объектов из ОЗУ в ПЗУ
void employee::write()
{
    int size;
    wcout<<L"\nИдет запись "<<n<<L"работников.\n";
    ofstream ouf;
    employee_type etype;
    ouf.open("EMPLOY.DAT", ios::trunc | ios::binary);
    if (!ouf)
    {wcout<<L"\nНевозможно открыть файл для записи\n";return;}
    for (int i=0;i<n;i++)
    {
        etype=arrap[i]->get_type();
        ouf.write(reinterpret_cast<char*>(&etype),sizeof(etype));
        switch(etype)
        {
        case tmanager: size=sizeof(manager);break;
        case tscientist: size=sizeof(scientist);break;
        case tlaborer: size=sizeof(laborer);break;
        }
        ouf.write(reinterpret_cast<char*>(arrap[i]),size);
        if(!ouf) {wcout<<L"\nЗапись невозможна!!! Хз, почему...\n"; return;}
    }
    ouf.close();
}
//Чтение из ПЗУ в ОЗУ
void employee::read()
{
    int size;
    employee_type etype;
    ifstream inf;
    inf.open("EMPLOY.DAT", ios::binary);
    if (!inf) {wcout<<L"\nНевозможно открыть файл для чтения!\n";return;}
    n=0;
    while(true)
    {
        inf.read(reinterpret_cast<char*>(&etype), sizeof(etype));
        if (inf.eof()) break;
        if(!inf) {wcout<<L"\nНевозможно чтение типа.\n";return;}
        switch(etype)
        {
        case tmanager:
            arrap[n]=new manager;
            size=sizeof(manager);
            break;
        case tscientist:
            arrap[n]=new scientist;
            size=sizeof(scientist);
            break;
        case tlaborer:
            arrap[n]=new laborer;
            size=sizeof(laborer);
            break;
        default: wcout<<L"\nНеизвестный тип в файле!\n";return;
        }
        inf.read(reinterpret_cast<char*>(arrap[n]),size);
        if (!inf) {wcout<<L"\nЧтение данных из файла невозможно!\n";return;}
        n++;
    }
    wcout<<L"Идет чтение "<<n<<L" работников\n";
    inf.close();
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0,".866");
    char ch;
    while(true)
    {
        wcout<<L"'a' - добавление сведений о работнике"
            L"\n'd' - вывести сведения обо всех работниках"
            L"\n'w' - записать все данные в файл"
            L"\n'r' - прочитать все данные из файла"
            L"\n'x' - выход"
            L"\nВаш выбор: ";
        cin>>ch;
        switch(ch)
        {
        case 'a': employee::add();break;
        case 'd': employee::display(); break;
        case 'w': employee::write();break;
        case 'r': employee::read();break;
        case 'x': exit(0);
        default: wcout<<L"\nНеизвестная команда!\n";
        }
        
    }
    return 0;
}
xvivax
1 / 1 / 0
Регистрация: 07.09.2013
Сообщений: 25
27.02.2014, 04:27     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #114
Задача 6, Глава 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
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
#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <ctime>
using namespace std;
 
//В игре бридж каждому из игроков раздают 13 карт, таким образом колода расходуется полностью.Модифицируйте программу CARDARAY 
//этой главы так, чтобы после перемешивания колоды она делилась на четыре части по 13 карт каждая.Каждая из четырех групп карт
//затем должна быть выведена.
 
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()
{
    card deck[52];
    card group[4][52];
    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 << "\nПеремешанная колода:\n";
    for (j = 0; j < 52; j++)
    {
        deck[j].display();
        cout << " ";
        if (!((j + 1) % 13)) // начинаем новую строку после каждой 13-й карты
            cout << endl;
    }
 
    int k = 0; // deck of cards 0-52
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 13; j++)
        {
            group[i][j] = deck[k]; // insert card into group
            k++; // increment card
        }
    }
 
    cout << endl;
 
    // Display deck of card by group
    for (int i = 0; i < 4; i++)
    {
        cout << "#" << i << "Group" << endl;
        for (int j = 0; j < 13; j++)
        {
            group[i][j].display();
        }
        cout << endl;
    }
    _getche();
    return 0;
}
xvivax
1 / 1 / 0
Регистрация: 07.09.2013
Сообщений: 25
28.02.2014, 17:08     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #115
Задача 9, Глава 7
Мой вариант заключаетя в том что метод get() полностью удаляет элемент из очереди
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <conio.h>
using namespace std;
 
class queue
{
private:
    static const int MAX = 10;
    int st[MAX]; // стек в виде массива
    int head, tail;
public:
    queue() // конструктор
    {
        head = 0, tail = 0;
    }
    void put(int var) // поместить в очередь
    {
        if (tail > MAX - 1)
        {
            tail = 0;
            st[tail++] = var;
        }
        else
        {
            st[tail++] = var;
        }
    }
    void get()
    {
        for (int head = 0; head < MAX - 1; head++)
        {
            st[head] = st[head + 1];
        }
        st[tail--];
        st[MAX - 1] = 0;
    }
    void fillArr()
    {
        for (int i = 0; i < MAX; i++)
        {
            st[i] = 0;
        }
    }
    void showArr()
    {
        for (int i = 0; i < MAX; i++)
        {
            cout << st[i] << " ";
        }
        cout << endl;
    }
};
 
int main()
{
    queue st1;
    st1.put(1);
    st1.put(2);
    st1.put(3);
    st1.put(4);
    st1.put(5);
    st1.put(6);
    st1.put(7);
    st1.put(8);
    st1.put(9);
    st1.put(10);
    st1.get();
    st1.showArr();
    _getch();
    return 0;
}
Purcell
 Аватар для Purcell
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 20
10.03.2014, 16:06     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #116
Глава 7. Связанные друг с другом задачи 7, 11 и 12. Попытался решить их, сохранив использование типа long double.

Упражнение 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
// преобразование строки в "денежном" формате в число типа long double
 
#include <iostream>
#include <cstring> // для функции strlen()
#include <iomanip> // для манипулятора setprecision()
#include <stdlib.h> // для функции strtold()
 
using namespace std;
//////////////////////////////////////////////////////
class Money
{
    private:
        char mstring[100];  // сумма в "денежном" формате
        long double umoney; // для хранения суммы в другом формате
    public:
        // перевод суммы из "денежного" формата в число типа long double
        void mstold(char mas[])
        {
            for (int i = 0, j = 0; i < strlen(mas); i++)
            {
                // пропускаем все элементы массива, не являющиеся
                // цифрой или точкой
                if (isdigit(mas[i]) || mas[i] == '.')
                {
                    mstring[j++] = mas[i];
                } 
            }
            umoney = strtold(mstring, NULL); // преобразование в long double
        }
        // вывод числа типа long double
        void output() const
        {
            cout << fixed << setprecision(2) << umoney << endl;
        }
};
/////////////////////////////////////////////////////
int main()
{
    char mas[100];
    char ch;
    Money obj;
    do
    {
        cout << "Введите денежную сумму: ";
        cin >> mas;
        obj.mstold(mas);
        obj.output();
        cout << "Продолжить (y/n) ? ";
        cin >> ch;
    }
    while (ch != 'n');
    return 0;
}


Упражнение 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
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
/* функция для преобразования числа типа long double
   в строку и для вывода её в "денежном" формате */
 
#include <iostream>
#include <stdio.h> // для функции sprintf()
#include <cstring> // для функции strlen()
using namespace std;
//-----------------------------------------------------------------
// функция для ввода числа типа long double
long double input()
{
    long double umoney;
    do
    {
        cout << "Введите денежную сумму: ";
        cin >> umoney;
        if (umoney > 9999999999999990.00)
        {
            cout << "Сумма слишком велика!" << endl;
        }
        if (umoney < 0)
        {
            cout << "Сумма не может быть отрицательным числом!" << endl;
        }
    }
    while (umoney > 9999999999999990.00 || umoney < 0);
    return umoney;
}
//-------------------------------------------------------------------
/* функция для преобразования числа типа long double
   в строку и для вывода её в "денежном" формате */
void ldtoms(long double ldmoney)
{
    char ustring[100];  // буфер
    char outmoney[100]; // строка для вывода суммы
    int len;      // количество символов в буфере ustring
    int zero;     // количество нулей перед числом
    // конвертация суммы из long double в массив символов
    // с сохренением 2-х знаков после запятой
    if (ldmoney >= 0 && ldmoney <= 9999999999999990.00)
    {
        sprintf (ustring, "%.2Lf", ldmoney);
    }
    else
    {
        cout << "Введенное вами число не находится в допустимом "
        "диапазоне!" << endl;
    }
 
    len = strlen(ustring);
    zero = 19 - len;
    // сначала создается массив с нулями в начале строки
    // и со всеми запятыми
    outmoney[0] = '$';
    for (int count = 1, count_2 = 0; count <= 24; count++)
    {
        switch (count)
        {
            case (2): outmoney[count] = ','; break;
            case (6): outmoney[count] = ','; break;
            case (10): outmoney[count] = ','; break;
            case (14): outmoney[count] = ','; break;
            case (18): outmoney[count] = ','; break;
            default:
                if (zero != 0)
                {
                    outmoney[count] = '0';
                    zero--;
                }
                else
                {
                    outmoney[count] = ustring[count_2++];
                }
        }
        if (count == 24)
        {
            outmoney[++count] = '\0';
        }
    }
    // потом убираются все нули в начале строки и лишние запятые
    while (outmoney[1] == '0' || outmoney[1] == ',')
    {
        for (int count = 1; count <= 24; count++)
        {
            outmoney[count] = outmoney[count + 1];
        }
    }
    cout << outmoney << endl;
}
//-------------------------------------------------------------------
int main()
{
    long double money;
    char ch;
    do
    {
        money = input();
        ldtoms(money);
        cout << "Продолжить (y/n)? ";
        cin >> ch;
    }
    while (ch != 'n');
    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
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
/* объединение упражнений 7 и 11 с добавлением функции
   для сложения двух объектов типа BMoney              */
 
#include <iostream>
#include <cstring> // для функции strlen()
#include <stdlib.h> // для функций strtold() и exit()
#include <stdio.h> // для функции sprintf()
 
using namespace std;
//////////////////////////////////////////////////////////////
class BMoney
{
    private:
        char mstring[100];    // сумма в "денежном" формате
        long double umoney;   // для хранения суммы в другом формате
        char ustring[100];    // буфер
        char outmoney[100];  // строка для вывода суммы
    public:
        // ввод суммы
        void putmoney()
        {
            cout << "Введите сумму (от '$0.00' до "
            "'$9,999,999,999,999,990.00)': ";
            cin >> mstring;
            if (mstring[0] == '-' || mstring[1] == '-')
            {
                cout << "Введеное вами число не находится в допустимом"
                " диапазоне!" << endl;
                exit(0);
            }
        }
        //-------------------------------------------------------------------
        // вывод суммы
        void getmoney() const
        {
            cout << outmoney << endl;
        }
        //-------------------------------------------------------------------
        // перевод суммы из "денежного" формата в число типа long double
        void mstold()
        {
            int len = strlen(mstring);
            for (int i = 0, j = 0; i < len; i++)
            {
                // пропускаем все элементы массива, не являющиеся
                // цифрой или точкой
                if (isdigit(mstring[i]) || mstring[i] == '.')
                {
                    mstring[j++] = mstring[i];
                }
                if (i == len - 1)
                {
                    mstring[j] = '\0';
                }
            }
            umoney = strtold(mstring, NULL); // преобразование в long double
        }
        //-------------------------------------------------------------------
        /* функция для преобразования числа типа long double
           в строку и для вывода её в "денежном" формате */
        void ldtoms()
        {
            int len;      // количество символов в буфере ustring
            int zero;     // количество нулей перед числом
            // конвертация суммы из long double в массив символов
            // с сохренением 2-х знаков после запятой
            if (umoney >= 0 && umoney <= 9999999999999990.00)
            {
                sprintf (ustring, "%.2Lf", umoney);
            }
            else
            {
                cout << "Итоговая сумма не находится в допустимом"
                " диапазоне!" << endl;
                exit(0);
            }
 
            len = strlen(ustring);
            zero = 19 - len;
            // сначала создается массив с нулями в начале строки
            // и со всеми запятыми
            outmoney[0] = '$';
            for (int count = 1, count_2 = 0; count <= 24; count++)
            {
                switch (count)
                {
                    case (2): outmoney[count] = ','; break;
                    case (6): outmoney[count] = ','; break;
                    case (10): outmoney[count] = ','; break;
                    case (14): outmoney[count] = ','; break;
                    case (18): outmoney[count] = ','; break;
                    default:
                        if (zero != 0)
                        {
                            outmoney[count] = '0';
                            zero--;
                        }
                        else
                        {
                            outmoney[count] = ustring[count_2++];
                        }
                }
                if (count == 24)
                {
                    outmoney[++count] = '\0';
                }
            }
            // потом убираются все нули в начале строки и лишние запятые
            while (outmoney[1] == '0' || outmoney[1] == ',')
            {
                for (int count = 1; count <= 24; count++)
                {
                    outmoney[count] = outmoney[count + 1];
                }
            }
        }
        //-------------------------------------------------------------------
        // функция для сложения 2-х объектов типа BMoney
        void madd(BMoney m1, BMoney m2)
        {
            umoney = m1.umoney + m2.umoney;
        }
};
//////////////////////////////////////////////////////////////
int main()
{
    BMoney obj_1, obj_2, obj_3;
    char ch;
    do
    {
        obj_1.putmoney();
        obj_1.mstold();
        obj_2.putmoney();
        obj_2.mstold();
        obj_3.madd(obj_1, obj_2);
        obj_3.ldtoms();
        obj_3.getmoney();
        cout << "Продолжить вычисления (y/n)? ";
        cin >> ch;
    }
    while (ch != 'n');
    return 0;
}


Добавлено через 4 минуты
Цитата Сообщение от Scythian Посмотреть сообщение
ГЛАВА 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
#include<iostream>
#include<stdlib.h>
#include<string>
#include<iomanip>
using namespace std;
 
class money
{
private:
    long double denughka;
public:
    money(){};
    void mstold(string st)
    {
        string m="0123456789.";
        int pos=0,l=0;
        while(pos>=0)
        {
            pos=st.find_first_not_of(m);
            if(pos==-1)
                break;
            st.replace(pos,1,"");
        }
        denughka=atof(st.c_str());
    }
    void show()
    {
        cout<<setiosflags(ios::fixed)<<setprecision(2)<<endl<<denughka<<endl;
    }
};
int main()
{
    money d;
    string s;
    char ch='Y';
    while(ch!='N')
    {
        cout<<"Enter the sum\t";
        cin>>s;
        d.mstold(s);
        d.show();
        cout<<"\nto continue?(Y/N)";
        cin>>ch;
    }
    system("pause");
    return 0;
}
Спасибо) Только не функция atof, а atold. Ведь используется long double.

Добавлено через 20 часов 58 минут
В 12 упражнении функции exit() нужно передавать не '0', а '1'.
Purcell
 Аватар для Purcell
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 20
16.03.2014, 11:58     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #117
Глава 8 Упражнение №7

не перегружал операции == и != -ибо не считаю нужным, с удовольствием посмотрю на реализацию перегрузки этих операторов в данном случае)
C++
1
2
3
4
5
6
7
8
// перегрузка операции сравнения ==
bool Fraction::operator==(Fraction arg)
{
    if (num == arg.num && denom == arg.denom)
    {
        return true;
    }
}
C++
1
2
3
4
5
if (obj_1 == obj_2)
{
    cout << "Введенная вами дробь равняется 0/1" << endl;
    exit(1); // или выход из цикла, если условие находится в цикле
}
Drusha
6 / 6 / 0
Регистрация: 16.07.2013
Сообщений: 74
26.03.2014, 15:55     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #118
Цитата Сообщение от Kins Посмотреть сообщение
Глава 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");
Иногда сравниваю решения с ответами в этой теме, для проверки правильности моего кода. Заметил что ответ на эту задачу у нас разный, потом сравнил с ответом Рики, с моим оно сошлось, и нашел онлайн калькулятор в интернете, там ответ с моим тоже сошелся. Решил отписать тут не ради похвастаться, а что бы были в курсе, может кому код понадобиться, а он у Вас не правильный. Вот мой ответ на эту задачу.
Кликните здесь для просмотра всего текста
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
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
 
class fraction
{
    int a,b;
public:
    fraction() : a(0), b(0)
    {}
    fraction(int x, int y) : a(x), b(y)
    {}
    void set_fraction()
    {   
        char temp;
        cout << "Enter fracrion (format 1/2): ";
        cin >> a >> temp >> b;
    }
    void show_fraction();
    void add(fraction d1, fraction d2);
    void sub(fraction d1, fraction d2);
    void mul(fraction d1, fraction d2);
    void div(fraction d1, fraction d2);
    void lowterms(int &a, int &b);
};
//--------------------------------------------
void fraction::show_fraction()
{
    cout << a << '/' << b ;  //Âîò
}
//--------------------------------------------
void fraction::add(fraction d1, fraction d2)
{
    a = (d1.a*d2.b + d1.b*d2.a);
    b = (d1.b*d2.b);
    lowterms(a,b);
}
//--------------------------------------------
void fraction::sub(fraction d1, fraction d2)
{
    a = (d1.a*d2.b - d1.b*d2.a);
    b = (d1.b*d2.b);
    lowterms(a,b);
}
//--------------------------------------------
void fraction::mul(fraction d1, fraction d2)
{
    a = (d1.a*d2.a);
    b = (d1.b*d2.b);
    lowterms(a,b);
}
//--------------------------------------------
void fraction::div(fraction d1, fraction d2)
{
    a = (d1.a*d2.b);
    b = (d1.b*d2.a);
    lowterms(a,b);
}
//--------------------------------------------
void fraction::lowterms(int &a, int &b)
{
    long tnum, tden, temp, gcd;
    tnum = labs(a);
    tden = labs(b);
    if(tden == 0)
    {
        cout << "Error, den = 0!";
        exit(1);
    }
    else if( tnum == 0)
    {
         a = 0;
         b = 1;
         return;
    }
    while(tnum !=0 )
    {
        if(tnum < tden)
        {
            temp = tnum;
            tnum = tden;
            tden = temp;
        }
        tnum = tnum - tden;
    }
    gcd = tden;
    a = a / gcd;
    b = b / gcd;
}
//--------------------------------------------
 
 
int main()
{
    const int N = 100;
    int i = 0;
    fraction f[N],f_answ;
    char ch,ex;
    do 
    {
        cout << "Fraction N: " << i+1 << endl;
        f[i++].set_fraction();
        cout << "Continue? y/n: ";
        cin >> ex;  
    } while (ex != 'n');
    for(int j=0; j<i; j++)
    {
        if(j)f_answ.add(f_answ, f[j]); 
        else f_answ = f[j];
    }
    cout << "Amount: "; 
    f_answ.show_fraction();
    cout << endl;
    fraction f_div(i, 1);
    f_answ.div(f_answ, f_div);
    cout << "Average: ";
    f_answ.show_fraction();
    cout << endl;
    return 0;
}
funt747
0 / 0 / 0
Регистрация: 10.04.2014
Сообщений: 4
10.04.2014, 12:37     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #119
Глава 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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
using namespace std;
 
int maxint(int arr[], int count);
 
int main(int argc, const char * argv[])
{
    int MAX = 100;      // размер массива
    int array[MAX];     // создал массив
    int number;         // число которое введет пользователь
    int count = 0;      // количество элементов в массиве
    char answer;        // да/нет
    int i;              // индекс максимального элемента массива
    
    do {
        cout << "Введите число: ";
        cin  >> number;
        array[count++] = number;
        cout << "Продолжить ввод? (y/n)";
        cin  >> answer;
    } while (answer != 'n');
    
    i = maxint(array, count);
 
    cout << "Индекс максимального элемента массива = ";
    cout << i << endl;
    
    cout << "Максимальное число в массиве = ";
    cout << array[i] << endl;
    
    
    
    return 0;
}
 
 
int maxint(int arr[], int count) {
    int max = 0;        // максимальный элемент массива
    int index = 0;      // индекс максимального элемента массива
    
    for (int j = 0; j < count; j++){
        if (max < arr[j]){
            max = arr[j];
            index = j;
        }
    }
    return index;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2014, 12:40     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
zss
Модератор
Эксперт С++
 Аватар для zss
6054 / 5657 / 1828
Регистрация: 18.12.2011
Сообщений: 14,449
Завершенные тесты: 1
10.04.2014, 12:40     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #120
C++
1
2
3
4
5
6
7
8
9
10
11
12
int maxint(int arr[], int count) {
    int max =arr[0];        // начинаем со значения нулевого элемента массива
    int index = 0;      // индекс максимального элемента массива
    
    for (int j = 1; j < count; j++){ // нулевой уже проверен
        if (max < arr[j]){
            max = arr[j];
            index = j;
        }
    }
    return index;
}
Yandex
Объявления
10.04.2014, 12:40     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Ответ Создать тему
Опции темы

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