立即前往

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
查看全部活动
热门活动
  • 智算采购季 热销S6云服务器2核4G限时88元/年起,部分主机可加赠对象存储组合包!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 一键部署Llama3大模型学习机 0代码一键部署,预装最新主流大模型Llama3与StableDiffusion
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 产品能力
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      【C语言】软件开发基础篇--CL音乐

      首页 知识中心 软件开发 文章详情页

      【C语言】软件开发基础篇--CL音乐

      2024-03-18 08:30:50 阅读次数:52

      c语言,开发语言

      作为基础篇,实现软件的那些功能呢?

      a.构建基本框架

      b.围绕歌曲信息的增删查改进行的

      c.将内容通过文件操作存进文档

      d.整理歌曲内容(排序)

      e.实现简单的歌曲播放功能

      有人可能就会问了,需要掌握C语言那些知识才能实现这些功能呢?

      主要是 :数组,函数,指针,结构体,文件操作等知识即可.

      接下来,带大家一起实操

      首先,为了让部分功能分工明确,我们可以建立三个cpp文件,(播放音乐需要在c++的环境下)一个头文件,将他看成一个盖房子的过程:

      CL-music.h 头文件(建筑图纸)

      Basic struct.cpp 用来构建框架,地基

      Function interface.cpp 功能界面(给建筑上色,标明门牌号)

      play.cpp 实现各部分功能(家具)

      【C语言】软件开发基础篇--CL音乐

      首先从创建好的Basic struct.cpp开始实现

      想象一下

      在我们登录类似于QQ音乐,网易音乐的时候刚开始是不是都有一个登录界面,然后显示音乐logo

      这里我们可以分装两个函数

      //初始化界面  
      Init_picture();
      //登录
      Lojin();

       

      接着在CL-music.h实现函数声明(可以把所有需要引用的头文件都写入CL-music.h,其他文件只需要引用一下此头文件即可,例如#include"CL-music.h")

      这两项都不需要返回值,所以写成void即可

      //初始化加载界面
      void Init_picture();
      
      //登录/注册
      void Lojin();

      接下来在Basic struct.cpp里实现

      初始化界面就不展示啦,大家可以根据自己的创意来设计logo~

      登录如何实现呢?

      想象一下

      大家刚开始在使用这个软件的时候是不是都没账号,所以要有注册界面,然后再登录(已有账号可以直接跳过注册),账号通过两个数组来维护,一个是注册时输入的,一个是登录时确定的,通过比较即可确定是否输入正确,密码也是如此,账号或密码输入需要重新输入.

      下面是登录代码:

      //登录
      void Lojin()
      {
      
      	printf("|-----------------------------------------|\n");
      	printf("                  请登录                  \n");
      	printf("|-----------------------------------------|\n");
      	char account[10] = { 0 };
      	char password[10] = { 0 };
      	char account_1[10] = { 0 };
      	char password_1[10] = { 0 };
      	while (1)
      	{
      		printf("请输入账号(如果您还没有账号请输入\"*\"注册账号) :");
      		scanf("%s", account_1);
      		if (account_1[0] == '*')
      		{
      			printf("\n请输入您要注册的账号:");
      			scanf("%s", account);
      			printf("\n请输入您要注册的密码:");
      			scanf("%s", password);
      			printf("注册成功\n");
      		}
      		else
      		{
      			if (strcmp(account, account_1) == 0)
      			{
      				printf("请输入密码:");
      				scanf("%s", &password_1);
      				if (strcmp(password, password_1) == 0)
      				{
      					printf("登录成功\n");
      					printf("正在为您加载...\n");
      					Sleep(4000);
      					system("cls");
      					return;
      				}
      				else
      				{
      					printf("密码错误,请重新输入!\n");
      				}
      			}
      			else
      			{
      				printf("账户错误,请重新输入!\n");
      			}
      		}
      	}
      
      }

      成功登录进入后,是不是因该转入功能界面了呢?

      大家可以自己想象设计一下功能界面,比如热门歌曲选项,主页,搜索,等等

      由于是基础篇,不需要考虑网络搭建,有些界面只需要一个形式即可

      下面是功能界面代码实现:

      //加载功能界面--主界面
      int Func_picture()
      {
      	printf("|-----------------------------------------|\n");
      	printf("|   搜索(1):                             |\n");
      	printf("|-----------------------------------------|\n");
      	printf("|   热门(2)  |     歌单(3)   |  主页(4)   |\n");
      	printf("|-----------------------------------------|\n");
      	printf("|-----------------------------------------|\n");
      	printf("|                                         |\n");
      	printf("|                                         |\n");
      	printf("|                欢迎您来到               |\n");
      	printf("|                                         |\n");
      	printf("|                   CL                    |\n");
      	printf("|    海报                          海报   |\n");
      	printf("|                  musci                  |\n");
      	printf("|                                         |\n");
      	printf("|                  ...                    |\n");
      	printf("|                                         |\n");
      	printf("|                关闭程序(0)              |\n");
      	printf("|                                         |\n");
      	printf("|-----------------------------------------|\n");
      	printf("请输入您要进行操作的序号:");
      	int input = 0;
      	scanf("%d", &input);
      	system("cls");
      	return input;
      }

      以上各功能只需输入对应的序号即可执行操作,并通过system("cls");清除界面,实现界面跳转

      补充一点,system函数来源于stdlib.h文件,登录界面的字符串比较函数来自string.h因此需要在头文件里包含

      #include<stdio.h>
      #include<stdlib.h>
      #include<string.h>

      int Func_picture();这个功能界面为什么需要返回值呢?

      接下来看主体框架

      int main()
      {
      	//初始化加载界面
      	Init_picture();
      	int input1 = 0;
      	Lojin();//登录
      	do
      	{
      		switch (input1 = Func_picture())
      		{
      		case 1:
      			break;
      		case 2:
      			break;
      		case 3:
                  break;
      		case 4:
      			break;
      		case 5:
      			break;
      		case 0:
      			printf("退出音乐\n");
      			return 0;
      		default:
      			printf("输入非法,请重新输入!\n");
      			break;
      		}
      	} while (input1);
      	return 0;
      }

      通过 Func_picture();的返回值来判断进入哪个case语句,并实现相应功能

      既然是歌曲库,那么何来的库呢?

      这里通过结构来创建歌曲库

      结构体放入.h文件即可

      typedef struct Songinfo //歌曲相关信息
      {
      	char Charname[NAME_MAX];
      	char Charauthor[AUTHOR_MAX];
      	char Charsinger[SINGER_MAX];
      	char Charpub_date[DATE_MAX];
      }Songinfo;

      这里的数量我用的#define定义的,可以方便后期维护和修改

      #define NAME_MAX 20
      #define AUTHOR_MAX 20
      #define SINGER_MAX 20
      #define DATE_MAX 11

      可是我们总不可能写入一个歌曲信息就去手动创建一个

      可以另外创建一个结构体,实现真正的歌曲库,里面包含一个结构体数组和一个计数器,每添加一个歌曲信息就将计数器加1,这样不仅实现了多信息的存储,也记录了信息的存储数量

      typedef struct Song_library //歌曲库
      {
      	Songinfo arr[MUSIC_MAX];//添加进的歌曲
      	int sz;//记录当前有效信息数
      }Song_library

      创建歌曲库,命名为son

      //歌曲库
      	Song_library son;

      下一步,将结构体数据初始化,写入play.cpp

      注意这里传址

      //初始化库存音乐
      void Init_library(Song_library* son)
      {
      	son->sz = 0;
      	memset(son->arr, 0, sizeof(son->arr));
      }

      接下来就可以一步一步实现功能界面部分功能啦

      既然是实现功能,不妨将这些功能分装成不同的函数,放在play.cpp中

      注意:不要忘记将这些函数声明哦~

      首先是

      搜索歌曲功能

      通过搜索歌曲名,展示出歌曲相应信息

      如何实现呢

      可以通过遍历数组,用字符串比较函数的方法来查询

      下面是搜索代码实现

      //查找信息
      static int Find_song(const Song_library* son, char name[NAME_MAX])
      {
          assert(son != NULL);
      	int i = 0;
      	for (i = 0; i < son->sz; i++)
      	{
      		if (0 == strcmp(name, son->arr[i].Charname))
      		{
      			return i;
      		}
      	}
      	return -1;
      }

      注:assert(son != NULL);保证指针有效性

      细心的小伙伴可能就发现了,

      这里的static是干什么的?

      const又是干什么的?

      第一个问题:想象一下,如果在未来的公司里,每个文件分别实现不同功能,当代码量特别大的时候,在两个不同的文件下定义了两个同名的函数,但是要实现不同的功能,这时代码就会出现冗余的现象,为了避免,加上static关键字,将其修饰为静态变量,使其函数功能的实现只能在本文件里使用,就有效防止了代码的冗余.

      第二个问题:搜索功能不需要去修改什么,const是为了防止Song_library* son被修改,这样加强了代码,未来实现一个大的工程,不是只有你一个人在完成这个项目,别人可能并不知道这个变量不能被修改!

      第二个模块:

      热门选项:

      //热门
      void Hot()
      {
      
      	printf("|-----------------------------------------|\n");
      	printf("|                  热门                   |\n");
      	printf("|-----------------------------------------|\n");
      	printf("|                今日榜单                 |\n");
      	printf("|                                         |\n");
      	printf("|         说好不哭 周杰伦 试听(1)         |\n");
      	printf("|                                         |\n");
      	printf("|       不为谁而作的歌 林俊杰 试听(2)     |\n");
      	printf("|                                         |\n");
      	printf("|         七里香 周杰伦 试听(3)           |\n");
      	printf("|                                         |\n");
      	printf("|                   ...                   |\n");
      	printf("|                 返回(0)                 |\n");
      	printf("|                                         |\n");
      	printf("|-----------------------------------------|\n");
      
      	int input = 0;
      	printf("请选择:");
      	scanf("%d", &input);
      	switch (input)
      		{
      		case 1:
      			system("cls");
      			Music(input);
      			break;
      		case 2:
      			system("cls");
      			Music(input);
      			break;
      		case 3:
      			system("cls");
      			Music(input);
      			break;
      		case 0:
      			system("cls");
      			break;
      		default:
      			printf("输入非法,请重新输入!\n");
      			break;
      		}
      	system("cls");
      

      一个简易的播放界面,作为试听歌曲

      第三个模块:

      歌单界面:

      int Playlist_menu()
      {
      	printf("|-----------------------------------------|\n");
      	printf("|               *** LC ***                |\n");
      	printf("|       |-------------------------|       |\n");
      	printf("|       |        添加歌曲(1)      |       |\n");
      	printf("|       |-------------------------|       |\n");
      	printf("|       |        删除歌曲(2)      |       |\n");
      	printf("|       |-------------------------|       |\n");
      	printf("|       |        查询歌单(3)      |       |\n");
      	printf("|       |-------------------------|       |\n");
      	printf("|       |        修改歌曲(4)      |       |\n");
      	printf("|       |-------------------------|       |\n");
      	printf("|                 返回(0)                 |\n");
      	printf("|-----------------------------------------|\n");
      	printf("请输入您要进行操作的序号:");
      	int input = 0;
      	scanf("%d", &input);
      	system("cls");
      	return input;
      }

      这就是整个信息管理系统的核心部分,对歌曲信息进行增删查改功能

      因此,我们因该在Basic struct.cpp这个基础框架中添加选项,如下代码:

      do
      	{
      		switch (input1 = Func_picture())
      		{
      		case 1:
      			Search(&son);
      			break;
      		case 2:
      			Hot();
      			break;
      		case 3:
      			do
      			{
      				switch (input2 = Playlist_menu())//歌单
      				{
      				case 1:
      					//增加歌曲
      					Add_song(&son);
      					Bubble_sort(&son);
      					break;
      				case 2:
      					//删除歌曲
      					Delete(&son);
      					break;
      				case 3:
      					//查询歌曲
      					Show_list(&son);
      					break;
      				case 4:
      					//修改信息
      					Modify(&son);
      					break;
      				case 0:
      					break;
      				default:
      					printf("输入非法,请重新输入\n");
      					break;
      				}
      			} while (input2);
      			break;
      		case 4:
      				Home_page();
      			break;
      		case 5:
      			Music(input1);
      			break;
      		case 0:
      			printf("退出音乐\n");
      			return 0;
      		default:
      			printf("输入非法,请重新输入!\n");
      			break;
      		}
      	} while (input1);

      先来看看添加歌曲

      //增加歌曲
      void Add_song(Song_library* son)
      {
      	assert(son != NULL);
      	if (son->sz == MUSIC_MAX)
      	{
      		printf("歌曲库已满,无法添加\n");
      	}
      	else
      	{
      		FILE* write = NULL;
      		if (son->sz == 0)
      		{
      			 write = fopen("歌曲库.txt", "w");
      			if (write == NULL)
      			{
      				return;
      			}
      		}
      		else
      		{
      			write = fopen("歌曲库.txt", "a");
      			if (write == NULL)
      			{
      				return;
      			}
      		}
      		printf("请输入歌曲名:");
      		scanf("%s",&(son->arr[son->sz].Charname));
      		printf("请输入作者:");
      		scanf("%s", &(son->arr[son->sz].Charauthor));
      		printf("请输入演唱者:");
      		scanf("%s", &(son->arr[son->sz].Charsinger));
      		printf("请输入发行时间:");
      		scanf("%s", &(son->arr[son->sz].Charpub_date));
      
      		//写入歌曲库
      		fprintf(write, "%-10s\t", son->arr[son->sz].Charname);
      		fprintf(write, "%-10s\t", son->arr[son->sz].Charauthor);
      		fprintf(write, "%-10s\t", son->arr[son->sz].Charsinger);
      		fprintf(write, "%-10s\t\n", son->arr[son->sz].Charpub_date);
      		son->sz++;
      		printf("添加成功!\n");
      		fclose(write);
      		write = NULL;
      	}
      }

      想象一下,进入此模块,首先因该想到该歌曲库是否已经被填满

             接下来,要注意,不能只是简单的进行"w"操作,"w"为只写,我们每次往文件里添加歌曲的时候都会覆盖上一个创建的文件,如果没有文件,则会重新创建一个,所以这首先因该判断,如果歌曲库的歌曲个数为零,则可以通过"w"创建一个txt文件,倘若歌曲个数不为零,我们则可以通过"a"来追加

      下一个功能:

      删除歌曲

      //删除歌曲
      void Delete(Song_library* son)
      {
      	assert(son != NULL);
      	char name[NAME_MAX] = { 0 };
      	printf("请输入要删除的歌曲的名字:");
      	scanf("%s", name);
      	int ret = Find_song(son, name);//查找
      	if (ret == -1)
      	{
      		printf("对不起,没有您要找的歌曲信息!\n");
      	}
      	else
      	{
      		int i = 0;  //从后向前覆盖
      		for (i = ret; i < son-> sz - 1; i++)
      		{
      			son->arr[i] = son->arr[i + 1];
      		}
      		son->sz--;
      		//重新写入文件
      		FILE* write = fopen("歌曲库.txt", "w");
      		if (write == NULL)
      		{
      			return;
      		}
      		for (i = 0; i < son->sz; i++)
      		{
      			fprintf(write, "%-10s\t", son->arr[i].Charname);
      			fprintf(write, "%-10s\t", son->arr[i].Charauthor);
      			fprintf(write, "%-10s\t", son->arr[i].Charsinger);
      			fprintf(write, "%-10s\t\n", son->arr[i].Charpub_date);
      		}
      		printf("删除成功!\n");
      		fclose(write);
      		write = NULL;
      	}
      	system("pause");
      	system("cls");
      }

             输入的歌曲名通过数组存放,再用之前的查找函数Find_song进行搜索,没找到输出提示,找到了进行删除歌曲信息操作,如何删除呢,由于歌曲库未添加歌曲的地方被初始化成全0,所以通过从后向前覆盖的方式进行删除

      下一个功能:

      查找歌曲信息

      //歌单列表
      void Show_list(const Song_library* son)
      {
      	assert(son != NULL);
      		FILE* read = fopen("歌曲库.txt", "r");
      		if (read == NULL)
      		{
      			return;
      		}
      		int i = 0;
      		for (i = 0; i < son->sz; i++)
      		{
      			fscanf(read, "%s", &(son->arr[i].Charname));
      			fscanf(read, "%s", &(son->arr[i].Charauthor));
      			fscanf(read, "%s", &(son->arr[i].Charsinger));
      			fscanf(read, "%s", &(son->arr[i].Charpub_date));
      		}
      		printf("|------------------------------------------------------------|\n");
      		printf("  %-18s\t%-8s\t%-8s\t%-11s\n", "歌曲名", "作词人", "演唱者", "日期");
      		for (i = 0; i < son->sz; i++)
      		{
      			if (i % 10 == 0 && i != 0)
      			{
      				system("pause");
      			}
      			printf("  %-18s\t%-8s\t%-8s\t%-11s\n",
      				son->arr[i].Charname,
      				son->arr[i].Charauthor,
      				son->arr[i].Charsinger,
      				son->arr[i].Charpub_date);
      		}
      		printf("|------------------------------------------------------------|\n");
      		system("pause");
      		system("cls");
      		fclose(read);
      		read = NULL;
      }

           通过fscanf函数从歌曲库中获取信息,再通过printf进行打印,分屏输出,每次10条歌曲信息

      注意:

      	for (i = 0; i < son->sz; i++)
      		{
      			if (i % 10 == 0 && i != 0)
      			{
      				system("pause");
      			}

      这里的 i = 0 时进入 i % 10 = 0 依然成立,所以这里要注意并且的条件

      下一个功能:

      修改歌曲信息

      //修改
      void Modify(Song_library* son)
      {
      	assert(son != NULL);
      	char name[NAME_MAX] = { 0 };
      	printf("请输入您要修改信息的歌曲名:");
      	scanf("%s", name);
      	int ret = Find_song(son, name);
      	if (ret == -1)
      	{
      		printf("对不起,没有您要找的歌曲信息!\n");
      	}
      	else
      	{
      		FILE* modif = fopen("歌曲库.txt", "a");
      		if (modif == NULL)
      		{
      			return;
      		}
      		printf("请输入歌曲名:");
      		scanf("%s", &(son->arr[ret].Charname));
      		printf("请输入作者:");
      		scanf("%s", &(son->arr[ret].Charauthor));
      		printf("请输入演唱者:");
      		scanf("%s", &(son->arr[ret].Charsinger));
      		printf("请输入发行时间:");
      		scanf("%s", &(son->arr[ret].Charpub_date));
      
      		//重新写入文件
      		FILE* write = fopen("歌曲库.txt", "w");
      		if (write == NULL)
      		{
      			return;
      		}
      		int i = 0;
      		for (i = 0; i < son->sz; i++)
      		{
      			fprintf(write, "%-10s\t", son->arr[i].Charname);
      			fprintf(write, "%-10s\t", son->arr[i].Charauthor);
      			fprintf(write, "%-10s\t", son->arr[i].Charsinger);
      			fprintf(write, "%-10s\t\n", son->arr[i].Charpub_date);
      		}
      		printf("修改成功!\n");
      		fclose(write);
      		write = NULL;
      	}
      	system("pause");
      	system("cls");
      }

           首先,通过查找歌曲函数先找到歌曲信息,然后对歌曲重新写入,覆盖之前的歌曲信息,最后修改成功并给予反馈

      增删查改功能到这里就完成啦,为了让歌曲信息直观有序,继续创建一个模块

      排序功能

      //排序
      void Bubble_sort(Song_library* son)
      {
      	assert(son != NULL);
      	char tmp_name[NAME_MAX] = { 0 };
      	//写入结构体数组
      	int i = 0;
      	for (i = 0; i < son->sz - 1; i++)
      	{
      		int j = 0;
      		for (j = 0; j < son->sz - i - 1; j++)
      		{
      			if (strcmp(son->arr[j].Charname, son->arr[j + 1].Charname) > 0)
      			{
      				//名字
      				strcpy(tmp_name, son->arr[j].Charname);
      				strcpy(son->arr[j].Charname, son->arr[j + 1].Charname);
      				strcpy(son->arr[j + 1].Charname, tmp_name);
      				//作者
      				strcpy(tmp_name, son->arr[j].Charauthor);
      				strcpy(son->arr[j].Charauthor, son->arr[j + 1].Charauthor);
      				strcpy(son->arr[j + 1].Charauthor, tmp_name);
      				//演唱者
      				strcpy(tmp_name, son->arr[j].Charsinger);
      				strcpy(son->arr[j].Charsinger, son->arr[j + 1].Charsinger);
      				strcpy(son->arr[j + 1].Charsinger, tmp_name);
      				//发行日期
      				strcpy(tmp_name, son->arr[j].Charpub_date);
      				strcpy(son->arr[j].Charpub_date, son->arr[j + 1].Charpub_date);
      				strcpy(son->arr[j + 1].Charpub_date, tmp_name);
      			}
      		}
      	}
      	//重新写入文件
      	FILE* write = fopen("歌曲库.txt", "w");
      	if (write == NULL)
      	{
      		return;
      	}
      	for (i = 0; i < son->sz; i++)
      	{
      		fprintf(write, "%-10s\t", son->arr[i].Charname);
      		fprintf(write, "%-10s\t", son->arr[i].Charauthor);
      		fprintf(write, "%-10s\t", son->arr[i].Charsinger);
      		fprintf(write, "%-10s\t\n", son->arr[i].Charpub_date);
      	}
      	printf("修改成功!\n");
      	fclose(write);
      	write = NULL;
      
      }

                  比较首元素ASCII码值的大小,由小到大进行排序,创建一个临时数组    char tmp_name[NAME_MAX] = { 0 };  用来临时存放歌曲信息,方便交换,相当于你要交换一个油瓶和一个醋瓶中的液体一样,肯定是需要一个空瓶来临时存放的,这里的临时数组就相当于空瓶,最后重新写入文件,注意这里因该覆盖掉之前的文件内容;此功能可以放在增添歌曲功能的后面

      如下代码:

      				case 1:
      					//增加歌曲
      					Add_song(&son);
      					Bubble_sort(&son);
      					break;
      				case 2:

      最后一个模块

      音乐播放

      这里首先要保证是在cpp环境下进行,并且需要修改字符集,修改为使用多字节字符集,如下图

      【C语言】软件开发基础篇--CL音乐

      下一步,需要引用一些头文件

      //加载音乐需要的头文件
      #include<Windows.h>
      #include<mmsystem.h>//包含多媒体设备接口头文件
      #pragma comment (lib,"winmm.lib")//加载静态库

       

      接着,将需要播放的音乐下载好,(注意:网易音乐不行,有加密),放在当前路径下

      【C语言】软件开发基础篇--CL音乐

       接着如下代码

      mciSendString("open 说好不哭.mp3 alias a", 0, 0, 0);// alias 是重命名
      mciSendString("play a", 0, 0, 0);//播放刚刚被命名的a音乐
      

      如果需要暂停音乐,可以用如下代码

      mciSendString("close a", 0, 0, 0);

      模仿音乐播放功能,就有了如下代码

      //音乐播放
      void Music(const int ret)
      {
      	int input = 0;
      	if (ret == 1)
      	{
      		A:
      		printf("|-----------------------------------------|\n");
      		printf(" 正在为您播放“说好不哭”\n");
      		mciSendString("close a", 0, 0, 0);
      		mciSendString("close b", 0, 0, 0);
      		mciSendString("close c", 0, 0, 0);
      		mciSendString("open 说好不哭.mp3 alias a", 0, 0, 0);
      		mciSendString("play a", 0, 0, 0);
      		printf(" 播放(1)       关闭播放(2)       单曲循环(3)\n");
      		printf("                 返回(0)\n");
      		printf("|-----------------------------------------|\n");
      	}
      	else if (ret == 2)
      	{
      		B:
      		printf("|-----------------------------------------|\n");
      		printf(" 正在为您播放“不为谁而作的歌”\n");
      		mciSendString("close a", 0, 0, 0);
      		mciSendString("close b", 0, 0, 0);
      		mciSendString("close c", 0, 0, 0);
      		mciSendString("open 不为谁而作的歌.mp3 alias b", 0, 0, 0);
      		mciSendString("play b", 0, 0, 0);
      		printf(" 播放(1)       关闭播放(2)       单曲循环(3)\n");
      		printf("                 返回(0)\n");
      		printf("|-----------------------------------------|\n");
      	}
      	else if (ret == 3)
      	{
      		C:
      		printf("|-----------------------------------------|\n");
      		printf(" 正在为您播放“七里香”\n");
      		mciSendString("close a", 0, 0, 0);
      		mciSendString("close b", 0, 0, 0);
      		mciSendString("close c", 0, 0, 0);
      		mciSendString("open 七里香.mp3 alias c", 0, 0, 0);
      		mciSendString("play c", 0, 0, 0);
      		printf(" 播放(1)       关闭播放(2)       单曲循环(3)\n");
      		printf("                 返回(0)\n");
      		printf("|-----------------------------------------|\n");
      	}
      	while (1)
      	{
      		printf("请选择:");
      		scanf("%d", &input);
      		if (input == 1)
      		{
      			if (ret == 1)
      			{
      				system("cls");
      				goto A;
      			}
      			else if (ret == 2)
      			{
      				system("cls");
      				goto B;
      			}
      			else if (ret == 3)
      			{
      				system("cls");
      				goto C;
      			}
      		}
      		else if (input == 2)
      		{
      			if (ret == 1)
      				mciSendString("close a", 0, 0, 0); 
      			else if(ret == 2)
      				mciSendString("close b", 0, 0, 0);
      			else if(ret == 3)
      				mciSendString("close c", 0, 0, 0);
      		}
      		else if (input == 3)
      		{
      			if (ret == 1)
      				mciSendString("repeat a", 0, 0, 0); 
      			else if (ret == 2)
      				mciSendString("repeat b", 0, 0, 0);
      			else if(ret == 3)
      				mciSendString("repeat c", 0, 0, 0);
      		}
      		else if (input == 0)
      		{
      			break;
      		}
      	}
      	system("cls");
      }

      这样一个基本的框架就建立好啦

      码字不易~

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/CYK_byte/article/details/124959634,作者:陈亦康,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:web前端移动端课程之canvas教程系列

      下一篇:平台化的测试工具推荐|一站式测试平台RunnerGo

      相关文章

      2025-04-07 10:28:48

      Python高维统计建模变量选择:SCAD平滑剪切绝对偏差惩罚、Lasso惩罚函数比较

      变量选择是高维统计建模的重要组成部分。许多流行的变量选择方法,例如 LASSO,都存在偏差。

      2025-04-07 10:28:48
      python , r语言 , 后端 , 开发语言
      2025-04-07 10:20:39

      ​Python是如何表示时间的?2个模块、3种方式,1文看懂~

      ​Python是如何表示时间的?2个模块、3种方式,1文看懂~

      2025-04-07 10:20:39
      python , 开发语言 , 时间戳 , 结构化
      2025-04-01 10:28:37

      找到非负数组中拥有“最大或的结果“的最短子数组,返回最短长度。

      找到非负数组中拥有"最大或的结果"的最短子数组,返回最短长度。

      2025-04-01 10:28:37
      java代码 , rust , 后端 , 开发语言 , 数组
      2025-04-01 09:21:49

      【C语言】探索数据的存储(上篇)

      【C语言】探索数据的存储(上篇)

      2025-04-01 09:21:49
      c语言 , 后端 , 开发语言
      2025-03-31 08:49:58

      算法题:剑指 Offer 40. 最小的k个数(题目+思路+代码+注释)时空 O(N*LogN) O(1) 0ms击败56%、32%用户

      算法题:剑指 Offer 40. 最小的k个数(题目+思路+代码+注释)时空 O(N*LogN) O(1) 0ms击败56%、32%用户

      2025-03-31 08:49:58
      c语言 , leetcode , 算法
      2025-03-31 08:49:25

      MFC编程 -- 判断是否按下ctrl和shift键

      MFC编程 -- 判断是否按下ctrl和shift键

      2025-03-31 08:49:25
      c++ , mfc , 开发语言
      2025-03-24 08:53:06

      【编译原理实验】 -- 词法分析程序设计原理与实现(C语言实现)

      【编译原理实验】 -- 词法分析程序设计原理与实现(C语言实现)

      2025-03-24 08:53:06
      c语言 , 开发语言
      2025-03-24 08:53:06

      【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)

      【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)

      2025-03-24 08:53:06
      c语言 , 数据结构
      2025-01-17 09:15:58

      小团生日收到妈妈送的两个一模一样的数列作为礼物! 他很开心的把玩,不过不小心没拿稳将数列摔坏了! 现在他手上的两个数列分别为A和B,长度分别为n和m。

      小团生日收到妈妈送的两个一模一样的数列作为礼物! 他很开心的把玩,不过不小心没拿稳将数列摔坏了! 现在他手上的两个数列分别为A和B,长度分别为n和m。

      2025-01-17 09:15:58
      rust , 后端 , 开发语言 , 递归
      2025-01-17 09:15:58

      一场电影开始和结束时间可以用一个小数组来表示[“07:30“,“12:00“],已知有2000场电影开始和结束都在同一天,这一天从00:00开始到23:59结束,一定要选3场完全不冲突的电影来观看,返回最大的观影时间。

      一场电影开始和结束时间可以用一个小数组来表示[“07:30”,“12:00”],已知有2000场电影开始和结束都在同一天,这一天从00:00开始到23:59结束,一定要选3场完全不冲突的电影来观看,返回最大的观影时间。

      2025-01-17 09:15:58
      golang , 开发语言 , 数组 , 空间复杂度 , 算法
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      32777

      阅读量

      4807233

      查看更多

      最新文章

      Python高维统计建模变量选择:SCAD平滑剪切绝对偏差惩罚、Lasso惩罚函数比较

      2025-04-07 10:28:48

      ​Python是如何表示时间的?2个模块、3种方式,1文看懂~

      2025-04-07 10:20:39

      找到非负数组中拥有“最大或的结果“的最短子数组,返回最短长度。

      2025-04-01 10:28:37

      【C语言】探索数据的存储(上篇)

      2025-04-01 09:21:49

      算法题:剑指 Offer 40. 最小的k个数(题目+思路+代码+注释)时空 O(N*LogN) O(1) 0ms击败56%、32%用户

      2025-03-31 08:49:58

      MFC编程 -- 判断是否按下ctrl和shift键

      2025-03-31 08:49:25

      查看更多

      热门文章

      C语言结构体与结构体指针的使用

      2023-03-08 10:38:36

      指针(*)、取地址(&)、解引用(*)与引用(&)

      2023-04-10 08:54:19

      20.6.5快速排序头文件的使用

      2023-03-20 02:06:43

      java学习第三天笔记-运算符10-短路逻辑运算符56

      2023-04-07 06:41:50

      ESLint:可组装的JavaScript和JSX检查工具

      2023-02-23 07:57:25

      Filter&Listener笔记

      2023-02-22 08:37:42

      查看更多

      热门标签

      java Java python 编程开发 开发语言 代码 算法 线程 html Python 数组 C++ javascript c++ 元素
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      C++:数据类型—字符串(11)

      【Kotlin】一款专门为 Java 程序员打造的快速掌握 Kotlin 技术博客

      【C语言】一次让你看透指针笔试题

      在N*N的正方形棋盘中,有N*N个棋子,那么每个格子正好可以拥有一个棋子。

      配置文件、API接口脱敏

      【编译原理实验】 -- 词法分析程序设计原理与实现(C语言实现)

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 权益商城
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 权益商城
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号