Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/1010: Рейтинг темы: голосов - 1010, средняя оценка - 4.92
 Аватар для ZarinZomanu4
10 / 10 / 0
Регистрация: 27.05.2013
Сообщений: 92

Решение всех задач из учебника Стивена Праты

23.03.2015, 12:20. Показов 217466. Ответов 271
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!Решил выложить свои решения задач книги С. Прата. Код ни в коем случае не претендует на звание эталонного, если есть замечания с радостью выслушаю и приму к сведению.

Глава 4

Задания




Задача №1
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
#include <iostream>
 
int main ()
{ 
    using namespace std;
    const int ArSize = 20;
    char Fname[ArSize];
    char Lname[ArSize];
    int age;
    char bit;
    //enum gradeW {A,B,C};
    cout<<"what is your first name "<<endl;
    cin.getline(Fname,ArSize);
    cout<<"what is your last name "<<endl;
    cin.getline(Lname,ArSize);
    cout<<"what letter grade do you deserve(A,B,C) "<<endl;
    cin>>bit;
    cout<<"what is your age "<<endl;
    cin>> age ;
    cin.get();
    cout<<"Name: "<<Lname<<" "<<Fname<<endl;
    cout<<"Age: "<<age<<endl;
    switch (bit)
        {case 'A':
            cout<<"Grade B "<<endl;
            break;
        case 'B':
            cout<<"Grade C"<<endl;
            break;
        case 'C':
            cout<<"Grade D"<<endl;
            break;
        default: cout<<"wrong"<<endl;}
    cin.get();
    return 0;
  }

Задача №2
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
#include <iostream>
#include <string>
int main ()
{ 
    using namespace std;
    string Fname;
    string Lname;
    int age;
    char bit;
    cout<<"what is your first name "<<endl;
    getline(cin,Fname);
    cout<<"what is your last name "<<endl;
    getline(cin,Lname);
    cout<<"what letter grade do you deserve(A,B,C) "<<endl;
    cin>>bit;
    cout<<"what is your age "<<endl;
    cin>> age ;
    cin.get();
    cout<<"Name: "<<Lname<<" "<<Fname<<endl;
    cout<<"Age: "<<age<<endl;
    switch (bit)
        {case 'A':
            cout<<"Grade B "<<endl;
            break;
        case 'B':
            cout<<"Grade C"<<endl;
            break;
        case 'C':
            cout<<"Grade D"<<endl;
            break;
        default: cout<<"dsfsfsfsfsd"<<endl;}
    cin.get();
    return 0;
  }

Задача №3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
//#include <string>
int main ()
{ 
    using namespace std;
    const int ArSize = 20;
    char Fname[ArSize];
    char Lname[ArSize];
    cout<<"Enter your first name "<<endl;
    cin.getline(Fname,ArSize);
    cout<<"Enter your last name "<<endl;
    cin.getline(Lname,ArSize);
    cout<<"Name: "<<Lname<<",  "<<Fname<<endl;
    cin.get();
    return 0;
  }

Задача №5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
struct CandyBar
    {
        char Name [20];
        double netto;
        int Ccal;
    };
int main ()
{ 
    using namespace std;
    CandyBar snack={"Mocha Much",2.3,350};
    cout<<"Struct )))) "<<snack.Name<<snack.netto<<"     "<<snack.Ccal<<endl;
    cin.get();
    return 0;
  }

Задача №6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
struct CandyBar
    {
        char Name [20];
        double netto;
        int Ccal;
    };
int main ()
{ 
    using namespace std;
    CandyBar snack[3]={
        {"Mocha Much",2.3,350},
        {"sfdsfsdf",2.45,435},
        {"bnderlogi", 2.12 , 777}};
 
    cout<<"Struct  "<<snack[2].Name<<"    "<<snack[2].netto<<"   "<<snack[0].Ccal<<endl;
    cin.get();
    return 0;
  }

Задача №7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
struct Pizza
    {
        char Name [20];
        double netto;
        int Ccal;
    };
int main ()
{   using namespace std;
    Pizza Peper;
    cout<<"Enter Name:"<<endl;
    cin.getline (Peper.Name,20);
    cout<<"Enter diametr:"<<endl;
    cin>>Peper.netto;
    cout<<"Enter ves:"<<endl;
    cin>>Peper.Ccal;
    cout<<"Pizza: "<<Peper.Name<<endl<<"Diametr: "<<Peper.netto<<endl<<"Ves: "<<Peper.Ccal<<endl;
    cin.get();
    cin.get();
    return 0;
  }

Задача №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
#include <iostream>
#include <string>
struct Pizza
{
    std :: string Name ;
    double netto;
    int Ccal;
    };
int main ()
{   using namespace std;
    Pizza *pz =new Pizza;
    cout<<"Enter diametr:"<<endl;
    cin>>(*pz).netto;
    cout<<"Enter Name:"<<endl;
    cin>>(*pz).Name ;
    cout<<"Enter ves:"<<endl;
    cin>>(*pz).Ccal;
    cout<<"Pizza: "<<(*pz).Name<<endl;
    cout<<"Diametr: "<<(*pz).netto<<endl<<"Ves: "<<(*pz).Ccal<<endl;
    system ("pause");
    delete pz;
    return 0;
  }

Задача №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
#include <iostream>
#include <string>
struct CandyBar
    {
        std::string Name  ;
        double netto;
        int Ccal;
    };
void main ()
{ 
    using namespace std;
    CandyBar *bar= new CandyBar[3];
    bar[0].Name="Mocha Much";
    bar[0].netto=2.3;
    bar[0].Ccal=350;
    bar[1].Name="sfdsfsdf";
    bar[1].netto=2.45;
    bar[1].Ccal=435;
    bar[2].Name="bnderlogi";
    bar[2].netto=2.12;
    bar[2].Ccal=777;
    cout<<"Struct  "<<bar[0].Name<<"    "<<bar[0].netto<<"   "<<bar[0].Ccal<<endl;
    system("pause");
    delete bar;
          }

