Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 15
1

Реализовать структуру Music

30.06.2014, 16:25. Показов 5482. Ответов 43
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
 Комментарий модератора 
Язык форума - русский. Переведите!

 Комментарий модератора 
Vitaliy1212, при повторном нарушении пункта правил 1.4. тема будет закрыта

Задача.Описати структуру MUSIC,яка містить інформацію про музичні
диски які продаються в магазині:
-назва альбому,
-виконавець,
-рік створення альбому,
-жанр,
-ціна диска
Написати програму що виконує наступні дії:
1. введення з клавіатури даних в масив, що складається з шести елементів типу MUSIC;
2. виведення даних на екран з масиву структур;
3. запис масиву структур в текстовий файл та зчитування даних з файлу в масив структур;
4. впорядкування записів по року створенняальбому;
5. організувати пошук дисків по жанру виконання:у користувача запрошується жанр і виводяться
усі диски,відповідні умові(Порівняння проводити за допомогою функціі порівняння рядків)[/CODE]
Значит структуру я описал и 1 и 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
#include <iostream>
#include <windows.h>
#include <iomanip>
#include <string.h>
#include <fstream>
#include <stdlib.h>
const int L_N=30,L_I=30,L_Y=15,L_G=15,L_C=10;//Обьявление длинны строк.
struct MUSIC//Описывание структуры.
{
    char nazva[L_N+1];//Название альбома
    char ispolnitel[L_I+1];//Исполнитель.
    double year;//Год издания.
    char ghanr[L_G+1];//Жанр.
    double cena;//Цена диска.
};
MUSIC songs[5];
void main()
{
    
    using namespace std;
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int n=2;
    for (int i=0;i<n;i++)
    {
        cout<<"Введите название альбома:";
        cin.ignore();
        cin.getline(songs[i].nazva,L_N);
        cout<<"Введите исполнителя:";
        cin>>songs[i].ispolnitel;
        cout<<"Введите год издания альбома:";
        cin>>songs[i].year;
        cout<<"Введите жанр альбома:";
        cin>>songs[i].ghanr;
        cout<<"Введите цену диска:";
        cin>>songs[i].cena;
        cout<<"============================"<<'\n';
        
    }
    
 
    system("pause");
 
}
Прошу помогите с 3,4,5 пунктом(желательно не отрывками а вставить в мой код ваше и прокоментировать)
Заранее всем огромное спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.06.2014, 16:25
Ответы с готовыми решениями:

Реализовать структуру моделирующую работу аэропорта; реализовать поиск по заданному полю в массиве таких структур
Здравствуйте. Каким образом можно сделать ввод данных через массив, а так же все последующие...

Реализовать структуру Parallelogram
Создайте структуру Параллелограмм с элементами a, b - стороны параллелограмма и a - угол между...

Как реализовать структуру БД
Доброе утро! Есть сайт технической поддержки. И есть пользователи, которые оставляют на нем заявку...

Как реализовать структуру
Доброго времени суток. Никак не могу скомпиллировать эту структуру. struct tree{ char inf;...

43
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
01.07.2014, 15:27 41
Author24 — интернет-сервис помощи студентам
В общем, как в той присказке "хвост вытащишь - голова завязнет; голову вытащишь - хвост завязнет".
Снёс я Code::Blocks с MinGW 4.7.1 и поставил вместо него Code::Blocks с MinGW 4.8.1.

1. Сортировка работает.
2. Код проверок с ифами тоже заработал, причём именно в той версии, которую я просто вчистую содрал с книги Стивена Праты "Язык программирования С++. Лекции и упражнения" (2012, 6-е изд.). И у Праты аналог моего userAnswer там именно char, а не string:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// listing 6.4
// or.cpp -- using the logical OR operator
#include <iostream>
int main()
{
    using namespace std;
    cout << "This program may reformat your hard disk\n"
            "and destroy all your data.\n"
            "Do you wish to continue? <y/n> ";
    char ch;
    cin >> ch;
    if (ch == 'y' || ch == 'Y')             // y or Y
        cout << "You were warned!\a\a\n";
    else if (ch == 'n' || ch == 'N')        // n or N
        cout << "A wise choice ... bye\n";
    else
        cout << "That wasn't a y or n! Apparently you "
                "can't follow\ninstructions, so "
                "I'll trash your disk anyway.\a\a\a\n";
    // cin.get();
    // cin.get();
    return 0;
}
Вот как выглядит пример выполнения программы из листинга 6.4:
This program may reformat your hard disk
and destroy all your data.
Do you wish to continue? <y/n> N
A wise choice ... bye

Эта программа читает только один символ, поэтому принимается во внимание
только первый символ ответа. Это значит, что пользователь может ввести N0! вместо
N, но программа прочитает только N. Но если ей пришлось бы читать еще входные
символы, то первым оказался бы символ О.


3. Зато теперь где-то в потоке застревают какие-то огрызки и на 178 строчке после вопроса "Желаете вывести введённые Вами данные из текстового файла? (да/нет)" программа сразу переходит к 222 строке с ожиданием
от пользователя ввода любой клавиши перед окончательным закрытием консоли. Не помогают никакие манипуляции ни с cin.clear(), ни с cin.ignore(), я их обоих класс труба шатал.

Собственно, код теперь выглядит вот так:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
/// [url]https://www.cyberforum.ru/cpp-beginners/thread1220023.html[/url]
/*
Задача. Описать структуру MUSIC, которая содержит информацию о музыкальных
дисках, которые продаются в магазине:
 
1. название альбома;
2. исполнитель;
3. год создания альбома;
4. жанр;
5. цена диска;
 
Написать программу которая выполняет следующие действия:
 
1. Ввод с клавиатуры данных в массив, состоящий из шести элементов типа MUSIC;
2. Вывода данных на экран из массива структур;
3. Запись массива структур в текстовый файл и чтение данных из файла в массив
   структур;
4. Порядок записей по году создания альбома;
5. Организовать поиск дисков по жанру выполнения: у пользователя запрашивается
   жанр и выводятся все диски, соответствующие условию (сравнение проводить
   с помощью функции сравнения строк);
 
*/
 
// Подключаем заголовочные файлы:
#include <iostream>     // для ввода-вывода
#include <windows.h>    // для отображения русского языка
#include <string>       // для строк класса string
#include <fstream>      // для чтения из файла
#include <ostream>      // для вывода в файл
#include <algorithm>    // для сортировки и поиска
 
using namespace std;    // подключаем стандартное пространство имён
 
struct music        // объявление структуры music
{
    string artist;  // исполнитель
    string name;    // название альбома
    string genre;   // жанр
    int year;       // год издания
    double price;   // цена диска
};
 
// прототип функции сортировки:
bool isSecondGreater(const music& first, const music&  second)
{
   return second.year>first.year;
}
 
music songs[6];  // создаём массив структур типа music (можно
                 // будет ввести данные не более чем для 6 дисков)
 
int main()  // функция main согласно стандарту C++ должна быть типа int
{
    SetConsoleCP(1251);       // для отображения в консоли русского языка
    SetConsoleOutputCP(1251); // для отображения в консоли русского языка
 
    int n;  // количество дисков
    cout << "Введите количество дисков, для которых Вы желаете\n"
            "ввести информацию (не более 6 дисков): ";
    cin >> n;
    cin.ignore();
    cout << endl;   // выводим на экран пустую строку для лучшего
                    // визуального восприятия текста
 
    if (n>6 || n<=0)
    {   // если пользователь ввёл неверное число, выводится уведомление
        // и программа завершается:
        cout << "Извините, данная реализация программы не расчитана на "
                "запись такого объёма данных.\n"
                "Максимальное количество дисков должно быть не более шести. "
                "Минимальное - один." << endl;
 
        cout << endl;
    }
 
    else
    {   // иначе выполняется следующий код:
        for (int i=0; i<n; i++)
        {
            cout << "\nВведите имя исполнителя: ";
            getline (cin, songs[i].artist);     // используем функцию getline
                                                // для чтения строк с пробелами
 
            cin.clear();    // очищаем поток от лишних символов новой строки,
                            // попадающих в поток с нажатием пользователем
                            // клавиши Enter
 
            cout << "Введите название диска: ";
            getline (cin, songs[i].name);
            cin.clear();
 
            cout << "Введите жанр: ";
            getline (cin, songs[i].genre);
            cin.clear();
 
            cout << "Введите год издания: ";
            cin >> songs[i].year;
            cin.clear();
 
            cout << "Введите цену диска: ";
            cin >>  songs[i].price;
            cin.ignore();
        }
 
//==============  Сортируем по годам ==============
 
        sort(songs, songs+n, isSecondGreater);
//=================================================
 
        for (int i=0;i<n;i++)
        {   // выводим введённые пользователем данные на экран
            cout << endl;
            cout << songs[i].artist << endl;
            cout << songs[i].name   << endl;
            cout << songs[i].genre  << endl;
            cout << songs[i].year   << endl;
            cout << songs[i].price  << endl;
            cout << endl;
        }
    }
 
//======= Запись данных введённых пользователем в файл music.txt =========
    char userAnswer;  // переменная для ответа пользователя
    cout << "\nЖелаете сохранить введённые Вами данные "
            "в текстовый файл? (да/нет): ";
    cin >> userAnswer;   // записываем ответ пользователя
    cin.ignore(1, '\n');
    cin.clear();
 
    // варианта утвердительного ответа, начинающиеся
    // на соответствующие символы:
    if (userAnswer == 'д' || userAnswer == 'Д' ||
        userAnswer == 'y' || userAnswer == 'Y')
    {
        cout << "\nВведённые Вами данные будут сохранены в файл music.txt.\n";
        ofstream fout;          // создание объекта fout типа ofstream
        fout.open("music.txt"); // ассоциирование объекта c файлом music.txt
 
        // используем созданный нами объект fout по аналогии с объектом cout
        for (int i=0;i<n;i++)
        {   // записываем введённые пользователем данные в файл music.txt
            fout << songs[i].artist << endl;
            fout << songs[i].name   << endl;
            fout << songs[i].genre  << endl;
            fout << songs[i].year   << endl;
            fout << songs[i].price  << endl;
        }
        fout.close ();  // закрытие соединения вывода с файлом
 
        //--------- Специальный блок для красоты ---------
 
        // С небольшой задержкой будут выведены 20 точек
        // одна за другой, как будто программа думает:
 
        cout << endl;
        for (int counter = 1; counter < 20; counter++)
        {
        Sleep(600);
        cout << ".";
        }
        cout << endl;
        //------------------------------------------------
 
        cout << "\nДанные были успешно сохранены.";
    }
    else
    {
         cout << "\nВы отказались от сохранения данных в "
         "текстовый файл. Программа будет завершена.";
         goto endOfCode;     // отсылка к метке для перехода
    }
//=========================================================================
 
//=== Чтение данных введённых пользователем из файла music.txt на экран ===
    cout << endl << endl;
    cin.clear();
    cout << "Желаете вывести введённые Вами данные "
            "из текстового файла? (да/нет): ";
    cin >> userAnswer;   // записываем ответ пользователя
    cin.ignore(1, '\n');
    cin.clear();
 
    if (userAnswer == 'д' || userAnswer == 'Д' ||
        userAnswer == 'y' || userAnswer == 'Y')
    {
        cout << "\nВы сохранили следующие данные в файле music.txt:\n";
        ifstream fin;               // создание объекта fin типа ifstream
 
        fin.open("music.txt");      // ассоциирование создание объекта fin
                                    // c файлом music.txt
 
        // используем созданный нами объект fin по аналогии с объектом cin
        for (int i=0; i<n; i++)
        {
            cout << "------------------------------" << endl;
            getline (fin, songs[i].artist);
            cout << songs[i].artist << endl << endl;
            fin.clear();
 
            getline (fin, songs[i].name);
            cout << songs[i].name << endl << endl;
            fin.clear();
 
            getline (fin, songs[i].genre);
            cout << songs[i].genre << endl << endl;
            fin.clear();
 
            fin >> songs[i].year;
            cout << songs[i].year << endl << endl;
            fin.clear();
 
            fin >>  songs[i].price;
            cout << songs[i].price << endl << endl;
            fin.ignore();
        }
        fin.close ();   // закрытие соединения ввода с файлом
    }
//======================================================================
    endOfCode:      // метка для перехода
 
    system("pause");    // для ожидания реакции пользователя
 
    return 0;   // успешное завершение программы
}


P.S. Осталось победить эти символы новой строки в потоке и всё заработает. Новая версия проекта в прикреплённом архиве.
Вложения
Тип файла: zip task_arr_str_iof.zip (317.6 Кб, 4 просмотров)
0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
01.07.2014, 17:49 42
В общем, пока что вот так только получилось:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
/// [url]https://www.cyberforum.ru/cpp-beginners/thread1220023.html[/url]
/*
Задача. Описать структуру MUSIC, которая содержит информацию о музыкальных
дисках, которые продаются в магазине:
 
1. название альбома;
2. исполнитель;
3. год создания альбома;
4. жанр;
5. цена диска;
 
Написать программу которая выполняет следующие действия:
 
1. Ввод с клавиатуры данных в массив, состоящий из шести элементов типа MUSIC;
2. Вывода данных на экран из массива структур;
3. Запись массива структур в текстовый файл и чтение данных из файла в массив
   структур;
4. Порядок записей по году создания альбома;
5. Организовать поиск дисков по жанру выполнения: у пользователя запрашивается
   жанр и выводятся все диски, соответствующие условию (сравнение проводить
   с помощью функции сравнения строк);
 
*/
 
// Подключаем заголовочные файлы:
#include <iostream>     // для ввода-вывода
#include <windows.h>    // для отображения русского языка
#include <string>       // для строк класса string
#include <fstream>      // для чтения из файла
#include <ostream>      // для вывода в файл
#include <algorithm>    // для сортировки и поиска
 
using namespace std;    // подключаем стандартное пространство имён
 
struct music        // объявление структуры music
{
    string artist;  // исполнитель
    string name;    // название альбома
    string genre;   // жанр
    int year;       // год издания
    double price;   // цена диска
};
 
// прототип функции сортировки:
bool isSecondGreater(const music& first, const music&  second)
{
   return second.year>first.year;
}
 
music songs[6];  // создаём массив структур типа music (можно
                 // будет ввести данные не более чем для 6 дисков)
 
int main()  // функция main согласно стандарту C++ должна быть типа int
{
    SetConsoleCP(1251);       // для отображения в консоли русского языка
    SetConsoleOutputCP(1251); // для отображения в консоли русского языка
 
    int n;  // количество дисков
    cout << "Введите количество дисков, для которых Вы желаете\n"
            "ввести информацию (не более 6 дисков): ";
    cin >> n;
    cin.ignore();
 
    cout << endl;   // выводим на экран пустую строку для лучшего
                    // визуального восприятия текста
 
    if (n>6 || n<=0)
    {   // если пользователь ввёл неверное число, выводится уведомление
        // и программа завершается:
        cout << "Извините, данная реализация программы не расчитана на "
                "запись такого объёма данных.\n"
                "Максимальное количество дисков должно быть не более шести. "
                "Минимальное - один." << endl << endl;
 
        goto endOfCode;
    }
 
    else
    {   // иначе выполняется следующий код:
        for (int i=0; i<n; i++)
        {
            cout << "\nВведите имя исполнителя: ";
            getline (cin, songs[i].artist);     // используем функцию getline
                                                // для чтения строк с пробелами
 
            cin.clear();    // очищаем поток от лишних символов новой строки,
                            // попадающих в поток с нажатием пользователем
                            // клавиши Enter
 
            cout << "Введите название диска: ";
            getline (cin, songs[i].name);
            cin.clear();
 
            cout << "Введите жанр: ";
            getline (cin, songs[i].genre);
            cin.clear();
 
            cout << "Введите год издания: ";
            cin >> songs[i].year;
            cin.clear();
 
            cout << "Введите цену диска: ";
            cin >>  songs[i].price;
            cin.ignore();
        }
 
//==============  Сортируем по годам ==============
 
        sort(songs, songs+n, isSecondGreater);
//=================================================
 
        for (int i=0;i<n;i++)
        {   // выводим введённые пользователем данные на экран
            cout << endl;
            cout << songs[i].artist << endl;
            cout << songs[i].name   << endl;
            cout << songs[i].genre  << endl;
            cout << songs[i].year   << endl;
            cout << songs[i].price  << endl;
            cout << endl;
        }
    }
 
//======= Запись данных введённых пользователем в файл music.txt =========
 
    char userAnswer;  // переменная для ответа пользователя
    cout << "\nЖелаете сохранить введённые Вами данные "
            "в текстовый файл? (да/нет): ";
    cin >> userAnswer;   // записываем ответ пользователя
    cin.ignore(1, '\n');
    cin.clear();
 
    // варианта утвердительного ответа, начинающиеся
    // на соответствующие символы:
    if (userAnswer == 'д' || userAnswer == 'Д' ||
        userAnswer == 'y' || userAnswer == 'Y')
    {
        cout << "\nВведённые Вами данные будут сохранены в файл music.txt.\n";
        ofstream fout;          // создание объекта fout типа ofstream
        fout.open("music.txt"); // ассоциирование объекта c файлом music.txt
 
        // используем созданный нами объект fout по аналогии с объектом cout
        for (int i=0;i<n;i++)
        {   // записываем введённые пользователем данные в файл music.txt
            fout << songs[i].artist << endl;
            fout << songs[i].name   << endl;
            fout << songs[i].genre  << endl;
            fout << songs[i].year   << endl;
            fout << songs[i].price  << endl;
        }
        fout.close ();  // закрытие соединения вывода с файлом
 
        //--------- Специальный блок для красоты ---------
 
        // С небольшой задержкой будут выведены 20 точек
        // одна за другой, как будто программа думает:
 
        cout << endl;
        for (int counter = 1; counter < 20; counter++)
        {
        Sleep(600);
        cout << ".";
        }
        cout << endl;
        //------------------------------------------------
        cout << endl;
        cout << "Данные были успешно сохранены.";
        cout << endl;
        cout << "(Примечание: если программа находится в режиме\n"
        "ожидания, нажмите клавишу Enter для продолжения работы).";
        cin.ignore();
    }
    else
    {
         cout << "\nВы отказались от сохранения данных в "
         "текстовый файл. Программа будет завершена.";
         goto endOfCode;     // отсылка к метке для перехода
    }
//=========================================================================
 
//=== Чтение данных введённых пользователем из файла music.txt на экран ===
    cout << endl << endl;
    cin.ignore(0, '\n');
 
    cout << "Желаете вывести введённые Вами данные "
            "из текстового файла? (да/нет): ";
    cin >> userAnswer;   // записываем ответ пользователя
    cin.ignore(1, '\n');
    cin.clear();
 
    if (userAnswer == 'д' || userAnswer == 'Д' ||
        userAnswer == 'y' || userAnswer == 'Y')
    {
        cout << "\nВы сохранили следующие данные в файле music.txt:\n";
        ifstream fin;               // создание объекта fin типа ifstream
 
        fin.open("music.txt");      // ассоциирование создание объекта fin
                                    // c файлом music.txt
 
        // используем созданный нами объект fin по аналогии с объектом cin
        for (int i=0; i<n; i++)
        {
            cout << "------------------------------" << endl;
            getline (fin, songs[i].artist);
            cout << songs[i].artist << endl << endl;
            fin.clear();
 
            getline (fin, songs[i].name);
            cout << songs[i].name << endl << endl;
            fin.clear();
 
            getline (fin, songs[i].genre);
            cout << songs[i].genre << endl << endl;
            fin.clear();
 
            fin >> songs[i].year;
            cout << songs[i].year << endl << endl;
            fin.clear();
 
            fin >>  songs[i].price;
            cout << songs[i].price << endl << endl;
            fin.ignore();
        }
        fin.close ();   // закрытие соединения ввода с файлом
    }
//======================================================================
    endOfCode:      // метка для перехода
 
    system("pause");    // для ожидания реакции пользователя
 
    return 0;   // успешное завершение программы
}

Строчки 169 и 170 в некоторых случаях необходимы, а в некоторых избыточны. Судя по всему, это зависит от выбора пользователя - смотря какое значение переменной n выбрал пользователь (количество дисков) и, соответственно, сколько символов \n попадёт в поток. Чтобы сделать всё это элегантнее, надо плотно заняться изучением стандартного потока ввода-вывода, операторов cin и cout и их методов cin.get(), getline(), cin.clear(), cin.ignore(). Ну да ладно, пока и так сойдёт.

Теперь осталось только поиск прикрутить.

Добавлено через 1 час 33 минуты
Вот с поиском. Правда пока не придумал как поиск в виде функции сделать, поэтому просто циклом for.
Ну и доделывать надо в плане этих недочётов с попаданием символа новой строки в поток - периодически всё-таки где-то, да выскакивают они.
Если кто-то может помочь отшлифовать код, буду благодарен. А то я уже что-то притомился.
Собственно, код:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
/// [url]https://www.cyberforum.ru/cpp-beginners/thread1220023.html[/url]
/*
Задача. Описать структуру MUSIC, которая содержит информацию о музыкальных
дисках, которые продаются в магазине:
 
1. название альбома;
2. исполнитель;
3. год создания альбома;
4. жанр;
5. цена диска;
 
Написать программу которая выполняет следующие действия:
 
1. Ввод с клавиатуры данных в массив, состоящий из шести элементов типа MUSIC;
2. Вывода данных на экран из массива структур;
3. Запись массива структур в текстовый файл и чтение данных из файла в массив
   структур;
4. Порядок записей по году создания альбома;
5. Организовать поиск дисков по жанру выполнения: у пользователя запрашивается
   жанр и выводятся все диски, соответствующие условию (сравнение проводить
   с помощью функции сравнения строк);
 
*/
 
// Подключаем заголовочные файлы:
#include <iostream>     // для ввода-вывода
#include <windows.h>    // для отображения русского языка
#include <string>       // для строк класса string
#include <fstream>      // для чтения из файла
#include <ostream>      // для вывода в файл
#include <algorithm>    // для сортировки и поиска
 
using namespace std;    // подключаем стандартное пространство имён
 
struct music        // объявление структуры music
{
    string artist;  // исполнитель
    string name;    // название альбома
    string genre;   // жанр
    int year;       // год издания
    double price;   // цена диска
};
 
// прототип функции сортировки:
bool isSecondGreater(const music& first, const music&  second)
{
    return second.year>first.year;
}
 
// прототип функции поиска:
// тут надо придумать как реализовать функцию поиска
// вместо того варианта поиска, что есть сейчас
 
music songs[6];  // создаём массив структур типа music (можно
                 // будет ввести данные не более чем для 6 дисков)
 
int main()  // функция main согласно стандарту C++ должна быть типа int
{
    SetConsoleCP(1251);       // для отображения в консоли русского языка
    SetConsoleOutputCP(1251); // для отображения в консоли русского языка
 
    int n;  // количество дисков
    cout << "Введите количество дисков, для которых Вы желаете\n"
            "ввести информацию (не более 6 дисков): ";
    cin >> n;
    cin.ignore();
 
    cout << endl;   // выводим на экран пустую строку для лучшего
                    // визуального восприятия текста
 
    if (n>6 || n<=0)
    {   // если пользователь ввёл неверное число, выводится уведомление
        // и программа завершается:
        cout << "Извините, данная реализация программы не расчитана на "
                "запись такого объёма данных.\n"
                "Максимальное количество дисков должно быть не более шести. "
                "Минимальное - один." << endl << endl;
 
        system("pause");    // для ожидания реакции пользователя
 
        return 0;   // успешное завершение программы
    }
 
    else
    {   // иначе выполняется следующий код:
        for (int i=0; i<n; i++)
        {
            cout << "\nВведите имя исполнителя: ";
            getline (cin, songs[i].artist);     // используем функцию getline
                                                // для чтения строк с пробелами
 
            cin.clear();    // очищаем поток от лишних символов новой строки,
                            // попадающих в поток с нажатием пользователем
                            // клавиши Enter
 
            cout << "Введите название диска: ";
            getline (cin, songs[i].name);
            cin.clear();
 
            cout << "Введите жанр: ";
            getline (cin, songs[i].genre);
            cin.clear();
 
            cout << "Введите год издания: ";
            cin >> songs[i].year;
            cin.clear();
 
            cout << "Введите цену диска: ";
            cin >>  songs[i].price;
            cin.ignore();
        }
 
//==============  Сортируем по годам ==============
 
        sort(songs, songs+n, isSecondGreater);
//=================================================
 
        for (int i=0;i<n;i++)
        {   // выводим введённые пользователем данные на экран
            cout << endl;
            cout << songs[i].artist << endl;
            cout << songs[i].name   << endl;
            cout << songs[i].genre  << endl;
            cout << songs[i].year   << endl;
            cout << songs[i].price  << endl;
            cout << endl;
        }
    }
 
//======= Запись данных введённых пользователем в файл music.txt =========
 
    char userAnswer;  // переменная для ответа пользователя
    cout << "\nЖелаете сохранить введённые Вами данные "
            "в текстовый файл? (да/нет): ";
    cin >> userAnswer;   // записываем ответ пользователя
    cin.ignore(1, '\n');
    cin.clear();
 
    // варианта утвердительного ответа, начинающиеся
    // на соответствующие символы:
    if (userAnswer == 'д' || userAnswer == 'Д' ||
        userAnswer == 'y' || userAnswer == 'Y')
    {
        cout << "\nВведённые Вами данные будут сохранены в файл music.txt.\n";
        ofstream fout;          // создание объекта fout типа ofstream
        fout.open("music.txt"); // ассоциирование объекта c файлом music.txt
 
        // используем созданный нами объект fout по аналогии с объектом cout
        for (int i=0;i<n;i++)
        {   // записываем введённые пользователем данные в файл music.txt
            fout << songs[i].artist << endl;
            fout << songs[i].name   << endl;
            fout << songs[i].genre  << endl;
            fout << songs[i].year   << endl;
            fout << songs[i].price  << endl;
        }
        fout.close ();  // закрытие соединения вывода с файлом
 
        //--------- Специальный блок для красоты ---------
 
        // С небольшой задержкой будут выведены 20 точек
        // одна за другой, как будто программа думает:
 
        cout << endl;
        for (int counter = 1; counter < 20; counter++)
        {
        Sleep(600);
        cout << "*";
        }
        cout << endl;
        //------------------------------------------------
        cout << endl;
        cout << "Данные были успешно сохранены.";
        cout << endl;
        cout << "\n(Примечание: если программа находится в режиме\n"
                "ожидания, нажмите клавишу Enter для продолжения"
                " работы).\n";
        cin.ignore();
    }
    else
    {
         cout << "\nВы отказались от сохранения данных в "
         "текстовый файл. Программа будет завершена.";
 
         system("pause");    // для ожидания реакции пользователя
 
         return 0;   // успешное завершение программы
    }
//=========================================================================
 
//=== Чтение данных введённых пользователем из файла music.txt на экран ===
    cout << endl << endl;
    cin.ignore();
 
    cout << "Желаете вывести введённые Вами данные "
            "из текстового файла? (да/нет): ";
    cin >> userAnswer;   // записываем ответ пользователя
    cin.ignore(1, '\n');
    cin.clear();
 
    if (userAnswer == 'д' || userAnswer == 'Д' ||
        userAnswer == 'y' || userAnswer == 'Y')
    {
        cout << "\nВы сохранили следующие данные в файле music.txt:\n";
        ifstream fin;               // создание объекта fin типа ifstream
 
        fin.open("music.txt");      // ассоциирование создание объекта fin
                                    // c файлом music.txt
 
        // используем созданный нами объект fin по аналогии с объектом cin
        for (int i=0; i<n; i++)
        {
            cout << "------------------------------" << endl;
            getline (fin, songs[i].artist);
            cout << songs[i].artist << endl << endl;
            fin.clear();
 
            getline (fin, songs[i].name);
            cout << songs[i].name << endl << endl;
            fin.clear();
 
            getline (fin, songs[i].genre);
            cout << songs[i].genre << endl << endl;
            fin.clear();
 
            fin >> songs[i].year;
            cout << songs[i].year << endl << endl;
            fin.clear();
 
            fin >>  songs[i].price;
            cout << songs[i].price << endl << endl;
            fin.ignore();
        }
        fin.close ();   // закрытие соединения ввода с файлом
    }
//=========================================================================
 
//====================== Поиск всех дисков по жанру =======================
    cout << "Поиск всех дисков по параметру \"жанр\"." << endl << endl;
    cin.clear();
    cout << "Введите название жанра для поиска: ";
    string wordForSearching;
    getline (cin, wordForSearching);
    cin.clear();
 
    for (int i=0; i<n; i++)
    {
        if(wordForSearching == songs[i].genre)
        {
            cout << endl;
            cout << songs[i].artist << endl;
            cout << songs[i].name   << endl;
            cout << songs[i].genre  << endl;
            cout << songs[i].year   << endl;
            cout << songs[i].price  << endl;
            cout << endl;
        }
        else
        {
            cout << "\nИдёт поиск.\n" << endl;
            for (int counter = 1; counter < 15; counter++)
            {
                Sleep(100);
                cout << "*";
            }
        }
 
 
    }
 
//=========================================================================
 
 
    cout << endl;
 
    system("pause");    // для ожидания реакции пользователя
 
    return 0;   // успешное завершение программы
}
1
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
01.07.2014, 19:14 43
Цитата Сообщение от gru74ik Посмотреть сообщение
И у Праты аналог моего userAnswer там именно char, а не string
Маленькая разница - сейчас это сравнение символа с символом:

C++
1
2
if (userAnswer == 'д' || userAnswer == 'Д' ||
        userAnswer == 'y' || userAnswer == 'Y')
И это правильно.

А в виденном мной варианте было:

C++
1
if (userAnswer == "д" || userAnswer == "Д" || userAnswer == "y" || userAnswer == "Y")
Это сравнение символа со строкой.

Добавлено через 1 час 4 минуты
"Застревает" в cin остаток ввода, если вводилось больше одного символа, по этому игнорировать надо все оставшееся:

C++
1
2
    cin.ignore(numeric_limits<streamsize>::max(), '\n');     
    cin.clear();
А в целом для начала - вполне
1
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
02.07.2014, 11:34 44
Окончательный (корректно работающий) вариант.
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
/// [url]https://www.cyberforum.ru/cpp-beginners/thread1220023.html[/url]
/*
Задача. Описать структуру MUSIC, которая содержит информацию о музыкальных
дисках, которые продаются в магазине:
 
1. название альбома;
2. исполнитель;
3. год создания альбома;
4. жанр;
5. цена диска;
 
Написать программу которая выполняет следующие действия:
 
1. ввод с клавиатуры данных в массив, состоящий из шести элементов типа MUSIC;
2. вывод данных на экран из массива структур;
3. запись массива структур в текстовый файл и чтение данных из файла в массив
   структур;
4. порядок записей по году создания альбома;
5. организовать поиск дисков по жанру выполнения: у пользователя запрашивается
   жанр и выводятся все диски, соответствующие условию (сравнение проводить
   с помощью функции сравнения строк);
*/
 
// Подключаем заголовочные файлы:
#include <iostream>     // для ввода-вывода
#include <windows.h>    // для отображения русского языка
#include <string>       // для строк класса string
#include <fstream>      // для чтения из файла
#include <ostream>      // для вывода в файл
#include <algorithm>    // для сортировки и поиска
 
using namespace std;    // подключаем стандартное пространство имён
 
struct music        // объявление структуры music
{
    string artist;  // исполнитель
    string name;    // название альбома
    string genre;   // жанр
    int year;       // год издания
    double price;   // цена диска
};
 
// прототип функции сортировки:
bool isSecondGreater(const music& first, const music&  second)
{
    return second.year>first.year;
}
 
music disc[6];  // создаём массив disc структур типа music (можно
                // будет ввести данные не более чем для 6 дисков)
 
int main()  // функция main согласно стандарту C++ должна быть типа int
{
    SetConsoleCP(1251);       // для отображения в консоли русского языка
    SetConsoleOutputCP(1251); // для отображения в консоли русского языка
 
 
//===== Ввод с клавиатуры данных в массив структур типа MUSIC =====
    int qty;        // количество дисков
    cout << "Введите количество дисков, для которых Вы желаете\n"
            "ввести информацию (не более 6 дисков): ";
    cin >> qty;     // пользователь вводит число
    cin.ignore();   // убираем лишние символы из потока
 
    cout << endl;   // выводим на экран пустую строку для лучшего
                    // визуального восприятия текста
 
    if (qty>6 || qty<=0)
    {   // если пользователь ввёл неверное число, выводится уведомление
        // и программа завершается:
        cout << "Извините, данная реализация программы не расчитана на "
                "запись такого объёма данных.\n"
                "Максимальное количество дисков должно быть не более шести. "
                "Минимальное - один." << endl << endl;
 
        system("pause");    // для ожидания реакции пользователя
 
        return 0;   // успешное завершение программы
    }
 
    else
    {   // иначе выполняется следующий код:
        for (int i=0; i<qty; i++)
        {
            cout << "\nВведите имя исполнителя: ";
            getline (cin, disc[i].artist);  // используем функцию getline
                                            // для чтения строк с пробелами
 
            cin.clear();    // очищаем поток от лишних символов новой строки,
                            // попадающих в поток с нажатием пользователем
                            // клавиши Enter
 
            cout << "Введите название диска: ";
            getline (cin, disc[i].name);
            cin.clear();
 
            cout << "Введите жанр: ";
            getline (cin, disc[i].genre);
            cin.clear();
 
            cout << "Введите год издания: ";
            cin >> disc[i].year;
            cin.clear();
 
            cout << "Введите цену диска: ";
            cin >>  disc[i].price;
            cin.ignore();
        }
//=================================================================
 
 
//====================== Сортируем по годам =======================
        sort(disc, disc+qty, isSecondGreater);
//=================================================================
 
 
//=========== Вывод данных на экран из массива структур ===========
        for (int i=0; i<qty; i++)
        {
            cout << endl;
            cout << disc[i].artist << endl;
            cout << disc[i].name   << endl;
            cout << disc[i].genre  << endl;
            cout << disc[i].year   << endl;
            cout << disc[i].price  << endl;
            cout << endl;
        }
    }
//=================================================================
 
//==== Запись данных введённых пользователем в файл music.txt =====
 
    char userAnswer;  // переменная для ответа пользователя
    cout << "\nЖелаете сохранить введённые Вами данные "
            "в текстовый файл? (да/нет): ";
    cin >> userAnswer;   // записываем ответ пользователя
    cin.ignore(1, '\n');
    cin.clear();
 
    // варианта утвердительного ответа, начинающиеся
    // на соответствующие символы:
    if (userAnswer == 'д' || userAnswer == 'Д' ||
        userAnswer == 'y' || userAnswer == 'Y')
    {
        cout << "\nВведённые Вами данные будут "
                "сохранены в файл music.txt.\n";
        ofstream fout;          // создание объекта fout типа ofstream
        fout.open("music.txt"); // ассоциирование объекта c файлом music.txt
 
        // используем созданный нами объект fout по аналогии с объектом cout
        for (int i=0; i<qty; i++)
        {   // записываем введённые пользователем данные в файл music.txt
            fout << disc[i].artist << endl;
            fout << disc[i].name   << endl;
            fout << disc[i].genre  << endl;
            fout << disc[i].year   << endl;
            fout << disc[i].price  << endl;
        }
        fout.close ();  // закрытие соединения вывода с файлом
 
        //--------- Специальный блок для красоты ---------
 
        // С небольшой задержкой будут выведены 20 точек
        // одна за другой, как будто программа думает:
 
        cout << endl;
        for (int i=0; i<20; i++)
        {
        Sleep(600);
        cout << "*";
        }
        cout << endl;
        //------------------------------------------------
 
        cout << endl;
        cout << "Данные были успешно сохранены.";
        cout << endl;
        cout << "\n(Примечание: если программа находится в режиме\n"
                "ожидания, нажмите клавишу Enter для продолжения"
                " работы).\n";
        cin.ignore();
    }
    else
    {
         cout << "\nВы отказались от сохранения данных в "
         "текстовый файл. Программа будет завершена.";
 
         system("pause");    // для ожидания реакции пользователя
 
         return 0;   // успешное завершение программы
    }
//=========================================================================
 
//=== Чтение данных введённых пользователем из файла music.txt на экран ===
    cout << endl << endl;
    cin.ignore();
 
    cout << "Желаете вывести введённые Вами данные "
            "из текстового файла? (да/нет): ";
    cin >> userAnswer;   // записываем ответ пользователя
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cin.clear();    // очистка буфера после ввода
 
    if (userAnswer == 'д' || userAnswer == 'Д' ||
        userAnswer == 'y' || userAnswer == 'Y')
    {
        cout << "\nВы сохранили следующие данные в файле music.txt:\n";
        ifstream fin;               // создание объекта fin типа ifstream
 
        fin.open("music.txt");      // ассоциирование создание объекта fin
                                    // c файлом music.txt
 
        // используем созданный нами объект fin по аналогии с объектом cin
        for (int i=0; i<qty; i++)
        {
            cout << "------------------------------" << endl;
            getline (fin, disc[i].artist);
            cout << disc[i].artist << endl << endl;
            fin.clear();
 
            getline (fin, disc[i].name);
            cout << disc[i].name << endl << endl;
            fin.clear();
 
            getline (fin, disc[i].genre);
            cout << disc[i].genre << endl << endl;
            fin.clear();
 
            fin >> disc[i].year;
            cout << disc[i].year << endl << endl;
            fin.clear();
 
            fin >>  disc[i].price;
            cout << disc[i].price << endl << endl;
            fin.ignore();
        }
        fin.close ();   // закрытие соединения ввода с файлом
    }
//=========================================================================
 
//====================== Поиск всех дисков по жанру =======================
    cout << "Поиск всех дисков по параметру \"жанр\"." << endl << endl;
 
    cout << "Введите название жанра для поиска: ";
    string keyword;     // пользователь вводит ключевое слово для поиска
    getline (cin, keyword);
    cin.clear();
 
    for (int i=0; i<qty; i++)
    {   // сравнение строки, содержащей ключевое слово, со строкой,
        // содержащей название жанра для данного диска
        keyword.compare( disc[i].genre );
        if (keyword == disc[i].genre)
        {   // если результат сравнения истина (строки совпали), то
            // вывести данные о диске:
            cout << endl;
            cout << disc[i].artist << endl;
            cout << disc[i].name   << endl;
            cout << disc[i].genre  << endl;
            cout << disc[i].year   << endl;
            cout << disc[i].price  << endl;
            cout << endl;
        }
        else
        {   // иначе продолжать поиск:
            cout << "\nИдёт поиск.\n" << endl;
            for (int i=0; i<15; i++)
            {
                Sleep(100);
                cout << "*";
            }
        }
    }
    cout << endl;
//=========================================================================
 
    system("pause");    // для ожидания реакции пользователя
 
    return 0;           // успешное завершение программы
}
0
02.07.2014, 11:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2014, 11:34
Помогаю со студенческими работами здесь

Как реализовать структуру?
Есть две структуры студент и комната в которой он проживает. Как лучше реализовать ситуацию?...

Реализовать структуру Student
HELP GUYS :help: Следующие задания требуется решить с использованием классов.При этом...

Как реализовать структуру на js?
struct klass { char name; char klass_name; float bal; }; как реализовать такое на js и...

Как лучше реализовать структуру класса?
Есть задача создать класс авто-архив. Класс реализовал со структурой внутри класса. Создал...


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

Или воспользуйтесь поиском по форуму:
44
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru