Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/2: Рейтинг темы: голосов - 2, средняя оценка - 5.00
17 / 18 / 0
Регистрация: 01.02.2012
Сообщений: 182

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

01.02.2012, 17:47. Показов 212371. Ответов 338
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хотя я и начинающий с++-шник. Хочу помочь другим людям. Здесь я буду выкладывать всё что мне удалось решить. В моих решениях будет много хедеров, делал я это в 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;
}
Это конец второй главы, третюю сделаю позже если будет нужна
 Комментарий модератора 
Пост обновлен по просьбе ТС
14
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.02.2012, 17:47
Ответы с готовыми решениями:

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

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

Роберт Лафоре, "Объектно-ориентированное программирование на C++"
Здравствуйте, хотелось бы узнать мнение по поводу этой книги: стоит ли читать, или поискать другую?

338
0 / 0 / 0
Регистрация: 16.10.2015
Сообщений: 2
18.04.2016, 14:09
Студворк — интернет-сервис помощи студентам
Ferrari F1, пробовал.

Добавлено через 23 минуты
Проблема решена.
В опциях компилятора во вкладке Settings -> C++ compiler стояло "Yes" напротив "Turn off all access checking"...
0
0 / 0 / 0
Регистрация: 01.04.2016
Сообщений: 11
25.05.2016, 23:03
Не могу понять в главе 11 упражнении 8 принцип работы char chifra [LEN]; в нее загружаются символы цифр. Например первое число 123456,88. Когда будет загружаться второе число, по идее если оно будет короче первого, например 321,78 то по сути должны остаться числа из первой строки и при следующей итерации должно получиться что-то вроде 321,78,88 в итоге. Насколько мне подсказывает логика char chifra [LEN]; должна обнуляться. Но я не нашел этого в коде. При этом код работает корректно. Подскажите, куда смотреть?
0
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,475
26.05.2016, 13:26
Eragorn2013, Выложи здесь код, а то без него вообще ничего непонятно
0
0 / 0 / 0
Регистрация: 25.05.2016
Сообщений: 14
01.06.2016, 20:45
Глава 11, Номер 6 и 7 программа не идёт. На этом моменте выдаёт ошибку:
C++
1
money = stold(arr);
Как её решить собственно? Уже голову сломал.
Миниатюры
Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"  
0
0 / 0 / 0
Регистрация: 11.06.2016
Сообщений: 1
05.07.2016, 10:31
Лови:
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()
{
    for (int number = 0; number < 20; number++)
    {
        cout << setw (40 - number * 2) << " ";
        for (int i = number * 2 + 1; i > 0; i--)
            cout << 'x';
        cout << endl;
    }
    system ("pause");
    return 0;   
}
P.S. Народ, если вдруг заподозрите в гавно-коде - просьба напишите что не так. Только учусь, поэтому с радостью выслушаю любую адекватную критику в свой адрес. Заранее спасибо)
0
0 / 0 / 0
Регистрация: 26.01.2016
Сообщений: 1
28.07.2016, 16:09
А почему бы нет? Например, так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//////// Отсев неиспользуемых дробей //////////////////////
        bool operator== (fraction frx)
    {
        if ( num==frx.num && den==frx.den)  return 1;   
        else return 0;  
    }
};
 
int main()
{
setlocale (LC_CTYPE,"rus");
fraction fr1, fr2, fr3, fr4(1,0,0), fr5(0,0,0), fr6(1,1,0) ;
char opfr, yn;
do
{
 
    cout<<"Первая дробь:"<<endl;
    fr1.putfr();
    if (fr1 == fr4|| fr1 == fr5 || fr1 == fr6) { cout<<"Неверная дробь!"<<endl; break;}
    cout<<"Вторая дробь:"<<endl;
    fr2.putfr();
    if (fr2 == fr4|| fr2 == fr5 || fr2 == fr6) { cout<<"Неверная дробь!"<<endl; break;}
    cout<<"Выберите тип операции (+,-,/,*): ";
Добавлено через 20 минут
Глава 8, упражнение 7.
Перегрузка операции ==.
Например, так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//////// Отсев неиспользуемых дробей //////////////////////
        bool operator== (fraction frx)
    {
        if ( num==frx.num && den==frx.den)  return 1;   
        else return 0;  
    }
 
};
int main()
{
setlocale (LC_CTYPE,"rus");
fraction fr1, fr2, fr3, fr4(1,0,0), fr5(0,0,0), fr6(1,1,0);
char opfr, yn;
do
{
    cout<<"Первая дробь:"<<endl;
    fr1.putfr();
    if (fr1 == fr4|| fr1 == fr5 || fr1 == fr6) { cout<<"Неверная дробь!"<<endl; break;}
    cout<<"Вторая дробь:"<<endl;
    fr2.putfr();
    if (fr2 == fr4|| fr2 == fr5 || fr2 == fr6) { cout<<"Неверная дробь!"<<endl; break;}
0
1 / 1 / 1
Регистрация: 23.10.2013
Сообщений: 25
26.10.2016, 10:55
Глава 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
#include <iostream>
#include <cstdlib>
#include <locale.h>
#include <sstream>
#include <cstring>
#include <conio.h>
 
using namespace std;
 
class money{
    private:
        double inp;     
        string st,ct;
        int wlen,m,z;       
    public:
        money() {z=0;m=0;inp=0.00;}
        void input(){
            st="";
            ct="";
            cout<<"\nÂâîä (ìàêñ: - 9999999999999990.00):\n";
        cin>>inp;
        if(inp>9999999999999990.00){cout<<"\nÑëèøêîì áîëüøîå ÷èñëî!\n"; exit(1);}
        }
        void ldtoms(){
        stringstream oss;
        oss<<fixed<<inp;
        oss>>st;    
        }
        void work(){
        
        wlen = st.length();
        z=wlen;
        for(int j = 0; j!=z; j++){          
            if(st[j]=='.'){z=j+3;}
            ct+=st.at(j);
            };
            wlen = ct.length();
            st="";          
            for(int j = wlen; j>=0; j--){
            if(ct[j]=='.'){m=-1;}
            if(wlen>6){if((m%3)==0&&(wlen-j)>6){st+=',';}}
            st+=ct[j];
            m++;
            };          
            wlen = st.length();         
            ct="$";
            for(int j = wlen; j>0; j--){
            ct+=st[j];
            };  
        cout<<endl<<ct;};
};
 
int main()
{
     setlocale( LC_ALL, "Russian" );
char ch;
money m1;
do{
m1.input();
m1.ldtoms();
m1.work();
cout<<"\nÏîâòîðèòü? Y/N\n";
ch=getch();
}while(ch!='n');
return 0;
}


Добавлено через 22 часа 52 минуты
не совсем понял это задание. (зачем так много методов?)
глава 7 задача 12
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <locale.h>
#include <sstream>
#include <cstring>
#include <conio.h>
 
using namespace std;
/////////////////////////////////////////////////////////////////////////////
class bMoney{
    private:
        double money;
        static double mon_sum;
        string st;
    public:
        bMoney(){};
        void madd();
        void getmoney();
        void putmoney();        
};
/////////////////////////////////////////////////////////////////////////////
void bMoney::putmoney(){
    st="";
    cout<<"\nÂâåäèòå ñóììó: ";
    cin>>st;
    money=strtold(st.c_str(),NULL);
}
void bMoney::getmoney(){
    st="";
    stringstream oss;
    oss<<fixed<<mon_sum;
    oss>>st;
    cout<<"\nÎáùàÿ ñóììà ââåäåíîãî: "<<st;
}
void bMoney::madd(){
    mon_sum+= money;    
}
/////////////////////////////////////////////////////////////////////////////
double bMoney::mon_sum=0;
 
int main()
{
setlocale( LC_ALL, "Russian" );
char ch;
do{
bMoney m1;
m1.putmoney();
m1.madd();
m1.getmoney();
cout<<"\nÅùå ââîä? Y/N\n";
ch=getch();
}while(ch!='n');
return 0;
}
0
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,475
27.10.2016, 11:16
mpol, Один метод для перевода строки в число, другой наоборот из числа в строку. Плюс метод для складывания двух объектов одного класса (bMoney). Ну и два стандартных метода для ввода и вывода данных. Всё же в задании изложено...
0
7 / 7 / 9
Регистрация: 20.11.2016
Сообщений: 120
08.03.2017, 18:58
Вообще отличная книга у ЛАфоре.

Выполнил половину упражнений, и выполняю остальные.

Следующий вопрос:
Какой следующий этап в изучении С++??
Возможно - нашли ресурсы, подобные Лафоре! Где всё доступно и просто, и есть упражнения.
а также - упражнения по QT
0
 Аватар для demonmadman
0 / 0 / 2
Регистрация: 08.01.2017
Сообщений: 10
19.08.2017, 19:21
Глава 11, Упражнение 8-11
Решение, если использовать строки (strings)
Кликните здесь для просмотра всего текста

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
#include<iostream>
#include<string>
 
const short MAX = 100;
 
class Token
{
public:
    virtual float getNumber() = 0;
    virtual char getOperator() = 0;
 
};
 
//////////////////////////////////////////////////
 
class Operator : public Token
{
private:
    char oper;
public:
    Operator(char ch)
    {
        oper = ch;
    }
    char getOperator()
    {
        return oper;
    }
    float getNumber()
    {
        return 0;
    }
};
 
/////////////////////////////////////////////////
 
class Number : public Token
{
private:
    float number;
public:
    Number(float num)
    {
        number = num;
    }
    char getOperator()
    {
        return 0;
    }
    float getNumber()
    {
        return number;
    }
};
 
/////////////////////////////////////////////////
 
class Stack
{
private:
    Token* arr[MAX];
    int top;
public:
    Stack() : top(0) {}
    void push(float number)
    {
        arr[++top] = new Number(number);
    }
    void push(char symbol)
    {
        arr[++top] = new Operator(symbol);
    }
    Token* pop()
    {
        return arr[top--];
    }
    int gettop()
    {
        return top;
    }
    void showStack()
    {
        std::cout << "Stack = ";
        for (int i(0); i < top; i++)
        {
            std::cout << *arr;
 
        }
    }
};
 
////////////////////////////////////////////////
 
class express
{
private:
    Stack st;
    char* pStr;
    int len;
public:
    express(char* ptr)
    {
        pStr = ptr;
        len = strlen(pStr);
    }
    void parse();
    float solve();
    void  round(float&);
};
 
void express::round(float& val)
{
    val = val - int(val) < 0.5 ? int(val) : int(val) + 1;
}
 
 
 
 
 
void express::parse()
{
    int n(0);
    char ch(0);
    float lastval;
    char lastoper;
    std::string value;
    for (int i(0); i < len;)
    {
        ch = pStr[i];
        if(ch >= '0' && ch <= '9')
        {
            while (ch != '+' && ch != '-' && ch != '*' && ch != '/' && ch != 0 && ch !='\0')
            {
    
                value += ch;
                ch = pStr[++i];
            } 
        float temp = stof(value);
        value.clear();
        round(temp);
        st.push(temp);
        }
        else if (ch == '+' || ch == '-' || ch == '*' || ch == '/')
        {
            if (st.gettop() == 1)
            {
                st.push(ch);
                ch = pStr[++i];
            }
            else
            {
                lastval = (st.pop())->getNumber();
                lastoper = (st.pop())->getOperator();
                if ((ch == '*' || ch == '/') && (lastoper == '+' || lastoper == '-'))
                {
                    st.push(lastoper);
                    st.push(lastval);
                }
                else
                {
                    switch (lastoper)
                    {
                    case '+': st.push((st.pop())->getNumber() + lastval); break;
                    case '-': st.push((st.pop())->getNumber() - lastval); break;
                    case '*': st.push((st.pop())->getNumber() * lastval); break;
                    case '/': st.push((st.pop())->getNumber() / lastval); break;
                    default: {
                        std::cout << "\nUncorrect operator 1" <<lastoper;
                        system("pause");
                        exit(1);
                            }
                    }   
                }
                st.push(ch);
                ch = pStr[++i];
            }
        }
        else
        {
            std::cout << "\nUncorrect symbol >>" << ch;
            system("PAUSE");
            exit(1);
        }
    }
}
 
float express::solve()
{
    float lastval;
    while (st.gettop() > 1)
    {
        lastval = (st.pop())->getNumber();
        switch((st.pop())->getOperator())
        {
        case '+': st.push((st.pop())->getNumber() + lastval); break;
        case '-': st.push((st.pop())->getNumber() - lastval); break;
        case '*': st.push((st.pop())->getNumber() * lastval); break;
        case '/': st.push((st.pop())->getNumber() / lastval); break;
        default: {
            std::cout << "\nUncorrect operator 2";
            system("pause");
            exit(1);
                }
        }
    }
    return (st.pop())->getNumber();
}
 
 
 
int main()
{
    char str[MAX];
    std::cout << "Enter string: ";
    std::cin >> str;
    express* strEx = new express(str);
    strEx->parse();
    std::cout << "Value is : " << strEx->solve()<<std::endl;
    system("pause");
    return 1;
}
0
0 / 0 / 0
Регистрация: 14.11.2017
Сообщений: 12
14.11.2017, 21:31
Вопрос по задаче 11 главы 9. Собственно задача решена, прошу разъяснить следующий момент, который мне не очень понятен как новичку.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
using namespace std;
class Stack
{
protected:
    static const int max = 6;
    int st[max];
    int top;
public:
    Stack()
    {
        top = -1;
    }
    void push(int var)
    {
        st[++top] = var;
    }
    int pop() 
    {
        return st[top--];
    }
};
class Stack2 : public Stack
{
public:
    void push(int var)
    {
        if (top >= max - 1)
        {
            cout << "\nОшибка: стек полон"; exit(1);
        }
        Stack::push(var);
    }
    int pop()
    {
        if (top < 0)
        {
            cout << "\nОшибка: стек пуст\n"; exit(1);
        }
        return Stack::pop();
    }
};
class PairStack : Stack2
{
public:
    void push(int var, int var2)
    {
        Stack2::push(var);
        Stack2::push(var2);
    }
    void pop()
    {       
        cout << Stack2::pop() << " " << Stack2::pop() << endl;
    }
};
int main()
{
    setlocale(LC_ALL, "Russian");
    
    PairStack s2;
    s2.push(11, 12); // поместим в стек несколько чисел
    s2.push(22, 23);
    s2.push(33, 34);
    s2.pop();
    s2.pop();
    s2.pop();
    cout << endl;
    cout << endl;
    system("pause");
    return 0;
}

интересует отрывок кода,
C++
1
2
3
4
void pop()
    {       
        cout << Stack2::pop() << " " << Stack2::pop() << endl;
    }
значения там выводятся почему-то 33 34, однако если сделать код таким
C++
1
2
3
4
5
void pop()
    {       
        cout << Stack2::pop() << endl;
        cout << Stack2::pop() << endl;
    }
то сначала выводится последний элемент массива 34, потом предпоследний 33(это мне как раз понятно). Не могу понять почему в коде идет сначала 33, потом 34, в чем принципиальное отличие этих двух вариантов?

Добавлено через 38 минут
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
15.11.2017, 06:39
Apleks, думаю дело в порядке вычисления операндов

выражение f1() + f2() + f3() разбирается как (f1() + f2()) + f3() за счёт левоассоциативности operator+, но вызов функции f3 может быть вычислен первым, последним, или между f1() и f2() во время выполнения.
0
0 / 0 / 0
Регистрация: 14.11.2017
Сообщений: 12
15.11.2017, 09:46
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Apleks, думаю дело в порядке вычисления операндов
да именно это я и хочу понять, почему это происходит?
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
15.11.2017, 10:19
Apleks, потому что порядок вычисления не регламентирован, в приведенной мною цитате ведь написано

Добавлено через 2 минуты
т.е.
C++
1
cout << Stack2::pop() << " " << Stack2::pop() << endl;
у тебя может давать результаты 33 34, а на другом компе будет 34 33
1
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,475
15.11.2017, 21:16
Цитата Сообщение от Apleks Посмотреть сообщение
Не могу понять почему в коде идет сначала 33, потом 34, в чем принципиальное отличие этих двух вариантов?
Из книги: Стандартная Библиотека Справочное руководство 2-е издание (Николаи М. Джосаттис), стр 777

"По общепринятому соглашению, операторы вывода возвращают свой первый
аргумент. Иначе говоря, результатом оператора вывода является поток вывода. Это позволяет образовывать цепочки операторов вывода:
C++
1
std::cout << x << " times " << y << " is 11 " << x * y << std::endl;
Оператор << выполняется слева направо. Таким образом, оператор
C++
1
 std::cout << x
выполняется первым. Это правило не распространяется на порядок вычисления аргументов — оно определяет только порядок выполнения операторов."
1
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37
13.12.2018, 08:26
Здравствуйте подскажите пожалуйста что хотел автор

кодом
else
String(s);


в задании 9.2 Лафоре
???

если это опечатка то как должно было выглядеть?
что надо добавить или убрать?

C++ (Qt)
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
// strconv.cpp
#include <iostream>
using namespace std;
#include <string.h>            
////////////////////////////////////////////////////////////////
class String                    
   {
   protected:
      enum { SZ = 8 };        
      char str[SZ];            
   public:
      String()                 
         { str[0] = '\0'; }
      explicit String( char s[] )       
         { strcpy(str, s); }   
      void display() const     
         { cout << str; }
      operator char*()        
         { return str; }   
   };
 
 
   class Pstring:public String
   {
   public:
       Pstring(char s[]);                 //no-arg constructor
 
   };
 
Pstring::Pstring(char s[])
{
 
if(strlen(s)>SZ-1){
for (int j = 0;j<SZ-1;j++){
str[j] = s[j];
if(str[j] == s[SZ])
str[j] = '\0';
}
     }
 
 else
    String(s); //ЭТО ЧТО ТАКОЕ? СОЗДАНИЕ ОБЪЕКТА ТИПА String? ЗАЧЕМ? ИЛИ ЧТО КОНСТРУКТОР???
 
    }
 
 
////////////////////////////////////////////////////////////////
int main()
   {
       setlocale(LC_ALL, "russian");
   Pstring s1 = " Это точно очень длинная строка ";                   
  
   s1.display();               
 
   Pstring s2("ваа!");  
              s2.display();                 
    cout << endl;                 
    return 0;                   
   }
0
261 / 111 / 53
Регистрация: 22.01.2017
Сообщений: 448
13.12.2018, 09:12
Achill, Pstring наследуется от String, так что вызывается конструктор explicit String(char s[]), если длина строки меньше 8.
Главное чтобы компилятор принял этот синтаксис.
Код сам компилируется?
А какой смысл имеет следующее условие?
C++
1
2
if(str[j] == s[SZ])
    str[j] = '\0';
Это точно такой код из книги?
0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37
13.12.2018, 10:27
Нет explicit там нету это уже добавлял, if(str[j] == s[SZ])
str[j] = '\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
51
52
53
54
55
56
57
58
59
// ex9_2.cpp
// наследование класса String
#include <iostream>
#include <cstring>        // дл¤ strcpy(), etc.
using namespace std;
///////////////////////////////////////////////////////////
class String             // базовый класс
{
protected:               // ѕримечание: не об¤зательно 
                         // делать их скрытыми
    enum { SZ = 80 };    // размер всех объектов String
    char str[SZ];        // содержит —-строку
public:
    String()             // конструктор 0, без аргументов
    { str[0] == '\0'; }
 
    String(char s[])     // конструктор 1, один аргумент
    { strcpy(str, s); }  // преобразование из string в String
 
    void display()const  // вывести String
    { cout << str; }
 
    operator char*()     // функци¤ преобразовани¤
    { return str; }      // преобразовать String в C-string
};
///////////////////////////////////////////////////////////
class Pstring :public String  // порожденный класс
{
public:
    Pstring(char s[]);        // конструктор
};
//---------------------------------------------------------
Pstring::Pstring(char s[])    // конструктор дл¤ Pstring
{
    if(strlen(s)> SZ - 1)     // если слишком длинна¤ строка,
    {
        for(int j = 0; j < SZ-1; j++) // копировать первую SZ-1
            str[j] == s[j];           // символы Ђвручнуюї
        str[j] == '\0';       // добавить служебный символ
    }
    else                      // если не слишком длинна¤,
        String(s);            // создать нормальную строку
}
///////////////////////////////////////////////////////////
int main()
{
    system("chcp 1251 > nul");
 
    // определить String
    Pstring s1 = "Ёто очень-очень длинна¤ строка, котора¤, возможно, "
        "да, нет, точно, -- превысит размер, ограниченный SZ.";
    cout << "\ns1 ="; s1.display();  // вывести String
 
    Pstring s2 = "ј это коротенька¤ строка.";// определить String
    cout << "\ns2 ="; s2.display();  // вывести String
    cout << endl;
 
    return 0;
}
0
261 / 111 / 53
Регистрация: 22.01.2017
Сообщений: 448
13.12.2018, 10:51
Цитата Сообщение от Achill Посмотреть сообщение
Как он вызывает базовый конструктор из тела конструктора-наследника то????
Производный класс может обращаться ко всем публичным и защищенным данным базового класса.
А условие в книге правильное. Ваше условие сравнивает каждый символ str с символом следующим за последним символом s, что не имеет смысла.

Добавлено через 6 минут
Правда в 39 строке должен быть оператор присваивания:
C++
1
str[j] = '\0';
0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37
13.12.2018, 11:35
Во первых надо обращать внимание на комментарии которые пишет автор
во вторых
C++
1
2
3
for(int j = 0; j < SZ-1; j++) // копировать первую SZ-1
            str[j] == s[j];           // символы Ђвручнуюї
        str[j] == '\0';       // добавить служебный символ
это не компилируется

в третьих речь не про доступ к данным базового класса, а про вызов конструктора базового класса из класса - наследника, такое не возможно.
ив четвертых в базовом классе тоже опечатки
C++
1
2
    String()             // конструктор 0, без аргументов
    { str[0] == '\0'; }
И мое условия правильное как и задумывал автор поставить в конце нуль-терминатор.
Условие заключается в том что когда массив дойдет до конца то оно будет верным и добавится в конец ноль в этом заключается смысл условия

Добавлено через 7 минут
Мое условия НЕ "сравнивает каждый символ str с символом следующим за последним" , а сравнивает с константой SZ которая является последним индексом массива. Условие заключается в том что когда массив дойдет до конца то оно будет верным и добавится в конец ноль-терминатор в этом заключается смысл условия.

Добавлено через 31 минуту
Извиняюсь, Согласен! эти опечатки все запутали, мое условие задумывалось такое :

C++
1
2
if(j == SZ)
str[j] = '\0';

Но суть то все равно не в этом! Можно было вообще в "псевдокоде" показывать, я не на это обращаю внимание в первом посту, мне не понятно вот это:
C++
1
2
3
4
else
    String(s); //ЭТО ЧТО ТАКОЕ? СОЗДАНИЕ ОБЪЕКТА ТИПА String? ЗАЧЕМ? ИЛИ ЧТО КОНСТРУКТОР???
 
    }
Что это и зачем? и куда?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.12.2018, 11:35

Объектно-ориентированный анализ, Объектно-ориентированное проектирование, Объектно-ориентированное программирование
Моё задание: Система Авиакомпания. Авиакомпания имеет список рейсов. Диспетчер формирует летную Бригаду (пилоты, штурман, радист,...

Ошибки в книги Р.Лафоре "Объектно-Ориентирование программирование в C++"
Добрый день всем присутствующим. Хотелось бы обсудить книгу Robert Lafore Object-Oriented Programming in C++. И если вы хотя бы...

Ориентированное программирование в С++ Р. Лафоре
Доброго времени суток форумчане! Хочу вот закинуть себе книгу &quot;Объектно-ориентированное программирование в С++&quot; на Ipad, да вот...

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

Объектно-ориентированное программирование
Друзья, прошу помощи, накопил кучу долгов по учёбе, совершенно нет времени разобраться с задачами, тем более что я в них не силён:cry: ...


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

Или воспользуйтесь поиском по форуму:
300
Ответ Создать тему
Новые блоги и статьи
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru