C语言是面向过程的编程语言,而C++是面向对象的编程语言,在书写代码时风格有所不同(也存在很多共性)。
程序说明
本次系统程序使用的是C++语言进行编写,主要考虑怎么实现面向对象的问题。
因为本次程序属于小型系统程序,所以采用两个源文件实现(不考虑头文件的使用)
①使用两个类(一个用来存放数据成员,另一个用来封装成员函数以完成功能的实现)
②书写菜单相关的代码(页面展示、判断进程等)
该程序的名字为“歌单信息管理系统”,主要采用“增删改查”的形式实现。使用的数据成员有:歌曲名字、歌手名字、歌曲的发布时间、专辑唱片、自定义代号。对于目前的娱乐方式来说,“听歌”有着不可替代的作用。歌曲可以用来烘托氛围,也可以是用来治愈心灵......
数据存储
采用文本存储数据(也可以用数据库实现数据存储)
首先准备txt文本文件(txt文本作为数据信息的载体),接着编写读写过程,最后合理调用读写函数。
在文本文件中的格式:每一首歌曲信息占一行;每一条数据使用空格隔开(如下图所示)
代码实现
1.菜单功能实现
#include"iostream"
#include"辅助.cpp"
#include"string"
using namespace std;
void menu() {//菜单功能(展示需要使用的几个功能)
system("cls");
cout << "\t\t\t************************************************" << endl;
cout << "\t\t\t******************歌单信息管理******************" << endl;
cout << "\t\t\t************************************************" << endl;
cout << "\t\t\t****************1.歌曲信息录入******************" << endl;
cout << "\t\t\t************************************************" << endl;
cout << "\t\t\t****************2.歌单信息显示******************" << endl;
cout << "\t\t\t************************************************" << endl;
cout << "\t\t\t****************3.歌曲查询**********************" << endl;
cout << "\t\t\t************************************************" << endl;
cout << "\t\t\t****************4.歌曲信息修改******************" << endl;
cout << "\t\t\t************************************************" << endl;
cout << "\t\t\t****************5.歌曲删除**********************" << endl;
cout << "\t\t\t************************************************" << endl;
cout << "\t\t\t****************6.歌曲总数量********************" << endl;
cout << "\t\t\t************************************************" << endl;
cout << "\t\t\t****************0.退出并保存********************" << endl;
cout << "\t\t\t************************************************" << endl;
cout << "\t\t\t输入你的选择【0 - 6】:";
}
MusicList ml; //使用一个类封装的变量方便进行调用
void add() {//添加歌单的歌曲
system("cls");
cout << "\t\t\t*********************************************" << endl;
cout << "\t\t\t* 欢迎来到歌曲信息录入功能界面 *" << endl;
cout << "\t\t\t*********************************************" << endl;
cout << "\n\n" << endl;
int select1, n;
cout << "\t\t\t\t《是否要录入歌曲信息?》 " << endl;
cout << "\t\t\t *********************************************" << endl;
cout << "\t\t\t **** 1 是 2 否 ****" << endl;
cout << "\t\t\t *********************************************" << endl;
cout << "\t\t\t输入你的选择【1 or 2】:";
cin >> select1;
while (select1 < 1 || select1 > 2) {
cout << "\t\t\t输入错误,请重新输入你的选择【1 or 2】:";
cin >> select1;
}
if (select1 == 2) {
return;
}
else if (select1 == 1) {
while (1) { //整体输入的循环操作
cout << "请输入需录取歌曲的数目:";
cin >> n;
for (int i = 0; i < n; i++) {
cout << "请输入第" << i + 1 << "首歌曲信息:" << endl;
string song, name, time, album, id;
cout << "请输入歌曲名字:";
cin >> song;
cout << "请输入歌手名字:";
cin >> name;
cout << "请输入歌曲发布时间:";
cin >> time;
cout << "请输入歌曲所属专辑:";
cin >> album;
cout << "请输入歌曲自定义代号:";
while (1) { //虽然是自定义的代号,也需要确定代号的唯一性,此处循环的作用
cin >> id;
Music mi = ml.findById(id); //定义mi变量用来存储查找的数据
if (mi.getId() != "") {
cout << "此代号已存在,请重新输入:";
}else {
Music m(song, name, time, album, id); //定义一个m变量存储输入的数据
ml.addMusic(m);
cout << "已完成本歌曲的录入\n" << endl;
system("pause"); cout << endl;
break;//输入完成就结束
}
}
}
int select2;
system("cls");
cout << "\n\n" << endl; //考虑是否继续添加数据
cout << "\t\t\t ************是否继续录入歌曲信息*************" << endl;
cout << "\t\t\t *********************************************" << endl;
cout << "\t\t\t ** 1 确定 2 放弃 **" << endl;
cout << "\t\t\t *********************************************" << endl;
cout << "\t\t\t输入你的选择【1 or 2】:";
cin >> select2;
while (select2 < 1 || select2>2){
cout << "\t\t\t输入错误,请重新输入你的选择【1 or 2】:";
cin >> select2;
}
if (select2 == 2){
return;
}
}
}
}
void show() {//歌单的显示功能
system("cls");
cout << "\t\t\t*********************************************" << endl;
cout << "\t\t\t* 欢迎来到个人歌单信息显示功能界面 *" << endl;
cout << "\t\t\t*********************************************" << endl;
cout << "\n\n" << endl;
ml.show(); //直接调用打印显示的函数
}
void search() {//歌单搜索歌曲的功能
while (1) {
system("cls");
cout << "\t\t\t*********************************************" << endl;
cout << "\t\t\t* 欢迎来到个人歌单信息查询功能界面 *" << endl;
cout << "\t\t\t*********************************************" << endl;
cout << endl; cout << endl;
while (1) {
cout << "1.按照歌曲查找\n2.按照歌手查找\n3.按照专辑查询\n4.按照代号查询\n5.退出" << endl;
cout << endl;
cout << "请输入你的选择:";
int flag;
cin >> flag;
while (flag < 1 || flag > 5) { //必须输入的选项是在1-5的范围才能够正常运行
cout << "\t\t\t输入错误,请重新输入你的选择【1 - 5】:";
cin >> flag;
}
if (flag == 1) { //按照歌曲的名字进行查找
system("cls");
cout << "请输入查找的歌曲:";
string song;
cin >> song;
MusicList mlt = ml.findBySong(song); //调用查找函数并把数据存储在mlt
if (mlt.getCount() != 0)
mlt.show();
else
cout << "查无此歌曲" << endl;
system("pause");
break;
}
else if (flag == 2) { //按照歌手的名字进行查找
system("cls");
cout << "请输入查找的歌手:";
string name;
cin >> name;
MusicList mlt = ml.findByName(name); //调用查找函数并把数据存储在mlt
if (mlt.getCount() != 0)
mlt.show();
else
cout << "查无此歌手" << endl;
system("pause");
break;
}
else if (flag == 3) { //按照专辑进行查找
system("cls");
cout << "请输入查找的专辑:";
string album;
cin >> album;
MusicList mlt = ml.findByAlbum(album); //调用查找函数并把数据存储在mlt
if (mlt.getCount() != 0)
mlt.show();
else
cout << "查无此专辑" << endl;
system("pause");
break;
}
else if (flag == 4) { //按照代号来进行查找
system("cls");
cout << "请输入查找的代号:";
string id;
cin >> id;
Music m = ml.findById(id); //比对存放的数据是否和目前输入的一样
if (m.getId() != "") //如果不是空的就说明存在数据并且给它输出
m.show();
else
cout << "查无此代号" << endl;
system("pause");
break;
}
else {
return; //退出功能代码
}
}
}
}
void modify() {//歌单中歌曲的修改功能
while (1) {
system("cls");
cout << "\t\t\t*********************************************" << endl;
cout << "\t\t\t* 欢迎来到个人歌单信息修改功能界面 *" << endl;
cout << "\t\t\t*********************************************" << endl;
cout << endl; cout << endl;
cout << "请输入准备修改的歌曲代号(输入#可退出):";
string song, name, time, album, id;
cin >> id;
Music m = ml.findById(id); //先比对歌曲是否正确(存在)
if (id == "#") { return; }
else if (m.getId() != "") {
cout << "此歌曲识别已存在" << endl;
m.show(); //存在就展示歌曲信息
cout << "请输入修改的歌曲名字:";
cin >> song;
cout << "请输入修改的歌手名字:";
cin >> name;
cout << "请输入修改的发布时间:";
cin >> time;
cout << "请输入修改的专辑名称:";
cin >> album;
Music m(song, name, time, album, id); //将信息存储在m里面,并调用函数进行修改操作
ml.modify(m);
int select2;
cout << "\t\t\t************是否继续修改歌曲信息*************" << endl;
cout << "\t\t\t*********************************************" << endl;
cout << "\t\t\t** 1 确定 2 放弃 **" << endl;
cout << "\t\t\t*********************************************" << endl;
cout << "\t\t\t输入你的选择【1 or 2】:";
cin >> select2;
while (select2 < 1 || select2>2){
cout << "\t\t\t输入错误,请重新输入你的选择【1 or 2】:";
cin >> select2;
}
if (select2 == 2){
return;
}
else if (select2 == 1) {
system("cls");
cout << endl; cout << endl;
}
}else { //歌曲如果不存在就显示“查无此歌曲”
cout << "查无此歌曲,请你重新输入" << endl;
cout << endl;
system("pause");
cout << "\n" << endl;
}
}
}
void del() {//歌单中歌曲的删除功能
while (1) {
system("cls");
cout << "\t\t\t*********************************************" << endl;
cout << "\t\t\t* 欢迎来到个人歌单信息删除功能界面 *" << endl;
cout << "\t\t\t*********************************************" << endl;
cout << endl; cout << endl;
cout << "1.按照歌曲代号查找\n2.退出" << endl;
cout << endl;
cout << "请输入你的选择:";
int flag1;
cin >> flag1;
while (flag1 < 1 || flag1>2){
cout << "输入错误,请重新输入你的选择【1 or 2】:";
cin >> flag1;
}
if (flag1 == 2) {
return;
}else{
system("cls");
cout << "请输入查找的歌曲代号:";
string id;
cin >> id;
Music m = ml.findById(id); //比对歌曲的代号
if (m.getId() != "") {
cout << "存在此代号歌曲:" << endl;
m.show(); //存在就显示歌曲的信息
int select5;
cout << "\t\t\t\t《是否要删除歌曲信息?》 " << endl;
cout << "\t\t\t *********************************************" << endl;
cout << "\t\t\t **** 1 是 2 否 ****" << endl;
cout << "\t\t\t *********************************************" << endl;
cout << "\t\t\t输入你的选择【1 or 2】:";
cin >> select5;
while (select5 < 1 || select5 > 2) {
cout << "\t\t\t输入错误,请重新输入你的选择【1 or 2】:";
cin >> select5;
}
if (select5 == 1) {
cout << "已删除成功" << endl;
system("pause");
ml.delMusic(id); //调用删除函数进行操作
}else{
cout << "已取消删除" << endl;
system("pause"); //停顿用来显示“已取消删除”
}
}else {
cout << "不存在此代号的歌曲!" << endl;
cout << endl;cout << endl;
cout << endl;cout << endl;
system("pause"); //停顿用来显示“不存在此代号的歌曲”
}
}
}
}
void getCount() {
system("cls");
cout << "\t\t\t*********************************************" << endl;
cout << "\t\t\t* 欢迎来到个人歌单信息统计功能界面 *" << endl;
cout << "\t\t\t*********************************************" << endl;
cout << endl; cout << endl;
cout << "总共:【" << ml.getCount() << "】首歌" << endl; //直接调用函数展示歌曲数目
cout << endl; cout << endl;
}
int main() {
int n = 7;
while (n) {
menu(); //调用主菜单函数进入选择界面
cin >> n;//输入编号选择相应的功能
switch (n){
case 1:add(); break;
case 2:show(); break;
case 3:search(); break;
case 4:modify(); break;
case 5:del(); break;
case 6:getCount(); break;
case 0:ml.writeFile();
}
system("pause");
}
}
2.封装
#include"iostream"
#include"string"
#include"fstream"
using namespace std;
class Music {
string song, name, time, album, id;//歌曲、歌手、发布时间、专辑唱片、代号
public:
Music() {}//默认构造函数
Music(string song, string name, string time, string album, string id) ://构造函数初始化列表
song(song), name(name), time(time), album(album), id(id) {}
string getSong() { return song; }//信息数据的获取
void setSong(string song) { this->song = song; }//this指针区分不同对象的成员变量
string getName() { return name; }
void setName(string name) { this->name = name; }
string getTime() { return time; }
void setTime(string time) { this->time = time; }
string getAlbum() { return album; }
void setAlbum(string album) { this->album = album; }
string getId() { return id; }
void setId(string id) { this->id = id; }
void show() {//显示的模版show
cout << "歌曲:" << song << endl;
cout << "歌手:" << name << endl;
cout << "发布时间:" << time << endl;
cout << "专辑:" << album << endl;
cout << "代号:" << id << endl;
cout << "------------------------" << endl;
}
friend ostream& operator<<(ostream& out, const Music& o) {
out << o.song << "\t" << o.name << "\t" << o.time << "\t" << o.album << "\t" << o.id;
return out;
}
friend istream& operator>>(istream& in, Music& o) {
in >> o.song >> o.name >> o.time >> o.album >> o.id;
return in;
}//运算符重载
};
class MusicList {
Music mus[1024];//定义一个数组大小存储数据
int count;
string filename;
public:
MusicList(string filename = "music.txt") :filename(filename), count(0) {
readFile();//读取文件操作
}
~MusicList() {
writeFile();//写入文件操作
}
int getCount() {//统计总人数
return count;
}
void addMusic(Music s) {
mus[count++] = s;//随着添加的使用,人数也跟着增加
}
void show() {
for (int i = 0; i < count; i++) {
mus[i].show();//显示(打印显示)把所有的数据都依次显示出来
}
}
MusicList findBySong(string song) {//按照歌曲名字查询
MusicList m("");
for (int i = 0; i < count; i++) {
if (mus[i].getSong() == song) {
m.addMusic(mus[i]);//如果查找到就在m里面添加一个数据
}
}
return m; //返回m的数据(值)
}
MusicList findByName(string name) {//按照歌手查询
MusicList m("");
for (int i = 0; i < count; i++) {
if (mus[i].getName() == name) {//如果查找到就在m里面添加一个数据
m.addMusic(mus[i]);
}
}
return m; //返回m的数据(值)
}
MusicList findByAlbum(string album) {//按照专辑查询
MusicList m("");
for (int i = 0; i < count; i++) {
if (mus[i].getAlbum() == album) {//如果查找到就在m里面添加一个数据
m.addMusic(mus[i]);
}
}
return m;//返回m的数据(值)
}
Music findById(string id) {//按照代号查找
for (int i = 0; i < count; i++) {
if (mus[i].getId() == id) {//如果查找到就直接返回一个值
return mus[i];
}
}
return Music();
}
void modify(Music m) {//修改歌曲的信息
for (int i = 0; i < count; i++) {
if (mus[i].getId() == m.getId()) {//找到并修改(匹对相同的信息)
mus[i].setSong(m.getSong());
mus[i].setName(m.getName());
mus[i].setTime(m.getTime());
mus[i].setAlbum(m.getAlbum());//更改数据
}
}
}
void delMusic(string id) {
int i;
for (i = 0; i < count; i++) {//首先查找需要删除的歌曲是否存在
if (mus[i].getId() == id)
break;//如果找到就结束
}
if (i == count)//没有找到同样也结束并且退出
return;
for (int j = i; j < count - 1; j++) {//删除
mus[j] = mus[j + 1];//把数组中所有的元素往前面移动
}
count--;//减少
}
void writeFile() {//写入
if (count == 0 || filename == "")return; //数据为0或者文件名为空的时候不进行写入的操作
ofstream outf(filename.c_str(), ios::out);
if (!outf) {
cout << "create file fail" << endl;//文件打开失败
return;
}
for (int i = 0; i < count; i++) {
outf << mus[i];//依次写入数据
if (i < count - 1)
outf << "\n";
}
outf.close();
}
void readFile() {//读取
if (filename == "")return;//文件名为空的时候不进行读取的操作
ifstream inf(filename.c_str());
if (!inf) {
cout << "open file fail" << endl;//文件打开失败
return;
}
while (!inf.eof()) {
Music m;
inf >> m;
if (m.getId() != "")
addMusic(m);
}
inf.close();
}
};