Задача №10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
int main ()
{ 
    using namespace std;
    int bar[3];
    cout<<"Vvedite rezyltat 1 "<<endl;
    cin>>bar[0];
    cout<<"Vvedite rezyltat 2 "<<endl;
    cin>>bar[1];
    cout<<"Vvedite rezyltat 3 "<<endl;
    cin>>bar[2];
    int Sr=(bar[0]+bar[1]+bar[2])/3;
    cout<<"Rezyltat  "<<bar[0]<<"    "<<bar[1]<<"   "<<bar[2]<<"  Srednee "<<Sr<<endl;
    system("pause");
}


Задачи из глав с 4 о 10, решенные sourcerer
9
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.03.2015, 12:20
Ответы с готовыми решениями:

Нюансы синтаксиса: классы, список инициализации (неясная строка из учебника Стивена Праты)
Вот сам класс #ifndef TABTENN0_H_ #define TABTENN0_H_ #include &lt;string&gt; using std :: string; class...

читаю главу 10 книги стивена праты - "объекты и классы". автор во всех примерах поступает следуйщим образм: объявляет класс в одном фаиле...
...а реализует функции в другом - в том котором создаёт и ползуется объектом. у меня вопросс: а не лучше ли (практичнее, или возможно ли...

Неожиданный консольный вывод (упражнения 3 к главе 6 книги Стивена Праты)
:-| Вообщем имеется код (решение 3 упражнения к главе 6 книги Прата): #include &lt;iostream&gt; #include&lt;cstdlib&gt; ...

271
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.06.2015, 22:20
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Raynor585 Посмотреть сообщение
К главе 11 упражнение 5: из строк 65, 74, 83 (Stonewt.cpp) "friend" -нужно удалить.
Да, это я копипастой злоупотребил. Скопировал как есть из заголовочника. Действительно, в определении методов ключевое слово friend избыточно.
Вот правильный вариант:
Глава 11, упражнение 5 (исправленный вариант).

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
//  sp_Ch11_Pg588_Ex05 - main.cpp
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 11, страница 588, упражнение 5.
/*
Перепишите класс Stonewt (листинги 11.16 и 11.17) так, чтобы он имел член
состояния, который управляет тем, в какой форме интерпретируется объект:
стоуны, целочисленное значение в фунтах или значение в фунтах с плавающей
точкой. Перегрузите операцию << для замены методов show_stn () и show_lbs ().
Перегрузите операции сложения, вычитания и умножения значений Stonewt.
Протестируйте полученный класс с помощью короткой программы, в которой
используются все методы и друзья класса.
*/
#include <iostream>
#include "Stonewt.h"
 
int main()
{
    Stonewt var_a;
    std::cout << "Object var_a constructed by default constructor: " << var_a << std::endl;
 
    Stonewt var_b(62.52);
    std::cout << "Object var_b constructed from double value: " << var_b << std::endl;
 
    Stonewt var_c(10, 60.21);
    std::cout << "Object var_c constructed from stone, double values: " << var_c << std::endl;
 
    var_c.setmode(0);
    std::cout << "Object var_c (Mode set to STONE): " << var_c << std::endl;
 
    var_c.setmode(1);
    std::cout << "Object var_c (Mode set to iPOUND): " << var_c << std::endl;
 
    var_c.setmode(2);
    std::cout << "Object var_c (Mode set to dPOUND): " << var_c << std::endl;
 
    std::cout << "Object var_c (Mode set to incorrect value):\n";
    var_c.setmode(6);
    std::cout << "Object var_c after that: " << var_c << std::endl;
 
    Stonewt var_d = var_b + var_c;
    std::cout << "\nObject var_d after adding: " << var_d << std::endl;
 
    var_d.setmode(0);
    std::cout << "Object var_d (Mode set to STONE): " << var_d << std::endl;
 
    var_d.setmode(1);
    std::cout << "Object var_d (Mode set to iPOUND): " << var_d << std::endl;
 
    var_d.setmode(2);
    std::cout << "Object var_d (Mode set to dPOUND): " << var_d << std::endl;
 
    var_d = var_c - var_b;
    std::cout << "\nObject var_d after division: " << var_d << std::endl;
 
    var_d.setmode(0);
    std::cout << "Object var_d (Mode set to STONE): " << var_d << std::endl;
 
    var_d.setmode(1);
    std::cout << "Object var_d (Mode set to iPOUND): " << var_d << std::endl;
 
    var_d.setmode(2);
    std::cout << "Object var_d (Mode set to dPOUND): " << var_d << std::endl;
 
    var_d = var_c * var_b;
    std::cout << "\nObject var_d after multiplying: " << var_d << std::endl;
 
    var_d.setmode(0);
    std::cout << "Object var_d (Mode set to STONE): " << var_d << std::endl;
 
    var_d.setmode(1);
    std::cout << "Object var_d (Mode set to iPOUND): " << var_d << std::endl;
 
    var_d.setmode(2);
    std::cout << "Object var_d (Mode set to dPOUND): " << var_d << std::endl;
 
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//  sp_Ch11_Pg588_Ex05 - Stonewt.h
 
#ifndef STONEWT_H
#define STONEWT_H
 
enum Mode {STONE, iPOUND, dPOUND};
enum {Lbs_per_stn = 14};        // pounds per stone
 
class Stonewt
{
public:
    Stonewt(double lbs);            // constructor for double pounds
    Stonewt(int stn, double lbs);   // constructor for stone, lbs
    Stonewt();                      // default constructor
    ~Stonewt();                     // destructor
    void setmode(int m);            // set mode by user
    friend Stonewt operator+(const Stonewt & stn1, const Stonewt & stn2);
    friend Stonewt operator-(const Stonewt & stn1, const Stonewt & stn2);
    friend Stonewt operator*(const Stonewt & stn1, const Stonewt & stn2);
    friend std::ostream & operator<<(std::ostream & os, const Stonewt & stn);
 
private:
    int stone;                      // whole stones
    double pds_left;                // fractional pounds
    double dpounds;                 // entire weight in fractional pounds
    int ipounds;                    // entire weight in whole pounds
    Mode mode;                      // stone or whole pounds or fractional pounds
    void setmode();                 // set mode
};
 
#endif // STONEWT_H
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
//  sp_Ch11_Pg588_Ex05 - Stonewt.cpp
 
#include <iostream>
#include "Stonewt.h"
 
 
void Stonewt::setmode()
{
    if (pds_left == 0)
        mode = STONE;
    else if (pds_left - int(pds_left))
        mode = dPOUND;
    else
        mode = iPOUND;
}
 
void Stonewt::setmode(int m)
{
    if (m == 0)
        mode = STONE;
    else if (m == 1)
        mode = iPOUND;
    else if (m == 2)
        mode = dPOUND;
    else
    {
        std::cout << "\n\tWarning! Incorrect argument in function setmode()."
                     "\n\tMode set to STONE.\n\n";
        mode = STONE;
    }
}
 
// construct Stonewt object from double value
Stonewt::Stonewt(double lbs)
{
    stone = int(lbs) / Lbs_per_stn;    // integer division
    pds_left = int(lbs) % Lbs_per_stn + lbs - int(lbs);
    dpounds = lbs;
    ipounds = int(lbs);
 
    setmode();
}
 
// construct Stonewt object from stone, double values
Stonewt::Stonewt(int stn, double lbs)
{
    int addToWholeStones = int(lbs) / Lbs_per_stn;
    double lbs_left = lbs - addToWholeStones * Lbs_per_stn;
    stone = stn + addToWholeStones;
    pds_left = lbs_left;
    dpounds = stn * Lbs_per_stn + lbs;
    ipounds = int(stn * Lbs_per_stn + lbs);
 
    setmode();
}
 
Stonewt::Stonewt()          // default constructor, wt = 0
{
    stone = dpounds = ipounds = pds_left = 0;
    mode = STONE;
}
 
Stonewt::~Stonewt()         // destructor
{
}
 
Stonewt operator+(const Stonewt & stn1, const Stonewt & stn2)
{
    Stonewt sum(stn1.dpounds + stn2.dpounds);
 
    return sum;
}
 
Stonewt operator-(const Stonewt & stn1, const Stonewt & stn2)
{
    Stonewt diff(stn1.dpounds - stn2.dpounds);
 
    return diff;
}
 
Stonewt operator*(const Stonewt & stn1, const Stonewt & stn2)
{
    Stonewt result(stn1.dpounds * stn2.dpounds);
 
    return result;
}
 
std::ostream & operator<<(std::ostream & os, const Stonewt & stn)
{
    if (stn.mode == STONE)
        os << stn.stone << " stone, " << stn.pds_left << " pounds.";
    else if (stn.mode == iPOUND)
        os << stn.ipounds << " pounds.";
    else
        os << stn.dpounds << " pounds.";
 
    return os;
}
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
03.07.2015, 05:27
Глава 11. Упражнение 6.

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
//  sp_Ch11_Pg588_Ex06 - main.cpp
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 11, страница 588, упражнение 6.
/*
Перепишите класс Stonewt (листинги 11.16 и 11.17) так, чтобы перегружались
все шесть операций сравнения. Операции должны сравнивать члены pounds и
возвращать значение типа bool. Напишите программу, которая объявляет
массив из шести объектов Stonewt с инициализацией в объявлении первых трех
из них. Затем программа должна в цикле читать значения, используемые для
установки остальных трех элементов массива. После этого программа должна
вывести самый маленький элемент, самый большой, а также количество
элементов, которые больше или равны 11 стоунам. (Простейший подход предполагает
создание объекта Stonewt, инициализированного 11 стоунами, и сравнение с
ним других объектов.)
*/
#include <iostream>
#include "Stonewt.h"
 
using namespace std;
 
int main()
{
    const int ARR_SIZE = 6;
 
    Stonewt eleven(11, 0);
    Stonewt arr[ARR_SIZE] = {30.27, 102.34, 80.51};
    Stonewt maxElement = arr[0];
    Stonewt minElement = arr[0];
 
    for (int i = 0, j = ARR_SIZE -1; i < ARR_SIZE / 2; ++i, --j)
        arr[j] = arr[i] * 2.0;
 
    int qtyOfElementsBiggerThanEleven = 0;
 
    for (int i = 0; i < ARR_SIZE; ++i)
    {
        if(arr[i] > maxElement)
            maxElement = arr[i];
 
        if(arr[i] < minElement)
            minElement = arr[i];
 
        if(arr[i] >= eleven)
            ++qtyOfElementsBiggerThanEleven;
    }
 
    cout << "Maximal element is: " << maxElement << endl;
    cout << "Minimal element is: " << minElement << endl;
    cout << "Quantity of elements bigger than 11 stones is: "
         << qtyOfElementsBiggerThanEleven;
 
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//  sp_Ch11_Pg588_Ex06 - stonewt.h
 
#ifndef STONEWT_H
#define STONEWT_H
 
enum Mode {STONE, iPOUND, dPOUND};
enum {Lbs_per_stn = 14};        // pounds per stone
 
class Stonewt
{
public:
    Stonewt(double lbs);            // constructor for double pounds
    Stonewt(int stn, double lbs);   // constructor for stone, lbs
    Stonewt();                      // default constructor
    ~Stonewt();                     // destructor
    void setmode(int m);            // set mode by user
    friend Stonewt operator+(const Stonewt & stn1, const Stonewt & stn2);
    friend Stonewt operator-(const Stonewt & stn1, const Stonewt & stn2);
    friend Stonewt operator*(const Stonewt & stn1, const Stonewt & stn2);
    friend bool operator>(const Stonewt & stn1, const Stonewt & stn2);
    friend bool operator>=(const Stonewt & stn1, const Stonewt & stn2);
    friend bool operator<(const Stonewt & stn1, const Stonewt & stn2);
    friend bool operator<=(const Stonewt & stn1, const Stonewt & stn2);
    friend bool operator==(const Stonewt & stn1, const Stonewt & stn2);
    friend bool operator!=(const Stonewt & stn1, const Stonewt & stn2);
    friend std::ostream & operator<<(std::ostream & os, const Stonewt & stn);
 
private:
    int stone;                      // whole stones
    double pds_left;                // fractional pounds
    double dpounds;                 // entire weight in fractional pounds
    int ipounds;                    // entire weight in whole pounds
    Mode mode;                      // stone or whole pounds or fractional pounds
    void setmode();                 // set mode
};
 
#endif // STONEWT_H
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
//  sp_Ch11_Pg588_Ex06 - stonewt.cpp
 
#include <iostream>
#include "Stonewt.h"
 
 
void Stonewt::setmode()
{
    if (pds_left == 0)
        mode = STONE;
    else if (pds_left - int(pds_left))
        mode = dPOUND;
    else
        mode = iPOUND;
}
 
void Stonewt::setmode(int m)
{
    if (m == 0)
        mode = STONE;
    else if (m == 1)
        mode = iPOUND;
    else if (m == 2)
        mode = dPOUND;
    else
    {
        std::cout << "\n\tWarning! Incorrect argument in function setmode()."
                     "\n\tMode set to STONE.\n\n";
        mode = STONE;
    }
}
 
// construct Stonewt object from double value
Stonewt::Stonewt(double lbs)
{
    stone = int(lbs) / Lbs_per_stn;    // integer division
    pds_left = int(lbs) % Lbs_per_stn + lbs - int(lbs);
    dpounds = lbs;
    ipounds = int(lbs);
 
    setmode();
}
 
// construct Stonewt object from stone, double values
Stonewt::Stonewt(int stn, double lbs)
{
    int addToWholeStones = int(lbs) / Lbs_per_stn;
    double lbs_left = lbs - addToWholeStones * Lbs_per_stn;
    stone = stn + addToWholeStones;
    pds_left = lbs_left;
    dpounds = stn * Lbs_per_stn + lbs;
    ipounds = int(stn * Lbs_per_stn + lbs);
 
    setmode();
}
 
Stonewt::Stonewt()          // default constructor, wt = 0
{
    stone = dpounds = ipounds = pds_left = 0;
    mode = STONE;
}
 
Stonewt::~Stonewt()         // destructor
{
}
 
Stonewt operator+(const Stonewt & stn1, const Stonewt & stn2)
{
    Stonewt sum(stn1.dpounds + stn2.dpounds);
 
    return sum;
}
 
Stonewt operator-(const Stonewt & stn1, const Stonewt & stn2)
{
    Stonewt diff(stn1.dpounds - stn2.dpounds);
 
    return diff;
}
 
Stonewt operator*(const Stonewt & stn1, const Stonewt & stn2)
{
    Stonewt result(stn1.dpounds * stn2.dpounds);
 
    return result;
}
 
bool operator>(const Stonewt & stn1, const Stonewt & stn2)
{
    return stn1.dpounds > stn2.dpounds;
}
 
bool operator>=(const Stonewt & stn1, const Stonewt & stn2)
{
    return stn1.dpounds >= stn2.dpounds;
}
 
bool operator<(const Stonewt & stn1, const Stonewt & stn2)
{
    return stn1.dpounds < stn2.dpounds;
}
 
bool operator<=(const Stonewt & stn1, const Stonewt & stn2)
{
    return stn1.dpounds <= stn2.dpounds;
}
 
bool operator==(const Stonewt & stn1, const Stonewt & stn2)
{
    return stn1.dpounds == stn2.dpounds;
}
 
bool operator!=(const Stonewt & stn1, const Stonewt & stn2)
{
    return stn1.dpounds != stn2.dpounds;
}
 
std::ostream & operator<<(std::ostream & os, const Stonewt & stn)
{
    if (stn.mode == STONE)
        os << stn.stone << " stone, " << stn.pds_left << " pounds.";
    else if (stn.mode == iPOUND)
        os << stn.ipounds << " pounds.";
    else
        os << stn.dpounds << " pounds.";
 
    return os;
}

Мой вариант 7 упражнения из главы 11:

Глава 11. Упражнение 7.

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
//  sp_Ch11_Pg588_Ex07 - main.cpp
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 11, страница 588, упражнение 7.
/*
Комплексное число состоит из двух частей — вещественной и мнимой. Один из
способов записи такого числа выглядит как (3.0, 4.0). Здесь 3.0 — вещественная
часть, а 4.0 — мнимая. Предположим, что а = (А, Ві) и с = (С, Di). Ниже
представлены некоторые операции с комплексными числами:
• сложение:   а + с = (А + С, (В + D)i)
• вычитание:  а - с = (А - С, (В - D)i)
• умножение:  а * с = (А * С - В * D, (A * D + В * С)і)
• умножение: (х — вещественное число): х * с = (х * С, x * Di)
• сопряжение: ~а = (А, -Ві)
 
Определите класс complex так, чтобы следующая программа могла использовать
его с корректными результатами:
#include <iostream>
#include "complex0.h" //во избежание конфликта с complex.h
int main()
{
    using std::cout;
    using std::cin;
 
    complex a(3.0, 4.0); // инициализация значением (3,4і)
    complex c;
 
    // Ввод комплексного числа (q для завершения):
    cout << "Enter a complex number (q to quit):\n";
 
    while (cin >> c)
    {
        cout << "с is " << c << '\n';                   // значение с
        cout << "complex conjugate is " << ~c << '\n';  // значение сопряженного числа
        cout << "a is " << a << '\n';                   // значение а
        cout << "a + с is " << a + c << '\n';           // значение а + с
        cout << "a — с is " << a - c << '\n';           // значение а — с
        cout << "a * с is " << a * c << '\n';           // значение а * с
        cout << "2 * с is " << 2 * c << '\n ';          // значение 2 * с
        cout << "Enter a complex number (q to quit):\n";
    }
 
    cout << "Done!\n";
 
    return 0;
}
 
He забывайте, что вы должны перегрузить операции << и >>. В стандарте C++
уже присутствует поддержка комплексных чисел — и намного более развитая,
чем в этом примере — в заголовочном файле complex, поэтому во избежание
конфликтов назовите свой файл complex0.h. Используйте const там, где это
оправдано.
Ниже показан пример выполнения этой программы:
Enter a complex number (q to quit):
real: 10
imaginary: 12
с is (10,12i)
complex conjugate is (10,-12i)
a is (3,4i)
a + с is (13,16i)
a - с is (-7,-8i)
a * с is (-18,76i)
2 * с is (20,24i)
Enter a complex number (q to quit):
real: q
Done!
 
Обратите внимание, что благодаря перегрузке, cin >> с теперь запрашивает
ввод вещественной и мнимой частей комплексного числа.
*/
 
#include <iostream>
#include "ComplexNumber.h"       // во избежание конфликта с complex.h
 
int main()
{
    using std::cout;
    using std::cin;
 
    ComplexNumber a(3.0, 4.0);   // инициализация значением (3,4і)
    ComplexNumber c;
 
    // Ввод комплексного числа (q для завершения):
    cout << "Enter a complex number (q to quit):\n";
 
    while (cin >> c)
    {
        cout << "c is" << c << '\n';                   // значение с
        cout << "complex conjugate is " << ~c << '\n';  // значение сопряженного числа
        cout << "a is " << a << '\n';                   // значение а
        cout << "a + c is " << a + c << '\n';           // значение а + с
        cout << "a - c is " << a - c << '\n';           // значение а — с
        cout << "a * c is " << a * c << '\n';           // значение а * с
        cout << "2 * c is " << 2 * c << '\n';           // значение 2 * с
        cout << "Enter a complex number (q to quit):\n";
    }
 
    cout << "Done!\n";
 
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//  sp_Ch11_Pg588_Ex07 - ComplexNumber.h
 
#ifndef COMPLEXNUMBER_H
#define COMPLEXNUMBER_H
 
class ComplexNumber
{
public:
    ComplexNumber();
    ComplexNumber(double real, double imaginary);
    friend ComplexNumber operator+(const ComplexNumber & c1, const ComplexNumber & c2);
    friend ComplexNumber operator-(const ComplexNumber & c1, const ComplexNumber & c2);
    friend ComplexNumber operator*(const ComplexNumber & c1, const ComplexNumber & c2);
    friend ComplexNumber operator*(double number, const ComplexNumber & c);
    friend ComplexNumber operator*(const ComplexNumber & c, double number);
    friend ComplexNumber operator~(const ComplexNumber & c);
    friend std::istream & operator>>(std::istream & is, ComplexNumber & c);
    friend std::ostream & operator<<(std::ostream & os, const ComplexNumber & c);
 
private:
    double m_real;
    double m_imag;
};
 
#endif // COMPLEXNUMBER_H
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
//  sp_Ch11_Pg588_Ex07 - ComplexNumber.cpp
 
#include <iostream>
#include "ComplexNumber.h"
 
ComplexNumber::ComplexNumber()
{
    m_real = 0;
    m_imag = 0;
}
 
ComplexNumber::ComplexNumber(double real, double imaginary)
{
    m_real = real;
    m_imag = imaginary;
}
 
ComplexNumber operator+(const ComplexNumber & c1, const ComplexNumber & c2)
{    
    ComplexNumber sum(c1.m_real + c2.m_real, c1.m_imag + c2.m_imag);
    return sum;
}
 
ComplexNumber operator-(const ComplexNumber & c1, const ComplexNumber & c2)
{
    ComplexNumber diff(c1.m_real - c2.m_real, c1.m_imag - c2.m_imag);
    return diff;
}
 
ComplexNumber operator*(const ComplexNumber & c1, const ComplexNumber & c2)
{
    ComplexNumber mult(c1.m_real * c2.m_real, c1.m_imag * c2.m_imag);
    return mult;
}
 
ComplexNumber operator*(double number, const ComplexNumber & c)
{
    ComplexNumber mult(number * c.m_real, number * c.m_imag);
    return mult;
}
 
ComplexNumber operator*(const ComplexNumber & c, double number)
{
    ComplexNumber mult(c.m_real * number, c.m_imag * number);
    return mult;
}
 
ComplexNumber operator~(const ComplexNumber & c)
{
    ComplexNumber conjugated(c.m_real, -c.m_imag);
 
    return conjugated;
}
 
std::istream & operator>>(std::istream & is, ComplexNumber & c)
{
    std::cout << "real: ";
    is >> c.m_real;
    if (c.m_real)
    {
        std::cout << "imaginary: ";
        is >> c.m_imag;
    }
 
    return is;
}
 
std::ostream & operator<<(std::ostream & os, const ComplexNumber & c)
{
    os << "(" << c.m_real << ", " << c.m_imag << "i)";
 
    return os;
}

Я решил в перегрузках операторов operator+(), operator-(), operator*() и operator~() использовать конструктор, вместо операции присваивания, чтобы избежать лишнего вызова конструктора копирования. Кроме того, я вставил проверку в перегрузке оператора operator>>(), чтобы получить результат в точности соответствующий условию из учебника.
1
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 933
12.07.2015, 15:40
gru74ik в 5 упражнении 3 задание. Мне кажется там хотят чтобы программа была написана с использованием динамического массива, поскольку в главе 4 уделялось большое внимание им. Мне кажется что так будет меньше занимать памяти. Поскольку я новичок, буду ждать ваших замечаний если не прав.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*Напишите программу, которая приглашает пользователя вводить числа. После
каждого введенного значения программа должна выдавать накопленную сумму
введенных значений. Программа должна завершаться при вводе 0. */
#include <iostream>
using namespace std;
 
int main()
{
    double s,n;
    double* pe = new double [500];
    cout<<"Enter number: ";
    for (cin>>*pe; *pe!=0; )
    {
        n=*pe;
        s += n;
        cout<<s<<endl;
        delete [] --pe;
        cout<<"Enter number: ";
        cin>>*pe;
    }
    cout<<"Bye";
    return 0;
}
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
13.07.2015, 08:58
Цитата Сообщение от Senarist Посмотреть сообщение
Мне кажется там хотят чтобы программа была написана с использованием динамического массива, поскольку в главе 4 уделялось большое внимание им. Мне кажется что так будет меньше занимать памяти.
Ещё раз посмотрите мой вариант:
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
//  sp_Ch5_Pg255_Ex03
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.)
/// Упражнения по программированию. Глава 5, страница 255, упражнение 3.
/*
Напишите программу, которая приглашает пользователя вводить числа. После
каждого введенного значения программа должна выдавать накопленную сумму
введенных значений. Программа должна завершаться при вводе 0.
*/
#include <iostream>
 
int main()
{
    double x = 1;
    double sum = 0;
    while (x)
    {
        std::cout << "Enter a number: ";
        std::cin >> x;
        sum += x;
        if (x)
            std::cout << "Sum is: " << sum << "\n\n";
        else
            std::cout << "\nYou entered zero... Hmm... OK, bye then.\n";
    }
    return 0;
}
У меня используется всего две переменных типа double, простой цикл и простое ветвление внутри цикла.
В Вашем же коде две переменных типа double, а потом ещё и массив типа double ажно на 500 элементов, так же цикл и выделение и очистка памяти (за которыми вы следите самостоятельно).
Памяти однозначно Вы расходуете больше. С точки зрения решения поставленной задачи, Ваше решение, на мой взгляд, чистой воды overengineering (неоправданное усложнение).
0
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 933
13.07.2015, 11:20
Ну да, Вы правы
0
59 / 71 / 2
Регистрация: 04.12.2014
Сообщений: 176
16.07.2015, 21:09
Всем доброго времени суток, у меня возник вопрос по 6 заданию 8 главы.
В задании написано, что в программе необходимо объявить специализацию, использующую массив строк. Можно ли считать функцию
C++
1
const char * maxn(const char * arr[], int qty)
и ее прототип (объявлены в коде) специализацией?

Я написал свой вариант программы, в ней объявление специализации схоже с объявлениями в книге Stephen Prata
Code
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
/*
Напишите шаблонную функцию maxn(), которая принимает в качестве
аргумента массив элементов типа T и целое число, представляющее количество
элементов в массиве, а возвращает элемент с наибольшим значением. Протестируйте
ее работу в программе, которая использует этот шаблон с массивом из шести
значений int и массивом из четырех значений double. Программа также
должна включать специализацию, которая использует массив указателей на char в
качестве первого аргумента и количество указателей — в качестве второго, а затем
возвращает адрес самой длинной строки. Если имеется более одной строки
наибольшей длины, функция должна вернуть адрес первой из них. Протестируйте
специализацию на массиве из пяти указателей на строки.
*/
 
#define _CRT_SECURE_NO_WARNINGS // Чтобы не компилятор не ругался на strlen()
 
#include <iostream>
#include <cstring>  // Для strlen()  
 
using std::cout;
using std::endl;
 
// Темплэйт для 5 задания
template <class T>
T max5(T arr[5]);
 
// Темплэйт для 6 задания (массив чисел)
template <class T>
T maxn(T arr[], int n);
 
// Специализация для массива строк
template <> char* maxn(char* ch[], int n);
 
int main()
{
    
 
    ////////////////////////////////////////
    // Разборка с integer (из задания 5)
 
    int test[5] = { 10, 999999, 100500, 8888888, 5 };
    int max = max5(test);
    cout << "The largest integer is " << max << endl;
 
    ////////////////////////////////////////
    // Разборка с double (из задания 5)
 
    // Сохраняем дефолтные настройки для cout
    std::ios_base::fmtflags initial;
    initial = cout.setf(std::ios_base::fixed);
 
    // Устанавливаем свои настройки для того, чтобы правильно вывести тип double
    cout.precision(1);  
    cout.setf(std::ios::fixed, std::ios::floatfield); 
 
    double test2[5] = { 2.4, 434353.6, 324.13, 32.7 };
    double max2 = max5(test2);
    cout << "The largest double is " << max2 << endl;
 
    // Восстанавливаем дефолтные настройки для cout
    cout.setf(initial);
 
    ////////////////////////////////////////
    // Разборка с integer (задание 6)
    int test3[3] = { 100, 50, 200 };
    int max3 = maxn(test3, 3);
    cout << "The largest integer is " << max3 << endl;
 
    ////////////////////////////////////////
    // Разборка со строками (задание 6)
 
    char* ch1 = "fffff";        // 5 символов
    char* ch2 = "aaaaaaaaaa";   // 10 символов
    char* ch3 = "ttttt";        // 5 символов
    char* ch4 = "j";            // 1 символ
    char* ch5 = "bbbbbb";       // 1 символ
 
    char* ch_array[5] = { ch1, ch2, ch3, ch4, ch5 };
 
    char* ch_res = maxn(ch_array, 5);
    cout << "The largest string is " << ch_res << endl;
 
    return 0;
}
 
////////////////////////////////////////
// Функции
 
template <class T>
T max5(T arr[5])
{
    T temp = arr[0];
    for (int i = 1; i < 5; i++)
    {
        if (temp < arr[i])
        temp = arr[i];
    }
    return temp;
}
 
template <class T>
T maxn(T arr[], int n)
{
    T temp = arr[0];
 
    for (int i = 1; i < n; i++)
    {
        if (temp < arr[i])
            temp = arr[i];
    }
 
    return temp;
}
 
template <> char* maxn(char* ch[], int n)
{
    char * temp = ch[0];
    
    for (int i = 0; i < n; i++)
    {
        if (strlen(temp) < strlen(ch[i]) )
        {
                temp = ch[i];       
        }
    }
 
    return temp;
}

Не могли бы знающие люди подсказать - какой вариант правильнее или, быть может, разницы между ними особой и нет.
0
2 / 2 / 0
Регистрация: 23.04.2015
Сообщений: 13
17.07.2015, 17:53
Кто нибудь дошел до 17 главы, 7-e упражнение ?
Глава 17. Упражнение 7.

/*Ниже представлена часть программы, которая читает клавиатурный ввод в
вектор объектов string, сохраняет строковое содержимое (не объекты!) в файле, а
затем копирует содержимое файла обратно в вектор объектов string:
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
int main () 
{ 
using namespace std; 
vector<string> vostr; 
string temp; 
// Получить строки 
cout « "Enter strings (empty line to quit) :\n"; // запрос на ввод строк 
while (getline (cin, temp) && temp[0] != '\0') 
vostr.push_back(temp); 
cout « "Here is your input. \n"; // вывод введенных строк 
for_each(vostr.begin (), vostr.end(), ShowStr); 
// Сохранить в файле 
ofstream fout("strings.dat", ios_base::out | ios_base::binary); 
for_each (vostr.begin (), vostr.endO, Store(fout)) ; 
f out .close () ; 
// Восстановить содержимое файла 
vector<string> vistr; 
ifstream fin("strings.dat", ios_base::in | ios_base: :binary) ; 
if (!fin.is_open()) 
{ 
cerr « "Could not open file for input. \n"; 
//не удается открыть файл для ввода 
exit(EXIT_FAILURE); 
} 
GetStrs(fin, vistr); 
cout « "\nHere are the strings read from the file:\n"; 
// строки, прочитанные из файла 
for_each(vistr.begin (), vistr.end(), ShowStr); 
return 0; 
}
Обратите внимание, что файл открывается в бинарном формате и требуется,
чтобы ввод-вывод осуществлялся методами read () и write (). Остается сделать
немного, как перечислено ниже.
• Написать функцию void ShowStr (const string &), которая отображает
объект string с последующим символом перевода строки.
• Написать функтор Store, который записывает строковую информацию в
файл. Конструктор Store должен указывать объект if stream, а
перегруженная функция operator () (const string &) должна указывать строку,
подлежащую записи. Приемлемый подход состоит в записи в файл сначала размера
строки, а затем — ее содержимого. Например, если Іеп содержит размер
строки, можно было бы использовать следующие операторы:
os.write((char *)&len, sizeof(std::size_t)); // сохранить длину
os.write(s.data(), len); // сохранить символы
Член data () возвращает указатель на массив, который содержит символы
строки. Он подобен члену est г (), за исключением того, что последний
добавляет нулевой символ.
• Написать функцию GetStrsO, которая восстанавливает информацию из
файла. Она может использовать read () для получения размера строки и
затем применять цикл для чтения указанного количества символов из файла,
добавляя их в изначально пустую временную строку. Поскольку данные
объекта string— закрытые, для извлечения данных в строку должен
использоваться метод класса вместо считывания их напрямую в нее. */




Может кто-то подсказать где ошибка в этом коде:
Code

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
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include <fstream>
 
void ShowStr(const std::string &);
void GetStrs(std::ifstream &, std::vector<std::string>);
 
class Store
{
private:
    std::ofstream & of;
public:
    Store(std::ofstream & file)
        : of(file)
    {}
 
    void operator()(std::string const & str)
    {
        std::size_t len = str.length();
 
        of.write((char *)&len, sizeof(std::size_t)); // сохранить длину
        of.write(str.data(), len); // сохранить символы
    }
};
 
int main()
{
    using namespace std;
    vector<string> vostr;
    string temp;
 
    
 
    // Получить строки 
    cout << "Enter strings (empty line to quit) :\n"; // запрос на ввод строк 
    while (getline(cin, temp) && temp[0] != '\0')
        vostr.push_back(temp);
    cout << "Here is your input. \n"; // вывод введенных строк 
    for_each(vostr.begin(), vostr.end(), ShowStr);
 
    // Сохранить в файле 
    ofstream fout("strings.dat", ios_base::out | ios_base::binary);
    for_each(vostr.begin(), vostr.end(), Store(fout));
    fout.close();
 
 
    // Восстановить содержимое файла 
    vector<string> vistr;
    ifstream fin("strings.dat", ios_base::in | ios_base::binary);
    if (!fin.is_open())
    {
        cerr << "Could not open file for input. \n";
        //не удается открыть файл для ввода 
        exit(EXIT_FAILURE);
    }
    
    cout << "\nHere are the strings read from the file:\n";
    GetStrs(fin, vistr);
    // строки, прочитанные из файла 
    for_each(vistr.begin(), vistr.end(), ShowStr);
 
    system("pause");
    return 0;
}
 
void ShowStr(const std::string & str)
{
    std::cout << str << std::endl;
}
 
void GetStrs(std::ifstream &f, std::vector<std::string> vec)
{
     int size = 0;
     f.read((char*)&size, sizeof(size));
     
     char* buffer = new char[size];
     f.read(buffer, size);
     vec.push_back(std::string(buffer, size));
     delete[] buffer;   
}
0
 Аватар для Martein
704 / 109 / 21
Регистрация: 22.06.2014
Сообщений: 241
17.07.2015, 18:16
Ошибка в сигнатуре функции:
C++
1
void GetStrs(std::ifstream &, std::vector<std::string>);
Вторым параметром вам следует передавать не копию вектора строк для заполнения его входными данными из файла, а ссылку на вектор. При передаче по знчению вы просто работаете с локальнм вектором под именем vec. Вы его заполняете верно, но он существует только внутри функции GetStrs, а по окончанию работы функции, он уничтожается вместе с данными, считанными из файла.
Сигнатура должна выглядеть вот так:
void GetStrs(std::ifstream &f, std::vector<std::string>& vec);
Поняли почему?
1
2 / 2 / 0
Регистрация: 23.04.2015
Сообщений: 13
17.07.2015, 18:28
Спасибо! День "убил", перечитывая работу с бинарными файлами.
0
 Аватар для Martein
704 / 109 / 21
Регистрация: 22.06.2014
Сообщений: 241
17.07.2015, 18:32
По-моему у Праты было где-то, что если данные вне функции надо изменить по параметру, то надо юзать указатели, а если просто считать оттуда, то константные ссылки. Просто полезно будет запомнить на будущее, что вектора надо передавать по константной ссылке, а вот уже если вам надо будет поработать с их копией, то тогда по значение, а если изменить что-то во внешнем векторе, то - указатели. Лично для меня это как-то немного систематизирует работу с параметрами для функций.
1
2 / 2 / 0
Регистрация: 23.04.2015
Сообщений: 13
17.07.2015, 19:10
Конечно там ссылка должна была быть. Моя ошибка на уровне копипасты. Написал прототип, отвлекся, когда вернулся продолжил... в результате цикл на весь день. Думал что ошибка в чтении бинарного файла.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
17.07.2015, 19:11
Цитата Сообщение от Raynor585 Посмотреть сообщение
ошибка на уровне копипасты
Копипаста - зло.
0
6 / 6 / 0
Регистрация: 08.02.2014
Сообщений: 79
21.07.2015, 13:57
ну так ведь детям нужно же с чего то начинать или сразу рождаться с дипломом из высшего учебного
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
22.07.2015, 08:12
Цитата Сообщение от andreypplk Посмотреть сообщение
сразу рождаться с дипломом из высшего учебного
Сразу рождаться сеньорами.
0
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 933
22.07.2015, 12:11
gru74ik,
Ну что то вы в 6 главе 9 упражнении решили передохнуть заменив cin на объект класса ifstream.
Я думал здесь хотят что то вроде этого:

Кликните здесь для просмотра всего текста
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
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
const int SIZE = 15;
 
int main()
{
    char filename[SIZE];
    ifstream inFile;
    cout<<"Enter name of data file: ";
    cin.getline(filename,SIZE);
    inFile.open(filename);
    if(!inFile.is_open())
    {
        cout<<"Could not open the file"<<filename<<endl;
        exit(EXIT_FAILURE);
    }
    string ch,str,str1,str2;
    string str0 = "\n";
    int patrons,sum, s = 0;
 
    inFile>>patrons;
    while (inFile.good())
    {
    inFile>>ch;
    s = s + 1;
    str = ch;
    inFile>>sum;
        if (sum >= 10000)
    str1 += str0 + str;
                    
        else 
    str2 += str0+ str;                      
                            
    }   
        if(inFile.eof())
        cout<<"End of file reached.\n";
            
    if (patrons == 0 || s > patrons)
        cout<<"No data processed or insufficient data";
    else
    {
    cout<<"Grand patrons: \n";
        if (str1[0]!='\0')
    cout<<str1<<endl;
        else 
    cout<<"none \n";
    cout<<"\nPatrons: \n";
        if (str2[0] != '\0')
    cout<<str2<<endl;
        else
    cout<<"none\n";
    }
     
            
    inFile.close();
    return 0;
}
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
22.07.2015, 12:27
Senarist, условие упражнения № 9 внимательнее читайте:
Выполните упражнение 6, но измените его так, чтобы данные можно было
получать из файла. Первым элементом файла должно быть количество меценатов,
а остальная часть состоять из пар строк, в которых первая строка содержит
имя, а вторая —
сумму пожертвования. То есть файл должен выглядеть
примерно так:
4
Sam Stone
2000
Freida Flass
100500
Tammy Tubbs
5000
Rich Raptor
55000
Теперь читаем условие упражнения № 6, которое нам надо переделать:
Постройте программу, которая отслеживает пожертвования в Общество
Защиты Влиятельных Лиц. Она должна запрашивать у пользователя
количество меценатов, а затем приглашать вводить их имена и суммы пожертвований от
каждого. Информация должна сохраняться в динамически выделяемом массиве
структур. Каждая структура должна иметь два члена: символьный массив (или
объект string) для хранения имени и переменную-член типа double —
для хранения суммы пожертвования. После чтения всех данных программа должна
отображать имена и суммы пожертвований тех, кто не пожалел $10 000 и
более. Этот список должен быть озаглавлен меткой "Grand Patrons". После этого
программа должна выдать список остальных жертвователей. Он должен быть
озаглавлен "Patrons". Если в одной из двух категорий не окажется никого,
программа должна напечатать "none". Помимо отображения двух категорий,
никакой другой сортировки делать не нужно.
А теперь, внимание, правильный вопрос: в чём моё решение не соответствует поставленной задаче?
0
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 933
22.07.2015, 13:40
Решение то правильное. Я думал чего то более сложного хотят. Поэтому решил от основного когда упражнения 6 отойти. Хотя в моем коде если написать имя в 2 слова то получается фигня. Придется переделывать.
0
0 / 0 / 0
Регистрация: 22.05.2015
Сообщений: 1
30.07.2015, 14:39
Большое спасибо)
0
0 / 0 / 1
Регистрация: 04.05.2014
Сообщений: 67
30.07.2015, 20:30
Цитата Сообщение от gru74ik Посмотреть сообщение
Глава 5 Упражнение 4
Потнявая задачка(
0
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 933
30.07.2015, 22:11
Nordener ну у gru74ik она реализована не лучшим образом. 7 переменных типа double, когда я обошелся 5, причем 2 из них интовские. Ибо сумма клео всегда будет инт.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.07.2015, 22:11

Найти причины и способы исправления ошибок в коде (упражнения по книге Стивена Праты)
В общем так . Пробую учить плюсы по книжке Прата . Пробую недавно , и потому полный нуб. От того и нумбский вопрос . В книжке написано что...

Задача из лекций по книге Стивена Праты
Глава 6 задача 5 Напишите программу, которая предлагает пользователю ввести прописную букву. Воспользуйтесь вложенными циклами, чтобы...

Решение задач из учебника Томшина
Я являюсь студентом 1-го курса, и нам дали задачи по c# которые необходимо решить. Задачи взяты из учебника Томшина , который предназначен...

Понятен материал учебника, но не получается самостоятельное решение задач
Здравствуйте. Читаю книжку Дейтелов, переписываю код, который дан в учебнике, потом читаю пояснения к строкам и в общем-то всё понимаю,...

Запишите в файл 2 название команды, количество решенных задач и общее времени, потраченное на решение всех задач
Подскажите как доделать задачу. В файле 1 хранятся данные о названиях команды, номере решенной задачи, времени, потраченном на решение....


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Был праздник вчера, а я и не знал.
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
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru