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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 621, средняя оценка - 4.99
Kimel
15 / 16 / 0
Регистрация: 01.02.2012
Сообщений: 182
#1

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

01.02.2012, 17:47. Просмотров 85990. Ответов 289
Метки нет (Все метки)

Хотя я и начинающий с++-шник. Хочу помочь другим людям. Здесь я буду выкладывать всё что мне удалось решить. В моих решениях будет много хедеров, делал я это в 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;
}
Это конец второй главы, третюю сделаю позже если будет нужна
 Комментарий модератора 
Пост обновлен по просьбе ТС
12
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2012, 17:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" (C++):

Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" - C++
Мне надо решение упражнений из книги Р. Лафоре &quot;Объектно-ориентированное программирование в С++&quot;. Хотя бы какая-то часть

Ищу ответы на задания из книги Лафоре Р. "Объектно-ориентированное программирование в С++" 4 издание. - C++
Дошел до 10 главы, из каждой главы делал все 12 заданий, хочу проверить правильно ли я их делал. И еще нужны ответы на вопросы которые идут...

Объектно-ориентированное приложение: "Эмулятор банкомата" - C++
Доброго времени всем! я начал изучать С++ И хотел бы спросить вашей помощи в этом нелёгком труде. Дело в том, что мне нужно сделать...

Разобраться в примерх к книге Лафоре "Обьектно-ориентированое программирование в С++" - C++
Всем доброго времени суток кто читает эту тему. Сегодня, изучая С++ по книге Лафоре &quot;Обьектно-ориентированое программирование в С++&quot; 4-е...

Объектно-ориентированное программирование - C++
Помогите мне отредактировать программу...У меня есть исходники..Склеить нужно.... Класс Данные класса Методы ...

Объектно-ориентированное программирование в С++ ? - C++
Книга Р. Лафоре - Объектно-ориентированное программирование в С++ как вам ?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Drusha
6 / 6 / 0
Регистрация: 16.07.2013
Сообщений: 74
10.04.2014, 13:00 #121
Цитата Сообщение от funt747 Посмотреть сообщение
что-то не правильно работает, подскажите:
Так вроде программа работает правильно.
0
funt747
0 / 0 / 0
Регистрация: 10.04.2014
Сообщений: 4
10.04.2014, 13:06 #122
Цитата Сообщение от Drusha Посмотреть сообщение
Так вроде программа работает правильно.
не, там в функции была ошибка, уже исправили, спасибо
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;
}
0
Drusha
6 / 6 / 0
Регистрация: 16.07.2013
Сообщений: 74
10.04.2014, 14:08 #123
Все равно не понимаю, в чем разница, изначальный Ваш вариант max = 0, и цикл начинался с 0 и происходит сравнения всех элементов, теперь max = arr[0], и цыкл начинается с 1, разница только в том что цикл на один раз меньше повторится, а для результата разницы я не вижу.
0
funt747
0 / 0 / 0
Регистрация: 10.04.2014
Сообщений: 4
10.04.2014, 16:12 #124
Цитата Сообщение от Drusha Посмотреть сообщение
Все равно не понимаю, в чем разница, изначальный Ваш вариант max = 0, и цикл начинался с 0 и происходит сравнения всех элементов, теперь max = arr[0], и цыкл начинается с 1, разница только в том что цикл на один раз меньше повторится, а для результата разницы я не вижу.
тогда в max записывалось число 0, а теперь значение нулевого индекса массива, и т.к. 0 уже проверен цикл начинается с 1
0
Drusha
6 / 6 / 0
Регистрация: 16.07.2013
Сообщений: 74
10.04.2014, 16:20 #125
Я про это и писал. Ну так это не ошибка, программа работала правильно. Хотя Вы писали:
Цитата Сообщение от funt747 Посмотреть сообщение
что-то не правильно работает, подскажите:
0
funt747
0 / 0 / 0
Регистрация: 10.04.2014
Сообщений: 4
10.04.2014, 18:09 #126
Цитата Сообщение от Drusha Посмотреть сообщение
Я про это и писал. Ну так это не ошибка, программа работала правильно. Хотя Вы писали:
хм, не знаю, у меня работало некорректно, поэтому и спросил тут, а теперь работает правильно. спасибо за ответы
0
Purcell
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 20
24.04.2014, 20:36 #127
Цитата Сообщение от Sabbat Посмотреть сообщение
кстати в функции mid(), там же вроде с номера символа а не из самого значения символа, если я правильно понял?
у меня только в студии компилирует и больше ни в чем(CodeBlocks,Dev-C++)
ругается на return Pstring2(str);

кто-то ещё делал?
У меня такая же ошибка, когда пытаюсь использовать подобное вовзращение по ссылке. GNU/Linux, компилятор GCC:
Код
$ g++ 08.cpp -o 08
08.cpp: In member function ‘Pstring_2& Pstring_2::left(Pstring_2, int)’:
08.cpp:63:33: error: invalid initialization of non-const reference of type ‘Pstring_2&’ from an rvalue of type ‘Pstring_2’
Почему инициализация недействительная?
0
Drusha
6 / 6 / 0
Регистрация: 16.07.2013
Сообщений: 74
14.05.2014, 14:17 #128
Может кто подскажет, в чем проблема то? Задача 12, главы 9. Немного не понял зачем создавать переменную eighths, решил делать по своему. Суть ошибки в том что когда в перегруженный операторе sterfrac::operator+ (ну и остальных -,*,/) пытается сложить fr+st2.fr, то он вызывает fraction::operator+, и вот собственно туда уже почему-то передаются нули. Не могу понять почему так. Отдельно класс fraction работает нормально.
Кликните здесь для просмотра всего текста

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
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
#include<iostream>
#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();
    fraction operator+ (fraction f2);
    fraction operator- (fraction f2);
    fraction operator* (fraction f2);
    fraction operator/ (fraction f2);
    bool operator== (fraction f2);
    bool operator!= (fraction f2);
    void lowterms(int &a, int &b);
};
////////////////////////////////////////////
void fraction::show_fraction()
{
    cout << a << '/' << b ;  
}
////////////////////////////////////////////
fraction fraction::operator+(fraction f2)
{
    int a1 = (a*f2.b + b*f2.a);
    int b1 = (b*f2.b);
 
    lowterms(a1,b1);
    return fraction(a1,b1);
}
////////////////////////////////////////////
fraction fraction::operator-(fraction f2)
{
    int a1 = (a*f2.b - b*f2.a);
    int b1 = (b*f2.b);
    lowterms(a1,b1);
    return fraction(a1,b1);
}
////////////////////////////////////////////
fraction fraction::operator* (fraction f2)
{
    int a1 = (a*f2.a);
    int b1 = (b*f2.b);
    lowterms(a1,b1);
    return fraction(a1,b1);
}
////////////////////////////////////////////
fraction fraction::operator/ (fraction f2)
{
    int a1 = (a*f2.b);
    int b1 = (b*f2.a);
    lowterms(a1,b1);
    return fraction(a1,b1);
}
////////////////////////////////////////////
bool fraction::operator== (fraction f2)
{
    bool bo;
    (a == f2.a && b == f2.b) ? bo = true : bo = false;
    return bo;
}
////////////////////////////////////////////
bool fraction::operator!= (fraction f2)
{
    bool bo;
    (a == f2.a && b == f2.b) ? bo = false : bo = true;
    return bo;
}
////////////////////////////////////////////
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;
}
////////////////////////////////////////////
 
 
class sterling
{
protected:
    long pounds;
    int shillings;
    int pence;  
public:
    sterling() : pounds(0), shillings(0), pence(0)
    {   }
    sterling(double old)
    {
        pounds=old;
        shillings=(old-pounds)*20;
        pence=(((old-pounds)*20)-shillings)*12;
    }
    sterling(long po, int sh, int pe) : pounds(po), shillings(sh), pence(pe)
    {   }
    void getSterling()
    {
        char temp;
        cout << "Enter money (9.19.11): ";
        cin >> pounds >> temp >> shillings >> temp >> pence;
    }
    void putSterling()
    {
        cout << pounds << '.' << shillings << '.' << pence;
    }
    sterling operator+ (sterling st2);
    sterling operator- (sterling st2);
    sterling operator* (double d);
    sterling operator/ (sterling st2);
    sterling operator/ (double d);
     operator double();
};
////////////////////////////////////////////
sterling sterling::operator+ (sterling st2)
{
    return sterling (double ( sterling(pounds, shillings, pence))+double(st2));
}
////////////////////////////////////////////
sterling sterling::operator- (sterling st2)
{
    return sterling (double ( sterling(pounds, shillings, pence))-double(st2));
}
////////////////////////////////////////////
sterling sterling::operator* (double d)
{
    return sterling (double ( sterling(pounds, shillings, pence))*d);
}
////////////////////////////////////////////
sterling sterling::operator/ (sterling st2)
{
    return sterling (double ( sterling(pounds, shillings, pence))/double(st2));
}
////////////////////////////////////////////
sterling sterling::operator/ (double d)
{
    return sterling (double ( sterling(pounds, shillings, pence))/d);
}
////////////////////////////////////////////
sterling::operator double()
{
    return (pounds*240+shillings*12+pence)/240.0;
}
////////////////////////////////////////////
class sterfrac : protected sterling, protected fraction
{
protected:
    fraction fr;
public:
    sterfrac() : sterling(), fraction()
    {   }
    sterfrac(int po, int sh, int pe, int x=0, int y=0) : sterling(po,sh,pe), fraction(x,y)
    {   }
    sterfrac(float fl, fraction f) : sterling(fl), fr(f)
    {   }
    void getSterling()
    {
        sterling::getSterling();
        fraction::set_fraction();
    }
    void putSterling()
    {
        sterling::putSterling();
        cout <<'-';
        fraction::show_fraction();
    }
    sterfrac operator+(sterfrac st2);
    sterfrac operator-(sterfrac st2);
    sterfrac operator*(sterfrac st2);
    sterfrac operator/(sterfrac st2);
    operator double()
    {
        return (pounds*240+shillings*12+pence)/240.0;
    }
};
 
sterfrac sterfrac::operator+(sterfrac st2)
{
    return sterfrac ((double ( sterfrac(pounds, shillings, pence))+double(st2)),(fr+st2.fr));   
}
 
sterfrac sterfrac::operator-(sterfrac st2)
{
    return sterfrac ((double ( sterfrac(pounds, shillings, pence))-double(st2)),(fr-st2.fr));   
}
 
sterfrac sterfrac::operator*(sterfrac st2)
{
    return sterfrac ((double ( sterfrac(pounds, shillings, pence))*double(st2)),(fr*st2.fr));   
}
 
sterfrac sterfrac::operator/(sterfrac st2)
{
    return sterfrac ((double ( sterfrac(pounds, shillings, pence))/double(st2)),(fr/st2.fr));   
}
 
 
int main()
{
    sterfrac s1,s2,s3;
    cout << "Test: " << endl;
    s1.getSterling();
    s2.getSterling();
    s3 = s1 + s2;
    s3.putSterling();
    return 0;
}
0
Kerry_Jr
Модератор
Эксперт PHP
2192 / 1988 / 696
Регистрация: 14.05.2014
Сообщений: 5,825
Записей в блоге: 1
Завершенные тесты: 5
14.05.2014, 14:33 #129
Глава 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
67
68
69
70
71
72
73
74
75
#include <iostream>
#include <cstring>
#include <string>
#include <sstream>
#include <iomanip>
#include <cstdlib>
using namespace std;
 
class Money
{
    static const int SIZE = 30;
    char sMoney[SIZE];
    long double ldMoney;
    public:
        Money(long double ld):ldMoney(ld){}
        void ldtoms()
        {
            // Проверяем на большое значение
            if (ldMoney > 9999999999999990.00)
            {
                cout << "Слишком большое значение!" << endl;
                exit(1);
            }
            // Создаем буфер для строки
            stringstream buffer;
            // Заносим в буфер числовое значение с предшествующим знаком доллара
            // После запятой остается 2 знака
            buffer << '$' << fixed << setprecision(2) << ldMoney;
            //Вставляем буферное значение в строку
            strcpy(sMoney, buffer.str().c_str());
            // Очищаем буфер
            buffer.str("");
            int point = strlen(sMoney) - 3; // положение десятичной точки в строке
            int count = 0; // количество символов перед десятичной точкой
            for (int i = point-1; i >=0; i--)
            {
                count++;
                //Через каждые три символа (count % 3 == 0) вставляем запятую
                //Исключаем вставку запятой перед знаком доллара (i > 1)
                if (count % 3 == 0 && i > 1)
                {
                    // Смещаем символы на одну позицию назад для вставки очередной запятой 
                    for (int j = strlen(sMoney); j >= i; j--)
                        sMoney[j+1] = sMoney[j];
                    //Вставляем запятую
                    sMoney[i] = ',';
                }
            }
            //Выводим значение sMoney
            cout << sMoney;
        }
};
 
//////////////////////////////////////////////////////////////////////////////
int main()
{
    setlocale(LC_ALL, "Rus");
 
    long double l;
    char ch;
    do
    {
        cout << "Введите денежную сумму: ";
        cin >> l;
        Money m(l);
        m.ldtoms();
        cout << "\nПродолжить? ";
        cin >> ch;
        if (ch > 96)
            ch -= 32;
    }
    while (ch != 'N');
    
    return 0;
}
0
Drusha
6 / 6 / 0
Регистрация: 16.07.2013
Сообщений: 74
14.05.2014, 14:47 #130
Все, вопрос снят. Затупил немного, а то я и включением и наследованием делал, убрал наследование, немного подредактировал и заработало, осталось только что бы целые части дроби в пенсы пересчитывало
0
Ярослав Никитин
0 / 0 / 2
Регистрация: 13.04.2014
Сообщений: 70
14.05.2014, 16:12 #131
Хочу подметить то, что люди не пишут в гуглаяндексах: "Упражнения 1 + Лафоре". Они предпочитают писать задание. Не могли бы вы добавить задания к каждому упражнению. Я понимаю что тема мертва, но мало ли...
0
iAndrew5
0 / 0 / 0
Регистрация: 19.04.2014
Сообщений: 7
15.05.2014, 14:00 #132
Цитата Сообщение от Kins Посмотреть сообщение
Глава 8 Упражнение №9
Кликните здесь для просмотра всего текста
Мне кажется это Неверное решение! Вы сами себя обманули. Доступ к массиву класса arr[LIMIT] свободный из функции класса getin(). Проверка не выполняется. Функцию int& operator[](int n) вообще можно исключить и результат работы программы будет тот же. Ввод и вывод элементов массива должен происходить вне класса, в функции main(), как было в примере arrover3. Автор ведь не просто так это делал в main(). В этом случае проверка индекса необходима и работает.
Мой вариант реализации упражнения :
Кликните здесь для просмотра всего текста
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 <conio.h>
using namespace std;
#include <process.h>      // для функции exit
const int LIMIT = 100;    // размер массива
///////////////////////////////////////////////////////////
class safearray
{
private:
    int arr[LIMIT];
    int low, high;
public:
    safearray() : low(0), high(0)
    {}
    safearray(int n, int m) : low(n), high(m)
    {}
    // обратите внимание, что функция возвращает ссылку!
    int& operator[](int n)
    {
        if (n < low || n >= high)
        {
            cout << "\nОшибочный индекс!"; 
            _getch(); // Не обязательно. Просто чтобы увидеть что произошло.
            exit(1);
        }
        return arr[n];
    }
};
///////////////////////////////////////////////////////////
int main()
{
    setlocale(LC_CTYPE, "russian");
    int low, high, size;
    int realsize;
    cout << "Введите нижнюю границу массива : "; cin >> low;
    cout << "Введите верхнюю границу массива : "; cin >> high;
    safearray sa(low, high);
    realsize = high - low;
    if (realsize > LIMIT)
    {
        cout << "Максимальный размер массива: 100 элементов!!!"; _getch();
        exit(1);
    }
    // задаем значения элементов
    for (int j = low; j < high; j++)
        sa[j] = j * 10;    // используем функцию слева от знака =
 
    // показываем элементы
    for (int j = low; j < high; j++)
    {
        int temp = sa[j];  // используем функцию справа от знака =
        cout << "Элемент " << j << " равен " << temp << endl;
    }
    _getch();
    return 0;
}


