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

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

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

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

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

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

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

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


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

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

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

Упражнение 9

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

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

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

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

Объектно-ориентированное программирование C++
C++ Объектно-ориентированное программирование
C++ Объектно ориентированное программирование
Ищу ответы на задания из книги Лафоре Р. "Объектно-ориентированное программирование в С++" 4 издание. C++
C++ Объектно-ориентированное программирование C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Drusha
6 / 6 / 0
Регистрация: 16.07.2013
Сообщений: 74
18.06.2014, 09:06     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #141
Вы выложите под спойлер, а то может кому через год, другой понадобится.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
iAndrew5
0 / 0 / 0
Регистрация: 19.04.2014
Сообщений: 7
18.06.2014, 13:02     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #142
Цитата Сообщение от Drusha Посмотреть сообщение
Вы выложите под спойлер, а то может кому через год, другой понадобится.
Выложу, только через недели 2-3 минимум, сейчас уже не имею достаточно удобств, чтобы выложить всё. Т.к. под рукой имею только смартфон. А с него ой как неудобно выкладывать. Несколько листингов еще можно постараться, если надобность у кого возникнет.
С уважением,
Андрей
Да
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 2
31.07.2014, 20:19     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #143
мой вариант
11 задание, глава 3
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;
int main()
{
setlocale(LC_ALL, "rus");
char ch='J';
char chh='.';
char chs='*';
char i;
int j;
int pound,shil,pens;
int pound2,shil2,pens2;
int pounds,shils,penss;
char op;
cout<<"Если сумма или разность нажмите 1,для произведения нажмите любую клавишу ";cin>>i;
if (i==1) {
cout<<"Введите первую сумму операцию и вторую сумму "<<ch<<endl;
cin>>pound>>chh>>shil>>chh>>pens>>op>>ch>>pound2>>chh>>shil2>>chh>>pens2;
pounds=pound+pound2;
switch(op)
{
case '+':
shils=shil+shil2;
penss=pens+pens2;
if (penss>6)
  {
    shils++;
    penss=0;
  }
if (shils>19)
   {
    pounds++;
    shils=0;
   }
cout<<"Всего "<<ch<<pounds<<chh<<shils<<chh<<penss;
break;
case '-':
    pounds=pound-pound2;
    shils=shil-shil2;
    penss=pens-pens2;
    cout<<"Разность равна "<<ch<<pounds<<chh<<shils<<chh<<penss;
    break;
}
}
if (i!=1 || i=='a') {
    cout<<"Введите первую сумму операцию и вещ.число "<<ch;
cin>>pound>>chh>>shil>>chh>>pens>>chs>>j;
pounds=pound*j;
shils=shil*j;
penss=pens*j;
if (penss>6)
  {
    shils++;
    penss=0;
  }
if (shils>19)
   {
    pounds++;
    shils=0;
   }
cout<<pounds<<'.'<<shils<<'.'<<penss;
return 0;
}
}
igoreshka3333
0 / 0 / 0
Регистрация: 01.08.2014
Сообщений: 3
01.08.2014, 14:30     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #144
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream.h>
#include <conio.h>
#include <windows.h>
#include <iomanip.h>
 
int main ()
{
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 char ch;
 int resultat = 0 ;
 cout << "Enter 6 symbols: ";
 while ((ch = getche())!='\r')
 
  resultat = resultat*10 + ch - '0';
  cout <<'\n' <<resultat;
 
 getch ();
 return 0;
}
Обьясните, пожалуйста, почему именно resultat = resultat*10 + ch - '0';?
iAndrew5
0 / 0 / 0
Регистрация: 19.04.2014
Сообщений: 7
13.08.2014, 14:43     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #145
Задавайте вопрос правильно!
Конкретизируйте что Вам не понятно. Тогда получите ответ.
А так получается вопрос из серии: "а почему яблоко называется яблоком?")
Какая именно часть выражения Вам непонятна?
GooderSteel
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 3
07.10.2014, 13:22     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #146
В упражнении 8 главы 9 по-моему допущена ошибка, так как вместе с возвращением новой строки также изменяется и старая, для которой собственно выполняется функция.. необходимо создать временный строковый массив для хранения строки, которую необходимо будет вернуть в программу, таким образом программа будет работать корректнее(ведь в этом упражнении мы делаем аналог класса string). также неправильно реализована функция mid, в условии задачи сказано, что в среднем аргументе задается номер символа, с которого необходимо начать копирование строки.

Добавлено через 39 минут
А после запуска этого кода выяснилось, что он не работает..Вы хоть отлаживали то, что написали?
Drusha
6 / 6 / 0
Регистрация: 16.07.2013
Сообщений: 74
08.10.2014, 14:36     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #147
GooderSteel, прошу прощение, но вы собственно о чем? В теме 146 комментариев (вместе с вашим), указали бы цитаты, что бы было понятно о чем речь. А вообще в этой теме почти все новички (или были ими), а как известно ошибается тот кто ничего не делает, думаю и в ваших решениях можно найти и не одну ошибку, так что как-то некрасиво заявлять:
Цитата Сообщение от GooderSteel Посмотреть сообщение
Вы хоть отлаживали то, что написали?
GooderSteel
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 3
12.10.2014, 16:53     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #148
Ничего некрасивого я тут не вижу, если вы уважаете тех людей, кто читает этот пост, то соизвольте выкладывать рабочие версии кода, тем более что все они новички и сделают своих кучу ошибок помимо тех, что наделали вы сами.

Добавлено через 13 минут
По-моему некрасиво выкладывать нерабочий код и утверждать, что он является решением для упражнения!
Drusha
6 / 6 / 0
Регистрация: 16.07.2013
Сообщений: 74
12.10.2014, 21:57     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #149
Повторюсь, не ошибается тот, кто ничего не делает.
Цитата Сообщение от GooderSteel Посмотреть сообщение
если вы уважаете тех людей, кто читает этот пост
То соизвольте приводить код про который Вы пишите.
GooderSteel
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 3
13.10.2014, 13:57     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #150
Вот код, который написал я, и заметьте, он хотя бы работает! Да, и удалите нерабочие коды, а то только вводите людей в ступор! Проявите хоть чуточку уважения к читателям!
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
#include <iostream>
#include <string.h>       // для функций str*
using namespace std;
 
///////////////////////////////////////////////////////////
class String
{
protected:
    enum { SZ = 100 };    // размер массива
    char str[SZ];         // массив для хранения строки
public:
    // конструктор без параметров
    String()
    {
        str[0] = '\0';
    }
    // конструктор с одним параметром
    String(char s[])
    {
        strcpy(str, s);
    } // сохраняем строку в массиве
    // показ строки
    void display() const
    {
        cout << str << endl;
    }
    // перевод строки к обычному типу
    operator char* ()
    {
        return str;
    }
};
///////////////////////////////////////////////////////////
 
class Pstring :public String    //Этот класс является производным от String
{
public:
    Pstring() :String(){};
    Pstring(char s[])
    {
        if (strlen(s) > SZ - 1)
        {
            for (int i = 0; i < SZ - 1; i++)
                str[i] = s[i];
            str[SZ - 1] = '\0';
        }
        else
            strcpy(str, s);
    }
};
 
class Pstring2 : public Pstring
{
public:
    Pstring2() :Pstring(){};
    Pstring2(char s[]) :Pstring(s){};
    Pstring2& left(Pstring2, int);
    Pstring2& mid(Pstring2, int, int);
    Pstring2& right(Pstring2, int);
};
 
//В строку класса помещаются n самых левых символов строки s1
Pstring2& Pstring2::left(Pstring2 s1, int n)
{
    int size = strlen(str);
    char ss[SZ];
    strcpy(ss, str);
    for (int i = 0; i < strlen(s1.str)+1; i++)
    {
        if (i == n)
        {
            ss[size] = '\0';
            break;
        }
        else
        {
            if (size != SZ)
            {
                ss[size] = s1.str[i];
                size++;
            }
            else
            {
                //если массив стал наибольшей возможной длины
                ss[size] = '\0';
                size++;
                break;
            }
        }
    }
 
    return Pstring2(ss);
}
 
