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

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

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

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

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

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

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

211
Xvlady
0 / 0 / 0
Регистрация: 16.02.2015
Сообщений: 1
13.10.2015, 17:50 61
gru74ik, Доброго времени суток!) А почему не выкладываете больше решение задач?) Мне кажется это кому-нибудь пригодилось бы...
0
sourcerer
Модератор
Эксперт CЭксперт С++
5000 / 2182 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
13.10.2015, 20:04 62
Xvlady, привет. Я подумал, что кто добрался до тех задач, которые я уже выложил, дальше вполне сам справится. Ведь для того и даны задачи, чтобы самому их решать. Насколько я знаю, других способов поднять скилл пока не придумали.
0
skales007
18 / 18 / 9
Регистрация: 09.07.2015
Сообщений: 91
Записей в блоге: 2
28.10.2015, 10:55 63
На мой взгляд, решение к упражнению 10 главы 5 слишком усложнено (это если выполнять задания, читая при этом книгу в том порядке, в котором она написана). В коде использованы шаблоны, опреаторы ветвления, куча циклов и условий.. для проверки того, что введенное значение больше нуля, используется бесконечный цикл, хотя вполне можно было обойтись условием входа в цикл while(qty <= 0). Используется break (который еще не изучен) для выхода из цикла.
Проще было все это сделать используя всего один цикл for с вложенными в него еще двумя циклами.
Вот пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
int main()
{
    using namespace std;
    int number = 0;
    
    cout << "Enter number of strings: ";
    cin >> number;
    
    for(int str = number; str > 0; str--)
    {
        for(int i = 1; i < str; i++)
            cout << '.';
        for(int j = str; j <= number; j++)
            cout << '*';
        cout << endl;
    }
    
    return 0;
}
Тут помимо всего прочего нет необходимости подключать еще и 15 заголовочных файлов.

Результат:
Кликните здесь для просмотра всего текста
$ ./app5.10
Assembler
1
2
3
4
5
6
Enter number of strings: 5
....*
...**
..***
.****
*****
2
sourcerer
Модератор
Эксперт CЭксперт С++
5000 / 2182 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
28.10.2015, 13:05 64
Цитата Сообщение от skales007 Посмотреть сообщение
На мой взгляд, решение к упражнению 10 главы 5 слишком усложнено
Так и есть. Типичнейшая ошибка новичков - оверинжениринг. И я - не исключение.
0
Chartedkey
0 / 0 / 0
Регистрация: 22.11.2015
Сообщений: 6
22.11.2015, 14:35 65
Добрый день.
Очень надеюсь на вашу помощь в решении задачи из 6го издания Стивена Праты С++.

Напишите программу,которая запрашивает текущую численность населения Земли и текущую численность населения США. Сохраните эту информацию в переменных типа long long. В качестве результата программа должна отображать процентное соотношение численности населения США и всего мира. Результат выполнения программы должен выглядеть следующим образом:
Enter the world`s population: 6898758899
Enter the population of the US: 310783781
The population of the US is 4.50492% of the world population.

P.S.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
int main()
{
    using namespace std;
    long long world_pop, us_pop;
    cout.setf(ios_base::fixed, ios_base::floatfield);
    cout<<"Enter the world`s population: ";
    cin>>world_pop;
    cout<<"Enter the population of US: ";
    cin>>us_pop;
    float soot= us_pop/world_pop *100;
    cout<<"The population of the US is "<<soot<<"% of the world population.";
    return 0;
}
Программа выдает значение 0
0
engine76
2 / 2 / 1
Регистрация: 04.03.2014
Сообщений: 65
20.12.2015, 00:18 66
В упражнении 9 главы 5, нужно вводить слова без нажатия enter( так показано в примере запуска 8 упражнения, а 9 идентично за исключение типа строки), потому наверно читать надо через std::cin, а не getline. Что получилось у меня:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
 
