Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 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
Kerry_Jr
Эксперт PHP
2263 / 2049 / 951
Регистрация: 14.05.2014
Сообщений: 6,011
Записей в блоге: 1
Завершенные тесты: 5
23.03.2015, 12:59 2
Цитата Сообщение от ZarinZomanu4 Посмотреть сообщение
LIST=10
неправильный результат. Среднее арифметическое в Вашем варианте будет целочисленным с отброшенной дробной частью (если таковая есть). Например, для чисел 5, 6 и 8 верным ответом будет 5.(6)n, в то время как Ваш вариант выдаст 5.

Добавлено через 1 минуту
Цитата Сообщение от ZarinZomanu4 Посмотреть сообщение
LIST=9
непонятно, для чего вводить значения для трех структур, а выводить для одной.

Добавлено через 1 минуту
Цитата Сообщение от ZarinZomanu4 Посмотреть сообщение
LIST=8
для (*pz).Name и т.п. красивее будет так pz->Name

Добавлено через 2 минуты
Цитата Сообщение от ZarinZomanu4 Посмотреть сообщение
LIST=7
Замечание к оформлению: здесь в глаза бросается помесь английского и транслита. Уж лучше либо одно, либо другое. Это же замечание почти ко всем заданиям относится.
0
Kerry_Jr
Эксперт PHP
2263 / 2049 / 951
Регистрация: 14.05.2014
Сообщений: 6,011
Записей в блоге: 1
Завершенные тесты: 5
23.03.2015, 13:11 3
Цитата Сообщение от ZarinZomanu4 Посмотреть сообщение
LIST=6
Неверное решение. Отображать нужно через цикл.
0
Velesthau
526 / 428 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
23.03.2015, 13:28 4
ZarinZomanu4, надо было задания здесь написать по-нормальному. Как их люди должны найти? Исключительно по фамилии "Прата" в поиске? Оформление - ужас. Код не смотрел.
1
Dimension
Dimension
574 / 444 / 221
Регистрация: 08.04.2014
Сообщений: 1,709
Завершенные тесты: 1
23.03.2015, 14:00 5
кому эти задачи нужны тут?ладно бы какие-нибудь сверхолимпиадные решали ,а это - детсад.
0
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
23.03.2015, 16:05 6
Решал давно, просто сохранилось на винте. Выложу для коллекции.

Глава 4.
Глава 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
37
38
39
40
41
42
43
//  sp_Ch4P202_Exercise01
/// Занятия по книге Стивена Праты "Язык программирования С++" (2001, 6-е издание).
/// Упражнения по программированию. Глава 4, страница 202, упражнение 1.
/*
Напишите программу С++, которая запрашивает и отображает информацию,
как показано в следующем примере:
What is your first name? Bette Sue
What is your last name? Yewe
What letter grade do you deserve? B
What is your age? 22
Name: Yewe, Bette Sue
Grade: C
Age: 22
*/
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    cout << "What is your first name? ";
    string firstName;
    getline (cin, firstName); //библиотечная функция, читает строку с пробелами
 
    cout << "What is your last name? ";
    string lastName;
    getline (cin, lastName);
 
    cout << "What letter grade do you deserve? ";
    char grade;
    cin >> grade;
    grade = ++grade;
 
    cout << "What is your age? ";
    int age;
    cin >> age;
 
    cout << "Name: " << lastName << ", "<< firstName << endl;
    cout << "Grade: " << grade << endl;
    cout << "Age: " << age;
 
    return 0;
}

Глава 4. Упражнение 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
35
36
37
38
39
40
41
42
43
44
45
46
//  sp_Ch4P202_Exercise02
/// Занятия по книге Стивена Праты "Язык программирования С++" (2001, 6-е издание).
/// Упражнения по программированию. Глава 4, страница 202, упражнение 2.
/*
 
Перепишите листинг 4.4, применив класс С++ string вместо массивов char.
Листинг 4.4:
// instr2.cpp -- reading more than one word with getline
#include <iostream>
int main()
{
    using namespace std;
    const int ArSize = 20;
    char name[ArSize];
    char dessert[ArSize];
 
    cout << "Enter your name:\n";
    cin.getline(name, ArSize);  // reads through newline
    cout << "Enter your favorite dessert:\n";
    cin.getline(dessert, ArSize);
    cout << "I have some delicious " << dessert;
    cout << " for you, " << name << ".\n";
    // cin.get();
    return 0;
}
*/
 
#include <iostream>
#include <string>
int main()
{
    using namespace std;
 
    cout << "Enter your name:\n";
    string yourName;
    getline (cin, yourName);
 
    cout << "Enter your favorite dessert:\n";
    string yourDessert;
    getline (cin, yourDessert);
 
    cout << "I have some delicious " << yourDessert;
    cout << " for you, " << yourName << ".\n";
    // cin.get();
    return 0;
}

Глава 4. Упражнение 3

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//  sp_Ch4P202_Exercise03
/// Занятия по книге Стивена Праты "Язык программирования С++" (2001, 6-е издание).
/// Упражнения по программированию. Глава 4, страница 202, упражнение 3.
/*
Напишите программу, которая запрашивает у пользователя имя, фамилию, а затем
конструирует, сохраняет и отображает третью строку, состоящую из фамилии
пользователя, за которым следует запятая, пробел и его имя.
Используйте массивы char и функции из заголовочного файла cstring.
Пример запуска должен выглядеть  так:
Enter your first name: Flip
Enter your last name: Fleming
Here's the information in a single string: Fleming, Flip
*/
 
#include <iostream>
#include <cstring>
using namespace std;
 
int main()
{
    //Приглашение ввести имя.
    cout << "Enter your first name: ";
 
    //Создаём массив символов типа char - в нём будет сохранено имя, которое
    //введёт пользователь с клавиатуры. Это узкое место в решении нашей
    //задачи. Вводимое пользователем имя не должно превышать 254 символа
    //(255-й символ зарезервирован под символ окончания строки.
    char firstName[255];
 
    //Использование библиотечной функции getline встроенного класса cin.
    //Функция getline позволяет считывать строку, в которой имеются символы
    //пробела. В качестве аргументов функция принимает два параметра: имя
    //массива (которое, фактически, указывает на первый элемент массива) и
    //разер массива, который в нашем случае мы получаем с помощью метода
    //sizeof - встроенного метода функции getline.
    //Говоря проще, использование getline позволяет нам сохранить в массиве
    //составные имена типа John Michael или Johann Sebastian. Без использования
    //данной функции в массиве будет сохраняться только первая часть составного
    //имени, то есть в случае с John Michael массив сохранит только имя John.
    cin.getline (firstName, sizeof(firstName));
 
    //Выводим пустую строку.
    cout << endl;
 
    //Приглашение ввести фамилию.
    cout << "Enter your last name: ";
 
    //Создаём массив символов типа char - в нём будет сохранена фамилия, которую
    //введёт пользователь с клавиатуры.
    char lastName[255];
 
    //Используем функцию getline для сохранения символов, введённых с клавиатуры
    //пользователем, в массив lastName.
    cin.getline (lastName, sizeof(lastName));
 
    //Выводим пустую строку.
    cout << endl;
 
    //Создаём строку, включающую всего два символа - запятую и пробел.
    char commaSpace[]={',', ' ', '\0'};
 
    //С помощью метода strcat библиотеки cstring склеиваем две строки
    //воедино - строку, в которой сохранена фамилия и строку, в которой
    //сохранена запятая и пробел.
    char *namePlus = strcat (lastName, commaSpace);
 
    //Склеиваем полученную строку с той, в которой сохранено имя.
    char *fullName = strcat (namePlus, firstName);
 
    //Выводим на экран фамилию с запятой, пробелом и именем.
    cout << "Here's the information in a single string: " << fullName;
 
    //Выводим пустую строку.
    cout << endl;
 
    //Успешное завершение программы.
    return 0;
}

Глава 4. Упражнение 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
27
28
29
30
31
32
//  sp_Ch4P202_Exercise04
/// Занятия по книге Стивена Праты "Язык программирования С++" (2001, 6-е издание).
/// Упражнения по программированию. Глава 4, страница 202, упражнение 4.
/*
Напишите программу, которая запрашивает у пользователя имя, фамилию, а затем
конструирует, сохраняет и отображает третью строку, состоящую из фамилии
пользователя, за которым следует запятая, пробел и его имя.
Используйте массивы char и функции из заголовочного файла cstring.
Пример запуска должен выглядеть  так:
Enter your first name: Flip
Enter your last name: Fleming
Here's the information in a single string: Fleming, Flip
*/
 
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    cout << "Enter your first name: ";
    string firstName;
    getline (cin, firstName);
    cout << endl;
    cout << "Enter your last name: ";
    string lastName;
    getline (cin, lastName);
    cout << endl;
    cout << "Here's the information in a single string: " << lastName << ", " << firstName;
    cout << endl;
    return 0;
}

Глава 4. Упражнение 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
//  sp_Ch4P202_Exercise05
/// Занятия по книге Стивена Праты "Язык программирования С++" (2001, 6-е издание).
/// Упражнения по программированию. Глава 4, страница 202, упражнение 5.
/*
Структура candyBar содержит три члена. Первый хранит название конфет, второй - её
вес (который может иметь дробную часть), а третий - количество килокалорий (целое
значние). Напишите программу, которая объявляет структуру типа candyBar по имени
snack, инициализируя её члены значениями Mocha Munch, 2.3 и 350 соответственно.
Инициализация должна быть частью объявления snack. И, наконец, программа должна
отобразить содержимое переменной.
*/
 
 
#include <iostream>
#include <string>
using namespace std;
 
    struct candyBar
    {
        string name;
        double weight;
        int kcal;
    };
 
int main()
{
    candyBar snack
    {
       "Mocha Munch",
       2.3,
       350
    };
 
    cout << "The name of these chocolates: " << snack.name << endl;
    cout << endl;
 
    cout << "The weight of these chocolates: " << snack.weight << endl;
    cout << endl;
 
    cout << "The kcal of these chocolates: " << snack.kcal << endl;
    cout << endl;
 
    return 0;
}

Глава 4. Упражнение 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
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
//  sp_Ch4P202_Exercise06
/// Занятия по книге Стивена Праты "Язык программирования С++" (2001, 6-е издание).
/// Упражнения по программированию. Глава 4, страница 202, упражнение 6.
/*
Структура candyBar включает три члена, как описано в предыдущем упражнении.
Напишите программу, которая создаёт массив из трёх структур candyBar,
инициализирует их значениями по Вашему усмотрению и затем отображает
содержимое каждой структуры.
*/
 
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
    struct candyBar
    {
        string name;
        double weight;
        int kcal;
    };
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    candyBar candyArray[3];
 
    cout << "Введите название 1-й коробки конфет: ";
    cin >> candyArray[0].name;
    cout << "Введите вес 1-й коробки конфет: ";
    cin >> candyArray[0].weight;
    cout << "Введите количество калорий в 1-й коробке конфет: ";
    cin >> candyArray[0].kcal;
    cout << endl;
 
    cout << "Введите название 2-й коробки конфет: ";
    cin >> candyArray[1].name;
    cout << "Введите вес 2-й коробки конфет: ";
    cin >> candyArray[1].weight;
    cout << "Введите количество калорий в 2-й коробке конфет: ";
    cin >> candyArray[1].kcal;
    cout << endl;
 
    cout << "Введите название 3-й коробки конфет: ";
    cin >> candyArray[2].name;
    cout << "Введите вес 3-й коробки конфет: ";
    cin >> candyArray[2].weight;
    cout << "Введите количество калорий в 3-й коробке конфет: ";
    cin >> candyArray[2].kcal;
    cout << endl;
 
    cout << "******************************************************" << endl;
 
    cout << "Название 1-й коробки конфет: " << candyArray[0].name;
    cout << endl;
    cout << "Вес 1-й коробки конфет: " << candyArray[0].weight;
    cout << endl;
    cout << "Количество калорий в 1-й коробке конфет: " << candyArray[0].kcal;
    cout << endl;
    cout << endl;
 
    cout << "Название 2-й коробки конфет: " << candyArray[1].name;
    cout << endl;
    cout << "Вес 2-й коробки конфет: " << candyArray[1].weight;
    cout << endl;
    cout << "Количество калорий в 2-й коробке конфет: " << candyArray[1].kcal;
    cout << endl;
    cout << endl;
 
    cout << "Название 3-й коробки конфет: " << candyArray[2].name;
    cout << endl;
    cout << "Вес 3-й коробки конфет: " << candyArray[2].weight;
    cout << endl;
    cout << "Количество калорий в 3-й коробке конфет: " << candyArray[2].kcal;
    cout << endl;
    cout << endl;
 
    cout << "******************************************************" << endl;
 
    return 0;
}

Глава 4. Упражнение 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
// sp_Ch4P203_Exercise07
/// Занятия по книге Стивена Праты "Язык программирования С++" (2001, 6-е издание).
/// Упражнения по программированию. Глава 4, страница 203, упражнение 7.
/*
Вильям Вингейт (William Wingate) заведует службой анализа рынка пиццы.
О каждой пицце он записывает следующую информацию:
• наименование компании (может состоять из более чем одного слова);
• диаметр пиццы;
• вес пиццы.
Разработайте структуру, которая может содержать всю эту информацию, и
напишите программу, использующую структурную переменную этого типа.
Программа должна запрашивать у пользователя каждый из перечисленных
показателей и затем отображать введенную информацию. Применяйте cin
(или его методы) и cout.
*/
#include <iostream>
#include <string>
 
struct pizza
{
    std::string name;
    double diameter;
    double weight;
};
 
int main()
{
    using namespace std;
    pizza forExample;
 
    cout << "Enter the brand name: ";
    getline (cin, forExample.name);
 
    cout << "Enter the diameter of the pizza: ";
    cin >> forExample.diameter;
 
    cout << "Enter the weight of the pizza: ";
    cin >> forExample.weight;
    cout << endl << endl;
 
    cout << "******************************************************" << endl;
    cout << "The brand name is: " << forExample.name << endl;
    cout << "The diameter of the pizza: " << forExample.diameter << endl;
    cout << "The weight of the pizza: " << forExample.weight << endl << endl;
    cout << "******************************************************" << endl;
 
    return 0;
}

Глава 4. Упражнение 8

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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
//  sp_Ch4P203_Exercise08
/// Занятия по книге Стивена Праты "Язык программирования С++" (2001, 6-е издание).
/// Упражнения по программированию. Глава 4, страница 203, упражнение 8.
/*
Выполните упражнение 7, но с применением операции new для размещения
структуры в свободном хранилище вместо объявления структурной переменной.
Кроме того,  сделайте так, чтобы программа сначала запрашивала диаметр
пиццы, а потом - наименование компании.
*/
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
struct pizza
{
    double diameter;
    string name;
    double weight;
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    pizza *forExample = new pizza;
 
    cout << "Введите диаметр пиццы: ";
    //(cin >> forExample->diameter).get(); // Первый способ. Работает!
        /*
        После ввода через cin >>, в потоке ввода остаётся '\n' (попадает в поток при
        нажатии Enter), который перед getline() нужно убрать, иначе getline() считает
        его первым (для неё это пустая строка) и код, не останавливаясь, пойдёт дальше.
        Функция get() извлекает символ из потока ввода (в данном случае - '\n').
        То же самое в две строки:
        cin >> forExample->diameter;
        cin.get();
        */
    //cin >> forExample->diameter; // Второй способ. Работает!
    //cin.get();
 
    //cin >> forExample->diameter; // Третий способ. Почему-то не работает :(
    //cin.ignore(cin.rdbuf()->in_avail());
 
    //cin >> forExample->diameter; // Четвёртый способ. Почему-то не работает :(
    //cin.clear();
 
    cin >> forExample->diameter; // Пятый способ. Работает!
    cin.ignore();
 
    cout << "Введите название компании-производителя: ";
    getline (cin, forExample->name);
    cout << "Введите вес пиццы: ";
    cin >> forExample->weight;
    cout << endl;
    cout << endl;
 
    cout << "******************************************************" << endl;
 
    cout << "Название компании-производителя: " << forExample->name;
    cout << endl;
    cout << "Диаметр пиццы: " << forExample->diameter;
    cout << endl;
    cout << "Вес пиццы: " << forExample->weight;
    cout << endl;
    cout << endl;
 
    cout << "******************************************************" << endl;
    delete forExample;
    return 0;
}
3
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
23.03.2015, 16:13 7
Глава 4. Упражнение 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
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
//  sp_Ch4P203_Exercise09
/// Занятия по книге Стивена Праты "Язык программирования С++" (2011, 6-е издание).
/// Упражнения по программированию. Глава 4, страница 203, упражнение 9.
/*
Выполните упражнение №6, но вместо объявления массива из трёх структур
CandyBar используйте операцию new для динамического размещения массива.
*/
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
    struct candyBar
    {
        string name;
        double weight;
        int kcal;
    };
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    candyBar *candyPtr = new candyBar[3]; // выделяем место дл
 
    cout << "Введите название 1-й коробки конфет: ";
    getline (cin, candyPtr[0].name);
    cout << "Введите вес 1-й коробки конфет: ";
    cin >> candyPtr[0].weight;
    cout << "Введите количество калорий в 1-й коробке конфет: ";
    cin >> candyPtr[0].kcal;
    cout << endl;
    cin.ignore();
 
    cout << "Введите название 2-й коробки конфет: ";
    getline (cin, candyPtr[1].name);
    cout << "Введите вес 2-й коробки конфет: ";
    cin >> candyPtr[1].weight;
    cout << "Введите количество калорий в 2-й коробке конфет: ";
    cin >> candyPtr[1].kcal;
    cout << endl;
    cin.ignore();
 
    cout << "Введите название 3-й коробки конфет: ";
    getline (cin, candyPtr[2].name);
    cout << "Введите вес 3-й коробки конфет: ";
    cin >> candyPtr[2].weight;
    cout << "Введите количество калорий в 3-й коробке конфет: ";
    cin >> candyPtr[2].kcal;
    cout << endl;
    cin.ignore();
 
    cout << "******************************************************" << endl;
 
    cout << "Название 1-й коробки конфет: " << candyPtr[0].name;
    cout << endl;
    cout << "Вес 1-й коробки конфет: " << candyPtr[0].weight;
    cout << endl;
    cout << "Количество калорий в 1-й коробке конфет: " << candyPtr[0].kcal;
    cout << endl;
    cout << endl;
 
    cout << "Название 2-й коробки конфет: " << candyPtr[1].name;
    cout << endl;
    cout << "Вес 2-й коробки конфет: " << candyPtr[1].weight;
    cout << endl;
    cout << "Количество калорий в 2-й коробке конфет: " << candyPtr[1].kcal;
    cout << endl;
    cout << endl;
 
    cout << "Название 3-й коробки конфет: " << candyPtr[2].name;
    cout << endl;
    cout << "Вес 3-й коробки конфет: " << candyPtr[2].weight;
    cout << endl;
    cout << "Количество калорий в 3-й коробке конфет: " << candyPtr[2].kcal;
    cout << endl;
    cout << endl;
 
    cout << "******************************************************" << endl;
 
    delete [] candyPtr;
    return 0;
}

Глава 4. Упражнение 10

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
//  sp_Ch4P203_Exercise10
/// Занятия по книге Стивена Праты "Язык программирования С++" (2011, 6-е издание).
/// Упражнения по программированию. Глава 4, страница 203, упражнение 10.
/*
Напишите программу, которая приглашает пользователя ввести три результата
забега на 40 ярдов и затем отображает эти значения и их среднее. Для
хранения данных применяйте объект array.
*/
 
int main()
{
    using std::cout;
    using std::cin;
    using std::endl;
    using std::array;
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    array <double, 4> sprint;
 
    for (int i = 1; i < 4; i++)
    {
        cout << "Введите " << i <<"-й результат забега на 40 ярдов: ";
        cin >> sprint[i];
        cout << endl;
    }
 
    sprint[0] = (sprint[1] + sprint[2] + sprint[3]) / 3.0  ;
 
    for (int j = 1; j < 4; j++)
    {
        cout << j <<"-й результат забега на 40 ярдов: " << sprint[j] << endl;
    }
 
    cout << "Средний результат: " << sprint[0] << endl;
 
    return 0;
}


Глава 5.
Глава 5. Упражнение 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
37
38
39
40
//  sp_Ch5_Pg255_Ex01
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.)
/// Упражнения по программированию. Глава 5, страница 255, упражнение 1.
/*
Напишите программу, запрашивающую у пользователя ввод двух целых чисел.
Затем программа должна вычислить и выдать сумму всех целых чисел, лежащих
между этими двумя целыми. Предполагается, что меньшее значение вводится
первым. Например, если пользователь ввел 2 и 9, программа должна сообщить,
что сумма всех целых чисел от 2 до 9 равна 44.
*/
 
#include <iostream>
#include <windows.h>
 
int main()
{
    using namespace std;
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int num_1, num_2, times;
 
    cout << "Введите первое(меньшее) число: ";
    cin >> num_1;
    cout << "Введите второе(большее) число: ";
    cin >> num_2;
 
    times = num_2 - num_1;
    int summ = 0;
    for (int i=0 ; i<=times; ++i)
    {
        summ += num_1 + i;
    }
 
    cout << "\nCумма всех целых чисел от " << num_1
         << " до " << num_2 << " равна " << summ << endl;
    cin.get();
    return 0;
}

Глава 5. Упражнение 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
//  sp_Ch5_Pg255_Ex02
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.)
/// Упражнения по программированию. Глава 5, страница 255, упражнение 2.
/*
Перепишите код из листинга 5.4 с использованием объекта array вместо
встроенного массива и типа long double вместо long long.
Найдите значение 100!
*/
 
#include <iostream>
#include <array>
 
const int ArSize = 101;      // example of external declaration
int main()
{
    std::array <long double, ArSize> factorials;
    factorials[1] = factorials[0] = 1LL;
    for (int i = 2; i < ArSize; i++)
        factorials[i] = i * factorials[i-1];
    for (int i = 0; i < ArSize; i++)
        std::cout << i << "! = " << factorials[i] << std::endl;
    // std::cin.get();
    return 0;
}

Глава 5. Упражнение 3

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//  sp_Ch5_Pg255_Ex03
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.)
/// Упражнения по программированию. Глава 5, страница 255, упражнение 3.
/*
Напишите программу, которая приглашает пользователя вводить числа. После
каждого введенного значения программа должна выдавать накопленную сумму
введенных значений. Программа должна завершаться при вводе 0.
*/
#include <iostream>
 
int main()
{
    using namespace std;
    double x = 1;
    double sum = 0;
    while (x != 0)
    {
        cout << "Enter a number: ";
        cin >> x;
        sum += x;
        if (x != 0)
            cout << "Sum is: " << sum << endl << endl;
        else
            cout << "\nYou entered zero... Hmm... OK, bye then.\n";
    }
    return 0;
}

Глава 5. Упражнение 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
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
//  sp_Ch5_Pg255_Ex04
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.)
/// Упражнения по программированию. Глава 5, страница 255, упражнение 4.
/*
Дафна инвестировала $100 под простые 10%. Другими словами, ежегодно
инвестиция должна приносить 10% инвестированной суммы, т.е. $10 каждый год:
прибыль = 0,10 х исходный баланс
В то же время Клео инвестировала $100 под сложные 5%. Это значит, что прибыль
составит 5% от текущего баланса, включая предыдущую накопленную прибыль:
прибыль = 0,05 х текущий баланс
Клео зарабатывает 5% от $100 в первый год, что дает ей $105. На следующий
год она зарабатывает 5% от $105, что составляет $5.25, и т.д. Напишите
программу, которая вычислит, сколько лет понадобится для того, чтобы сумма
баланса Клео превысила сумму баланса Дафны, с отображением значений обоих
балансов за каждый год.
*/
 
#include <iostream>
#include <windows.h>
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    double cleoDeposit = 100.0; /* первоначальный вклад Клео */
    double daphDeposit = 100.0; /* первоначальный вклад Дафны */
 
    double cleoYearProfit = 0.1 * cleoDeposit;  /* Процентная ставка Клео - 20%
    годовых (простой процент); у Клео каждый год одна и та же прибыль. */
 
    double daphYearProfit = 0.05 * daphDeposit; /* Процентная ставка Дафны  - 5 %
    годовых, но с пересчётом в конце каждого года (сложный процент) */
 
    double year = 1.0; /* количество лет потраченных на соревнование Клео и Дафны */
 
    double cleoBalance = cleoDeposit + (cleoYearProfit * year); /* состояние счёта Клео
    в конце первого года (когда к сумме первоначального вклада прибавились проценты) */
 
    double daphBalance = daphDeposit + daphYearProfit; /* состояние счёта Дафны в конце
    первого года (когда к сумме первоначального вклада прибавились проценты) */
 
    while (cleoBalance > daphBalance)
    {   // выполнять цикл до тех пор, пока на счету у Клео больше денег, чем у Дафны:
 
        daphYearProfit = 0.05 * daphDeposit;
        daphBalance = daphDeposit + daphYearProfit;
        daphDeposit = daphBalance;
 
        cleoBalance = cleoDeposit + (cleoYearProfit * year);
 
        cout << "\nБаланс Дафны за " << year << "-й год: "
             << daphBalance << " долларов." << endl;
        cout << "Баланс Клео за " << year << "-й год: "
             << cleoBalance << " долларов." << endl;
 
        ++year;
    }
 
    cout << "\nПонадобилось " << --year << " лет, чтобы баланс "
            "Дафны стал больше, чем у Клео." << endl;
 
    return 0;
}

Глава 5. Упражнение 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
//  sp_Ch5_Pg255_Ex05
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.)
/// Упражнения по программированию. Глава 5, страница 255, упражнение 5.
/*
Предположим, что вы продаете книгу по программированию на Языке C++ для
начинающих. Напишите программу, которая позволит ввести ежемесячные
объемы продаж в течение года (в количестве книг, а не в деньгах). Программа
должна использовать цикл, в котором выводится приглашение с названием месяца,
применяя массив указателей на char (или массив объектов string , если
вы предпочитаете его), инициализированный строками с названиями месяцев,
и сохраняя введенные значения в массиве int. Затем программа должна найти
сумму содержимого массива и выдать общий объем продаж за год.
*/
 
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int arrayBooksSold[12];
    int totalBooksSold=0;
 
    string arrayMonths[12]={
    "январь", "февраль", "март", "апрель", "май", "июнь", "июль",
    "август", "сентябрь", "октябрь", "ноябрь", "декабрь"};
 
    for (int i=0; i<12; ++i)
    {
        cout << "Введите количество проданных книг за "
             << arrayMonths[i] << ":\t";
        cin  >> arrayBooksSold[i];
        totalBooksSold += arrayBooksSold[i];
    }
    cout << "\nВсего книг продано за год: " << totalBooksSold;
    cout << endl;
 
    return 0;
}

Глава 5. Упражнение 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
//  sp_Ch5_Pg256_Ex06
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.)
/// Упражнения по программированию. Глава 5, страница 256, упражнение 6.
/*
Выполните упражнение 5, но используя двумерный массив для сохранения
данных о месячных продажах за 3 года. Выдайте общую сумму продаж за каждый
год и за все годы вместе.
*/
 
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int booksSoldPerMonth[3][12];
    int totalBooksSold=0;
 
    string month[12]={
    "январь\t", "февраль\t", "март\t", "апрель\t", "май\t", "июнь\t", "июль\t",
    "август\t", "сентябрь\t", "октябрь\t", "ноябрь\t", "декабрь\t"};
 
    string year[3]={"2011 года\t", "2012 года\t", "2013 года\t"};
 
    for (int y=0; y<3; ++y)
    {
        int booksSoldPerYear=0;
        int m;
        for (m=0; m<12; ++m)
        {
            cout << "\nВведите количество проданных книг за "
                 << month[m] << year[y];
            cin  >> booksSoldPerMonth[y][m];
            booksSoldPerYear += booksSoldPerMonth[y][m];
        }
        cout << "\nВсего книг продано за год: " << booksSoldPerYear;
        totalBooksSold += booksSoldPerYear;
        cout << endl;
    }
 
    cout << "\nВсего книг продано за три года: " << totalBooksSold;
    cout << endl;
 
    return 0;
}

Глава 5. Упражнение 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
//  sp_Ch5_Pg256_Ex07
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.)
/// Упражнения по программированию. Глава 5, страница 256, упражнение 7.
/*
Разработайте структуру по имени car, которая будет хранить следующую
информацию об автомобиле: название производителя в виде строки в символьном
массиве или в объекте string , а также год выпуска автомобиля в виде целого
числа. Напишите программу, которая запросит пользователя, сколько автомобилей
необходимо включить в каталог. Затем программа должна применить new
для создания динамического массива структур car указанного пользователем
размера. Далее она должна пригласить пользователя ввести название
производителя и год выпуска для наполнения данными каждой структуры в массиве
(см. главу 4). И, наконец, она должна отобразить содержимое каждой структуры.
Пример запуска программы должен выглядеть подобно следующему:
Сколько автомобилей поместить в каталог?  2
Автомобиль #1:
Введите производителя:  Hudson Hornet
Укажите год выпуска:  1952
Автомобиль #2:
Введите производителя:  Kaiser
Укажите год выпуска:  1951
Вот ваша коллекция:
1952 Hudson Hornet
1951 Kaiser
*/
 
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
struct car
{
    string name;
    int year;
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int qty;
    cout << "Сколько автомобилей поместить в каталог? ";
    cin  >> qty;
    cin.ignore();
    cout << endl;
    car* p_catalog = new car [qty];
    for (int i=0; i<qty; ++i)
    {
        cout << "Автомобиль #" << i+1 << ":" << endl;
        cout << "Введите название модели автомобиля: ";
        getline (cin, p_catalog[i].name);
        cin.clear();
        cout << "Введите год выпуска автомобиля: ";
        cin  >> p_catalog[i].year;
        cin.ignore();
        cout << endl;
    }
 
    cout << "Вот Ваша коллекция:\n";
    cout << endl;
 
    for (int i=0; i<qty; ++i)
    {
        cout << p_catalog[i].year << " " << p_catalog[i].name << endl;
        cout << endl;
    }
 
    delete [] p_catalog;
    return 0;
}
2
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
23.03.2015, 16:16 8
Глава 5. Упражнение 8

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//  sp_Ch5_Pg256_Ex08
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.)
/// Упражнения по программированию. Глава 5, страница 256, упражнение 8.
/*
Напишите программу, которая использует массив char и цикл для чтения по
одному слову за раз до тех пор, пока не будет введено слово done. Затем
программа должна сообщить количество введённых слов (исключая done).
Пример запуска должен быть таким:
Вводите слова (для завершения введите слово done):
anteater birthday category dumpsteг
envy finagle geometry done for sure
Вы ввели 7 слов .
Вы должны включить заголовочный файл cstring и применять функцию
strcmp() для выполнения проверки.
 
*/
 
#include <iostream>
#include <cstring>  // для функции сравнения строк strcmp()
#include <windows.h>
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    const int size = 20;
    char answer[size];
    int qty = 0;
    std::cout << "Вводите слова (для завершения введите слово done):\n";
    std::cin >> answer;
    while ( strcmp(answer, "done"))
    {
        std::cin >> answer;
        ++qty;
    }
 
    std::cout << "Вы ввели " << qty << " слов." << std::endl;
    std::cin.get();
    return 0;
}

Глава 5. Упражнение 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
26
27
28
29
30
31
32
33
34
35
36
37
//  sp_Ch5_Pg256_Ex09
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.)
/// Упражнения по программированию. Глава 5, страница 256, упражнение 9.
/*
Напишите программу, соответствующую описанию программы из упражнения 8,
но с использованием объекта string вместо символьного массива.
Включите заголовочный файл string и применяйте операции отношений для
выполнения проверки.
*/
 
#include <iostream>
#include <string>
#include <windows.h>
int main()
{
    using namespace std;
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int qty = 0;
    string userword;
    string quitword = "exit";
    cout << "Вводите слова и нажимайте клавишу Enter. "
            "Для завершения введите слово exit:\n" << endl;
    getline(cin, userword);
 
    while (userword != quitword)
    {
        getline(cin, userword);
        ++qty;
    }
 
    cout << "\nВы ввели " << qty << " слов и слово-пароль"
            " exit для выхода." << endl;
    return 0;
}

Глава 5. Упражнение 10

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
//  sp_Ch5_Pg256_Ex10
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.)
/// Упражнения по программированию. Глава 5, страница 256, упражнение 10.
/*
Напишите программу, использующую вложенные циклы, которая запрашивает
у пользователя значение количества строк для отображения. Затем она должна
отобразить указанное число строк со звездочками, с одной звездочкой в первой
строке, двумя — во второй и т.д: В каждой строке звездочкам должны
предшествовать точки — в таком количестве, чтобы общее число символов в каждой
строке было равно количеству строк. Пример запуска программы должен
выглядеть следующим образом:
 
Введите количество строк: 5
....*
...**
..***
.****
*****
 
*/
 
// Функция isInteger() написана -=ЮрА=-:
// [url]https://www.cyberforum.ru/cpp-beginners/thread764125.html#post4014736[/url]
 
// Цикл while написан юзером gray_fox:
// [url]https://www.cyberforum.ru/cpp-beginners/thread1225226-page2.html#post6413181[/url]
 
#include <iostream>
#include <windows.h>
#include <limits>
#include <typeinfo>
 
template <class T>
bool isInteger(T val);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int qty=0;
 
    while(true)
    {
        std::cout << "Введите количество строк: ";
        std::cin >> qty;
        if ((isInteger(qty)))
        {
            if (qty>0)
                break;
            else
                std::cout << "Вы должны ввести целое "
                "число больше нуля." << std::endl;
        }
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
 
    for (int i=0; i<qty; ++i)
    {
 
        for (int j=0; j<qty; ++j)
        {
            std::cout << ".";
        }
 
        for (int j=0; j<i+1; ++j)
        {
            std::cout << "\b";
        }
        for (int j=0; j<i+1; ++j)
        {
            std::cout << "*";
        }
        std::cout << std::endl;
    }
 
    return 0;
}
 
template <class T>
bool isInteger(T val)
{
    return typeid(val) == typeid(int);
}


Глава 6.
Глава 6. Упражнение 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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//  sp_Ch6_Pg300_Ex01
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 6, страница 300, упражнение 1.
/*
Напишите программу, которая читает клавиатурный ввод до символа @ и
повторяет его, за исключением десятичных цифр, преобразуя каждую букву
верхнего регистра в букву нижнего регистра и наоборот.
(Не забудьте о семействе функций cctype.)
*/
#include <iostream>
#include <windows.h>
#include <string>
#include <cctype>
 
int main()
{
    using std::string;
    using std::cout;
    using std::cin;
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    string text;
    cout << "Привет! Это программа, которая читает клавиатурный "
    "ввод до символа @ и повторяет его, за исключением десятичных цифр, "
    "преобразуя каждую букву верхнего регистра в букву нижнего регистра "
    "и наоборот.\n\n" << "Введите Ваш текст и нажмите Enter: ";
    getline(cin, text);
    int strSize = text.size();
    char ch;
    for (int i=0; i<strSize; ++i)
    {
        ch = text[i];
        if (ch != '@')
        {
            if (isspace(ch) || ispunct(ch))
                cout << ch;
            else if (isdigit(ch))
                cout << "";
            else if (isalpha(ch))
                islower(ch) ? cout << (char)toupper(ch) : cout << (char)tolower(ch);
            else
                cout << ch;
        }
        else
        {
            cout << "";
            break;
        }
    }
    return 0;
}

Глава 6. Упражнение 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
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
//  sp_Ch6_Pg300_Ex02
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 6, страница 300, упражнение 2.
/*
Напишите программу, читающую в массив double до 10 значений
пожертвований. (Или, если хотите, используйте шаблонный объект array.) Программа
должна прекращать ввод при получении нечисловой величины. Она должна
выдавать среднее значение полученных чисел, а также количество значений в
массиве, превышающих среднее.
*/
#include <iostream>
#include <windows.h>
#include <limits>
 
int main()
{
    using namespace std;
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    const int arrSize = 10;
    double donation[arrSize];
    cout << "Введите сумму пожертвования в формате xx.yy\n"
            "(где xx - это рубли, а yy - копейки).\n\n";
    for (int i=0; i<arrSize; ++i)
    {
        cout << "Введите сумму " << i+1 << "-го пожертвования: ";
        while (!(cin >> donation[i]))
        {
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cout << "Некорректный ввод!" << endl;
            cout << "Введите сумму " << i+1 << "-го пожертвования: ";
        }
    }
 
    double sum = 0;
 
    for (int i=0; i<arrSize; ++i)
        sum += donation[i];
 
    double average = sum/arrSize;
 
    int greaterThanAverage = 0;
 
    for (int i=0; i<arrSize; ++i)
    {
        if (donation[i]<average)
            continue;
        else
            ++greaterThanAverage;
    }
 
    cout << endl << "Средняя сумма пожертвований: "
         << average << endl << endl;
 
    cout << endl << "Пожертвований превышающих среднюю сумму: "
         << greaterThanAverage << endl << endl;
 
    return 0;
}

Глава 6. Упражнение 3

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//  sp_Ch6_Pg300_Ex03
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 6, страница 300, упражнение 3.
/*
Напишите предшественник программы, управляемой меню. Она должна
отображать меню из четырех пунктов, каждый из них помечен буквой. Если
пользователь вводит букву, отличающуюся от четырех допустимых, программа
должна повторно приглашать его ввести правильное значение до тех пор, пока
он этого не сделает. Затем она должна выполнить некоторое простое действие
на основе пользовательского выбора. Работа программы должна выглядеть
примерно так:
Please enter one of the following choices:
c) carnivore p) pianist
t) tree g) game
f
Please enter a c, p, t, or g: q
Please enter a c, p, t, or g: t
A maple is a tree.
*/
#include <iostream>
#include <string>
 
int main()
{
    using std::endl;
    using std::cout;
    using std::cin;
    using std::string;
 
    const int arrSize = 5;
    int sz = arrSize-1;
    cout << "Please enter one of the following choices:\n"
            "c) carnivore\n"
            "p) pianist\n"
            "t) tree\n"
            "g) game\n\n";
 
    string phrase[] = {"\nTiger is a carnivore.\n", "\nChopin was a great pianist.\n", "\nMaple is a tree.\n", "\nDiablo is a revolutionary game\n"};
    char choice[arrSize] = {'c', 'p', 't', 'g', '0'};
    cin >> choice[sz];
    while(true)
    {
        for (int i=0; i<sz; ++i)
            if (choice[sz] == choice[i])
            {
                cout << phrase[i];
                return 0;
            }
        cout << "\nThis is not possible choice. Please, try again: ";
        cin.clear();
        while (cin.get() != '\n');
        cin >> choice[sz];
    }
}

Глава 6. Упражнение 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
//  sp_Ch6_Pg300_Ex04
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 6, страница 300, упражнение 4.
/*
Когда вы вступите в Благотворительный Орден Программистов (БОП), к вам
могут обращаться на заседаниях БОП по вашему реальному имени, по
должности либо секретному имени БОП. Напишите программу, которая может
выводить списки членов по реальным именам, должностям, секретным именам либо
по предпочтению самого члена. В основу положите следующую структуру:
// Структура имен Благотворительного Ордена Программистов (БОП)
struct bop
{
    char fullname[strsize]; // реальное имя
    char title[strsize]; // должность
    char bopname[strsize]; // секретное имя БОП
    int preference; // 0 = полное имя, 1 = титул, 2 = имя БОП
};
В этой программе создайте небольшой массив таких структур и
инициализируйте его соответствующими значениями. Пусть программа запустит цикл,
который даст возможность пользователю выбирать разные альтернативы:
a. display by name b. display by title
c. display by bopname d. display by preference
q. quit
Обратите внимание, что "display by preference" (отображать по предпочтениям)
не означает, что нужно отобразить член preference; это значит, что
необходимо отобразить член структуры, который соответствует значению preference.
Например, если preference равно 1, то выбор d должен вызвать отображение
должности данного программиста. Пример запуска этой программы может
выглядеть следующим образом:
Benevolent Order of Programmers Report
a. display by name b. display by title
c. display by bopname d. display by preference
q. quit
Enter your choice: a
Wimp Macho
Raki Rhodes
Celia Laiter
Hoppy Hipman
Pat Hand
Next choice: d
Wimp Macho
Junior Programmer
MIPS
Analyst Trainee
LOOPY
Next choice: q
Bye!
*/
#include <iostream>
#include <string>
using namespace std;
 
struct bop
{
    string fullname;    // реальное имя
    string title;       // должность
    string bopname;     // секретное имя БОП
    int preference;     // 0 = полное имя, 1 = титул, 2 = имя БОП
};
 
int main()
{
    const int arrSize = 5;
 
    bop memberList[arrSize] =
    {
        {"John Goldfish", "system analyst", "FISHER"},
        {"Katherine Thomas", "junior programmer", "GREATKAT"},
        {"Dave Stone", "senior programmer", "SPARKY"},
        {"Brian Mill", "system administrator", "ROCKER"},
        {"Alice Crawford", "webmaster", "BEAUTY"}
    };
 
    cout << "Benevolent Order of Programmers Report\n"
            "a. display by name\n"
            "b. display by title\n"
            "c. display by bopname\n"
            "d. display by preference\n"
            "q. quit\n"
            "\nEnter your choice: ";
 
    char choice = ' ';
    cin >> choice;
 
    while (choice != 'q')
    {
        switch (choice)
        {
            case 'a':   for (int i=0; i<arrSize; ++i)
                            cout << memberList[i].fullname << endl;
                        break;
 
            case 'b':   for (int i=0; i<arrSize; ++i)
                            cout << memberList[i].title << endl;
                        break;
 
            case 'c':   for (int i=0; i<arrSize; ++i)
                            cout << memberList[i].bopname << endl;
                        break;
 
            case 'd':   cout << "\nPlease, set your preference:\n"
                            "0 = fullname\n"
                            "1 = title\n"
                            "2 = bopname\n";
                        for (int i=0; i<arrSize; ++i)
                        {
                            cout << "\nPlease, set your preference for "
                                 << i+1 << " memeber of BOP: ";
                            cin >> memberList[i].preference;
                        }
 
                        for (int i=0; i<arrSize; ++i)
                        {
                            if (memberList[i].preference == 0)
                                cout << memberList[i].fullname << endl;
                            else if (memberList[i].preference == 1)
                                cout << memberList[i].title << endl;
                            else if (memberList[i].preference == 2)
                                cout << memberList[i].bopname << endl;
                            else
                            {
                                cout << "\nThis is not possible choice.\n"
                                        "You should enter 0 or 1 or 2.\n"
                                        "Please, try type correct numbers next time.\n";
                                break;
                            }
 
                        }
                        break;
 
            default:    cout << "\nThis is not possible choice. Please, try again.\n";
        }
        cin.clear();
        while (cin.get() != '\n');
        cout << "\nEnter your next choice: ";
        cin >> choice;
    }
    cout << "\nBye!\n";
    return 0;
}
2
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
23.03.2015, 16:18 9
Глава 6. Упражнение 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
//  sp_Ch6_Pg301_Ex05
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 6, страница 301, упражнение 5.
/*
Королевство Нейтрония, где денежной единицей служит тварп, использует
следующую шкалу налогообложения:
первые 5 000 тварпов —
налог 0%
следующие 10 000 тварпов —
налог 10%
следующие 20 000 тварпов —
налог 15%
свыше 35 000 тварпов —
налог 20%
Например, если некто зарабатывает 38 000 тварпов, то он должен заплатить
налогов 5000 х 0,00 + 10000 х 0,10 + 20000 х 0,15 + 3000 х 0,20, или 4 600 тварпов.
Напишите программу, которая использует цикл для запроса доходов и выдачи
подлежащего к выплате налога. Цикл должен завершаться, когда пользователь
вводит отрицательное или нечисловое значение.
*/
#include <iostream>
 
int main()
{
    using std::cout;
    using std::cin;
    const double TAX_FACTOR = 5000;
    cout << "Welcome to the portal of the tax service of the Kingdom of Neutronia.\n"
            "This programm will help you calculate the amount of income tax.\n"
            "Enter the amount of income for which you want to calculate the income tax:\n";
    double income = 0;
    double tax = 0;
    while (cin >> income && income >= 0)
    {
        if (income <= TAX_FACTOR)
            tax = 0;
        else if (income > TAX_FACTOR && income <= TAX_FACTOR * 3)
            tax = (income - TAX_FACTOR) * 0.10;
        else if (income > TAX_FACTOR * 3 && income <= TAX_FACTOR * 7)
            tax = (TAX_FACTOR * 2 * 0.10) + ((income - TAX_FACTOR * 2) * 0.15);
        else
            tax = (TAX_FACTOR * 2 * 0.10) + (TAX_FACTOR * 4 * 0.15) + ((income - TAX_FACTOR * 7) * 0.20);
        cout << "Your income tax is " << tax << " tvarps.\n";
        cout << "Enter the amount of income for which you want to calculate the income tax:\n";
    }
    cout << "\nBye!\n";
    return 0;
}

Глава 6. Упражнение 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
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
//  sp_Ch6_Pg301_Ex06
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 6, страница 301, упражнение 6.
/*
Постройте программу, которая отслеживает пожертвования в Общество
Защиты Влиятельных Лиц. Она должна запрашивать у пользователя
количество меценатов, а затем приглашать вводить их имена и суммы пожертвований
от каждого. Информация должна сохраняться в динамически выделяемом массиве
структур. Каждая структура должна иметь два члена: символьный массив (или
объект string) для хранения имени и переменную-член типа double — для
хранения суммы пожертвования. После чтения всех данных программа должна
отображать имена и суммы пожертвований тех, кто не пожалел $10 000 и
более. Этот список должен быть озаглавлен меткой "Grand Patrons". После этого
программа должна выдать список остальных жертвователей. Он должен быть
озаглавлен "Patrons". Если в одной из двух категорий не окажется никого,
программа должна напечатать "none". Помимо отображения двух категорий,
никакой другой сортировки делать не нужно.
*/
#include <iostream>
#include <string>
 
using namespace std;
 
struct Contributor  // меценат
{
    string name;    // имя
    double amount;  // сумма
};
 
int main()
{
    cout << "Enter the number of contributors: ";
    int num;
    cin >> num;
    while (cin.get() != '\n'); // освобождаемся от мусора в потоке
 
    Contributor * memberlist = new Contributor[num];
 
    int greatPatrons = 0;
    int patrons = 0;
 
    for (int i=0; i<num; ++i)
    {
        cout << "\nEnter the name of " << i+1 << " contributor: ";
        getline (cin, memberlist[i].name);
        cout << "Enter the amount of the " << i+1 << " contribution: ";
        cin >> memberlist[i].amount;
        while (cin.get() != '\n'); // освобождаемся от мусора в потоке
        if (memberlist[i].amount >= 10000)
            ++greatPatrons;
        else
            ++patrons;
    }
 
    cout << "\nGreat Patrons:" << endl;
    if (greatPatrons > 0)
    {
        for (int i=0; i<num; ++i)
            if (memberlist[i].amount >= 10000)
                cout << memberlist[i].name << "\t" << memberlist[i].amount << endl;
    }
    else
    {
        cout << "none" << endl;
    }
 
    cout << "\nPatrons:" << endl;
    if (patrons > 0)
    {
        for (int i=0; i<num; ++i)
            if (memberlist[i].amount < 10000)
                cout << memberlist[i].name << "\t" << memberlist[i].amount << endl;
    }
    else
    {
        cout << "none" << endl;
    }
 
    delete [] memberlist;
 
    return 0;
}

Глава 6. Упражнение 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
//  sp_Ch6_Pg301_Ex07
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 6, страница 301, упражнение 7.
/*
Напишите программу, которая читает слова по одному за раз, пока не будет
введена отдельная буква q. После этого программа должна сообщить количество
слов, начинающихся с гласных, количество слов, начинающихся с согласных,
а также количество слов, не попадающих ни в одну из этих категорий. Одним
из возможных подходов может быть применение isalpha() для различения
слов, начинающихся с букв, и остальных, с последующим применением if или
switch для идентификации тех слов, прошедших проверку isalpha(),
которые начинаются с гласных. Пример запуска может выглядеть так:
Enter words (q to quit):
The 12 awesome oxen ambled
quietly across 15 meters of lawn, q
5 words beginning with vowels
4 words beginning with consonants
2 others
*/
#include <iostream>
#include <string>
#include <cctype>
 
int main()
{
    using std::cout;
    using std::cin;
    using std::endl;
    using std::string;
 
    const int VOW_SIZE = 12;
    char vow[VOW_SIZE] = {'a', 'e', 'i', 'o', 'u', 'y', 'A', 'E', 'I', 'O', 'U', 'Y'};
 
    int vowels = 0;
    int consonants = 0;
    int others = 0;
    bool isvowel = false;
 
    cout << "Enter words, (q to quit):\n";
    string word;
 
    while (cin >> word && word != "q")
    {
        if(isalpha(word[0]))
        {
            for (int i=0; i<VOW_SIZE; ++i)
                if (word[0] == vow[i])
                    isvowel = true;
 
            if (isvowel)
                ++vowels;
            else
                ++consonants;
        }
        else
            ++others;
 
        isvowel = false;
    }
    cout << vowels << " words beginning with vowels." << endl;
    cout << consonants << " words beginning with consonants." << endl;
    cout << others << " others." << endl;
 
    return 0;
}

Глава 6. Упражнение 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
//  sp_Ch6_Pg302_Ex08
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 6, страница 302, упражнение 8.
/*
Напишите программу, которая открывает текстовый файл, читает его символ
за символом до самого конца и сообщает количество символов в файле.
*/
#include <iostream>
#include <fstream>
 
int main()
{
    using namespace std;
    ifstream fin;
    fin.open("for_example.txt");  // ассоциирование fin с файлом
 
    int counter = 0;
    char ch;
    fin >> ch;
    while (fin.fail() == false)   // проверка на EOF
    {
        ++counter;
        fin >> ch;
    }
    cout << "\nThe file contains " << counter << " characters.\n";
    fin.close();    // завершение работы с файлом
    return 0;
}

