2.1.1问题描述 建立一个供个人使用的音乐信息管理系统,用于存储、管理和快速查找歌曲信息;能够生成收藏夹和按歌名排序的播放列表。 2.1.2分析与设计提示 1.歌曲信息 音乐信息可能包括两方面的内容。 (1)音乐的基本信息,如名称、演唱者、创作者等 (2)根据个人查找偏好的查找信息,如类别、年份、喜爱程度、曲风等。 2.功能设计 作为一个乐库管理系统,最基本的功能如下。 (1)歌曲的增、删、改。通过这些操作更新乐库。 (2)歌曲查找。查找功能需考虑到用户的多种需求,如按演唱者查找、按歌名查找、按类别查找或多条件组合查找 (3)歌曲浏览。该功能可能是总歌单浏览,也可能是查找后的歌曲浏览。总歌单浏览可以显示歌曲的所有信息,也可以显示部分信息。 如果提供收藏夹功能,需考虑收藏夹的创建,在收藏夹中增、删、查歌 曲等功能。 除上述功能外,用户根据乐库管理的需求增设其他功能。例如,按查找次数形成热门歌单等。 3.存储设计 每一首歌曲有多个属性,查找时按关键字查找,关键字由用户的查找偏好决定。存储设计既要考虑歌曲信息管理的方便,也需考虑到查找的需要。用c++写
时间: 2024-03-27 22:39:39 浏览: 110
一个音乐信息管理系统的存储设计可以采用面向对象的方式进行设计。我们可以定义一个Song类用来表示每一首歌曲的信息,并在该类中定义各种属性和操作方法。同时,我们还可以设计一个MusicLibrary类用来管理所有的歌曲信息。
下面是一个简单的示例代码:
```c++
class Song {
private:
string name; // 歌曲名称
string artist; // 歌曲演唱者
string composer; // 歌曲作曲者
string category; // 歌曲类别
int year; // 歌曲发行年份
int favoriteLevel; // 歌曲喜爱程度
string style; // 歌曲曲风
int playCount; // 歌曲播放次数
public:
// 构造函数
Song(string name, string artist, string composer, string category, int year, int favoriteLevel, string style, int playCount) {
this->name = name;
this->artist = artist;
this->composer = composer;
this->category = category;
this->year = year;
this->favoriteLevel = favoriteLevel;
this->style = style;
this->playCount = playCount;
}
// 获取歌曲名称
string getName() {
return this->name;
}
// 获取歌曲演唱者
string getArtist() {
return this->artist;
}
// 获取歌曲作曲者
string getComposer() {
return this->composer;
}
// 获取歌曲类别
string getCategory() {
return this->category;
}
// 获取歌曲发行年份
int getYear() {
return this->year;
}
// 获取歌曲喜爱程度
int getFavoriteLevel() {
return this->favoriteLevel;
}
// 获取歌曲曲风
string getStyle() {
return this->style;
}
// 获取歌曲播放次数
int getPlayCount() {
return this->playCount;
}
// 增加歌曲播放次数
void addPlayCount() {
this->playCount++;
}
// 修改歌曲信息
void modifySong(string name, string artist, string composer, string category, int year, int favoriteLevel, string style) {
this->name = name;
this->artist = artist;
this->composer = composer;
this->category = category;
this->year = year;
this->favoriteLevel = favoriteLevel;
this->style = style;
}
};
class MusicLibrary {
private:
vector<Song> songs; // 存储所有歌曲信息
public:
// 添加歌曲
void addSong(Song song) {
songs.push_back(song);
}
// 删除歌曲
void deleteSong(string name) {
for (int i = 0; i < songs.size(); i++) {
if (songs[i].getName() == name) {
songs.erase(songs.begin() + i);
break;
}
}
}
// 修改歌曲信息
void modifySong(string name, string artist, string composer, string category, int year, int favoriteLevel, string style) {
for (int i = 0; i < songs.size(); i++) {
if (songs[i].getName() == name) {
songs[i].modifySong(name, artist, composer, category, year, favoriteLevel, style);
break;
}
}
}
// 按歌名查找歌曲
Song* searchBySongName(string name) {
for (int i = 0; i < songs.size(); i++) {
if (songs[i].getName() == name) {
return &songs[i];
}
}
return NULL;
}
// 按演唱者查找歌曲
vector<Song> searchByArtist(string artist) {
vector<Song> result;
for (int i = 0; i < songs.size(); i++) {
if (songs[i].getArtist() == artist) {
result.push_back(songs[i]);
}
}
return result;
}
// 按类别查找歌曲
vector<Song> searchByCategory(string category) {
vector<Song> result;
for (int i = 0; i < songs.size(); i++) {
if (songs[i].getCategory() == category) {
result.push_back(songs[i]);
}
}
return result;
}
// 按多条件组合查找歌曲
vector<Song> searchByConditions(string artist, string category, int year, string style) {
vector<Song> result;
for (int i = 0; i < songs.size(); i++) {
if ((artist == "" || songs[i].getArtist() == artist) &&
(category == "" || songs[i].getCategory() == category) &&
(year == -1 || songs[i].getYear() == year) &&
(style == "" || songs[i].getStyle() == style)) {
result.push_back(songs[i]);
}
}
return result;
}
// 按歌名排序
void sortByName() {
sort(songs.begin(), songs.end(), [](Song a, Song b) {return a.getName() < b.getName();});
}
// 生成收藏夹
vector<Song> generatePlaylist(vector<string> songNames) {
vector<Song> result;
for (int i = 0; i < songNames.size(); i++) {
Song* song = searchBySongName(songNames[i]);
if (song != NULL) {
result.push_back(*song);
}
}
return result;
}
// 按播放次数生成热门歌单
vector<Song> generateHotlist(int count) {
vector<Song> result = songs;
sort(result.begin(), result.end(), [](Song a, Song b) {return a.getPlayCount() > b.getPlayCount();});
if (count < result.size()) {
result.erase(result.begin() + count, result.end());
}
return result;
}
};
```
在这个示例中,我们定义了一个Song类用来表示每一首歌曲的信息,并在该类中定义了各种属性和操作方法。同时,我们还定义了一个MusicLibrary类用来管理所有的歌曲信息。通过该类的各种方法,我们可以实现歌曲的增、删、改、查找、排序、收藏等功能,并且可以根据不同的需求生成不同的歌单。
阅读全文