//В строку помещаются n символов из строки s1 начиная с s
Pstring2& Pstring2::mid(Pstring2 s1, int s, int n)
{
    int size = strlen(str);
    char ss[SZ];
    strcpy(ss, str);
    for (int i = 0; i < n + 1; i++)
    {
        if (i == n)
        {
            ss[size] = '\0';
            break;
        }
        else
        {
            if (size != SZ)
            {
                ss[size] = s1.str[i + s];
                size++;
            }
            else
            {
                //если массив стал наибольшей возможной длины
                ss[size] = '\0';
                size++;
                break;
            }
        }
    }
 
    return Pstring2(ss);
}
 
Pstring2& Pstring2::right(Pstring2 s1, int n)
{
    int size = strlen(str);
    char ss[SZ];
    strcpy(ss, str);
    for (int i = strlen(s1.str) - n; i < strlen(s1.str) + 1; i++)
    {
        if (i == n)
        {
            ss[size] = '\0';
            break;
        }
        else
        {
            if (size != SZ)
            {
                ss[size] = s1.str[i];
                size++;
            }
            else
            {
                //если массив стал наибольшей возможной длины
                ss[size] = '\0';
                size++;
                break;
            }
        }
    }
 
    return Pstring2(ss);
}
 
///////////////////////////////////////////////////////////
int main()
{
    setlocale(LC_CTYPE, "rus");
    const int SZ = 100;
 
    char xstr[] = "Ура, товарищи!"; // создаем обычную строку
 
    Pstring2 s1 = xstr;
 
    s1.display();                   // показываем строку
 
    Pstring2 s2("Мы победим!");     // снова используем конструктор с параметром
 
    s2.display();
    Pstring2 s3 = s1.left(s2, 11);
 
    cout << static_cast<char*>(s3); // используем оператор перевода типа
    cout << endl;
 
    s3 = s3.right(s2, 11);
 
    cout << static_cast<char*>(s3); // используем оператор перевода типа
    cout << endl;
 
    s3 = s3.mid(s1, 0 ,14);
 
    cout << static_cast<char*>(s3); // используем оператор перевода типа
    cout << endl;
 
    std::system("pause");
    return 0;
}
Добавлено через 9 минут
А вот вашего варианта кода я так и не увидел.. Собственно, отсюда делаем вывод о вашем отношении к людям) Либо вы считаете, что тот код правильный?)
Recrut_rf
6 / 6 / 0
Регистрация: 14.10.2014
Сообщений: 44
Завершенные тесты: 2
14.10.2014, 00:52     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #151
Здравствуйте. Искал решения из книги Р. Лафоре "Объектно-ориентированное программирование в С++" и наткнулся на этот форум. Во общем до 3 -ей главы удалось решить всё самому, но на 6-ом упражнении 3-ей главы застрял. Нашёл тут решение Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" , но что-то данный код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    char ch;
    unsigned long fact=1, r=0;
    cout <<"Введите число: ";
    while ((ch=_getche()) !='0')
    {
        r= r* 10+ ch -'0';//получаем число в long
        for (int j=r; j>0; j--)//цикл для расчета факториала
            fact *=j;//расчет факториала
    }
    
    cout <<"\nФакториал числа равен: " <<fact <<endl;
    
    system ("pause >>void");


у меня не работает. Написал свой - факториалы считает без проблем, но после этого сразу же прога завершается. Как сделать так, чтобы выходил запрос на ввод следующего числа?
вот мой исходник:
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
#include <iostream>
#include <locale>
 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main() 
{
    setlocale (LC_ALL, "rus");
    unsigned int numb;
    unsigned long fact =1;
    cout << "Введите целое число:";
    cin >> numb;
    while (numb!=0)
    {
        cout << "Факториал числа равен:";
        for (int j=numb; j>0; j--)
        {
            fact*=j;
                   
        }
        cout << fact << endl;
        break;
    }
    
    return 0;
}
Aleksandr644
2 / 2 / 0
Регистрация: 11.08.2014
Сообщений: 11
18.10.2014, 14:19     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #152
а можете подсказать зачем в вашем исходнике while и break; ???
Имхо для запроса на следующее число нужно вот так.
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
#include <iostream>
#include <windows.h>
 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    unsigned int numb;
    int var;
    do
    {
           cout << "Введите целое число:";
           cin >> numb;
           cout << "Факториал числа равен:";
           unsigned long fact =1;
           for (int j=numb; j>0; j--)
             {
                fact*=j;
             }
           cout << fact << endl;
       cout<<"нажмите 0 для выхода";
       cin >>var;
    }
    while(var!=0);
    return 0;
}
Recrut_rf
6 / 6 / 0
Регистрация: 14.10.2014
Сообщений: 44
Завершенные тесты: 2
25.10.2014, 14:50     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #153
while - что бы при нажатии 0 программа завершалась, ну а без break - факториал считается бесконечно.
Вообще я хотел организовать подобную конструкцию:
Вводим 0 - получаем надпись - Некорректное число;
Вводим целое число - получаем факториал и надпись - Продолжать? (введите 'y' или 'n').
Вводим отличное от 'n' - программа запрашивает новое число и считает новый факториал.
Вот исходник:
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
#include <iostream>
#include <locale>
 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main() 
{
    setlocale (LC_ALL, "rus");
    char ch;
    unsigned int numb;
    unsigned long fact =1;
    do
    {
    cout << "Введите целое число:";
    cin >> numb;
    if (numb==0)
    {
        cout << "Некорректное число!\n";
        continue;
        cin >> numb;
    } 
    for (int j=numb; j>0; j--)
    fact*=j;
    cout << "Факториал числа равен:";
    cout << fact << endl;
    cout << "Продолжать? (введите 'y' или 'n')\n";
    cin >> ch;
    }
    while (ch!='n');
    return 0;
}
Вроде при первом прогоне числа всё работает нормально. Но если в конце выбрать продолжение (нажать что-нибудь кроме 'n') - получаем ерунду:
например - вводим первый раз 5 - в итоге получаем факториал -120 и запрос на продолжение. Если продолжить - то при вводе той же 5 получим результат 14400. То есть из цикла не выходит и полученные 120 умножает на новые 120.
Вот я и думал - как организовать выход из цикла - break вставлял поочерёдно во всех циклах - не помогло, continue и exit пробовал - тот же результат. Хочу разобраться - что не так сделано?

Добавлено через 3 минуты
Цитата Сообщение от Aleksandr644 Посмотреть сообщение
SetConsoleOutputCP(1251); SetConsoleCP(1251);
а что это за функции?
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,180
Завершенные тесты: 1
25.10.2014, 15:02     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #154
Выход тут ни при чем.
Надо в начале цикла КАЖДЫЙ раз обнулять( "ободинять" ) fact:
C++
1
2
fact=1;for (int j=numb; j>0; j--)
    fact*=j;
Recrut_rf
6 / 6 / 0
Регистрация: 14.10.2014
Сообщений: 44
Завершенные тесты: 2
25.10.2014, 19:06     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #155
Слава Всевышнему !!! Работает!!!! Большое спасибо!
8tomat8
0 / 0 / 0
Регистрация: 08.01.2015
Сообщений: 1
08.01.2015, 14:40     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #156
Прошу прощения что поднимаю некропост. Выкладываю свой вариант решения 12ой задачи. Вариант решения предложенный в книге - не понравился...
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
    float dec_amount,temp;
    int dec_pou,pou,pen,shil;
    cout << "New amount: ";
    cin >> dec_amount;
    dec_pou = static_cast<int>(dec_amount);
    temp = dec_amount*240-dec_pou*240;
    shil = static_cast<int>(temp/12);
    pen = temp-shil*12;
    cout << "Result: " << dec_pou << "." << shil << "." << pen;
    return 0;
}
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
15.01.2015, 02:13     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #157
Цитата Сообщение от Kins Посмотреть сообщение

Решение глава 3 задача №8:

int a, b, c, d, e, f, x, y, z;
char ch;
do {
cout <<"\nВведите первую сумму: \x9c "; cin >>a >>b >>c;
cout <<"Введите вторую сумму: \x9c "; cin >>d >>e >>f;
z=c+f;//рассчет пенсов
y=b+e;//рассчет шиллингов
x=a+d;//рассчет фунтов
if (z>11)(y+=1)&&(z=z%12);//если сумма пенсов >11, то прибавляем к сумме шиллингов 1 и приводим сумму пенсов к виду кратной 12
if (y>19)(x+=1)&&(y=y%20);//если сумма шиллингов >19, то прибавляем к сумме фунтов 1 и приводим сумму шиллингов к виду кратной 20
cout <<"Всего: \x9c " <<x <<"." <<y <<"." <<z <<endl;
cout <<"Продолжить? (y/n)";
} while ((ch=_getche())!='n');
Или я чего не понял либо у вас тут ошибка.

if (z>11)(y+=1)&&(z=z%12);//если сумма пенсов >11, то прибавляем к сумме шиллингов 1 и приводим с

Т.е по вашему получается, что если сумма пенсов >11 мы к шиллингам прибавляем 1. Но если допустим я ввиду число пенсов=34. В вашем случае шиллинги увеличатся только на 1 и в пенсы попадет 1. А должно количество шиллингов увеличиться на 3 а количество пенсов должно быть равно 1.
Recrut_rf
6 / 6 / 0
Регистрация: 14.10.2014
Сообщений: 44
Завершенные тесты: 2
17.01.2015, 01:10     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #158
А разве в книге есть решение 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
#include <iostream>
#include <clocale>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
 
int main()
 {
    setlocale (LC_CTYPE, "rus");
    float decfunt, decshiling, decpens, a, b;
    int funt, shiling, pens;
    cout << "Введите число десятичных фунтов:";
    cin >> decfunt;
    funt = static_cast<int>(decfunt);
    a = decfunt - funt;
    decshiling = a * 20;
    shiling = static_cast<int>(decshiling);
    b = decshiling - shiling;
    decpens = b * 12;
    pens = static_cast<int>(decpens);
    cout << "Эквивалентная сумма в старой форме записи:" << funt << '.' << shiling << '.' << pens << endl;
    system("pause");
    return 0;
}
Вроде не сильно отличается от вашего...

Добавлено через 1 час 32 минуты
Цитата Сообщение от dicros Посмотреть сообщение
Или я чего не понял либо у вас тут ошибка.
if (z>11)(y+=1)&&(z=z%12);//если сумма пенсов >11, то прибавляем к сумме шиллингов 1 и приводим с
Т.е по вашему получается, что если сумма пенсов >11 мы к шиллингам прибавляем 1. Но если допустим я ввиду число пенсов=34. В вашем случае шиллинги увеличатся только на 1 и в пенсы попадет 1. А должно количество шиллингов увеличиться на 3 а количество пенсов должно быть равно 1.
Значение шилингов увеличивается на 1 а в пенсы попадёт 10 а не 1 (если складывать 0.0.34 + 0.0.0), хотя вроде как должно быть 2 шилинга и 10 пенсов (12+12+10). Один хрен - если подставить значения из книги - 5.10.6 + 3.2.6 - получим нужные 8.13.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
#include <iostream>
#include <clocale>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main(int argc, char** argv)
 {
    setlocale (LC_ALL, "rus");
    char ch;
    int funt, shiling, pens, funt2, shiling2, pens2, vsegosh, vsegop, vsegof;
    do
    {
        cout << "Введите первую сумму :\n";
        cin >> funt >> shiling >> pens;
        cout << "\nВведите вторую сумму:\n";
        cin >> funt2 >> shiling2 >> pens2;
        vsegof = funt + funt2;
        vsegosh = shiling+shiling2;
        vsegop = pens + pens2;
        if (pens + pens2 > 11)
        {
            (vsegosh+=1) && (vsegop = vsegop%12);
            
        }
        if (shiling+shiling2 > 19)
        {
            (vsegof+=1) && (vsegosh = vsegosh%20);
        
        }
        cout << "\nВсего:" << vsegof << '.' << vsegosh << '.' << vsegop << endl;
        cout << "\nЕщё раз? (y,n)";
        cin >> ch;
    }
    while (ch!='n');
    return 0;
}
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
17.01.2015, 22:33     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #159
Цитата Сообщение от Recrut_rf Посмотреть сообщение
Значение шилингов увеличивается на 1 а в пенсы попадёт 10 а не 1 (если складывать 0.0.34 + 0.0.0), хотя вроде как должно быть 2 шилинга и 10 пенсов (12+12+10). Один хрен - если подставить значения из книги - 5.10.6 + 3.2.6 - получим нужные 8.13.0. У меня результаты точно такие же. Вот код если что:
Если вводить пример из книжки понятно что получиться потому-что там значения маленькие а попробуй другие....
Хорошо может быть так будет понятней попробуй ввести такие значения:
5.25.6 + 3.12.35 = ? (сколько получиться у тебя)

И сравни результат свой и правильный (10.2.8)

Я этот пример решил так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
using namespace std;
 
int main()
{
    setlocale(0, "Rus");
    int shil, penc, funt, shil2, penc2, funt2, shil3, penc3;
    char ch;
 
    do
    {
        cout << "Введите первую сумму: "; cin >> funt >> shil >> penc;
        cout << "Введите вторую сумму: "; cin >> funt2 >> shil2 >> penc2;
 
        funt += funt2;
 
        if ((penc3 = penc + penc2) > 11)
        {
            shil += (penc3 / 11);
            penc = penc3 % 11;
        }
        else
        {
            penc += penc2;
        }
 
        if ((shil3 = shil + shil2) > 19)
        {
            funt += (shil3 / 19);
            shil = shil3 % 19;
        }
        else
        {
            shil += shil2;
        }
 
        cout << "Всего " << funt << "." << shil << "." << penc << endl;
 
        cout << "Продолжить(y/n)?"; cin >> ch;
    } while (ch != 'n');
 
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.01.2015, 23:28     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Recrut_rf
6 / 6 / 0
Регистрация: 14.10.2014
Сообщений: 44
Завершенные тесты: 2
17.01.2015, 23:28     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #160
Признаю - мой код неправильный...
у тебя верно только надо в строках
Цитата Сообщение от dicros Посмотреть сообщение
if ((penc3 = penc + penc2) > 11) { shil += (penc3 / 11); penc = penc3 % 11; } else
и
Цитата Сообщение от dicros Посмотреть сообщение
if ((shil3 = shil + shil2) > 19) { funt += (shil3 / 19); shil = shil3 % 19; } else
поменять кое какие цифры. Вот правильный вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if ((penc3 = penc + penc2) > 11)
        {
            shil += (penc3 / 12);
            penc = penc3 % 12;
        }
        else
        {
            penc += penc2;
        }
 
        if ((shil3 = shil + shil2) > 19)
        {
            funt += (shil3 / 20);
            shil = shil3 % 20;
        }
        else
Цитата Сообщение от dicros Посмотреть сообщение
5.25.6 + 3.12.35 = ? (сколько получиться у тебя)
И сравни результат свой и правильный (10.2.8)
Правильный результат - 10.0.5 (пенсов - 35+6=41 из них 5 пенсов и 3 шилинга получаем, шилингов значит будет 25+12+3(от пенсов)=40 что равоносильно 2 фунтам, фунтов - 5+3+2(от шилингов) = 10. Итого - 10.0.5).
Спасибо что заставил довести до ума это задание
Yandex
Объявления
17.01.2015, 23:28     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Ответ Создать тему
Опции темы

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