Глава 6. Упражнение 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
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
//  sp_Ch6_Pg302_Ex09
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 6, страница 302, упражнение 9.
/*
Выполните упражнение 6, но измените его так, чтобы данные можно было
получать из файла. Первым элементом файла должно быть количество меценатов,
а остальная часть состоять из пар строк, в которых первая строка содержит
имя, а вторая — сумму пожертвования. То есть файл должен выглядеть
примерно так:
4
Sam Stone
2000
Freida Flass
100500
Tammy Tubbs
5000
Rich Raptor
55000
*/
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
struct Contributor  // меценат
{
    string name;    // имя
    double amount;  // сумма
};
 
int main()
{
    ifstream fin;
    fin.open("for_example.txt");  // ассоциирование fin с файлом
    int num = 0;
    fin >> num;
 
    Contributor * memberlist = new Contributor[num];
 
    int greatPatrons = 0;
    int patrons = 0;
 
    for (int i=0; i<num; ++i)
    {
        fin.ignore();
        getline (fin, memberlist[i].name);
        fin >> memberlist[i].amount;
        if (memberlist[i].amount >= 10000)
            ++greatPatrons;
        else
            ++patrons;
    }
 
    cout << "\nGreat Patrons:" << endl;
    if (greatPatrons > 0)
    {
        for (int i=0; i<num; ++i)
            if (memberlist[i].amount >= 10000)
                cout << memberlist[i].name << "\t" << memberlist[i].amount << endl;
    }
    else
    {
        cout << "none" << endl;
    }
 
    cout << "\nPatrons:" << endl;
    if (patrons > 0)
    {
        for (int i=0; i<num; ++i)
            if (memberlist[i].amount < 10000)
                cout << memberlist[i].name << "\t" << memberlist[i].amount << endl;
    }
    else
    {
        cout << "none" << endl;
    }
 
    delete [] memberlist;
 
    return 0;
}
6
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
23.03.2015, 16:24 10
Вдруг кому-то пригодится...

Глава 7.
Глава 7. Упражнение 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
//  sp_Ch7_Pg363_Ex01
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 7, страница 363, упражнение 1.
/*
Напишите программу, которая многократно запрашивает у пользователя пару
чисел до тех пор, пока хотя бы одно из этой пары не будет равно 0. С
каждой парой программа должна использовать функцию для вычисления среднего
гармонического этих чисел. Функция должна возвращать ответ main () для
отображения результата. Среднее гармоническое чисел — это инверсия среднего
значения их инверсий; она вычисляется следующим образом:
среднее гармоническое = 2.0 * x * y / (x + y)
*/
#include <iostream>
 
double harmonic_mean(double x, double y);
 
int main()
{
    double x, y = 1;
    while (x != 0 && y != 0)
    {
        std::cout << "Enter x: ";
        std::cin  >> x;
        std::cout << "Enter y: ";
        std::cin  >> y;
        if (x != 0 && y != 0)
            std::cout << "Harmonic mean: " << harmonic_mean(x, y) << "\n\n";
        else
            std::cout << "\nYou entered zero. Hmm... Bye then.\n";
    }
    return 0;
}
double harmonic_mean(double x, double y)
{
    return 2.0 * x * y / (x + y);
}

Глава 7. Упражнение 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
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
//  sp_Ch7_Pg363_Ex02
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 7, страница 363, упражнение 2.
/*
Напишите программу, которая запрашивает у пользователя 10 результатов игры
в гольф, сохраняя их в массиве. При этом необходимо обеспечить возможность
прекращения ввода до ввода всех 10 результатов. Программа должна отобразить
все результаты в одной строке и сообщить их среднее значение. Реализуйте
ввод, отображение и вычисление среднего в трех отдельных функциях,
работающих с массивами.
*/
#include <iostream>
 
const int ARR_SIZE = 10;
 
void    enter_scores(double * arr);
void    show_results(double * arr, int sz);
double  show_average(double * arr, int sz);
 
int main()
{
    double * golfScores = new double[ARR_SIZE];
    for (int i=0; i < ARR_SIZE; ++i)
        golfScores[i] = -1;
 
    std::cout << "Please enter your golf scores.\n"
              << "You may enter up to " << ARR_SIZE
              << " golf scores <q to terminate>.\n";
    enter_scores(golfScores);
 
    int sz = 0;
    for (int i=0; i < ARR_SIZE; ++i)
        if (golfScores[i]>=0)
            ++sz;
 
    if (sz > 0)
    {
        std::cout << "There are results: ";
        show_results(golfScores, sz);
        std::cout << "\nAverage value is: " <<
        show_average(golfScores, sz) << std::endl;
    }
    else
    {
        std::cout << "No results, because you prefer quit program.\n"
                  << "Bye then.\n";
    }
 
    delete [] golfScores;
    return 0;
}
 
void enter_scores(double * arr)
{
    std::cout << "score #1: ";
 
    for (int i=0; i<ARR_SIZE; ++i)
    {
        if (std::cin >> arr[i])
        {
            std::cout << "score #" << i+2 << ": ";
        }
 
        else
        {
            arr[i] = -1;
            break;
        }
 
    }
}
 
void show_results(double * arr, int sz)
{
    for (int i=0; i<sz; ++i)
        std::cout << arr[i] << " ";
}
 
double show_average(double * arr, int sz)
{
    double sum = 0;
    for (int i=0; i<sz; ++i)
            sum += arr[i];
    return sum/sz;
}

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//  sp_Ch7_Pg364_Ex03
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 7, страница 364, упражнение 3.
/*
Пусть имеется следующее объявление структуры:
struct box
{
    char maker[40];
    float height;
    float width;
    float length;
    float volume;
};
а. Напишите функцию, принимающую структуру box по значению и
отображающую все ее члены.
б. Напишите функцию, принимающую адрес структуры box и устанавливающую
значение члена volume равным произведению остальных трех членов.
в. Напишите простую программу, которая использует эти две функции.
*/
#include <iostream>
 
struct box
{
    char maker[40];
    float height;
    float width;
    float length;
    float volume;
};
 
void show_box(box somebox);
float set_volume(box * somebox);
 
int main()
{
    using std::cout;
    using std::cin;
 
    box mybox;
    cout << "Please enter maker of box: ";
    cin >> mybox.maker;
    cout << "Please set height of box: ";
    cin >> mybox.height;
    cout << "Please set width of box: ";
    cin >> mybox.width;
    cout << "Please set length of box: ";
    cin >> mybox.length;
    mybox.volume = set_volume(&mybox);
 
    show_box(mybox);
 
    return 0;
}
 
void show_box(box somebox)
{
    std::cout << std::endl;
    std::cout << "Maker is: "  << somebox.maker  << std::endl;
    std::cout << "Height is: " << somebox.height << std::endl;
    std::cout << "Width is: "  << somebox.width  << std::endl;
    std::cout << "Lenght is: " << somebox.length << std::endl;
    std::cout << "Volume is: " << somebox.volume << std::endl;
}
 
float set_volume(box * somebox)
{
    return somebox->height * somebox->width * somebox->length;
}

Глава 7. Упражнение 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
27
28
29
30
31
32
33
34
35
36
37
38
39
//  sp_Ch7_Pg364_Ex04
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 7, страница 364, упражнение 4.
/*
Многие лотереи в США организованы подобно той, что была смоделирована
в листинге 7.4. Во всех их вариациях вы должны выбрать несколько чисел из
одного набора, называемого полем номеров. (Например, вы можете выбрать 5
чисел из поля 1-47.) Вы также указываете один номер (называемый меганоме-
ром) из второго диапазона, такого как 1-27. Чтобы выиграть главный приз, вы
должны правильно угадать все номера. Шанс выиграть вычисляется как
вероятность угадывания всех номеров в поле, умноженная на вероятность
угадывания меганомера. Например, вероятность выигрыша в описанном здесь
примере вычисляется как вероятность угадывания 5 номеров из 47, умноженная на
вероятность угадывания одного номера из 27. Модифицируйте листинг 7.4 для
вычисления вероятности выигрыша в такой лотерее.
*/
#include <iostream>
const int MAIN_FIELD = 47;
const int MEGA_FIELD = 27;
long double probability(unsigned numbers, unsigned picks);
int main()
{
    long double choices = probability(MAIN_FIELD, 5);
    long double megaNum = probability(MEGA_FIELD, 1);
    std::cout << "Chance to win is: " << choices * megaNum;
 
    return 0;
}
 
long double probability(unsigned numbers, unsigned picks)
{
    long double result = 1.0;  // here come some local variables
    long double n;
    unsigned p;
 
    for (n = numbers, p = picks; p > 0; n--, p--)
        result = result * n / p ;
    return result;
}

Глава 7. Упражнение 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
//  sp_Ch7_Pg364_Ex05
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 7, страница 364, упражнение 5.
/*
Определите рекурсивную функцию, принимающую целый аргумент и
возвращающую его факториал. Вспомните, что факториал 3 записывается, как 3! и
вычисляется как 3x2! и т.д., причем 0! равно 1. В общем случае, если n больше
нуля, то n != n * (n-1)!. Протестируйте функцию в программе, использующей
цикл, где пользователь может вводить различные значения, для которых
программа вычисляет и отображает факториалы.
*/
#include <iostream>
 
unsigned long long calc_factorial(int x);
 
int main()
{
    std::cout << "Hello! Welcome to the program that is able to calculate\n"
                 "the factorial of the number specified by the user.\n"
                 "If you want to qiut enter q.\n";
    std::cout << "\nEnter some integer: ";
    int x = 0;
    while (std::cin >> x)
    {
        if (x >= 0 && x <= 21)
            std::cout << "Factorial of number you choose is: " << calc_factorial(x);
        else
            std::cout << "\nSorry, this program can't calculate numbers like these.";
 
        std::cout << "\n\nEnter next integer: ";
    }
    std::cout << "\n\nYou choose to quit. OK, bye then.\n";
    return 0;
}
 
unsigned long long calc_factorial(int x)
{
    unsigned long long n = x;
    if(n > 1)
        return n * calc_factorial(n-1);
    else
        return 1;
}

Глава 7. Упражнение 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
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
//  sp_Ch7_Pg364_Ex06
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 7, страница 364, упражнение 6.
/*
Напишите программу, использующую описанные ниже функции:
 
fill_array() принимает в качестве аргумента имя массива элементов типа
double и размер этого массива. Она приглашает пользователя ввести значения
double для помещения их в массив. Ввод прекращается при наполнении массива
либо когда пользователь вводит нечисловое значение и возвращает действительное
количество элементов;
 
show_array() принимает в качестве аргументов имя массива значений double,
а также его размер, и отображает содержимое массива;
 
reverse_array() принимает в качестве аргумента имя массива значений double,
а также его размер, и изменяет порядок его элементов на противоположный.
 
Программа должна использовать эти функции для наполнения массива,
обращения порядка его элементов, кроме первого и последнего, с последующим
отображением.
*/
 
#include <iostream>
 
int  fill_array(double * arr, int sz);
void reverse_array(double * arr, int sz);
void show_array(double * arr, int sz);
 
int main()
{
    const int ARR_SIZE = 10;
    double * arr = new double[ARR_SIZE];
 
    int sz = fill_array(arr, ARR_SIZE);
    reverse_array(arr, sz);
    show_array(arr, sz);
 
    delete [] arr;
    return 0;
}
 
int fill_array(double * arr, int sz)
{
    int realSize = 0;
    std::cout << "Enter 1-st element of the array: ";
    while (realSize < sz && std::cin >> arr[realSize])
    {
        ++realSize;
        std::cout << "Enter next element of the array: ";
    }
    return realSize;
}
 
void reverse_array(double * arr, int sz)
{
    double temp;
    int n;
 
    if (sz > 3 && sz % 2)
        n = (sz - 1)/2;
    else
        n = sz/2;
 
    for (int i = 1; i < n; ++i)
    {
        temp = arr[i];
        arr[i] = arr[sz - 1 - i];
        arr[sz - 1 - i] = temp;
    }
}
 
void show_array(double * arr, int sz)
{
    for (int i=0; i<sz; ++i)
    {
        std::cout << std::endl << i+1 << " value is: " << arr[i];
    }
}

Глава 7. Упражнение 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
//  sp_Ch7_Pg365_Ex07
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 7, страница 365, упражнение 7.
/*
Вернитесь к программе из листинга 7.7 и замените три функции обработки
массивов версиями, которые работают с диапазонами значений, заданными парой
указателей. Функция fill_array() вместо возврата действительного
количества прочитанных значений должна возвращать указатель на место, следующее за
последним введенным элементом; прочие функции должны использовать его в
качестве второго аргумента для идентификации конца диапазона данных.
*/
 
#include <iostream>
const int ARR_SIZE = 5;
 
// function prototypes
double * fill_array(double * arBegin, double * arEnd);
void show_array(double * arBegin, double * arEnd);  // don't change data
void revalue(double r, double * arBegin, double * arEnd);
 
int main()
{
    using namespace std;
 
    double properties[ARR_SIZE];
 
    double * arEnd = fill_array(properties, properties + ARR_SIZE);
 
    show_array(properties, arEnd);
    if (arEnd != properties)
    {
        cout << "Enter revaluation factor: ";
        double factor;
        while (!(cin >> factor))    // bad input
        {
            cin.clear();
            while (cin.get() != '\n')
                continue;
           cout << "Bad input; Please enter a number: ";
        }
        revalue(factor, properties, arEnd);
        show_array(properties, arEnd);
    }
    cout << "Done.\n";
    // cin.get();
    // cin.get();
    return 0;
}
 
double * fill_array(double * arBegin, double * arEnd)
{
    using namespace std;
    double temp;
    int i = 0;
    double * pt;
    for (pt = arBegin; pt != arEnd; pt++)
    {
        cout << "Enter value #" << (i + 1) << ": ";
        cin >> temp;
        if (!cin)    // bad input
        {
            cin.clear();
            while (cin.get() != '\n');
            cout << "Bad input; input process terminated.\n";
            break;
        }
        else if (temp < 0)     // signal to terminate
            break;
        *pt = temp;
    }
    return pt;
}
 
// the following function can use, but not alter,
// the array whose address is ar
void show_array(double * arBegin, double * arEnd)
{
    using namespace std;
    int i = 0;
    for (double * pt = arBegin; pt != arEnd; pt++)
    {
        cout << "Property #" << (i + 1) << ": $";
        cout << *pt << endl;
    }
}
 
// multiplies each element of ar[] by r
void revalue(double r, double * arBegin, double * arEnd)
{
    double * pt;
    for (pt = arBegin; pt != arEnd; pt++)
        *pt *= r;
}
3
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
23.03.2015, 16:28 11
Глава 7. Упражнение 8

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//  sp_Ch7_Pg365_Ex08
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 7, страница 365, упражнение 8.
/*
Вернитесь к программе из листинга 7.15, не использующей класс array.
Напишите следующие две версии.
а. Используйте обычный массив из const char *
для строковых представлений
времен года и обычный массив из double для расходов.
б. Используйте обычный массив из const char *
для строковых
представлений времен года и структуру, единственный член которой является обычным
массивом из double для расходов. (Это очень похоже на базовое проектное
решение для класса array.)
*/
#include <iostream>
 
const int AR_SIZE = 4;
const int STR_LEN = 7;
 
void fill_array(double arr[], const char season[][STR_LEN]);
void show_array(const double arr[], const char season[][STR_LEN]);
 
int main()
{
    const char season [AR_SIZE][STR_LEN] = {"Spring", "Summer", "Fall", "Winter"};
    double expenses[AR_SIZE];
 
    fill_array(expenses, season);
    show_array(expenses, season);
 
    // std::cin.get();
    // std::cin.get();
    return 0;
}
 
void fill_array(double arr[], const char season[][STR_LEN])
{
    for (int i = 0; i < AR_SIZE; i++)
    {
        std::cout << "Enter " << season[i] << " expenses: ";
        std::cin >> arr[i];
    }
}
 
void show_array(const double arr[], const char season[][STR_LEN])
{
    double total = 0.0;
    std::cout << "\nEXPENSES\n";
    for (int i = 0; i < AR_SIZE; i++)
    {
        std::cout << season[i] << ": $" << arr[i] << '\n';
        total += arr[i];
    }
    std::cout << "Total: $" << total << '\n';
}

Глава 7. Упражнение 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
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
//  sp_Ch7_Pg365_Ex09
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 7, страница 365, упражнение 9.
/*
Следующее упражнение позволит попрактиковаться в написании функций,
работающих с массивами и структурами. Ниже представлен каркас программы.
Дополните его функциями, описанными в комментариях.
 
getinfo() принимает два аргумента: указатель на первый элемент массива
структур student и значение int, представляющее количество элементов в
массиве. Функция запрашивает и сохраняет данные о студентах. Ввод
прекращается либо после наполнения массива, либо при вводе пустой строки
в качестве имени студента. Функция возвращает действительное количество
введенных элементов.
int getinfо(student pa[], int n);
 
display1() принимает в качестве аргумента структуру student и отображает
ее содержимое.
void displayl(student st);
 
display2() принимает адрес структуры student в качестве аргумента
и отображает ее содержимое.
void display2(const student * ps);
 
display3() принимает указатель на первый элемента массива
структур student и количество элементов в этом массиве и
отображает содержимое всех структур в массиве.
void display3(const student pa[], int n) ;
*/
#include <iostream>
#include <cstring>
const int SLEN = 30;
 
struct student
{
    char fullname[SLEN];
    char hobby[SLEN];
    int ooplevel;
};
 
int  getinfo(student pa[], int arrSize);
void displayl(student st);
void display2(const student * ps);
void display3(const student pa[], int n);
 
int main()
{
    using namespace std;
 
    cout << "Enter class size: ";
    int class_size;
    cin >> class_size;
 
    student * ptr_stu = new student[class_size];
 
    int entered = getinfo(ptr_stu, class_size);
 
    for (int i = 0; i < entered; i++)
    {
        displayl(ptr_stu[i]);
        display2(&ptr_stu[i]);
    }
    display3(ptr_stu, entered);
 
    delete [] ptr_stu;
 
    cout << "Done.\n";
 
    return 0;
}
 
int getinfo(student pa[], int arrSize)
{
    int realQtyEnteredItems = 0;
    for (int i = 0; i < arrSize; ++i)
    {
        std::cin.sync();
 
        std::cout << "\nEnter fullname: ";
        std::cin.getline(pa[i].fullname, SLEN);
 
        if(strlen(pa[i].fullname) != 0)
        {
            std::cout << "Enter hobby: ";
            std::cin.getline(pa[i].hobby, SLEN);
 
            std::cout << "Enter ooplevel: ";
            std::cin >> pa[i].ooplevel;
 
            ++realQtyEnteredItems;
        }
        else
            break;
    }
    std::cout << std::endl;
    return realQtyEnteredItems;
}
 
void displayl(student st)
{
    std::cout << st.fullname << std::endl;
    std::cout << st.hobby << std::endl;
    std::cout << st.ooplevel << std::endl;
    std::cout << std::endl;
}
 
void display2(const student * ps)
{
    std::cout << ps->fullname << std::endl;
    std::cout << ps->hobby << std::endl;
    std::cout << ps->ooplevel << std::endl;
    std::cout << std::endl;
}
 
void display3(const student pa[], int n)
{
    for (int i = 0; i < n; ++i)
    {
        std::cout << pa[i].fullname << std::endl;
        std::cout << pa[i].hobby << std::endl;
        std::cout << pa[i].ooplevel << std::endl;
        std::cout << std::endl;
    }
}

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

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
//  sp_Ch7_Pg366_Ex10
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 7, страница 366, упражнение 10.
/*
Спроектируйте функцию calculate (), которая принимает два значения типа
double и указатель на функцию, принимающую два аргумента double и
возвращающую значение double. Функция calculate () также должна иметь тип
double и возвращать значение, вычисленное функцией, которая задана
указателем, используя аргумент double функции calculate (). Например,
предположим, что имеется следующее определение функции add ():
double add(double x, double y)
{
    return x + y;
}
Приведенный ниже вызов функции должен заставить calculate () передать
значения 2.5 и 10.4 функции add () и вернуть ее результат (12.9):
double q = calculate (2.5, 10.4, add);
Используйте в программе эти функции и еще хотя бы одну дополнительную,
которая подобна add(). В программе должен быть организован цикл,
позволяющий пользователю вводить пары чисел. Для каждой пары calculate () должна
вызвать add () и хотя бы еще одну функцию такого рода. Если вы чувствуете
себя уверенно, попробуйте создать массив указателей на функции, подобные
add (), и организуйте цикл, применяя calculate () для вызова этих функций
по их указателям. Подсказка: вот как можно объявить массив из трех таких
указателей:
double (*pf[3])(double, double);
Инициализировать такой массив можно с помощью обычного синтаксиса
инициализации массивов и имен функций в качестве адресов.
*/
#include <iostream>
double add_product(double x, double y);
double add_sum(double x, double y);
double calculate(double x, double y, double (*pfunc)(double , double));
 
int main()
{
    using namespace std;
 
    cout << "Please enter x: ";
    double x;
    cin >> x;
 
    cout << "Please enter y: ";
    double y;
    cin >> y;
 
    cout << endl;
    cout << "1-st result: " << calculate(x, y, add_sum) << endl;
    cout << "2-nd result: " << calculate(x, y, add_product) << endl;
 
    return 0;
}
 
double add_product(double x, double y)
{
    return x * y;
}
 
double add_sum(double x, double y)
{
    return x + y;
}
 
double calculate(double x, double y, double (*pfunc)(double , double))
{
    double result = (*pfunc)(x, y);
    result += (x*x + y*y) - x*y;
    return result;
}


Глава 8.
Глава 8. Упражнение 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
37
38
39
40
41
42
//  sp_Ch8_Pg426_Ex01
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 8, страница 426, упражнение 1.
/*
Напишите функцию, которая обычно принимает один аргумент — адрес строки
и выводит эту строку один раз. Однако если задан второй аргумент типа int,
не равный нулю, то эта функция выводит строку столько раз, сколько было
осуществлено вызовов этой функции к моменту ее данного вызова. (Обратите
внимание, что количество выводимых строк не равно значению второго аргумента,
оно равно числу вызовов функции к моменту последнего вызова.) Действительно,
это не слишком полезная функция, но она заставит применить некоторые из
методов, рассмотренных в данной главе. Напишите простую программу для
демонстрации этой функции.
*/
#include <iostream>
#include <string>
 
int counter = 0;
 
void str_func(std::string * str, int flag = 0);
 
int main()
{
    std::string phrase = "Long Live Rock-n-roll!\n";
    str_func(&phrase);
    phrase = "Let There Be Rock!\n";
    str_func(&phrase);
    phrase = "Be Quick Or Be Dead!\n";
    str_func(&phrase, 5);
 
    return 0;
}
 
void str_func(std::string * str, int flag)
{
    if (flag != 0)
        for (int i=0; i < counter; ++i)
            std::cout << *str;
    else
        std::cout << *str;
    ++counter;
}

Глава 8. Упражнение 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
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
//  sp_Ch8_Pg426_Ex02
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 8, страница 426, упражнение 2.
/*
Структура CandyBar содержит три члена. Первый член хранит название коробки
конфет. Второй — ее вес (который может иметь дробную часть), а третий —
количество калорий (целое значение). Напишите программу, использующую
функцию, которая принимает в качестве аргументов ссылку на CandyBar, указатель
на char, значение double и значение int. Функция использует три последних
значения для установки соответствующих членов структуры. Три последних
аргумента должны иметь значения по умолчанию: "Millennium Munch", 2.85 и 350.
Кроме того, программа должна использовать функцию, которая принимает в
качестве аргумента ссылку на CandyBar и отображает содержимое этой структуры.
Где необходимо, используйте const.
*/
#include <iostream>
 
struct CandyBar
{
    const char * m_name;
    double m_weight;
    int m_kcal;
};
 
void set_fields(CandyBar & lollipops,
                const char * name = "Millenium Munch",
                double weight = 2.85,
                int kcal = 5500
                );
void show_struct(const CandyBar & lollipops);
 
int main()
{
    CandyBar box_1;
    CandyBar box_2;
    CandyBar box_3;
 
    set_fields(box_1);
    show_struct(box_1);
 
    set_fields(box_2, "Rafaello", 2.5, 8000);
    show_struct(box_2);
 
    set_fields(box_3, "Bon-Bon", 2.7);
    show_struct(box_3);
 
    return 0;
}
 
void set_fields(CandyBar & lollipops, const char * name, double weight, int kcal)
{
    lollipops.m_name = name;
    lollipops.m_weight = weight;
    lollipops.m_kcal = kcal;
}
 
void show_struct(const CandyBar & lollipops)
{
    std::cout << lollipops.m_name << std::endl;
    std::cout << lollipops.m_weight << std::endl;
    std::cout << lollipops.m_kcal << std::endl << std::endl;
}

Глава 8. Упражнение 3

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//  sp_Ch8_Pg426_Ex03
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 8, страница 426, упражнение 3.
/*
Напишите функцию, которая принимает ссылку на объект string в качестве
параметра и преобразует содержимое string в символы верхнего регистра.
Используйте функцию toupper (), описанную в табл. 6.4 (см. главу 6). Напишите
программу, использующую цикл, которая позволяет проверить работу функции
для разного ввода. Пример вывода может выглядеть следующим образом:
Enter a string (q to quit): go away
GO AWAY
Next string (q to quit): good grief!
GOOD GRIEF!
Next string (q to quit): q
Bye.
*/
#include <iostream>
#include <string>
#include <cstring>  // для strcpy()
#include <cctype>   // для toupper()
 
std::string & to_upper(std::string & str);
int main()
{
    std::string str;
    std::cout << "Enter a string (q to quit): ";
    while (true)
    {
        getline(std::cin, str);
        if (str[0] != 'q')
        {
            std::cout << to_upper(str) << "\nNext string (q to quit): ";
        }
        else
        {
            std::cout << "\nBye.\n";
            break;
        }
    }
    return 0;
}
 
std::string & to_upper(std::string & str)
{
    char * cstr = new char [str.length()+1];
    strcpy (cstr, str.c_str());
    for (size_t i = 0; i < str.length(); ++i)
    {
        cstr[i] = toupper(cstr[i]);
        str[i] = cstr[i];
    }
    delete [] cstr;
    return str;
}

Глава 8. Упражнение 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
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
//  sp_Ch8_Pg427_Ex04
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 8, страница 427, упражнение 4.
/*
Завершите программу, создав соответствующие функции и прототипы. Обратите
внимание, что в программе должны быть две функции show(), и каждая из
них использует аргументы по умолчанию. Где необходимо, используйте const.
Функция set() должна использовать операцию new для выделения достаточного
пространства памяти под хранение заданной строки. Используемые здесь
методы аналогичны методам, применяемым при проектировании и реализации
классов. (В зависимости от используемого компилятора, может понадобиться
изменить имена заголовочных файлов и удалить директиву using.)
*/
#include <iostream>
#include <cstring>  // для strlen(), strcpy()
 
struct stringy
{
    char * str;     // указывает на строку
    int ct;         // длина строки (не считая символа '\0')
};
 
void show(const char * str, int times = 1);
void show(const stringy & some, int times = 1);
void set(stringy & some, const char * cstr);
void del(stringy & some);
 
int main()
{
    stringy beany;
    char testing[] = "Reality is not what it used to be.";
    set(beany, testing);    // первым аргументом является ссылка,
    // Выделяет пространство для хранения копии testing,
    // использует элемент типа str структуры beany как указатель
    // на новый блок, копирует testing в новый блок и
    // создает элемент ct структуры beany
 
    show(beany);        // выводит строковый член структуры один раз
    show(beany, 2);     // выводит строковый член структуры два раза
    del(beany);
    testing[0] = 'D';
    testing[1] = 'u';
    show(testing);      // выводит сроку testing один раз
    show(testing, 3);   // выводит строку testing три раза
    show("Done");
 
    return 0;
}
 
void show(const char * str, int times)
{
    for (int i = 0; i < times; ++i)
        std::cout << str << std::endl;
}
 
void show(const stringy & some, int times)
{
    for (int i = 0; i < times; ++i)
        std::cout << some.str << std::endl;
}
 
void set(stringy & some, const char * cstr)
{
    some.ct = strlen(cstr);
    some.str = new char[some.ct+1];
    strcpy(some.str, cstr);
}
 
void del(stringy & some)
{
    delete [] some.str;
}
3
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
23.03.2015, 16:30 12
Глава 8. Упражнение 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
//  sp_Ch8_Pg427_Ex05
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 8, страница 427, упражнение 5.
/*
Напишите шаблонную функцию max5(), которая принимает в качестве
аргумента массив из пяти элементов типа T и возвращает наибольший элемент в
массиве. (Поскольку размер массива фиксирован, его можно жестко закодировать в
цикле, а не передавать в виде аргумента.) Протестируйте функцию в
программе с использованием массива из пяти значений int и массива из пяти значений
double.
*/
#include <iostream>
 
const int ARR_SIZE = 5;
 
template <typename T>
T max5(T * arr)
{
    T maxValue = arr[0];
    for (int i = 1; i < ARR_SIZE; ++i)
        if (arr[i] > maxValue)
            maxValue = arr[i];
    return maxValue;
}
 
 
int main()
{
    int iarr[ARR_SIZE] = {5, 3, 1, 7, 2};
    std::cout << "The maximum value of the array is: " << max5(iarr);
    double darr[ARR_SIZE] = {2.5, 3.4, 0.1, 0.7, 2.9};
    std::cout << "\nThe maximum value of the array is: " << max5(darr);
 
    return 0;
}

Глава 8. Упражнение 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
54
55
56
57
//  sp_Ch8_Pg428_Ex06
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 8, страница 428, упражнение 6.
/*
Напишите шаблонную функцию maxn(), которая принимает в качестве
аргумента массив элементов типа T и целое число, представляющее количество
элементов в массиве, а возвращает элемент с наибольшим значением. Протестируйте
ее работу в программе, которая использует этот шаблон с массивом из шести
значений int и массивом из четырех значений double. Программа также
должна включать специализацию, которая использует массив указателей на char в
качестве первого аргумента и количество указателей — в качестве второго, а затем
возвращает адрес самой длинной строки. Если имеется более одной строки
наибольшей длины, функция должна вернуть адрес первой из них. Протестируйте
специализацию на массиве из пяти указателей на строки.
*/
#include <iostream>
#include <cstring>  // для strlen()
 
template <typename T>
T maxn(T * arr, int arrSize)
{
    T maxValue = arr[0];
    for (int i = 1; i < arrSize; ++i)
        if (arr[i] > maxValue)
            maxValue = arr[i];
    return maxValue;
}
 
const char * maxn(const char * arr[], int qty)
{
    const char * maxLenghtString = &arr[0][0];
    int maxCharacters = strlen(arr[0]);
    int next = 0;
    for (int i = 1; i < qty; ++i)
    {
        next = strlen(arr[i]);
        if (next > maxCharacters)
        {
            maxCharacters = next;
            maxLenghtString = &arr[i][0];
        }
    }
    return maxLenghtString;
}
 
int main()
{
    int iarr[6] = {5, 3, 7, 9, 1};
    double darr[4] = {2.3, 3.1, 1.6, 7.4};
    const char * carr[5] = { "Rome", "Moscow", "Berlin", "Paris", "London" };
    std::cout << "This is the max value in the int array: " << maxn(iarr, 6);
    std::cout << "\nThis is the max value in the double array: " << maxn(darr, 4);
    std::cout << "\nThis is the max lenght string in the C-strings array: "
    << maxn(carr, 5);
 
    return 0;
}

Глава 8. Упражнение 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
//  sp_Ch8_Pg428_Ex07
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 8, страница 428, упражнение 7.
/*
Измените программу из листинга 8.14 так, чтобы использовать две шаблонных
функции по имени SumArray (), возвращающие сумму содержимого массива
вместо его отображения. Программа должна сообщать общее количество предметов
и сумму всех задолженностей (debts).
*/
// tempover.cpp --- template overloading
#include <iostream>
 
template <typename T>            // template A
int sum_array(T arr[], int n);
 
template <typename T>            // template B
int sum_array(T * arr[], int n);
 
struct debts
{
    char name[50];
    double amount;
};
 
int main()
{
    using namespace std;
    int things[6] = {13, 31, 103, 301, 310, 130};
    struct debts mr_E[3] =
    {
        {"Ima Wolfe", 2400.0},
        {"Ura Foxe", 1300.0},
        {"Iby Stout", 1800.0}
    };
    double * pd[3];
 
// set pointers to the amount members of the structures in mr_E
    for (int i = 0; i < 3; i++)
        pd[i] = &mr_E[i].amount;
 
    cout << "Sum of things: " <<
    sum_array(things, 6);  // uses template A
 
    cout << "\nSum of debts: " <<
    sum_array(pd, 3);      // uses template B (more specialized)
    // cin.get();
    return 0;
}
 
template <typename T>
int sum_array(T arr[], int n)
{
    int sum = 0;
    for (int i = 0; i < n; i++)
        sum += arr[i];
    return sum;
}
 
template <typename T>
int sum_array(T * arr[], int n)
{
    int sum = 0;
    for (int i = 0; i < n; i++)
        sum += *arr[i];
    return sum;
}


Глава 9.
Глава 9. Упражнение 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
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
//  sp_Ch9_Pg479_Ex01
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 9, страница 479, упражнение 1.
/*
Имеется следующий заголовочный файл:
// golf.h — для ре9-1.срр
const int Len = 40;
struct golf
{
    char fullname[Len];
    int handicap;
};
// Неинтерактивная версия:
// функция присваивает структуре.типа golf имя игрока и его гандикап (фору),
// используя передаваемые ей аргументы
void setgolf (golf & g, const char * name, int hc);
 
// Интерактивная версия:
// функция предлагает пользователю ввести имя и гандикап,
// присваивает элементам структуры g введенные значения;
// возвращает 1, если введено имя, и 0, если введена пустая строка
int setgolf(golf & g);
 
// Функция устанавливает новое значение гандикапа
void handicap (golf & g, int hc);
 
// Функция отображает содержимое структуры типа golf
void showgolf (const golf & g);
 
Обратите внимание, что функция setgolf() перегружена. Вызов первой
версии функции имеет следующий вид:
golf ann;
setgolf(ann, "Ann Birdfree", 24);
Функция предоставляет информацию, которая содержится в структуре ann.
Вызов второй версии функции имеет следующий вид:
golf andy;
setgolf(andy);
Функция предлагает пользователю ввести имя и гандикап, а затем сохраняет эти
данные в структуре andy. Эта функция могла бы (но не обязательно) внутренне
использовать первую версию.
Постройте многофайловую программу на основе этого заголовочного файла.
Один файл по имени golf.cpp должен содержать определения функций,
которые соответствуют прототипам заголовочного файла. Второй файл должен
содержать функцию main() и обеспечивать реализацию всех средств прототипи-
рованных функций. Например, цикл должен запрашивать ввод массива структур
типа golf и прекращать ввод после заполнения массива, либо когда вместо
имени игрока в гольф пользователь вводит пустую строку. Чтобы получить доступ к
структурам типа golf, функция main() должна использовать только прототипи-
рованные функции.
*/
#include <cstring>
#include "golf.h"
 
int main()
{
    const int ARR_SIZE = 4;
 
    golf ann;
    setgolf(ann, "Ann Birdfree", 24);
    showgolf(ann);
 
    golf player[ARR_SIZE];
    int k = 0;
    for ( ; k < ARR_SIZE; ++k)
        if (setgolf(player[k]) == 0)
            break;
 
    for ( int i = 0; i < k; ++i)
        showgolf(player[i]);
 
    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
#include <iostream>
#include "golf.h"
#include <cstring>
void setgolf(golf & g, const char * name, int hc)
{
    strcpy (g.fullname, name);
    g.handicap = hc;
}
 
int setgolf(golf & g)
{
    int nameHasBeenEntered = 0;
    std::cout << "\nPlease enter the name: ";
    std::cin.sync();
    std::cin.get(g.fullname, Len);
    if (strlen(g.fullname) > 0)
    {
        nameHasBeenEntered = 1;
        std::cout << "Please enter the handicap: ";
        std::cin >> g.handicap;
    }
 
    return nameHasBeenEntered;
}
 
void handicap(golf & g, int hc)
{
    g.handicap = hc;
}
 
void showgolf(const golf & g)
{
    std::cout << std::endl << g.fullname << std::endl << g.handicap << std::endl;
}

Глава 9. Упражнение 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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//  sp_Ch9_Pg480_Ex02
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 9, страница 480, упражнение 2.
/*
Модифицируйте код в листинге 9.9, заменив символьный массив объектом
string. Программа больше не должна проверять, умещается ли вводимая
строка, и для проверки ввода пустой строки может сравнивать вводимую строку со
значением "".
*/
// static.cpp -- using a static local variable
#include <iostream>
#include <string>
 
using std::cout;
using std::cin;
using std::string;
 
void strcount(string);
 
int main()
{
    string input;
    cout << "Enter a line: ";
    getline(cin, input);
    do
    {
        strcount(input);
        cout << "Enter next line (empty line to quit):\n";
        cin.sync();
        getline(cin, input);
    }
    while (input != "");
    cout << "Bye\n";
 
    return 0;
}
 
void strcount(string str)
{
    static int total = 0;        // static local variable
    int count = 0;               // automatic local variable
 
    cout << """ << str <<"" contains ";
    for (size_t i = 0; i < str.size(); ++i)              // go to end of string
        ++count;
    total += count;
    cout << count << " characters\n";
    cout << total << " characters total\n";
}

Глава 9. Упражнение 3

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//  sp_Ch9_Pg480_Ex03
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 9, страница 480, упражнение 3.
/*
Начните со следующего объявления структуры:
struct chaff
{
    char dross[20];
    int slag;
);
Напишите программу, которая использует операцию new с размещением, чтобы
поместить массив из двух таких структур в буфер. Затем программа присваивает
значения членам структуры (не забудьте воспользоваться функцией strcpy()
для массива char) и отображает ее содержимое с помощью цикла. Вариант 1
предусматривает применение в качестве буфера памяти статического массива,
как было показано в листинге 9.10. Вариант 2 состоит в использовании обычной
операции new для выделения памяти под буфер.
*/
#include <iostream>
#include <cstring>
#include <new>
const int Len = 20;
 
struct chaff
{
    char dross[Len];
    int slag;
};
 
void setchaff(chaff & g, const char * d, int s)
{
    strcpy (g.dross, d);
    g.slag = s;
}
 
void showchaff(const chaff & g)
{
    std::cout << std::endl << g.dross << std::endl << g.slag << std::endl;
}
 
int main()
{
    const int BUF_SIZE = 50;
    const int ARR_SIZE = 2;
    char buffer[BUF_SIZE];
    chaff * garbage;
    garbage = new(buffer) chaff[ARR_SIZE];
 
    char name[Len];
    int qty = 0;
 
    for (int i = 0; i < ARR_SIZE; ++i)
    {
        std::cout << "\nPlease enter the name: ";
        std::cin.sync();
        std::cin.get(name, Len);
        std::cout << "Please enter the quantity: ";
        std::cin >> qty;
        setchaff(garbage[i], name, qty);
    }
 
    for (int i = 0; i < ARR_SIZE; ++i)
    {
        showchaff(garbage[i]);
    }
 
    return 0;
}
3
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
23.03.2015, 16:35 13
Глава 9. Упражнение 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
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
//  sp_Ch9_Pg481_Ex04
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 9, страница 481, упражнение 4.
/*
Напишите программу, включающую три файла и использующую следующее
пространство имен:
namespace sales
{
    const int QUARTERS = 4;
 
    struct Sales
    {
        double m_sales[QUARTERS];
        double m_average;
        double m_max;
        double m_min;
    };
 
    // Копирует меньшее значение из 4 или n элементов из массива
    // ar в член sales структуры s, вычисляет и сохраняет
    // среднее арифметическое, максимальное и минимальное
    // значения введенных чисел;
    // оставшиеся элементы sales, если таковые есть, устанавливаются в 0
    void set_sales(Sales & s, const double ar[], int n);
 
    // Интерактивно подсчитывает продажи за 4 квартала,
    // сохраняет их в члене sales структуры s, вычисляет и
    // сохраняет среднее арифметическое, а также максимальное
    // и минимальное значения введенных чисел
    void set_sales(Sales & s);
 
    // Отображает всю информацию из структуры s
    void show_sales(const Sales & s);
}
Первый файл должен быть заголовочным и содержать пространство имен.
Второй файл должен содержать исходный код и расширять пространство имен,
предоставляя определения трех прототипированных функций. В третьем файле
должны объявляться два объекта Sales. Он должен использовать интерактивную
версию функции set_sales() для предоставления значений первой структуре и
неинтерактивную версию той же функции для предоставления значений второй
структуре. Он также должен отображать содержимое обеих структур с помощью
функции show_sales().
*/
#include "Sales.h"
 
int main()
{
    sales::Sales s1;
    sales::set_sales(s1);
    sales::show_sales(s1);
 
    double ar[] = {225056.55, 340742.15, 410123.35, 270521.25};
    sales::Sales s2;
    sales::set_sales(s2, ar, sales::QUARTERS);
    sales::show_sales(s2);
 
    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
38
39
#ifndef SALES_H_INCLUDED
#define SALES_H_INCLUDED
 
namespace sales
{
    const int QUARTERS = 4;
 
    struct Sales
    {
        double m_sales[QUARTERS] = {0,0,0,0};
        double m_average = 0;
        double m_max = 0;
        double m_min = 0;
    };
 
    double find_min(const double ar[], int n);
 
    double find_max(const double ar[], int n);
 
    double find_average(const double ar[], int n);
 
    // Копирует меньшее значение из 4 или n элементов из массива
    // ar в член sales структуры s, вычисляет и сохраняет
    // среднее арифметическое, максимальное и минимальное
    // значения введенных чисел;
    // оставшиеся элементы sales, если таковые есть, устанавливаются в 0
    void set_sales(Sales & s, const double ar[], int n);
 
    // Интерактивно подсчитывает продажи за 4 квартала,
    // сохраняет их в члене sales структуры s, вычисляет и
    // сохраняет среднее арифметическое, а также максимальное
    // и минимальное значения введенных чисел
    void set_sales(Sales & s);
 
    // Отображает всю информацию из структуры s
    void show_sales(const Sales & s);
}
 
#endif // SALES_H_INCLUDED
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
#include <iostream>
#include "Sales.h"
namespace sales
{
    double find_min(const double ar[], int n)
    {
        double min_value = ar[0];
        for (int i = 1; i < n; ++i)
            if (ar[i] < min_value)
                min_value = ar[i];
 
        return min_value;
    }
 
    double find_max(const double ar[], int n)
    {
        double max_value = ar[0];
        for (int i = 1; i < n; ++i)
            if (ar[i] > max_value)
                max_value = ar[i];
 
        return max_value;
    }
 
    double find_average(const double ar[], int n)
    {
        double sum = 0;
        for (int i = 0; i < n; ++i)
                sum += ar[i];
 
        return sum/n;
    }
 
    // Копирует меньшее значение из 4 или n элементов из массива
    // ar в член m_sales структуры s, вычисляет и сохраняет
    // среднее арифметическое, максимальное и минимальное
    // значения введенных чисел;
    // оставшиеся элементы m_sales, если таковые есть, устанавливаются в 0
    void set_sales(Sales & s, const double ar[], int n)
    {
        for (int i = 0; i < n; ++i)
        {
            if (s.m_sales[i] == 0)
            {
                s.m_sales[i] = find_min(ar, QUARTERS);
                if (i+1 < n)
                {
                    for (int j = i+1; j < n; ++j)
                        s.m_sales[j] = 0;
                }
                break;
            }
        }
 
        s.m_average = find_average(ar, n);
        s.m_max = find_max(ar, n);
        s.m_min = find_min(ar, n);
    }
 
    // Интерактивно подсчитывает продажи за 4 квартала,
    // сохраняет их в члене sales структуры s, вычисляет и
    // сохраняет среднее арифметическое, а также максимальное
    // и минимальное значения введенных чисел
    void set_sales(Sales & s)
    {
        for (int i = 0; i < QUARTERS; ++i)
        {
            std::cout << "\nEnter the total amount of sales for the "
                      << i+1 << " quarter: ";
            std::cin >> s.m_sales[i];
        }
        s.m_average = find_average(s.m_sales, QUARTERS);
        s.m_max = find_max(s.m_sales, QUARTERS);
        s.m_min = find_min(s.m_sales, QUARTERS);
    }
 
    // Отображает всю информацию из структуры s
    void show_sales(const Sales & s)
    {
        std::cout << "\nAverage: " << s.m_average << std::endl;
        std::cout << "Maximum: " << s.m_max << std::endl;
        std::cout << "Minimum: " << s.m_min << std::endl;
    }
}


Глава 10.
Глава 10. Упражнение 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
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
//  sp_Ch10_Pg531_Ex01
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 10, страница 531, упражнение 1.
/*
Определите класс для представления банковского счета. Данные-члены должны
включать имя вкладчика, номер счета (используйте строку) и баланс. Функции-
члены должны позволять следующее:
• создание объекта и его инициализация;
• отображение имени вкладчика, номера счета и баланса;
• добавление на счет суммы денег, переданной в аргументе;
• снятие суммы денег, переданной в аргументе.
Предоставьте определения методов для класса, и напишите короткую программу
для иллюстрации всех его возможностей.
*/
#include <iostream>
#include <string>
#include <cmath>
#include "Account.h"
 
int main()
{
    Account acc;
    std::string name;
    std::string number;
    double balance = 0.0;
    int choice = 0;
    double amount = 0.0;
 
    for (char userAnswer = 'y' ; userAnswer == 'y'; std::cin >> userAnswer)
    {
        std::cout << "\nEnter the name of the account holder: ";
        std::cin.sync();
        std::getline(std::cin, name);
 
        std::cout << "\nEnter the number of the account: ";
        std::cin.sync();
        std::getline(std::cin, number);
 
        std::cout << "\nEnter the current balance: ";
        std::cin.sync();
        std::cin >> balance;
 
        acc = Account(name, number, balance);
 
        for (char userAnswer = 'y' ; userAnswer == 'y'; std::cin >> userAnswer)
        {
            std::cout << "\nChoose operation:"
                         "\n1. deposit money"
                         "\n2. withdraw money";
            std::cout << std::endl;
            std::cin >> choice;
            if (choice == 1 || choice == 2)
            {
                std::cout << "\nEnter amount: ";
                std::cin >> amount;
                switch (choice)
                {
                    case 1:     acc.deposit_money(amount);
                                break;
                    case 2:     acc.withdraw_money(amount);
                                break;
                }
                acc.show_data();
            }
            else
            {
                std::cout << "\nWrong value has been entered. "
                             "The data remains the same.";
            }
 
            std::cout << "\nWould you like to continue operate "
                         "with the current account? (y/n) ";
        }
        std::cout << "\nWould you like to work with other accounts? (y/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
#ifndef ACCOUNT_H
#define ACCOUNT_H
 
#include <string>
 
class Account
{
    public:
        Account();
        Account(const std::string & name, const std::string & number, double balance);
        ~Account();
        void deposit_money(double amount);      // внести деньги на счёт
        void withdraw_money(double amount);     // снять деньги со счёта
        void show_data();                       // отобразить данные
 
    private:
        std::string m_customerName;     // имя клиента
        std::string m_accountNumber;    // номер счёта
        double m_currentBalance;        // текущий баланс
};
 
#endif // ACCOUNT_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
#include <iostream>
#include <string>
#include "Account.h"
 
Account::Account()
{
    m_customerName = "no name";
    m_accountNumber = "0000 0000 0000 0000";
    m_currentBalance = 0.0;
}
 
Account::Account(const std::string & name, const std::string & number, double balance)
{
    m_customerName = name;
    m_accountNumber = number;
    m_currentBalance = balance;
}
 
Account::~Account()
{
}
 
void Account::deposit_money(double amount)
{
    m_currentBalance += amount;
}
 
void Account::withdraw_money(double amount)
{
    m_currentBalance -= amount;
}
 
void Account::show_data()
{
    std::cout << "\nThe account holder: " << m_customerName
              << "\nThe account number: " << m_accountNumber
              << "\nCurrent balance: " << m_currentBalance << std::endl;
}

Глава 10. Упражнение 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
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
//  sp_Ch10_Pg531_Ex02
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 10, страница 531, упражнение 2.
/*
Пусть имеется определение следующего простого класса:
class Person
{
    private:
        static const LIMIT = 25;
        string lname;         // фамилия
        char fname[LIMIT];    // имя
    public:
        Person () { lname = ""; fname[0] = '\0'; }              // #1
        Person (const string & ln, const char * fn = "Heyyou"); // #2
 
        // Следующие методы отображают lname и fname
        void Show() const;          // формат: имя фамилия
        void FormalShow() const;    // формат: фамилия, имя
};
(В нем используется объект string и символьный массив, так что вы сможете
сравнить применение этих двух форм.) Напишите программу, которая дополнит
реализацию за счет предоставления кода для пока еще не определенных
методов. В программе, использующей класс, должны также присутствовать вызовы
трех возможных конструкторов (без аргументов, с одним аргументом, с двумя
аргументами) и двух методов отображения. Ниже приведен пример применения
этих конструкторов и методов:
Person one;     // используется конструктор по умолчанию
 
Person two("Smythecraft");  // используется конструктор #2
                            // с одним аргументом по умолчанию
 
Person three("Dimwiddy", "Sam");    // используется конструктор #2,
                                    // без аргументов по умолчанию
one.Show();
cout << endl;
one.FormalShow();
// и т.д. для объектов two и three
*/
#include <iostream>
#include "Person.h"
 
int main()
{
    Person one;
    Person two("Smythecraft");
    Person three("Dimwiddy", "Sam");
 
    one.show();
    std::cout << std::endl << std::endl;
    one.formal_show();
    std::cout << std::endl << std::endl << std::endl;
 
    two.show();
    std::cout << std::endl << std::endl;
    two.formal_show();
    std::cout << std::endl << std::endl << std::endl;
 
    three.show();
    std::cout << std::endl << std::endl;
    three.formal_show();
    std::cout << 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
#ifndef PERSON_H
#define PERSON_H
 
#include <string>
 
class Person
{
    private:
        static const int LIMIT = 25;
        std::string m_lastname;  // фамилия
        char m_firstname[LIMIT]; // имя
 
    public:
        Person() { m_lastname = ""; m_firstname[0] = '\0'; }              // #1
        Person(const std::string & lname, const char * fname = "Heyyou"); // #2
        ~Person() {}
        void show() const;        // формат: имя фамилия
        void formal_show() const; // формат: фамилия, имя
};
 
#endif // PERSON_H
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "Person.h"
#include <iostream>
#include <string>
#include <cstring>
 
Person::Person(const std::string & lname, const char * fname)
{
    m_lastname = lname;          // фамилия
    strcpy(m_firstname, fname);  // имя
}
 
void Person::show() const
{
    std::cout << m_firstname << " " << m_lastname;
}
 
void Person::formal_show() const
{
    std::cout << m_lastname << ", " << m_firstname;
}
1
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
23.03.2015, 16:45 14
Глава 10. Упражнение 3

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//  sp_Ch10_Pg532_Ex03
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 10, страница 532, упражнение 3.
/*
Выполните упражнение 1 из главы 9, но замените показанный там код подходящим
объявлением класса golf. Замените setgolf(golf &, const chart *, int)
конструктором с соответствующими аргументами для выполнения инициализации.
Оставьте интерактивную версию setgolf (), но реализуйте ее с использованием
этого конструктора. (Например, в коде setgolf() получите данные, передайте
их конструктору для создания временного объекта и присвойте временный объект
вызвавшему, представленному через *this.)
*/
#include <iostream>
#include "Golf.h"
 
int main()
{
    const int ARR_SIZE = 4;
 
    Golf ann("Ann Birdfree", 24);
    ann.show_golf();
 
    Golf player[ARR_SIZE];
    int k = 0;
    for ( ; k < ARR_SIZE; ++k)
        if (player[k].set_golf() == 0)
            break;
 
    for ( int i = 0; i < k; ++i)
        player[i].show_golf();
 
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Golf.h
 
#ifndef GOLF_H
#define GOLF_H
 
class Golf
{
    public:
        Golf(const char * name = "", int hc = 0);
        ~Golf(){};
        int set_golf();
        void show_golf();
 
    private:
        static const int LEN = 40;
        char m_fullname[LEN];
        int m_handicap;
};
 
#endif // 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
24
25
26
27
28
29
30
31
32
33
34
35
// Golf.cpp
#include "Golf.h"
#include <iostream>
#include <cstring>
 
Golf::Golf(const char * name, int hc)
{
    strcpy(m_fullname, name);
    m_handicap = hc;
}
 
int Golf::set_golf()
{
    int nameHasBeenEntered = 0;
    std::cout << "\nPlease enter the name: ";
    char name[LEN];
    std::cin.sync();
    std::cin.get(name, LEN);
    if (strlen(name) > 0)
    {
        int hc = 0;
        nameHasBeenEntered = 1;
        std::cout << "Please enter the handicap: ";
        std::cin >> hc;
        Golf temp(name, hc);
        *this = temp;
    }
 
    return nameHasBeenEntered;
}
 
void Golf::show_golf()
{
    std::cout << std::endl << m_fullname << std::endl << m_handicap << std::endl;
}

Глава 10. Упражнение 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
27
//  sp_Ch10_Pg532_Ex04
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 10, страница 532, упражнение 4.
/*
Выполните упражнение 4 из главы 9, но преобразуйте структуру Sales и
ассоциированные с ней функции в класс и методы. Замените функцию
setSales (Sales &, double[], int) конструктором. Реализуйте интерактивный
метод setSales (Sales &), используя конструктор. Оставьте класс в
пространстве имен SALES.
*/
#include "Sales.h"
 
int main()
{
    using namespace sales;
 
    double ar[] = {225056.55, 340742.15, 410123.35, 270521.25};
    Sales s1;
    s1 = Sales(ar, QUARTERS);
    s1.show_sales();
 
    s1.reset_sales();
    s1.set_sales();
    s1.show_sales();
 
    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
#ifndef SALES_H
#define SALES_H
 
namespace sales
{
    static const int QUARTERS = 4;
    class Sales
    {
        public:
            Sales(){}
            ~Sales(){}
            Sales(const double ar[], const int arSize);
            void reset_sales();
            void set_sales();
            void show_sales();
 
        private:
            double m_sales[QUARTERS];
            double m_average;
            double m_max;
            double m_min;
            double find_min(const double ar[], int arSize);
            double find_max(const double ar[], int arSize);
            double find_average(const double ar[], int arSize);
    };
}
#endif // SALES_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
#include <iostream>
#include "Sales.h"
namespace sales
{
    Sales::Sales(const double ar[], const int arSize)
    {
        for (int i = 0; i < arSize; ++i)
        {
            if (m_sales[i] == 0)
            {
                m_sales[i] = find_min(ar, arSize);
                if (i+1 < QUARTERS)
                {
                    for (int j = i+1; j < arSize; ++j)
                        m_sales[j] = 0;
                }
                break;
            }
        }
 
        m_average = find_average(ar, arSize);
        m_max = find_max(ar, arSize);
        m_min = find_min(ar, arSize);
    }
 
    void Sales::reset_sales()
    {
        for (int i = 0; i < QUARTERS; ++i)
            m_sales[i] = 0;
    }
 
    void Sales::set_sales()
    {
        for (int i = 0, qty = 0; i < QUARTERS; ++i)
        {
            std::cout << "\nEnter the quantity of sales for the "
                      << i+1 << " quarter: ";
            std::cin >> qty;
            double * sales = new double[qty];
            for (int j = 0; j < qty; ++j)
            {
                std::cout << "\nEnter the " << j+1 << " amount: ";
                std::cin >> sales[j];
            }
            Sales temp(sales, qty);
            *this = temp;
            delete [] sales;
        }
 
    }
 
    void Sales::show_sales()
    {
        std::cout << "\nAverage: " << m_average
        << "\nMaximum: " << m_max
        << "\nMinimum: " << m_min << std::endl;
    }
 
    double Sales::find_min(const double ar[], int arSize)
    {
        double min_value = ar[0];
        for (int i = 1; i < arSize; ++i)
            if (ar[i] < min_value)
                min_value = ar[i];
 
        return min_value;
    }
 
    double Sales::find_max(const double ar[], int arSize)
    {
        double max_value = ar[0];
        for (int i = 1; i < arSize; ++i)
            if (ar[i] > max_value)
                max_value = ar[i];
 
        return max_value;
    }
 
    double Sales::find_average(const double ar[], int arSize)
    {
        double sum = 0;
        for (int i = 0; i < arSize; ++i)
                sum += ar[i];
 
        return sum/arSize;
    }
 
}//endof namespace sales

Глава 10. Упражнение 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
//  sp_Ch10_Pg532_Ex05
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 10, страница 532, упражнение 5.
/*
Пусть имеется следующее объявление структуры:
struct Customer
{
    char fullname[35];
    double payment;
};
Напишите программу, которая будет добавлять структуры заказчиков в стек и
удалять их из стека, представленного объявлением класса Stack. Всякий раз,
когда заказчик удаляется из стека, его зарплата должна добавляться к
промежуточной сумме и по этой сумме выдаваться отчет. На заметку: вы должны иметь
возможность пользоваться классом Stack без изменений; просто поменяйте
объявление typedef, чтобы Item был типом Customer вместо unsigned long.
*/
#include <iostream>
#include <cctype>
#include "Customer.h"
#include "Stack.h"
 
int main()
{
    using std::cout;
    using std::cin;
 
    Stack st;   // create an empty stack
    double subtotal = 0.0;
    char ch;
    Customer po;
    cout << "Please enter A to add a customer,\n"
         << "P to pop the customer, or Q to quit.\n";
    while (cin >> ch && toupper(ch) != 'Q')
    {
        while (cin.get() != '\n')
            continue;
        if (!isalpha(ch))
        {
            cout << '\a';
            continue;
        }
        switch(ch)
        {
             case 'A':
             case 'a': cout << "Enter a customer name to add: ";
                       cin.sync();
                       getline (cin, po.fullname);
                       cout << "Enter a customer payment to add: ";
                       cin >> po.payment;
 
                       if (st.isfull())
                           cout << "stack already full\n";
                       else
                           st.push(po);
                       break;
             case 'P':
             case 'p': if (st.isempty())
                           cout << "stack already empty\n";
                       else
                       {
                           subtotal += po.payment;
                           st.pop(po);
                           cout << "Customer " << po.fullname << " popped.\n"
                                << "Subtotal is: " << subtotal;
                       }
                       break;
        }
        cout << "\n\nPlease enter A to add a customer,\n"
             << "P to pop the customer, or Q to quit.\n";
    }
    cout << "Bye\n";
 
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef CUSTOMER_H_INCLUDED
#define CUSTOMER_H_INCLUDED
 
#include <string>
 
struct Customer
{
    std::string fullname;
    double payment;
};
 
#endif // CUSTOMER_H_INCLUDED
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
// Stack.h -- class definition for the stack ADT
#ifndef STACK_H
#define STACK_H
 
#include "Customer.h"
 
typedef Customer Item;
 
class Stack
{
    private:
        enum {MAX = 10};    // constant specific to class
        Item items[MAX];    // holds stack items
        int top;            // index for top stack item
 
    public:
        Stack();
        bool isempty() const;
        bool isfull() const;
 
        // push() returns false if stack already is full, true otherwise
        bool push(const Item & item);   // add item to stack
 
        // pop() returns false if stack already is empty, true otherwise
        bool pop(Item & item);          // pop top into item
};
 
#endif // STACK_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
// Stack.cpp -- Stack member functions
#include "stack.h"
#include "Customer.h"
 
Stack::Stack()    // create an empty stack
{
    top = 0;
}
 
bool Stack::isempty() const
{
    return top == 0;
}
 
bool Stack::isfull() const
{
    return top == MAX;
}
 
bool Stack::push(const Item & item)
{
    if (top < MAX)
    {
        items[top++] = item;
        return true;
    }
    else
        return false;
}
 
bool Stack::pop(Item & item)
{
    if (top > 0)
    {
        item = items[--top];
        return true;
    }
    else
        return false;
}

Глава 10. Упражнение 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
//  sp_Ch10_Pg532_Ex06 - main.cpp
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 10, страница 532, упражнение 6.
/*
Пусть имеется следующее объявление класса:
class Move
{
    private:
        double x;
        double y;
    public:
        Move(double a = 0, double b = 0) ;   // устанавливает х, у в a, b
        showmove() const;  // отображает текущие значения х, у
 
        Move add (const Move & m) const;     // Эта функция добавляет х из m
        // к х вызывающего объекта, чтобы получить новое значение х.
        // Добавляет у из m к у вызывающего объекта, чтобы получить новое
        // значение у, присваивает инициализированному объекту значения х, у
        // и возвращает его.
 
        reset (double a = 0, double b = 0) ; // сбрасывает х, у в a, b
};
Создайте определения функций-членов и напишите программу, которая
использует этот класс.
*/
#include "Move.h"
 
int main()
{
    Move dog(2.2, 3.3);
    dog.show_move();
 
    dog.add(dog);
    dog.show_move();
 
    dog.reset();
    dog.show_move();
 
    dog.reset(100.0, 200.0);
    dog.show_move();
 
    Move cat(10.0, 20.0);
    cat.show_move();
 
    cat.add(dog);
    cat.show_move();
 
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//  sp_Ch10_Pg532_Ex06 - Move.h
#ifndef MOVE_H
#define MOVE_H
 
class Move
{
    public:
        Move(){}
        ~Move(){}
        Move(double a = 0, double b = 0);
        void show_move() const;
        Move add(const Move & m);
        void reset(double a = 0, double b = 0);
 
    private:
        double m_x;
        double m_y;
};
 
#endif // MOVE_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
//  sp_Ch10_Pg532_Ex06 - Move.cpp
#include <iostream>
#include "Move.h"
 
Move::Move(double a, double b)
{
    m_x = a;
    m_y = b;
}
 
void Move::show_move() const
{
    std::cout << std::endl << m_x << std::endl << m_y << std::endl;
}
 
Move Move::add(const Move & m)
{
    m_x += m.m_x;
    m_y += m.m_y;
 
    return *this;
}
 
void Move::reset(double a, double b)
{
    m_x = a;
    m_y = b;
}

Глава 10. Упражнение 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
//  sp_Ch10_Pg533_Ex07 - main.cpp
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 10, страница 533, упражнение 7.
/*
Плорг из Бетельгейзе обладает следующими свойствами:
 
Данные:
• плорг имеет имя не длиннее 19 символов;
• плорг имеет индекс удовлетворенности (contentment index — CI), выражаемый
целым числом.
 
Операции:
• новый плорг начинает существование с именем и индексом СІ равным 50;
• индекс СІ плорга может изменяться;
• плорг может сообщать свое имя и индекс CI,
• по умолчанию плорг имеет имя "Plorga".
 
Напишите объявление класса Plorg (включая данные-члены и прототипы функций-
членов), который представляет плорга. Напишите определения функций-членов.
Напишите короткую программу, демонстрирующую все средства класса Plorg.
*/
#include <iostream>
#include "Plorg.h"
 
int main()
{
    Plorg plorgina;
    plorgina.show_data();
 
    Plorg plorgar("Ozzy", 600);
    plorgar.show_data();
 
    plorgar.change_index('-', 100);
    plorgar.show_data();
 
    plorgar.change_index('+', 166);
    plorgar.show_data();
 
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//  sp_Ch10_Pg533_Ex07 - Plorg.h
#ifndef PLORG_H
#define PLORG_H
 
class Plorg
{
    public:
        Plorg(const char *name = "Plorga", int index = 50);
        void change_index(char op = '+', int index = 1);
        void show_data() const;
 
    private:
        enum {ARR_SIZE = 20};    // constant specific to class
        char m_name[ARR_SIZE];
        int m_index;    // индекс удовлетворенности (contentment index Ч CI)
};
 
#endif // PLORG_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
//  sp_Ch10_Pg533_Ex07 - Plorg.cpp
#include <iostream>
#include <cstring>
#include "Plorg.h"
 
Plorg::Plorg(const char *name, int index)
{
    strcpy(m_name, name);
    m_index = index;
}
 
void Plorg::change_index(char op, int index)
{
    switch (op)
    {
        case '+':   m_index += index;
                    break;
        case '-':   m_index -= index;
                    break;
    }
}
 
void Plorg::show_data() const
{
    std::cout << "\nPlorg name: " << m_name
              << "\nPlorg contentment index: " << m_index
              << std::endl << std::endl;
}
2
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
23.03.2015, 16:46 15
Глава 10. Упражнение 8

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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
//  sp_Ch10_Pg533_Ex08 - main.cpp
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 10, страница 533, упражнение 8.
/*
Простой список можно описать следующим образом:
• простой список может содержать ноль или более элементов определенного типа;
• можно создавать пустой список;
• можно добавлять элемент в список;
• можно определять, пуст ли список;
• можно определять, полон ли список;
• можно посетить каждый элемент списка и выполнить над ним определенное действие.
 
Как видите, список действительно прост: так, например, он не позволяет
осуществлять вставку или удаление элементов.
Спроектируйте класс List для представления этого абстрактного типа. Вы
должны подготовить заголовочный файл list.h с объявлением класса и файл
list.cpp с реализацией его методов. Вы должны также написать короткую
программу, которая будет использовать полученный класс.
Главная причина того, что спецификация списка проста, связана с попыткой
упростить это упражнение. Вы можете реализовать список в виде массива или же
в виде связного списка, если знакомы с этим типом данных. Однако открытый
интерфейс не должен зависеть от вашего выбора. То есть открытый интерфейс
не должен иметь индексов массива, указателей на узлы и т.п. Он должен быть
выражен в виде общих концепций создания списка, добавления элемента в список
и т.д.
Обычный способ управления посещением каждого элемента в списке и
выполнения над ним каких-то действий состоит в применении функции, которая
принимает указатель на другую функцию в качестве аргумента:
void visit(void (*pf)(Item &));
Здесь pf указывает на функцию (не функцию-член), которая принимает ссылку
на аргумент типа Item, где Item — это тип элементов списка, visit() применяет
эту функцию к каждому элементу списка. В качестве общего руководства можете
воспользоваться классом Stack.
*/
#include <iostream>
#include <string>
#include "List.h"
 
int main()
{
    using std::cout;
    using std::cin;
 
    List some;
 
    std::string phrase[] =
    {
        "Black Sabbath",
        "Led Zeppelin",
        "Deep Purple",
        "Uriah Heep",
        "Pink Floyd",
        "Iron Maiden",
        "Judas Priest"
    };
 
    if (some.isempty())
        for (int i = 0; !some.isfull(); ++i)
            some.add(phrase[i]);
 
    some.show_list();
 
    some.reset_list();
 
    std::string str;
    while (!some.isfull())
    {
        cout << "Enter your string and it will be added to list: ";
        getline(cin, str);
        some.add(str);
    }
 
    some.show_list();
 
    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
// sp_Ch10_Pg533_Ex08 - List.h
#ifndef LIST_H
#define LIST_H
 
#include <string>
 
typedef std::string Item;
 
class List
{
    private:
        enum {MAX = 4};     // constant specific to class
        Item items[MAX];    // holds list items
        int top;            // index for top list item
 
    public:
        List();
        bool isempty() const;
        bool isfull() const;
        void add(const Item & item);    // add item to list
        void visit(void (*pf)(Item &)); // visit each element of the list
        void show_list();
        void reset_list();
};
 
#endif // LIST_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
// sp_Ch10_Pg533_Ex08 - List.cpp
#include "List.h"
#include <iostream>
List::List()    // create an empty list
{
    top = 0;
}
 
bool List::isempty() const
{
    return top == 0;
}
 
bool List::isfull() const
{
    return top == MAX;
}
 
void List::add(const Item & item)
{
    if (top < MAX)
        items[top++] = item;
}
 
void List::visit(void (*pf)(Item &))
{
    for (int i = 0; i < MAX; ++i)
        pf(items[i]);
}
 
void List::show_list()
{
    for (int i = 0; i < MAX; ++i)
        std::cout << items[i] << std::endl;
    std::cout << std::endl;
}
 
void List::reset_list()
{
    top = 0;
}
2
Mikhail1990
27 / 26 / 6
Регистрация: 22.03.2014
Сообщений: 277
19.04.2015, 11:10 16
gru74ik, ну а адльше? 11 глава на 2 задании застрял
0
Евгений89
100 / 100 / 39
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
19.04.2015, 11:58 17
Цитата Сообщение от Dimension Посмотреть сообщение
кому эти задачи нужны тут?ладно бы какие-нибудь сверхолимпиадные решали ,а это - детсад.
Кому-нибудь да пригодятся.
1
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
19.04.2015, 13:45 18
Глава 11.

Глава 11. Упражнение 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
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
//  sp_Ch11_Pg587_Ex01 - main.cpp
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 11, страница 587, упражнение 1.
/*
Модифицируйте код в листинге 11.15 так, чтобы обеспечить запись в файл
последовательных позиций при случайном блуждании. Каждая позиция должна
помечаться номером шага. Также программа должна записывать в файл начальные
условия (целевое расстояние и длину шага) и суммарные результаты.
Содержимое файла может выглядеть примерно так:
Target Distance: 100, Step Size: 20
0: (x, y) = (0, 0)
1: (x, y) = (-11.4715, 16.383)
2: (x, y) = (-8.68807, -3.42232)
...
26: (x, y) = (42.2919, -78.2594)
27: (x, y) = (58.6749, -89.7309)
After 27 steps, the subject has the following location:
(x, y) = (58.6749, -89.7309)
or
(m, a) = (107.212, -56.8194)
Average outward distance per step = 3.97081
*/
 
#include <fstream>      // для ввода в файл и вывода из файла
#include <string>
#include <cstdlib>      // rand(), srand() prototypes
#include <ctime>        // time() prototype
#include "Vector.h"     // includes <iostream>
int main()
{
    using std::cout;
    using std::cin;
    using std::endl;
    using std::string;
    using std::ofstream;
    using std::ifstream;
    using VECTOR::Vector;
 
    ofstream fout;          // создание объекта fout типа ofstream
    fout.open("rw.txt");    // ассоциирование объекта fout c файлом
    cout << "Enter target distance: ";
    double targetDistance = 0.0;
    cin >> targetDistance;
    cout << "Enter step size: ";
    int stepSize = 0;
    cin >> stepSize;
    fout << "Target Distance: " << targetDistance
         << ", Step Size: " << stepSize << "\n";
    Vector randwalk;
    Vector temp;
    int stepNumber = 1;
    srand( time(0) );
    double randomNumber1 = 0;
    double randomNumber2 = 0;
    double sumMagnitude = 0;
    while (randwalk.magval() < targetDistance)
    {
        randwalk = randwalk + temp;
        fout << stepNumber << ". " << randwalk << "\n";
        ++stepNumber;
        randomNumber1 = 1 + rand() % (stepSize * 2) - stepSize;
        randomNumber2 = 1 + rand() % (stepSize * 2) - stepSize;
        temp.reset(randomNumber1, randomNumber2);
        sumMagnitude += randwalk.magval();
    }
    double averageDistance = sumMagnitude / stepNumber;
    fout << "Average outward distance per step = " << averageDistance;
 
    fout.close();
 
    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
38
39
40
41
42
43
44
45
46
47
48
//  sp_Ch11_Pg587_Ex01 - Vector.h
#ifndef VECTOR_H
#define VECTOR_H
 
#include <iostream>
 
namespace VECTOR
{
    class Vector
    {
    public:
        enum Mode {RECT, POL};
    // RECT for rectangular, POL for Polar modes
    private:
        double x;          // horizontal value
        double y;          // vertical value
        double mag;        // length of vector
        double ang;        // direction of vector in degrees
        Mode mode;         // RECT or POL
    // private methods for setting values
        void set_mag();
        void set_ang();
        void set_x();
        void set_y();
    public:
       Vector();
        Vector(double n1, double n2, Mode form = RECT);
        void reset(double n1, double n2, Mode form = RECT);
        ~Vector();
        double xval() const {return x;}       // report x value
        double yval() const {return y;}       // report y value
        double magval() const {return mag;}   // report magnitude
        double angval() const {return ang;}   // report angle
        void polar_mode();                    // set mode to POL
        void rect_mode();                     // set mode to RECT
    // operator overloading
        Vector operator+(const Vector & b) const;
        Vector operator-(const Vector & b) const;
        Vector operator-() const;
        Vector operator*(double n) const;
    // friends
        friend Vector operator*(double n, const Vector & a);
        friend std::ostream & operator<<(std::ostream & os, const Vector & v);
    };
 
}   // end namespace VECTOR
 
#endif // VECTOR_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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
//  sp_Ch11_Pg587_Ex01 - Vect.cpp
//  methods for the Vector class
#include <cmath>
#include "Vector.h"   // includes <iostream>
 
using std::sqrt;
using std::sin;
using std::cos;
using std::atan;
using std::atan2;
using std::cout;
 
namespace VECTOR
{
    // compute degrees in one radian
    const double Rad_to_deg = 45.0 / atan(1.0);
    // should be about 57.2957795130823
 
    // private methods
    // calculates magnitude from x and y
    void Vector::set_mag()
    {
        mag = sqrt(x * x + y * y);
    }
 
    void Vector::set_ang()
    {
        if (x == 0.0 && y == 0.0)
            ang = 0.0;
        else
            ang = atan2(y, x);
    }
 
    // set x from polar coordinate
    void Vector::set_x()
    {
        x = mag * cos(ang);
    }
 
    // set y from polar coordinate
    void Vector::set_y()
    {
        y = mag * sin(ang);
    }
 
    // public methods
    Vector::Vector()             // default constructor
    {
        x = y = mag = ang = 0.0;
        mode = RECT;
    }
 
    // construct vector from rectangular coordinates if form is r
    // (the default) or else from polar coordinates if form is p
    Vector::Vector(double n1, double n2, Mode form)
    {
        mode = form;
        if (form == RECT)
         {
             x = n1;
             y = n2;
             set_mag();
             set_ang();
        }
        else if (form == POL)
        {
             mag = n1;
             ang = n2 / Rad_to_deg;
             set_x();
             set_y();
        }
        else
        {
             cout << "Incorrect 3rd argument to Vector() -- ";
             cout << "vector set to 0\n";
             x = y = mag = ang = 0.0;
             mode = RECT;
        }
    }
 
    // reset vector from rectangular coordinates if form is
    // RECT (the default) or else from polar coordinates if
    // form is POL
    void Vector:: reset(double n1, double n2, Mode form)
    {
        mode = form;
        if (form == RECT)
         {
             x = n1;
             y = n2;
             set_mag();
             set_ang();
        }
        else if (form == POL)
        {
             mag = n1;
             ang = n2 / Rad_to_deg;
             set_x();
             set_y();
        }
        else
        {
             cout << "Incorrect 3rd argument to Vector() -- ";
             cout << "vector set to 0\n";
             x = y = mag = ang = 0.0;
             mode = RECT;
        }
    }
 
    Vector::~Vector()    // destructor
    {
    }
 
    void Vector::polar_mode()    // set to polar mode
    {
        mode = POL;
    }
 
    void Vector::rect_mode()     // set to rectangular mode
    {
        mode = RECT;
    }
 
    // operator overloading
    // add two Vectors
    Vector Vector::operator+(const Vector & b) const
    {
        return Vector(x + b.x, y + b.y);
    }
 
    // subtract Vector b from a
    Vector Vector::operator-(const Vector & b) const
    {
        return Vector(x - b.x, y - b.y);
    }
 
    // reverse sign of Vector
    Vector Vector::operator-() const
    {
        return Vector(-x, -y);
    }
 
    // multiply vector by n
    Vector Vector::operator*(double n) const
    {
        return Vector(n * x, n * y);
    }
 
    // friend methods
    // multiply n by Vector a
    Vector operator*(double n, const Vector & a)
    {
        return a * n;
    }
 
    // display rectangular coordinates if mode is RECT,
    // else display polar coordinates if mode is POL
    std::ostream & operator<<(std::ostream & os, const Vector & v)
    {
        if (v.mode == Vector::RECT)
             os << "(x,y) = (" << v.x << ", " << v.y << ")";
        else if (v.mode == Vector::POL)
        {
             os << "(m,a) = (" << v.mag << ", "
                 << v.ang * Rad_to_deg << ")";
        }
        else
             os << "Vector object mode is invalid";
        return os;
    }
 
}  // end namespace VECTOR
2
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
19.04.2015, 13:48 19
Глава 11. Упражнение 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
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
//  sp_Ch11_Pg588_Ex02 - main.cpp
/// Занятия по книге Стивена Праты "Язык программирования С++" (2013, 6-е изд.).
/// Упражнения по программированию. Глава 11, страница 588, упражнение 2.
/*
Модифицируйте заголовок класса Vector и файлы реализации (листинги 11.13
и 11.14) так, чтобы модуль и направление вектора больше не хранились в виде
компонентов данных. Вместо этого они должны вычисляться по требованию
при вызове методов magval() и angval(). Вы должны оставить открытый
интерфейс без изменений (те же открытые методы с теми же аргументами), но
изменить закрытую часть, включая некоторые из закрытых методов и их
реализации. Протестируйте модифицированную версию с помощью программы из
листинга 11.15, которая должна остаться неизменной, поскольку открытый
интерфейс класса Vector не менялся.
*/
 
#include <cstdlib>      // rand(), srand() prototypes
#include <ctime>        // time() prototype
#include "Vector.h"     // includes <iostream>
int main()
{
    using namespace std;
    using VECTOR::Vector;
 
    srand(time(0));     // seed random-number generator
    double direction;
    Vector step;
    Vector result(0.0, 0.0);
    unsigned long steps = 0;
    double target;
    double dstep;
    cout << "Enter target distance (q to quit): ";
    while (cin >> target)
    {
        cout << "Enter step length: ";
        if (!(cin >> dstep))
            break;
 
        while (result.magval() < target)
        {
            direction = rand() % 360;
            step.reset(dstep, direction, VECTOR::Vector::POL);
            result = result + step;
            steps++;
        }
        cout << "After " << steps << " steps, the subject "
            "has the following location:\n";
        cout << result << endl;
        result.polar_mode();
        cout << " or\n" << result << endl;
        cout << "Average outward distance per step = "
            << result.magval()/steps << endl;
        steps = 0;
        result.reset(0.0, 0.0);
        cout << "Enter target distance (q to quit): ";
    }
    cout << "Bye!\n";
/* keep window open
    cin.clear();
    while (cin.get() != '\n')
        continue;
    cin.get();
*/
    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
38
39
40
41
42
43
//  sp_Ch11_Pg588_Ex02 - Vector.h
 
#ifndef VECTOR_H
#define VECTOR_H
 
#include <iostream>
 
namespace VECTOR
{
    class Vector
    {
        public:
            enum Mode {RECT, POL};  // RECT for rectangular, POL for Polar modes
 
            Vector();
            Vector(double n1, double n2, Mode form = RECT);
            void reset(double n1, double n2, Mode form = RECT);
            ~Vector();
            double xval() const {return x;}     // report x value
            double yval() const {return y;}     // report y value
            double magval() const;              // calculate magnitude
            double angval() const;              // calculate angle
            void polar_mode();                  // set mode to POL
            void rect_mode();                   // set mode to RECT
        // operator overloading
            Vector operator+(const Vector & b) const;
            Vector operator-(const Vector & b) const;
            Vector operator-() const;
            Vector operator*(double n) const;
 
        // friends
            friend Vector operator*(double n, const Vector & a);
            friend std::ostream & operator<<(std::ostream & os, const Vector & v);
 
        private:
            double x;          // horizontal value
            double y;          // vertical value
            Mode mode;         // RECT or POL
    };
 
}   // end namespace VECTOR
 
#endif // VECTOR_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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
//  sp_Ch11_Pg588_Ex02 - Vector.cpp
//  methods for the Vector class
 
#include <cmath>
#include "Vector.h"  // includes <iostream>
 
using std::sqrt;
using std::sin;
using std::cos;
using std::atan;
using std::atan2;
using std::cout;
 
namespace VECTOR
{
    // compute degrees in one radian
    const double Rad_to_deg = 45.0 / atan(1.0);
    // should be about 57.2957795130823
 
 
// ===================public methods====================
 
    Vector::Vector()             // default constructor
    {
        x = y = 0.0;
        mode = RECT;
    }
 
    // construct vector from rectangular coordinates if form is r
    // (the default) or else from polar coordinates if form is p
    Vector::Vector(double n1, double n2, Mode form)
    {
        mode = form;
        if (form == RECT)
        {
             x = n1;
             y = n2;
        }
        else if (form == POL)
        {
             x = n1 * cos(n2 / Rad_to_deg);
             y = n1 * sin(n2 / Rad_to_deg);
        }
        else
        {
             cout << "Incorrect 3rd argument to Vector() -- ";
             cout << "vector set to 0\n";
             x = y = 0.0;
             mode = RECT;
        }
    }
 
    // reset vector from rectangular coordinates if form is
    // RECT (the default) or else from polar coordinates if
    // form is POL
    void Vector:: reset(double n1, double n2, Mode form)
    {
        mode = form;
        if (form == RECT)
         {
             x = n1;
             y = n2;
        }
        else if (form == POL)
        {
             x = n1 * cos(n2 / Rad_to_deg);
             y = n1 * sin(n2 / Rad_to_deg);
        }
        else
        {
             cout << "Incorrect 3rd argument to Vector() -- ";
             cout << "vector set to 0\n";
             x = y = 0.0;
             mode = RECT;
        }
    }
 
    Vector::~Vector()    // destructor
    {
    }
 
    double Vector::magval() const   // calculate magnitude
    {
        return sqrt(x * x + y * y);
    }
 
    double Vector::angval() const   // calculate angle
    {
        return (x == 0.0 && y == 0.0) ? 0.0 : atan2(y, x);
    }
 
    void Vector::polar_mode()    // set to polar mode
    {
        mode = POL;
    }
 
    void Vector::rect_mode()     // set to rectangular mode
    {
        mode = RECT;
    }
 
    // operator overloading
    // add two Vectors
    Vector Vector::operator+(const Vector & b) const
    {
        return Vector(x + b.x, y + b.y);
    }
 
    // subtract Vector b from a
    Vector Vector::operator-(const Vector & b) const
    {
        return Vector(x - b.x, y - b.y);
    }
 
    // reverse sign of Vector
    Vector Vector::operator-() const
    {
        return Vector(-x, -y);
    }
 
    // multiply vector by n
    Vector Vector::operator*(double n) const
    {
        return Vector(n * x, n * y);
    }
 
    // friend methods
    // multiply n by Vector a
    Vector operator*(double n, const Vector & a)
    {
        return a * n;
    }
 
    // display rectangular coordinates if mode is RECT,
    // else display polar coordinates if mode is POL
    std::ostream & operator<<(std::ostream & os, const Vector & v)
    {
        if (v.mode == Vector::RECT)
             os << "(x,y) = (" << v.x << ", " << v.y << ")";
        else if (v.mode == Vector::POL)
        {
             os << "(m,a) = (" << v.magval() << ", "
                 << v.angval() * Rad_to_deg << ")";
        }
        else
             os << "Vector object mode is invalid";
        return os;
    }
 
}  // end namespace VECTOR
3
S_el
19.04.2015, 13:59     Решение всех задач из учебника Стивена Прата
  #20

Не по теме:

Цитата Сообщение от Dimension Посмотреть сообщение
кому эти задачи нужны тут?ладно бы какие-нибудь сверхолимпиадные решали ,а это - детсад.
Посмотрите на эту тему:
Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
здесь будет тоже самое

0
19.04.2015, 13:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2015, 13:59
Привет! Вот еще темы с ответами:

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

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

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


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

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

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