Не претендую на истину в 100% инстанции! ))) Вариантов реализации может быть много. Это просто моё видение.
С уважением,
Андрей

Добавлено через 21 час 45 минут
Цитата Сообщение от Kins Посмотреть сообщение
Глава 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
65
66
Код C++
 
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;
}
Функция присвоения работает здесь только в явном виде. Т.е. bMoney b=s; можно записать и так bMoney b; а затем присвоить b = s; Это работает, а вот наоборот уже проблема!!! Т.е. sterling st=d; работает, а в неявном виде не работает т.е. запись: sterling st; а затем st = d; не работает!!! А должна. Должна быть возможность присваивать объекты классов bMoney = sterling и наоборот sterling = bMoney при помощи знака "="; Ошибка в том,что Вы пытаетесь использовать конструктор в обоих случаях...А должен быть конструктор с одним параметром и операция преобразования. Смотрите мой вариант.
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <conio.h>
#include <iomanip>
 
using namespace std;
char dummychar = '.';
const int SIZE = 30;
 
class sterling
{
private:
    long pounds;
    int shilling;
    int penny;
public:
    sterling() : pounds(0), shilling(0), penny(0) {}
    sterling(long pnd, int shlg, int pnc) : pounds(pnd), shilling(shlg), penny(pnc) {}
    
    long getf() const { return pounds;} // Обеспечивает доступ конструктору bmoney с одним параметром к полю pounds класса sterling
    int getsh() const { return shilling;} // Обеспечивает доступ конструктору bmoney с одним параметром к полю shilling класса sterling
    int getp() const { return penny; } // Обеспечивает доступ конструктору bmoney с одним параметром к полю penny класса sterling
    void putSterling() { cout << " GBP " << pounds << dummychar << shilling << dummychar << penny << endl; }
    void getSterling() { cin >> pounds >> dummychar >> shilling >> dummychar >> penny; }
    
};
 
 
class bmoney
{
private:
    long double lmoney;
public:
    bmoney() : lmoney(0) { }             // конструктор
    bmoney(long double m) : lmoney(m) {}
    operator long double() { return lmoney; } //преобразование bMoney в long double
    void display() { cout << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(3) << "\n" <<"$ "<< lmoney << endl; }
 
    bmoney(sterling st) //конструктор с одним параметром. Преобразование sterling в bmoney
    {
        long pounds = st.getf();
        int shilling = st.getsh();
        int penny = st.getp();
        long double result = 0;
        result = static_cast<long double>(((pounds * 20 + shilling) * 12 + penny)) / 240;
        lmoney = result * 50;
    }
    
    operator sterling() const // Операция преобразования ( bmoney -----> sterling )
    {
        long double decpounds = lmoney;
        decpounds /= 50;
        double decfrac;
        long pounds = static_cast<long>(decpounds);
        decfrac = decpounds - pounds;
        int shilling = static_cast<int> (decfrac * 20);
        int penny = static_cast<int>((decfrac * 20 - shilling) * 12);
        return sterling(pounds, shilling, penny);
    }
    //****************************************************************************************************
    void getlmoney() // Ввод переменной LMONEY
    {
        do{
            cout << "Введите сумму в долларах : ";
            cin >> lmoney;
            if (lmoney > 9999999999999990.00 / 2) cout << " Number is too big !!!Input correct number! " << endl;
        } while (lmoney > 9999999999999990.00 / 2);
    }
    //****************************************************************************************************
};
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
    sterling s1;
    bmoney d1, d2;
    cout << "Введите сумму стерлингов в старой системе (формат 10.10.10) : ";
    s1.getSterling();
    d2.getlmoney();
    d1 = s1; // Конверсия стерлинг в доллар
    cout << "Сумма долларов после конверсии стерлингов: ";
    d1.display(); // 
    sterling s2;
    s2 = d2; // Конверсия доллар в стерлинг*/
    cout << "Сумма стерлингов после конверсии долларов: ";
    s2.putSterling();
    _getch();
    return 0;
}


С Уважением,
Андрей
0
Purcell
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 20
20.05.2014, 13:58 #133
Упражнение 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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/* добавление новых элементов в конец связного списка
   через прохождение по нему от начала до конца */
#include <iostream>
using namespace std;
///////////////////////////////////////////////////
struct Link        // один элемент списка
{   
    int data;      // какие-то данные
    Link* next;    // указатель на следующий элемент списка
};
///////////////////////////////////////////////////
class Linklist                 // список
{
    private:
        Link* first;
    public:
        Linklist()
        { first = NULL; }
        void additem(int d);   // добавление элементов
        void display();        // вывод данных элементов
};
///////////////////////////////////////////////////
void Linklist::additem(int d)   // добавление элементов
{
    Link* newlink = new Link;   // выделение памяти
    newlink->data = d;          // запись данных
    if (first == NULL)          // если происходит добавление первого элемента
    {
        newlink -> next = NULL;
        first = newlink;
    }
    else                        // если происходит добавление в список,
    {                           // уже содержащий как минимум один элемент
        Link* current = first;              // создание служебного указателя
        while (current -> next != NULL)     // прохождение по списку от начала
        {
            current = current -> next;
        }
        current -> next = newlink;
        newlink -> next = NULL;
    }
}
///////////////////////////////////////////////////
void Linklist::display()             // вывод данных
{
    Link* current = first;           // создание служебного указателя
    while(current)                      // проход по списку от начала
    {
        cout << current->data << endl;
        current = current->next;
    }
}
///////////////////////////////////////////////////
int main()
{
    Linklist li;
 
    for (int i = 1; i < 5; i++)
        li.additem(i);
 
    li.display();
 
    return 0;
}
0
iAndrew5
0 / 0 / 0
Регистрация: 19.04.2014
Сообщений: 7
30.05.2014, 15:58 #134
Цитата Сообщение от Рики Посмотреть сообщение
Глава 12
Задание 12.4
Код C++

Кликните здесь для просмотра всего текста
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
#include <fstream> // для файловых потоков
#include <iostream>
#include <string>
#include <process.h> // для exit()
using namespace std;
///////////////////////////////////////////////////////////
class employee // класс person
 {
 protected:
 public:
 string name; // имя человека
 string patronymic; //отчество 
 string surname; //фамилия
 unsigned long No; // его номер
void getData() // получить данные о человеке
 {
 cout << "\n Введите имя: "; cin >> name;
 cout << " Введите отчество: "; cin >> patronymic;
 cout << " Введите фамилию: "; cin >> surname;
 cout << " Введите номер: "; cin >> No;
 }
 // void showData() // вывод данных о человеке
 // {
 // cout << "\n Имя: "<<name;
 //cout << "\n Отчество: "<<patronymic;
 //cout << "\n Фамилия: "<<surname;
 // cout << "\n Номер: "<<No;
 // }
 };
///////////////////////////////////////////////////////////
int main()
 {
 setlocale (LC_ALL, "russian");
 char ch;
 employee worker; // создать объект person
 ofstream outfile ("workers.txt"); //создать объект ofstream
 do // данные от пользователя – в файл
 {
 cout << "Введите данные о работнике:";
 worker.getData(); // получить данные
 // записать их в файл
 outfile << worker.name
 <<' '
 << worker.patronymic
 <<' '
 << worker.surname
 <<' '
 << worker.No
 <<endl;
 cout << "Файл записан.";
 cout << "Продолжить ввод (y/n)? ";
 cin >> ch;
 }
 while(ch=='y'); // выход по 'n'
 ifstream infile ;
 infile.open("workers.txt");
 if( !infile ) // проверить на наличие ошибок
 {
 cerr << "\nНевозможно открыть workers.txt";
 exit(-1);
 }
 while( infile.get(ch) != 0 ) // считать символ
 cout << ch; // отобразить символ
cout << endl;
 system("pause");
 return 0;
 }
Мое решение в соответствии с заданием. По заданию не нужен класс,а нужен форматированный ввод и вывод.
Кликните здесь для просмотра всего текста
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>
#include <fstream>
#include <process.h>
#include <conio.h>
 
using namespace std;
//////////////////////////////////////////////////////////
const int MAX = 30;
//////////////////////////////////////////////////////////
int main()
{
    setlocale(LC_CTYPE, "rus");
    char name[MAX];
    char surname[MAX];
    char otchestvo[MAX];
    unsigned long number;
    char ch;
    ofstream ofile;
    ofile.open("Data.txt", ios::app);
    do{
        
        cout << "Введите фамилию : "; cin >> name;
        cout << "Введите имя : "; cin >> surname;
        cout << "Введите отчество : "; cin >> otchestvo;
        cout << "Введите номер : "; cin >> number;
        ofile << name << " " << surname << " " << otchestvo << " " << number;
        cout << "{Продолжить (y/n) : "; cin >> ch;
    } while (ch == 'y');
    cout << endl;
    ofile.close();
 
    ifstream infile;    // создать входной файл (файл - источник)
    infile.open("Data.txt");    // открыть файл
    if (!infile)   // проверить на наличие ошибок
    {
        cerr << "\nНевозможно открыть file... " << endl; exit(-1);
    }
    infile.seekg(0);
    while (true){
        infile >> name >> surname >> otchestvo >> number;
        if (!infile) break;
        cout << "Фамилия : " << name << endl;
        cout << "Имя : " << surname << endl;
        cout << "Отчество : " << otchestvo << endl;
        cout << "Номер : " << number << endl;
        cout << "-----------------------------------" << endl;
    }
    _getch();
    return 0;
}


С уважением,
Андрей
0
iAndrew5
0 / 0 / 0
Регистрация: 19.04.2014
Сообщений: 7
02.06.2014, 18:33 #135
Ребята, что тему умерла?
Если нет, кто-нибудь продвинулся дальше 12 главы?
Выложите пожалуйста свои варианты решений.
Заранее благодарен,

С уважением,
Андрей

P.s. здесь нашел только решения упражнений главы 13 упр.1 и главы 15 упражнений 5 и 6
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2014, 18:33
Привет! Вот еще темы с ответами:

Объектно ориентированное программирование - C++
Нужно решить задачи. Помогите кому это не сложно, очень нужно. Вот задачи: 1) Создание и редактирование классов. Нужно создать класс...

Объектно-ориентированное программирование - C++
Составить описание класса одномерных массивов строк, каждая строка которых задается длиной и указателем на выделенную для нее память....

Объектно-ориентированное программирование - C++
На основе объектного подхода создать программу которая рассчитывает значения степенных функций y=sqr(x), корень 3, 4, 5 степеней. В...

Объектно ориентированное программирование. - C++
Нужно решить задачи. Помогите кому это не сложно, очень нужно. Вот задачи: 1) Создание и редактирование классов. Нужно создать класс...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.06.2014, 18:33
Ответ Создать тему
Опции темы

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