Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.90/389: Рейтинг темы: голосов - 389, средняя оценка - 4.90
ZarinZomanu4
8 / 8 / 0
Регистрация: 27.05.2013
Сообщений: 93
1

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

23.03.2015, 12:20. Просмотров 76290. Ответов 211
Метки нет (Все метки)

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

Глава 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, решенные gru74ik
7
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2015, 12:20
Ответы с готовыми решениями:

Пример с книги Стивена Прата (Язык программирования с++). Расхождение в ответе
В книге один ответ. У меня другой выходит (На русский перевод, не обращайте внимание) Сама...

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

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

Вклады, простые и сложные проценты (вопрос из учебника С. Прата)
Изучаю книгу С. Прата. В главе 5 у него присутствует такая задача: Дафна сделала вклад на сумму...

Программа из учебника Прата. Структуры в многофайловом приложении. Исправить недочеты в коде
Посмотрите, пожалуйста, что где исправить. int fill()-для заполнения массива all-для вывода суммы...

211
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
26.06.2015, 22:20 41
Цитата Сообщение от 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
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
03.07.2015, 05:27 42
Глава 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
Senarist
51 / 55 / 34
Регистрация: 14.03.2014
Сообщений: 728
12.07.2015, 15:40 43
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
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
13.07.2015, 08:58 44
Цитата Сообщение от 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
Senarist
51 / 55 / 34
Регистрация: 14.03.2014
Сообщений: 728
13.07.2015, 11:20 45
Ну да, Вы правы
0
Lethorn
51 / 25 / 2
Регистрация: 04.12.2014
Сообщений: 55
Завершенные тесты: 4
16.07.2015, 21:09 46
Всем доброго времени суток, у меня возник вопрос по 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
Raynor585
2 / 2 / 0
Регистрация: 23.04.2015
Сообщений: 13
17.07.2015, 17:53 47
Кто нибудь дошел до 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
690 / 99 / 17
Регистрация: 22.06.2014
Сообщений: 210
17.07.2015, 18:16 48
Ошибка в сигнатуре функции:
C++
1
void GetStrs(std::ifstream &, std::vector<std::string>);
Вторым параметром вам следует передавать не копию вектора строк для заполнения его входными данными из файла, а ссылку на вектор. При передаче по знчению вы просто работаете с локальнм вектором под именем vec. Вы его заполняете верно, но он существует только внутри функции GetStrs, а по окончанию работы функции, он уничтожается вместе с данными, считанными из файла.
Сигнатура должна выглядеть вот так:
void GetStrs(std::ifstream &f, std::vector<std::string>& vec);
Поняли почему?
1
Raynor585
2 / 2 / 0
Регистрация: 23.04.2015
Сообщений: 13
17.07.2015, 18:28 49
Спасибо! День "убил", перечитывая работу с бинарными файлами.
0
Martein
690 / 99 / 17
Регистрация: 22.06.2014
Сообщений: 210
17.07.2015, 18:32 50
По-моему у Праты было где-то, что если данные вне функции надо изменить по параметру, то надо юзать указатели, а если просто считать оттуда, то константные ссылки. Просто полезно будет запомнить на будущее, что вектора надо передавать по константной ссылке, а вот уже если вам надо будет поработать с их копией, то тогда по значение, а если изменить что-то во внешнем векторе, то - указатели. Лично для меня это как-то немного систематизирует работу с параметрами для функций.
1
Raynor585
2 / 2 / 0
Регистрация: 23.04.2015
Сообщений: 13
17.07.2015, 19:10 51
Конечно там ссылка должна была быть. Моя ошибка на уровне копипасты. Написал прототип, отвлекся, когда вернулся продолжил... в результате цикл на весь день. Думал что ошибка в чтении бинарного файла.
0
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
17.07.2015, 19:11 52
Цитата Сообщение от Raynor585 Посмотреть сообщение
ошибка на уровне копипасты
Копипаста - зло.
0
andreypplk
1 / 1 / 0
Регистрация: 08.02.2014
Сообщений: 29
21.07.2015, 13:57 53
ну так ведь детям нужно же с чего то начинать или сразу рождаться с дипломом из высшего учебного
0
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
22.07.2015, 08:12 54
Цитата Сообщение от andreypplk Посмотреть сообщение
сразу рождаться с дипломом из высшего учебного
Сразу рождаться сеньорами.
0
Senarist
51 / 55 / 34
Регистрация: 14.03.2014
Сообщений: 728
22.07.2015, 12:11 55
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
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
22.07.2015, 12:27 56
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
Senarist
51 / 55 / 34
Регистрация: 14.03.2014
Сообщений: 728
22.07.2015, 13:40 57
Решение то правильное. Я думал чего то более сложного хотят. Поэтому решил от основного когда упражнения 6 отойти. Хотя в моем коде если написать имя в 2 слова то получается фигня. Придется переделывать.
0
radziecki77
0 / 0 / 0
Регистрация: 22.05.2015
Сообщений: 1
30.07.2015, 14:39 58
Большое спасибо)
0
Nordener
0 / 0 / 1
Регистрация: 04.05.2014
Сообщений: 59
30.07.2015, 20:30 59
Цитата Сообщение от gru74ik Посмотреть сообщение
Глава 5 Упражнение 4
Потнявая задачка(
0
Senarist
51 / 55 / 34
Регистрация: 14.03.2014
Сообщений: 728
30.07.2015, 22:11 60
Nordener ну у gru74ik она реализована не лучшим образом. 7 переменных типа double, когда я обошелся 5, причем 2 из них интовские. Ибо сумма клео всегда будет инт.
0
30.07.2015, 22:11
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2015, 22:11

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Объясните решение задачи из учебника
Книга &quot;Курс теории вероятностей&quot; Б.В. Гнеденко, серия &quot;Классический университетский учебник&quot;, 2005...

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.