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

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

01.02.2012, 17:47. Показов 212427. Ответов 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
6 / 6 / 1
Регистрация: 16.07.2013
Сообщений: 74
18.06.2014, 09:06
Студворк — интернет-сервис помощи студентам
Вы выложите под спойлер, а то может кому через год, другой понадобится.
0
0 / 0 / 0
Регистрация: 19.04.2014
Сообщений: 7
18.06.2014, 13:02
Цитата Сообщение от Drusha Посмотреть сообщение
Вы выложите под спойлер, а то может кому через год, другой понадобится.
Выложу, только через недели 2-3 минимум, сейчас уже не имею достаточно удобств, чтобы выложить всё. Т.к. под рукой имею только смартфон. А с него ой как неудобно выкладывать. Несколько листингов еще можно постараться, если надобность у кого возникнет.
С уважением,
Андрей
0
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 2
31.07.2014, 20:19
мой вариант
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;
}
}
0
0 / 0 / 0
Регистрация: 01.08.2014
Сообщений: 3
01.08.2014, 14:30
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';?
0
0 / 0 / 0
Регистрация: 19.04.2014
Сообщений: 7
13.08.2014, 14:43
Задавайте вопрос правильно!
Конкретизируйте что Вам не понятно. Тогда получите ответ.
А так получается вопрос из серии: "а почему яблоко называется яблоком?")
Какая именно часть выражения Вам непонятна?
0
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 3
07.10.2014, 13:22
В упражнении 8 главы 9 по-моему допущена ошибка, так как вместе с возвращением новой строки также изменяется и старая, для которой собственно выполняется функция.. необходимо создать временный строковый массив для хранения строки, которую необходимо будет вернуть в программу, таким образом программа будет работать корректнее(ведь в этом упражнении мы делаем аналог класса string). также неправильно реализована функция mid, в условии задачи сказано, что в среднем аргументе задается номер символа, с которого необходимо начать копирование строки.

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

Добавлено через 13 минут
По-моему некрасиво выкладывать нерабочий код и утверждать, что он является решением для упражнения!
0
6 / 6 / 1
Регистрация: 16.07.2013
Сообщений: 74
12.10.2014, 21:57
Повторюсь, не ошибается тот, кто ничего не делает.
Цитата Сообщение от GooderSteel Посмотреть сообщение
если вы уважаете тех людей, кто читает этот пост
То соизвольте приводить код про который Вы пишите.
0
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 3
13.10.2014, 13:57
Вот код, который написал я, и заметьте, он хотя бы работает! Да, и удалите нерабочие коды, а то только вводите людей в ступор! Проявите хоть чуточку уважения к читателям!
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 минут
А вот вашего варианта кода я так и не увидел.. Собственно, отсюда делаем вывод о вашем отношении к людям) Либо вы считаете, что тот код правильный?)
0
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,475
14.10.2014, 00:52
Здравствуйте. Искал решения из книги Р. Лафоре "Объектно-ориентированное программирование в С++" и наткнулся на этот форум. Во общем до 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;
}
0
2 / 2 / 0
Регистрация: 11.08.2014
Сообщений: 14
18.10.2014, 14:19
а можете подсказать зачем в вашем исходнике 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;
}
1
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,475
25.10.2014, 14:50
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);
а что это за функции?
0
Модератор
Эксперт С++
 Аватар для zss
13789 / 10981 / 6492
Регистрация: 18.12.2011
Сообщений: 29,281
25.10.2014, 15:02
Выход тут ни при чем.
Надо в начале цикла КАЖДЫЙ раз обнулять( "ободинять" ) fact:
C++
1
2
fact=1;for (int j=numb; j>0; j--)
    fact*=j;
1
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,475
25.10.2014, 19:06
Слава Всевышнему !!! Работает!!!! Большое спасибо!
0
0 / 0 / 0
Регистрация: 08.01.2015
Сообщений: 1
08.01.2015, 14:40
Прошу прощения что поднимаю некропост. Выкладываю свой вариант решения 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;
}
0
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
15.01.2015, 02:13
Цитата Сообщение от 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.
0
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,475
17.01.2015, 01:10
А разве в книге есть решение 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;
}
0
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
17.01.2015, 22:33
Цитата Сообщение от 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;
}
1
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,475
17.01.2015, 23:28
Признаю - мой код неправильный...
у тебя верно только надо в строках
Цитата Сообщение от 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).
Спасибо что заставил довести до ума это задание
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.01.2015, 23:28

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
160
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru