Application.h
8.73 KB
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
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
#ifndef _APPLICATION_H
#define _APPLICATION_H
#include <iostream>
#include <fstream>
#include <string>
#include<sstream>
using namespace std;
#include "MusicType.h"
#include"SortedLinkedList.h"
#include"GenreType.h"
#include"AlbumType.h"
#include"ArtistType.h"
#include"ManageType.h"
#include"UnSortedLinkedList.h"
#include"PLType.h"
#define FILENameSIZE 1024
/**
* application class for item management simply.
*/
class Application
{
public:
/**
* default constructor.
*/
Application()
{
m_Command = 0;
RemakeAlbumList = true;
RemakeArtistList = true;
RemakeGenreList = true;
NumofPL = 0;
}
/**
* destructor.
*/
~Application()
{
DoublyIter<ArtistType> Atiter(ArtistList);
while (Atiter.NotNull())
{
ArtistType* Atptr = Atiter.GetCurrentPtr();
Atptr->MakeEmptyListinList();
Atiter.Next();
}
m_List.MakeEmpty();
GenreList.MakeEmpty();
AlbumList.MakeEmpty();
};
/**
* @brief Program driver.
* @pre program is started.
* @post program is finished.
*/
void Run();
/**
* @brief Display command on screen and get a input from keyboard.
* @pre none.
* @post none.
* @return user's command.
*/
int GetCommand();
/**
* @brief Add new record into list.
* @pre list should be initialized.
* @post new record is added into the list.
* @return return 1 if this function works well, otherwise 0.
*/
int AddMusic();
/**
* @brief Display all records in the list on screen.
* @pre none.
* @post none.
*/
void DisplayAllMusic();
/**
* @brief Open a file by file descriptor as an input file.
* @pre a file for reading is exist.
* @post open the file for reading.
* @param fileName a fileName to open for reading.
* @return return 1 if this function works well, otherwise 0.
*/
int OpenInFile(char *fileName);
/**
* @brief Open a file by file descriptor as an output file.
* @pre list should be initialized.
* @post open the file for writing.
* @param fileName a fileName to open for writing.
* @return return 1 if this function works well, otherwise 0.
*/
int OpenOutFile(char *fileName);
/**
* @brief Open a file as a read mode, read all data on the file, and set list by the data.
* @pre The file is not opened.
* @post list holds all records from the file.
* @return return 1 if this function works well, otherwise 0.
*/
int ReadDataFromFile();
/**
* @brief Open a file as a write mode, and write all data into the file,
* @pre The file is not opened.
* @post the list is stored in the output file.
* @return return 1 if this function works well, otherwise 0.
*/
int WriteDataToFile();
/**
* @brief 객체를 생성 후, 문자열을 입력받는다.
* @pre 없다.
* @post SearchByName함수에 문자열이 설정된 객체를 전달한다.
* @return 없다.
*/
void RetreiveRecordByName();
/**
* @brief inData의 이름 부분을 포함하는 문자열을 찾아 출력한다.
* @pre inData의 이름 부분이 초기화되어있어야 한다.
* @post inData에 알맞은 항목이 복사된다.
* @param inData 이름이 설정되어있고 나머지는 비어있는 Musictype
* @return 없다.
*/
void SearchByName(MusicType &inData);
/**
* @brief 객체를 생성 후, 문자열을 입력받는다.
* @pre 없다.
* @post SearchBySinger함수에 문자열이 설정된 객체를 전달한다.
* @return 없다.
*/
void RetreiveRecordBySinger();
/**
* @brief inData의 이름 부분을 포함하는 문자열을 찾아 출력한다.
* @pre inData의 이름 부분이 초기화되어있어야 한다.
* @post inData에 알맞은 항목이 복사된다.
* @param inData 이름이 설정되어있고 나머지는 비어있는 Musictype
* @return 없다.
*/
void SearchBySinger(MusicType &inData);
/**
* @brief 객체를 생성 후, 문자열을 입력받는다.
* @pre 없다.
* @post SearchByAlbum함수에 문자열이 설정된 객체를 전달한다.
* @return 없다.
*/
void RetreiveRecordByAlbum();
/**
* @brief inData의 이름 부분을 포함하는 문자열을 찾아 출력한다.
* @pre inData의 이름 부분이 초기화되어있어야 한다.
* @post inData에 알맞은 항목이 복사된다.
* @param inData 이름이 설정되어있고 나머지는 비어있는 Musictype
* @return 없다.
*/
void SearchByAlbum(MusicType &inData);
/**
* @brief 객체를 생성 후, 문자열을 입력받는다.
* @pre 없다.
* @post SearchByGenre함수에 문자열이 설정된 객체를 전달한다.
* @return 없다.
*/
void RetreiveRecordByGenre();
/**
* @brief inData의 이름 부분을 포함하는 문자열을 찾아 출력한다.
* @pre inData의 이름 부분이 초기화되어있어야 한다.
* @post inData에 알맞은 항목이 복사된다.
* @param inData 이름이 설정되어있고 나머지는 비어있는 Musictype
* @return 없다.
*/
void SearchByGenre(MusicType &inData);
/**
* @brief inData의 Index와 같은 Index를 가진 MusicList의 정보를 찾아온다
* @pre inData의 Index가 초기화 되어 있어야 한다.
* @post inData에 알맞은 항목이 복사된다.
* @param inData Index가 설정되어있고 나머지는 비어있는 Musictype
* @return 없다.
*/
void SearchByIndex(MusicType &indata);
/**
* @brief 사용자에게 Name을 입력받아 SortedList의 Delete함수에 넘겨주는 역할을 한다.
* @pre 없다.
* @post 사용자가 입력한 Name을 가지고 있는 Musictype이 m_List에서 사라진다.
* @return 없다.
*/
void Delete();
/**
* @brief 사용자에게 Name을 입력받아 SortedList의 Replace함수에 넘겨주는 역할을 한다.
* @pre 없다.
* @post 사용자가 입력한 Name을 가지고 있는 MusicType을 다시 입력받아 갱신한다.
* @return 없다.
*/
void Update();
/**
* @brief 최근에 추가된 30곡의 자세한 정보를 화면에 출력
* @pre 없다.
* @post 없다.
* @return 없다.
*/
void DIsplayNewMusic();
/**
* @brief Primary key를 이용해 원하는 음악정보가져온다.
* @pre 리스트가 초기화되어야함.
* @post inData에 원하는 곡정보가 담김
* @return 찾으면 1, 아니면 0
* @param key 곡번호를 찾기위한 int형 변수
* @inData 원하는 곡의 정보를 받아오기 위한 변수
*/
bool Search(int key, MusicType& inData);
/**
* @brief 장르 리스트에 있는 곡들을 장르에 맞춰 출력
* @pre 없다.
* @post 없다.
* @return 없다.
*/
void DisplayMusicbyGenre();
/**
* @brief 객체를 생성 후, 문자열을 입력받는다.
* @pre 없다.
* @post SearchByNameNGenre함수에 문자열이 설정된 객체를 전달한다.
* @return 없다.
*/
void RetreiveRecordByNameNGenre();
/**
* @brief inData의 이름 부분을 포함하는 문자열을 찾아 출력한다.
* @pre inData의 이름 부분이 초기화되어있어야 한다.
* @post inData에 알맞은 항목이 복사된다.
* @param inData 이름이 설정되어있고 나머지는 비어있는 Musictype
* @return 없다.
*/
void SearchByNameNGenre(MusicType &inData);
/**
* @brief MusicList에 있는 곡을 앨범별로 출력한다.
* @pre 없다.
* @post 없다.
* @return 없다.
*/
void DisplayMusicByAlbum();
/**
* @brief MusicList에 있는 곡을 아티스트별로 나누고, 각 아티스트별 로 앨범을 분류하여 출력한다.
* @pre 없다.
* @post 없다.
* @return 없다.
*/
void DisplayMusicByArtist();
/**
* @brief MusicList에 있는 곡을 Primary Key에 따라 정렬된 순서에 따라 Index를 부여한다
* @pre MusicList에 최소한 하나이상의 곡이 있어야한다.
* @post MusicList의 각 MusicType에 Index가 부여된다
* @return 없다.
*/
void SetMusicIndex();
/**
* @brief MusicList의 Music을 분류하는 하위리스트들을 다시 만들기 위한 조건을 충족시킨다.
* @pre 곡이 추가되거나, 삭제되거나, 변경되어야 한다.
* @post Remake~~List 형의 변수의 값이 모두 true가 된다.
* @return 없다.
*/
void RemakeSubList()
{
RemakeAlbumList = true;
RemakeArtistList = true;
RemakeGenreList = true;
};
void makePlayList();
void AddMusicInPL();
void PrintPL();
private:
ifstream m_InFile; ///< input file descriptor.
ofstream m_OutFile; ///< output file descriptor.
SortedLinkedList<MusicType> m_List; /// 노래 리스트
UnSortedLinkedList<ManageType> mg_List;
int m_Command; ///< current command number.
SortedLinkedList<AlbumType> AlbumList; //앨범을 분류하기 위한 앨범리스트
SortedLinkedList<ArtistType> ArtistList; //아티스트를 분류하기 위한 아티스트리스트
SortedLinkedList <string> GenreList; //장르를 분류하기 위한 장르 리스트
UnSortedLinkedList<PLType> PlayLists;
//아래의 변수들은 각 하위 리스트를 다시만들어야 할지 판별하는 변수이다.
bool RemakeAlbumList;
bool RemakeArtistList;
bool RemakeGenreList;
int NumofPL;
};
#endif // _APPLICATION_H