int main()
{
    std::string done = "done";
    std::string word;
    unsigned int count = 0;
 
    std::cout << "Enter the words, enter "done" for stop:" << std::endl;
    std::cin >> word;
    while(word != done)
    {
        std::cin >> word;
        count++;
    }
    std::cout << "You entered " << count << " words." << std::endl;
 
    system("pause");
    return 0;
}
0
sourcerer
Модератор
Эксперт CЭксперт С++
5000 / 2182 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
22.12.2015, 17:29 67
Цитата Сообщение от engine76 Посмотреть сообщение
нужно вводить слова без нажатия enter
Где там такое написано?

У тебя std::cin без нажатия Enter не закончит принимать поток с устройства ввода (клавиатуры), так-то, если чё.
0
loromits
0 / 0 / 0
Регистрация: 06.01.2016
Сообщений: 4
06.01.2016, 01:04 68
Доброго времени суток.
Подскажите, пожалуйста, как реализовать извлечение из очереди при множественном наследовании.
Шаблонный класс очереди + виртуальный базовый класс Worker с потомками:
Кликните здесь для просмотра всего текста
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
template <typename Type>
class QueueTP
{
private:
    struct Node { Type item; struct Node * next; };
    enum {Q_SIZE = 10};
    Node * front;
    Node * rear;
    int items;
    const int qsize;
    QueueTP(const QueueTP & q) :qsize(0) {}
    QueueTP & operator=(const QueueTP & q) { return *this; }
public:
    QueueTP(int qs = Q_SIZE);
    ~QueueTP();
    bool isempty() const { return items == 0; }
    bool isfull() const {return items  == qsize; }
    int queuecount() const {return items; }
    bool enqueue(const Type & item);
    bool dequeue(Type & item);
};
template <typename Type>
QueueTP<Type>::QueueTP(int qs) :qsize(qs)
{
    front = rear = nullptr;
    items = 0;
}
template <typename Type>
QueueTP<Type>::~QueueTP()
{
    Node * temp;
    while(front != nullptr)
    {
        temp = front;
        front = front->next;
        delete temp;
    }
}
template <typename Type>
bool QueueTP<Type>::enqueue(const Type & item)
{
    if (isfull()) return false;
    Node * add = new Node;
    add->item = item;
    add->next = nullptr;
    items++;
    if (front == nullptr) front = add;
    else rear->next = add;
    rear = add;
    return true;
}
template <typename Type>
bool QueueTP<Type>::dequeue(Type & item)
{
    if (front = nullptr) return false;  
    item = front->item;
    items--;
    Node * temp = front;
    front = front->next;
    delete temp;
    if (items == 0) rear = nullptr;
    return true;
}
class Worker
{
private:
    std::string fullname;
    long id;
protected:
    virtual void Data() const;
    virtual void Get();
public:
    Worker() :fullname("no one"), id(0L) {}
    Worker(const std::string & s, long n) :fullname(s), id(n) {}
    virtual ~Worker() = 0;
    virtual void Set() = 0;
    virtual void Show() const = 0;
};
class Waiter: virtual public Worker
{
private:
    int panache;
protected:
    void Data() const;
    void Get();
public:
    Waiter() :Worker(), panache(0) {}
    Waiter(const std:: string & s, long n, int p = 0) :Worker(s,n), panache(p) {}
    Waiter(const Worker & wk, int p = 0) :Worker(wk), panache(p) {}
    void Set();
    void Show() const;
};
class Singer : virtual public Worker
{
protected:
    enum {other, alto, contralto, soprano, bass, baritone, tenor};
    enum {Vtypes = 7};
    void Data() const;
    void Get();
private:
    static char *pv[Vtypes];
    int voice;
public:
    Singer() :Worker(), voice(other) {}
    Singer(const std::string & s, long n, int v = other) :Worker(s, n), voice(v) {}
    Singer(const Worker & wk, int v = other) :Worker(wk), voice(v) {}
    void Set();
    void Show() const;
};
//multiple inheritance
class SingingWaiter : public Singer, public Waiter
{
protected:
    void Data() const;
    void Get();
public:
    SingingWaiter() {}
    SingingWaiter(const std::string & s, long n, int p = 0, int v = other) 
        :Worker(s, n), Waiter(s, n, p), Singer(s, n, v) {}
    SingingWaiter(const Worker & wk, int p = 0, int v = other) 
        :Worker(wk), Waiter(wk, p), Singer(wk, v) {}
    SingingWaiter(const Waiter & wt, int v = other) 
        :Worker(wt), Waiter(wt), Singer(wt, v) {}
    SingingWaiter(const Singer & wt, int p = 0)
        :Worker(wt), Waiter(wt, p), Singer(wt) {}
    void Set();
    void Show() const;
};

Реализация Worker для вопроса точь в точь как в книге.
Использование этого всего:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <cstring>
#include "workermi.h"
const int SIZE = 5;
int main()
{
    using std::cin;
    using std::endl;
    using std::cout;
    using std::strchr;
    QueueTP<Worker *> lolas;
    Worker * temp;
    while (!lolas.isfull())
    {
        char choice;
        cout << "Enter the employee category:\n"
            << "w: waier s: singer t: singingwaiter q: quit\n";
        cin >> choice;
        while (strchr("wstq", choice) == NULL)
        {
            cout << "Please enter a w, s, t, or q: ";
            cin >> choice;
        }
        if(choice == 'q') break;
        switch(choice)
        {
            case 'w': temp = new Waiter; break;
            case 's': temp = new Singer; break;
            case 't': temp = new SingingWaiter; break;
        }
        cin.get();
        temp->Set();
        lolas.enqueue(temp);
                delete temp;
    }
    cout << "\nHere is your staff:\n";
    while (!lolas.isempty())
    {
        cout << endl;
        lolas.dequeue(temp);
        temp->Show();
        
    }
    
    cin.get();
    return 0;
}

После "Here is your staff:" прога экстренно завершается.
0
_Valera_
492 / 374 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
06.01.2016, 01:17 69
Цитата Сообщение от loromits Посмотреть сообщение
virtual void Show() const = 0;
у наследников есть реализация этого метода?
давай скрины ошибок, так ничего не ясно.
0
loromits
0 / 0 / 0
Регистрация: 06.01.2016
Сообщений: 4
06.01.2016, 21:37 70
Во всех наследниках есть. Реализация:
Кликните здесь для просмотра всего текста
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
#include "workermi.h"
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
//worker
Worker::~Worker() {}
void Worker::Data() const
{
    cout << "Name: " << fullname << endl;
    cout << "Emplyee ID: " << id << endl;
}
void Worker::Get()
{
    getline(cin, fullname);
    cout << "Enter worker's ID: ";
    cin >> id;
    while(cin.get() != '\n') continue;
}
//waiter
void Waiter::Set()
{
    cout << "Enter waiter's name: ";
    Worker::Get();
    Get();
}
void Waiter::Show() const
{
    cout << "Category: waiter\n";
    Worker::Data();
    Data();
}
void Waiter::Data() const
{
    cout << "Panache raiting: "<< panache << endl;
}
void Waiter::Get()
{
    cout << "Enter waiter's panache raiting: ";
    cin >> panache;
    while (cin.get() != '\n') continue;
}
//singer
char * Singer::pv[Singer::Vtypes] = {"other", "alto", "contralto", "soprano", "bass", "baritone", "tenor"};
 
void Singer::Set()
{
    cout << "Enter singer's name: ";
    Worker::Get();
    Get();
}
void Singer::Show() const
{
    cout << "Category: singer\n";
    Worker::Data();
    Data();
}
void Singer::Data() const
{
    cout << "Vocal range: " << pv[voice] << endl;
}
void Singer::Get()
{
    cout << "Enter number for singer's vocal range:\n";
    int i;
    for(i = 0; i < Vtypes; i++)
    {
        cout << i << ": " << pv[i] << " ";
        if (i % 4 == 3) cout << endl;
    }
    if (i % 4 != 0) cout << '\n';
    cin >> voice;
    while (cin.get() != '\n') continue;
}
//singingwaiter
void SingingWaiter::Data() const
{
    Singer::Data();
    Waiter::Data();
}
void SingingWaiter::Get()
{
    Waiter::Get();
    Singer::Get();
}
void SingingWaiter::Set()
{
    cout << "Enter singing waiter's name: ";
    Worker::Get();
    Get();
}
void SingingWaiter::Show() const
{
    cout << "Category: singing waiter\n";
    Worker::Data();
    Data();
}

Ошибку не выдаёт, просто "workerqueue.exe завершил работу. Найти решение... Закрыть..."
Работаю в wxdev.

Добавлено через 11 часов 38 минут
Есть у кого соображения? Я так понял получается ошибка времени выполнения? Возможно связано с указателем temp.
0
loromits
0 / 0 / 0
Регистрация: 06.01.2016
Сообщений: 4
07.01.2016, 20:29 71
Добавил скрин.

Временная метка аварийного модуля: 568cead2
Код исключения: c0000005
Смещение исключения: 00020e6d
Версия ОС: 6.1.7600.2.0.0.256.1
Код локализации: 1049
Дополнительные сведения 1: 0a9e
Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789
Дополнительные сведения 3: 0a9e
Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789
0
Миниатюры
Решение всех задач из учебника Стивена Прата  
loromits
0 / 0 / 0
Регистрация: 06.01.2016
Сообщений: 4
07.01.2016, 20:49 72
Закомментил всё после
C++
1
cout << "\nHere is your staff:\n";
, поставил Code::Blocks, поменял компилятор на Clang 3.7.1 - эффект не изменился. Где я туплю? T_T
0
bambique
1 / 1 / 3
Регистрация: 02.04.2015
Сообщений: 169
18.01.2016, 19:18 73
Цитата Сообщение от gru74ik Посмотреть сообщение
Глава 10.
4 упражнение немного не верное, а именно конструктор, там идет поиск элемента в массиве, который равен 0, но как он может быть равным 0 если вы не инициализировали не чем этот массив. Я еще немного не понял условие задачи, она простая, но условие запутанное.
0
exxtra_noise
0 / 0 / 0
Регистрация: 27.10.2015
Сообщений: 1
31.01.2016, 10:14 74
Здравствуйте, уважаемые!
Глава 9 упражнение 01.
Подскажите, почему у меня после первого ввода пары имя/счет два раза выводится строка с запросом имени? Затупил и не могу понять
golf.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
#include <iostream>
#include <clocale>
#include <cstring>
#include <string>
#include <cstdio>
 
using std::cout;
using std::cin;
using std::string;
using std::getline;
using std::endl;
 
const int len = 40;
 
struct golf {
    char fullname[len];
    int handicap;
};
 
void set_golf(golf &g, const char *name, int hc);
int set_golf(golf &g);
void handicap(golf &g, int hc);
void show_golf(const golf &g);


golf.cpp
Кликните здесь для просмотра всего текста
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
#include "golf.h"
 
void set_golf(golf &g, const char *name, int hc)
{
    strcpy(g.fullname, name);
    g.handicap = hc;
}
 
int set_golf(golf &g)
{
    char *tmp_arr = new char[len];
    
    cout << "Enter a fullname(null for Quit): ";
    gets(tmp_arr);
 
    if(strlen(tmp_arr) != 0)
    {   
        strcpy(g.fullname, tmp_arr);
        cout << "Enter a handicap of " << tmp_arr << ": ";
        cin >> g.handicap;
    
        delete [] tmp_arr;
        return 1;
    }
    else return 0;
}
 
void handicap(golf &g, int hc)
{
    
}
 
void show_golf(const golf &g)
{
    cout << endl;
    cout << "Golfer name: " << g.fullname << endl;
    cout << g.fullname << "'s handicap: " << g.handicap << endl;
}


main.cpp
Кликните здесь для просмотра всего текста
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
#include "golf.h"
 
int main()
{
    setlocale(LC_CTYPE, "");
    const int max_g_arr_size = 5;
    
    golf *g_arr = new golf[max_g_arr_size];
    int count = 0;
    
    while(count < max_g_arr_size && set_golf(g_arr[count]))
    {
        set_golf(g_arr[count]);
        ++count;
    }
    
    if(count)
    {
        for(int i = 0; i < count; ++i)
            show_golf(g_arr[i]);
    }
    else
        cout << "Empty!\n";
    
    delete [] g_arr;
    return 0;
}
0
Миниатюры
Решение всех задач из учебника Стивена Прата  
sourcerer
Модератор
Эксперт CЭксперт С++
5000 / 2182 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
31.01.2016, 10:22 75
exxtra_noise, читайте прикреплённые темы.
1
skales007
18 / 18 / 9
Регистрация: 09.07.2015
Сообщений: 91
Записей в блоге: 2
18.02.2016, 18:02 76
gru74ik, осмелюсь показать свое решение Упражнения 3 Главы 8.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
using namespace std;
 
void strup(string &str);
 
int main()
{
    string str;
    cout << "Enter a string (q to quit): ";
    while(str!= "q")
        {
            getline(cin, str);  
            if(str != "q")
            {
                strup(str);
                cout << str << "\nNext string (q to quit): " << endl;
            }
        }
    cout << "Bye." << endl;
    
    return 0;
}
 
void strup(string &str)
{   
    int counter = 0;
    while(str[counter] != '\0')
    {
        str[counter] = toupper(str[counter]);
        counter++;
    }
}
На мой взгляд ошибкой было выходить из цикла, проверяя значение первого символа в строке, ведь может быть слово "quit", например, и тогда последует выход из цикла, хотя нам этого не нужно.
Ну и плюс уж очень усложнённой мне показалась сама реализация функции. Достаточно ведь было просто изменить саму строку. В задании было условие преобразовать строку в верхний регистр, т.е. возвращать значение не нужно.
1
sourcerer
Модератор
Эксперт CЭксперт С++
5000 / 2182 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
18.02.2016, 18:35 77
skales007, да, у Вас лучше, чем у меня получилось. Тогда я намудрил Но Вы учитывайте, что тот пример я год назад писал. И да, я бы, всё-таки, добавил в Ваш код заголовочный файл, в котором определена функция toupper(), а также заголовочный файл, в котором определен тип 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
#include <iostream>
#include <string>
#include <cctype>
 
void strup(std::string &str);
 
int main()
{
    std::string str;
    std::cout << "Enter a string (q to quit): ";
    while(str != "q")
        {
            getline(std::cin, str);
            if(str != "q")
            {
                strup(str);
                std::cout << str << "\nNext string (q to quit): ";
            }
        }
    std::cout << "Bye.\n";
 
    return 0;
}
 
void strup(std::string &str)
{
    for (auto & elem : str)
        elem = toupper(elem);
}
1
skales007
18 / 18 / 9
Регистрация: 09.07.2015
Сообщений: 91
Записей в блоге: 2
18.02.2016, 19:02 78
С заголовочными файлами согласен. И на счет года назад тоже понимаю =) Это я все к тому, чтобы поделиться мыслями, получить совет и т.д. и т.п. Так скажем от первопроходца.
Ну и по теме: о данной вещи " for (auto & elem : str) " не знал, в книжке пока не встречал. Буду иметь ввиду))
0
Kerry_Jr
Эксперт PHP
2273 / 2059 / 953
Регистрация: 14.05.2014
Сообщений: 6,049
Записей в блоге: 1
Завершенные тесты: 5
18.02.2016, 19:08 79
Цитата Сообщение от gru74ik Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
while(str != "q")
{
    getline(std::cin, str);
    if(str != "q")
    {
        strup(str);
        std::cout << str << "\nNext string (q to quit): ";
    }
а может лучше так
C++
1
2
3
4
5
while (std::getline(std::cin, str) && str != "q")
{
        strup(str);
        std::cout << str << "\nNext string (q to quit): ";
}
1
skales007
18 / 18 / 9
Регистрация: 09.07.2015
Сообщений: 91
Записей в блоге: 2
18.02.2016, 19:12 80
Kerry_Jr, может быть и лучше) Я так пишу, для удобства чтения. Если использую Вашу тактику - начинаю блудить и теряться в коде =)
0
18.02.2016, 19:12
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.02.2016, 19:12

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

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

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

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

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


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

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

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