用C++编写信息管理系统(歌单信息管理)

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);   //调用查找函数并把数据存储在mltif (mlt.getCount() != 0)mlt.show();elsecout << "查无此歌曲" << endl;system("pause");break;}else if (flag == 2) {      //按照歌手的名字进行查找system("cls");cout << "请输入查找的歌手:";string name;cin >> name;MusicList mlt = ml.findByName(name);     //调用查找函数并把数据存储在mltif (mlt.getCount() != 0)mlt.show();elsecout << "查无此歌手" << endl;system("pause");break;}else if (flag == 3) {         //按照专辑进行查找system("cls");cout << "请输入查找的专辑:";string album;cin >> album;MusicList mlt = ml.findByAlbum(album);    //调用查找函数并把数据存储在mltif (mlt.getCount() != 0)mlt.show();elsecout << "查无此专辑" << 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();elsecout << "查无此代号" << 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() {//显示的模版showcout << "歌曲:" << 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();}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/56015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多元线性回归:机器学习中的经典模型探讨

引言 多元线性回归是统计学和机器学习中广泛应用的一种回归分析方法。它通过分析多个自变量与因变量之间的关系&#xff0c;帮助我们理解和预测数据的行为。本文将深入探讨多元线性回归的理论背景、数学原理、模型构建、技术细节及其实际应用。 一、多元线性回归的背景与发展…

2024免费mac苹果电脑清理垃圾软件CleanMyMac X4.15.8

对于苹果电脑用户来说&#xff0c;设备上积累的垃圾文件可能会导致存储空间变得紧张&#xff0c;影响电脑的性能和使用体验。尤其是那些经常下载和安装新应用、编辑视频或处理大量照片的用户&#xff0c;更容易感受到存储空间的压力。面对这种情况&#xff0c;寻找一种有效的苹…

计组_中断响应的步骤

2024.10.13&#xff1a;计算机组成原理学习笔记 中断响应步骤 中断响应 &#xff08;中断响应的过程也称中断隐指令&#xff09;第一步&#xff1a;关中断第二步&#xff1a;保存断点第三步&#xff1a;引出中断服务程序中断源识别判优方法1&#xff1a;软件查询方法中断源识别…

74.【C语言】文件操作(1)

目录 1.进行文件操作的原因 销毁的示例 2.文件的类型 1.操作文件的步骤 2.文件名 3.查看文件路径的方法 方法1 方法2 方法3 4.数据文件的介绍 举例 ① ASCII码的形式(即字符形式)存储 ②二进制形式存储 理解"不加转换"的含义 1.进行文件操作的原因 为…

maven加载依赖成功但是引入import不了包,注解报错

突然就复现不出来了&#xff0c;奇了怪了&#xff0c;简单说一下吧&#xff0c;就是模块里引入了SpringBoot Test那个依赖然后&#xff0c; 这个地方是显示引入成功的&#xff0c;但是 这个包下没有&#xff0c;导致我SpringBootTest一直出不来&#xff0c;就找不到这个包下的注…

Qt事件——鼠标事件

通过label来显示各种事件 鼠标按下事件 //按下显示坐标 void MyLabel::mousePressEvent(QMouseEvent * ev) {int i ev->x();int j ev->y();//判断按下的鼠标键位if (ev->button() Qt::LeftButton) {qDebug() << "LeftButton";}else if (ev->bu…

Elasticsearch学习笔记(六)使用集群令牌将新加点加入集群

随着业务的增长&#xff0c;陆续会有新的节点需要加入集群。当我们在集群中的某个节点上使用命令生成令牌时会出现报错信息。 # 生成令牌 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node出现报错信息&#xff1a; Unable to create enrollment…

开源商城系统crmeb phpstudy安装配置

BOSS让我最快时间部署一套开源商场系统&#xff0c;今天就以crmeb为例。 快速部署在linux中我会首选docker&#xff0c;因为我要在windows中部署&#xff0c;本文就选用phpstudy集成环境做了。 什么是crmeb 我从官网摘点&#xff1a; CRMEB产品与服务 CRMEB通过将CRM&#x…

NFT Insider #151:The Sandbox 推出 Alpha 第4季;腾讯或将收购育碧

市场数据 加密艺术及收藏品新闻 Beeple 将于 11 月在南京德基美术馆举办个人首展 著名数字艺术家 Beeple 近日在X平台发布视频&#xff0c;宣布将于 2024 年 11 月 14 日在南京德基美术馆举办个人首次展览&#xff0c;名为《Beeple&#xff1a;来自合成未来的故事》。该展览将…

Django的请求与响应

Django的请求与响应 1、常见的请求2、常见的响应3、案例 1、常见的请求 函数的参数request是一个对象&#xff0c;封装了用户发送过来的所有请求相关数据。 get请求一般用来请求获取数据&#xff0c;get请求也可以传参到后台&#xff0c;但是传递的参数显示在地址栏。 post请求…

[自然语言处理]RNN

1 传统RNN模型与LSTM import torch import torch.nn as nntorch.manual_seed(6)# todo:基础RNN模型 def dem01():参数1&#xff1a;input_size 每个词的词向量维度&#xff08;输入层神经元的个数&#xff09;参数2&#xff1a;hidden_size 隐藏层神经元的个数参数3&#xff1a…

物联网:一种有能力重塑世界的技术

物联网&#xff08;IoT&#xff09;近年来对我们的日常生活产生了如此积极的影响&#xff0c;以至于即使是不懂技术的人也开始相信它所带来的便利以及敏锐的洞察力。 物联网是一场数字技术革命&#xff0c;其意义甚至比工业革命更为重大。物联网是仍处于起步阶段的第四次工业革…

前端开发笔记--html 黑马程序员2

文章目录 前端常用标签一、标题标签二、段落标签和换行标签和水平线标签三、文本格式化标签![请添加图片描述](https://i-blog.csdnimg.cn/direct/87583fa23fe04229b016912051f3fc45.png)四、盒子标签五、图像标签六、连接标签七、注释和特殊字符 八、表格标签的基本使用九、列…

自动化运维:提升效率、降低风险的利器

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

如何批量从sql语句中提取表名

简介 使用的卢易表 的提取表名功能&#xff0c;可以从sql语句中批量提取表名。采用纯文本sql语法分析&#xff0c;无需连接数据库&#xff0c;支持从含非sql语句的文件文件中提取&#xff0c;支持各类数据库sql语法。 特点 快&#xff1a;从成百个文件中提取上千个表名只需1…

离岗睡岗预警系统 值班室离岗识别系统Python 结合 OpenCV 库

在众多工作场景中&#xff0c;存在着一些特殊岗位&#xff0c;这些岗位对于人员的专注度和警觉性有着极高的要求。然而&#xff0c;离岗睡岗现象却时有发生&#xff0c;给工作的正常开展和安全保障带来了严重的威胁。本文将深入探讨特殊岗位离岗睡岗的危害&#xff0c;以及如何…

Ubuntu安装Apache教程

系统版本&#xff1a;Ubuntu版本 23.04 Ubuntu是一款功能强大且用户友好的操作系统&#xff0c;而Apache是一款广泛使用的Web服务器软件。在Ubuntu上安装Apache可以帮助用户搭建自己的网站或者进行Web开发。为大家介绍如何在Ubuntu上安装Apache&#xff0c;并提供详细的教程和操…

【HarmonyOS NEXT】实现页面水印功能

关键词&#xff1a;鸿蒙、水印、Watermark、页面、触摸问题 注&#xff1a;本期文章同样适用 OpenHarmony 的开发 在app开发过程中时常会出现敏感信息页面&#xff0c;为保护信息安全和及时的数据追踪&#xff0c;通常会采用给页面加水印的形式&#xff0c;那么本期文章会介绍…

【NLP自然语言处理】探索注意力机制:解锁深度学习的语言理解新篇章

目录 &#x1f354; 注意力机制介绍 1.1 注意力概念 1.2 注意力计算规则 1.3 常见的注意力计算规则 &#x1f354; 什么是注意力机制 &#x1f354; 注意力机制的作用 &#x1f354; 注意力机制实现步骤 4.1 步骤 4.2 代码实现 &#x1f354; 小结 学习目标 &#x1…