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

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

01.02.2012, 17:47. Показов 210074. Ответов 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
388 / 334 / 65
Регистрация: 14.10.2014
Сообщений: 1,463
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
388 / 334 / 65
Регистрация: 14.10.2014
Сообщений: 1,463
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
388 / 334 / 65
Регистрация: 14.10.2014
Сообщений: 1,463
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
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru