【C/C++】C/C++ KTV点歌系统设计与实现(源码+数据+报告)【独一无二】

news2024/12/27 9:33:01

请添加图片描述


👉博__主👈:米码收割机
👉技__能👈:C++/Python语言
👉公众号👈:测试开发自动化【获取源码+商业合作】
👉荣__誉👈:阿里云博客专家博主、51CTO技术博主
👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。


C/C++ KTV点歌系统设计与实现(源码+数据+报告)【独一无二】

目录

    • C/C++ KTV点歌系统设计与实现(源码+数据+报告)【独一无二】
  • 一、设计要求
  • 二、代码设计思路
    • (1)main( )函数及program1()函数
    • (2)int program2(),void program6()及Sing* program4()函数
    • (3)int program5()函数
    • (4)void delsing()
    • (5)void shangyising()
    • (6)void zhidengsing()
  • 三、代码展示


一、设计要求

KTV点歌系统:
设计并实现一个KTV点歌程序,实现点歌功能。要求实现二级菜单:
并使之能提供以下功能:
(1)显示已点歌曲:按照点歌顺序显示已点歌曲;
(2)查询已点歌曲:输入查询歌曲名称后进行查询,若存在显示歌名以及序号;若不存 在,显示:未点播此歌曲;
(3)删除已点歌曲:在显示已点歌曲后,输入删除歌曲序号,将次歌曲删除,并重新排 列序号。
(4)置顶:在显示已点歌曲后,选择置顶歌曲的序号,将歌曲置顶,并重新排序列号。 (5)上移一位:在显示已点歌曲后,选择上移一位歌曲的序号,将该歌曲上移一位后, 重新排列序号。
补充功能:
<1> 查看初始歌单
<2> 字体颜色变换
<3> 错误警告功能
<4> 查询已点歌曲

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 点歌” 获取。👈👈👈


二、代码设计思路

数据结构如下:

Typedef struct sing
{  int num;
			 char name[20];
			 char singer[20];
			 char letter1;
	 		 char letter2;
} Sing; 

通过对项目分析,设计了上述结构类型,其中还有一个类似结构的数组(未展示),这样便于分别处理初始歌单与已歌单。因为数组便于处理固定数据,就由数组存储初始歌单(固定),链表存储需要处理的已点歌单。并且用typedef函数将struct sing结构体简化为Sing,以便于声明该结构变量。

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 点歌” 获取。👈👈👈

各功能模块的算法处理流程图及使用说明:

(1)main( )函数及program1()函数

调用program1()函数,并将返回值存储在alselect变量中。这个返回值表示用户在program1菜单 中选择的操作。
使用if-else if结构来处理用户的选择:
如果用户选择2(点歌),则调用program2()函数并清屏。
如果用户选择0(退出),则使用break语句退出循环,并退出程序。
如果用户选择1(输出歌库),则调用program3()函数,并在之后打印一个换行符。
如果用户选择3(管理已点歌),则调用program5()函数,并在之前打印一个换行符(但通常换行符应 该在调用函数之后打印,以保持输出的一致性)。

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 点歌” 获取。👈👈👈

当用户输入4时,代码执行system(“cls”);和continue;,这会导致屏幕清屏,并继续下一次循环。当用户输入一个非法的值(即不是0-4的数字)时,程序会打印“输入错误!”,暂停屏幕,清屏,然后再次显示菜单。这也是正确的行为。

在这里插入图片描述
在这里插入图片描述

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 点歌” 获取。👈👈👈

(2)int program2(),void program6()及Sing* program4()函数

通过 printf 函数,该函数创建并显示了一个包含四个选项的菜单,允许用户选择不同的歌曲排序方式。使用 scanf 函数从用户处获取输入,并将该输入存储在 num2 变量中。
如果用户输入 4,则清除屏幕并返回 0,表示用户希望返回主菜单。如果用户输入的数不在 1 到 4 之间,则打印一个错误消息,暂停屏幕,清除屏幕,并使用 continue 关键字回到循环的开始,重新显示菜单。如果用户输入的数在 1 到 3 之间,则调用 program6 函数,并传入用户的选择作为参数。

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 点歌” 获取。👈👈👈

如果num2等于3,调用program33()函数(该函数未在代码中给出),并将a赋值给b。如果num2等于1,对a所指向的数组(假设它是一个数组)按照letter1字段进行排序,并打印排序后的结果。冒泡排序实现。如果num2等于2,对a所指向的数组按照letter2字段进行排序,并打印排序后的结果。

函数最后返回b,排序后的歌曲列表的指针。

在这里插入图片描述
在这里插入图片描述

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 点歌” 获取。👈👈👈

在这里插入图片描述
在这里插入图片描述

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 点歌” 获取。👈👈👈

(3)int program5()函数

system(“cls”); 在 Windows 系统中用于清屏。在调用菜单前执行,以确保屏幕上没有之前的输出。
菜单显示:
函数首先打印出一个包含多个选项的菜单供用户选择。
用户输入循环:
使用 while(1) 创建一个无限循环,直到用户选择退出(num5 == 4)。
选项处理:
根据用户输入的 num5 值,函数执行相应的操作。
显示已点歌曲:
如果链表 head(可能是用于存储已点歌曲的链表)为空,则调用 printaddsing() 函数(可能是打印一个空列表的消息)。

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 点歌” 获取。👈👈👈

在这里插入图片描述
在 while 循环中,current 指针沿着链表移动,直到它到达链表的末尾(即 current->next 为 NULL)。在每次迭代中,都会打印出当前节点的信息,并将 current 指向下一个节点。
当遍历完整个链表后,while 循环结束,函数返回。此时,用户可以看到已点歌曲的完整列表。

在这里插入图片描述
如果链表不为空,函数会提示用户输入要查找的歌曲名称,并使用 scanf 函数读取用户输入。但是,scanf 函数中 &name 的使用是错误的,因为 name 已经是一个数组名,它本身就代表了数组的首地址函数将 current 指针重置为链表的头节点,并开始遍历链表。在遍历过程中,它使用 strcmp 函数比较当前节点的歌曲名称与用户输入的歌曲名称。如果两者相等,则输出歌曲信息,将 flag 设置为 1,并使用 break 跳出循环。
如果在遍历完整个链表后仍未找到歌曲(即 flag 仍为 0),则输出一条消息告知用户未找到指定的歌曲。
无论是否找到歌曲,函数最后都会输出一条消息,提示用户选择(1-7)进行后续操作。

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 点歌” 获取。👈👈👈

在这里插入图片描述

(4)void delsing()

应用while以及定义俩个指针becurrent,current遍历指针,找到后判断位置选择删除方法。

在这里插入图片描述

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 点歌” 获取。👈👈👈

(5)void shangyising()

如果链表为空,输出提示信息。如果链表只有一个节点,输出无需上移的提示信息。提示用户输入想要上移的歌曲名称,并读取输入。遍历链表查找用户输入的歌曲。如果找到歌曲,根据歌曲在链表中的位置进行不同的处理:如果歌曲是第一个节点,则输出提示信息表示已经是第一个了。如果歌曲是第二个节点(即head->next),则将其与第一个节点交换,并更新head指针。

在这里插入图片描述

(6)void zhidengsing()

current:遍历链表的指针。zsing:用于临时存储当前节点current的下一个节点。temp:动态分配的节点,但在当前实现中并未正确使用。becurrent:用于存储current的前一个节点。flag:用于标记是否找到了歌曲。name:存储用户输入的歌曲名称。

在这里插入图片描述

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 点歌” 获取。👈👈👈


三、代码展示

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

typedef struct sing//歌单结构指针
{
	int num;
	char name[20];
	char singer[20];
	char letter1;
	char letter2;
	struct sing *next;

} Sing;

Sing* head=NULL;//全局指针 音乐库
int  program1();//一级菜单07/04/24 08:54
int  program2();//选2二级菜单
void program3();//初始化歌单
void program33();//初歌单
Sing* program4(int num2);//排序
int program5();//选3二级菜单
void program6(int number2);//点歌顺序
void addsingg(Sing* a,int n);//存储已点歌曲链表
void printaddsing();//打印已点歌曲
void delsing();//删除已点歌曲
void zhidengsing();//置顶
void shangyising();//上移一位
void forsing();//查找
void rangesing();//重编序号

> 👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 点歌” 获取。👈👈👈


//一级菜单07/04/24 08:54
int program1()
{
	system("cls");

	int select;

	while(1)
	{
		printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
		printf("$$                             $$\n");
		printf("$$");
		printf("          ktv点歌            $$\n");
		printf("$$");
		printf("       1.查看歌曲库          $$\n");
		printf("$$");
		printf("       2.点歌                $$\n");
		printf("$$");
		printf("       3.修改、查看已点歌曲  $$\n");
		printf("$$");
		printf("       4.返回主菜单          $$\n");
		printf("$$");
		printf("       0.退出                $$\n");
		printf("$$                             $$\n");
		printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
		printf("\n");
		printf("请选择:");
		scanf("%d",&select);

		if(select>=0&&select<4)
		{
			// 代码 略...
		    // 代码 略...
		    // 代码 略...
		    // 代码 略...
		    // 代码 略...
		}
		system("cls");
	}
}

> 👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 点歌” 获取。👈👈👈

//点歌菜单
int program2()
{
	int num2=0,number2;

	while(1)
	{
		printf("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n") ;
		printf("*-*                                         *-*\n");
		printf("*-*");
		printf("   1)按照歌曲的拼音字母排序显示(a-z)");
		printf("     *-*\n");

		printf("*-*");
		printf("   2)按照演唱者的名字排序显示(a-z)");
		printf("       *-*\n");

		printf("*-*");
		printf("   3)按照原歌单顺序显示");
		printf("                  *-*\n");

		printf("*-*");
		printf("   4)返回主菜单");
		printf("                          *-*");
		printf("\n");
		printf("*-*                                         *-*");
		printf("\n*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n");
		printf("\n");
		printf("请输入序号:");


		scanf("%d",&num2);

		printf("\n");

		if(num2==4)
		{
			system("cls");
			return 0;

		}

		else if(num2<1||num2>4)
		{
			printf("输入错误请输入序号1-4\n");
			system("pause");
			system("cls");
			continue;
		}

		else
			program6(num2);

	}

	system("pause");
	system("cls");

}


//歌单 static关键
Sing* gedan()
{


	static Sing a[6]=
	{

		{0},
		{1,"第三人称","买辣椒也用券",'d','m'},
		{2,"王招君","任素汐",'w','r'},
		{3,"星光就在前方","抠抠",'x','k'},
		{4,	"李香兰","邓紫棋",'l','d'},
		{5,"带我去找夜生活","告五人",'d','g'},

	};//歌单

	return a;
}


void program3()//一级菜单输出歌单
{

	system("cls");

	int n;

	printf("序号      歌名            歌手\n");
	program33();
	printf("输入4返回主菜单。\n") ;
	printf(":");

	while(1)
	{
    // 代码 略...
    // 代码 略...
    // 代码 略...
    // 代码 略...

		else
		{
			printf("输入错误!重新输入。\n");
			printf(":");
		}
	}

	//与33的不同之处,是界面更便捷
	system("cls");

}


//歌单****
void program33()
{
    // 代码 略...
    // 代码 略...
    // 代码 略...
    // 代码 略...> 👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 点歌” 获取。👈👈👈

	for(int i=1; i<= 5; i++)
	{
		printf("%-10d%-16s%s\n",a[i].num,a[i].name,a[i].singer);
		if(i!=5)
			printf("\n");
	}


}


//排序*
Sing* program4(int num2)
{
	Sing* a;
	Sing* b;
	Sing temp;

    // 代码 略...
    // 代码 略...
    // 代码 略...> 👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 点歌” 获取。👈👈👈
    // 代码 略...
    // 代码 略...

	return b;
}


int program5()//选3管理点歌曲的二级菜单***
{
	system("cls");

	int num5;
	printf("*************************\n");
	printf("*   1)显示已点歌曲      *\n");
	printf("*   2)查询已点歌曲      *\n");
	printf("*   3)删除已点歌曲      *\n");
	printf("*   4)返回主菜单        *\n");
	printf("*   5)上移一位          *\n");
	printf("*   6)置顶              *\n");
	printf("*   7)清屏              *\n");
	printf("*************************\n");
	printf("\n");
	printf("请选择:");
}


void shangyising()//上移一位
{
	char name[20];
	Sing* current=head;
	Sing* becurrent=head;
	Sing* zsing=head;
	Sing* temp=NULL;


	int flag=0;

	if(head==NULL)
	{
		printf("目前您未点歌请按4返回点歌。\n");
	}
	else if(head->next==NULL)
	{
		printf("\n目前你只点了一首歌无需上移。\n");
		printf("请选择(1-7):");
	}

	else
	{
		printaddsing();

		printf("请输入想要上移的歌曲名称:");
		scanf("%s",&name);

		while(current!=NULL)
		{


			if(strcmp(current->name,name)==0)
			{

				if(current==head)
				{
					printf("\n%s已经是第一个了。\n",name);
					flag=1;
					break;
				}

				else if(head->next==current)//****
				{
					zsing->next=current->next;
					current->next=zsing;


					head=current;

					printf("上移成功!\n") ;
					flag=1;
					break;

				}

				else
				{
					> 👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 点歌” 获取。👈👈👈

				}
			}


			if(current!=head&&current!=head->next)
			{
				becurrent=becurrent->next;
				becurrent->next=current;
			}

			current=current->next;


		}
		if(flag==0)

		{
			printf("您未点该歌曲%s\n",name);
		}
		printf("请选择(1-7):");

	}

}


void rangesing()//已点歌曲排序
{
	Sing* current;
	int i=1;
	current=head;
	while(current!=NULL)
	{
		current->num=i;
		i++;
		current=current->next;
	}
}

> 👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 点歌” 获取。👈👈👈

int main()
{
	int alselect;

	while(1)
	{
		alselect=program1();
		if(alselect==2)//点歌
		{
			system("cls");
			program2();
		}

		else if(alselect==0)//退出
		{

			break;

		}

		else if(alselect==1)//输出歌库
		{
			printf("\n");
			program3();
		}

		else if(alselect==3)//管理已点歌
		{
			program5();
			printf("\n");
		}

	}

	return 0;
}

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 点歌” 获取。👈👈👈

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

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

相关文章

3588 pwm android12 的操作

问题&#xff1a; 客户需要在android12 的界面上操作板卡上的 PWM 蜂鸣器设备。 过程&#xff1a; 1 了解一下 3588 android12 源码的 关于PWM 的驱动。 设备树找不到 pwm 但是&#xff0c; 还不知道&#xff0c;android12 最终包含的 设备树是哪个&#xff0c;但是经过我的…

MyCat实现分库分表

两个集群 两个库 两个表 搭建数据库服务使用docker启动两个mysql 3506 3507连接MyCat创建两个数据源连接MyCat创建集群 mycat创建逻辑库MyCat创建全局表广播表创建分片表mycat逻辑库MyCat插入数据mycat查看数据物理库3506查看数据物理库3507查看数据 ER表创建ER表mycat插入数据…

蓝桥杯练习系统(算法训练)ALGO-946 Q神的足球赛

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 足球赛上&#xff0c;只见Q神如闪电般的速度带球时而左&#xff0c;时而右&#xff0c;时而前&#xff0c;时而后&#xff…

HDFS HA 修改nameservice

本例中修改将原来的hdfs-ha 修改为 hdfs-ns 停止HDFS, 防止新的业务操作 等待停止结束 KDE中需要调整的配置项如下图所示 a.搜索栏找到fs.defaultFS&#xff0c;将hdfs://hdfs-ha改为hdfs://hdfs-ns b.搜索栏找到dfs.nameservices&#xff0c;将hdfs-ha改为hdfs-ns c.搜索栏找…

HBuilder报错--openssl-legacy-provider is not allowed in NODE_OPTIONS解决方法

目录 一、问题描述二、解决方法 一、问题描述 HBuilder编译时报错&#xff1a;–openssl-legacy-provider is not allowed in NODE_OPTIONS 二、解决方法 将 windows 环境变量 NODE_OPTIONS 的值设置为空&#xff0c;由&#xff1a; 改为&#xff1a;

并发-判断线程对象是否处于活动状态 - isAlive

t.isAlive() 测试线程t是否处于活动状态&#xff0c;只要线程启动并且没有终止&#xff0c;方法返回值就是truestart()之前&#xff0c;线程不处于活动状态&#xff0c;之后就处于活动状态示例&#xff1a;运行结果&#xff1a;但是事情并没有这么简单&#xff0c;先来看一下以…

【每日刷题】Day37

【每日刷题】Day37 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 2391. 收集垃圾的最少总时间 - 力扣&#xff08;LeetCode&#xff09; 2. 1614. 括号的最大嵌套深度…

软件库V1.5版本iApp源码V3

软件库V1.5版本iApp源码V3 配置教程在【mian.iyu】的【载入事件】 更新内容&#xff1a; 1、分类对接蓝奏&#xff08;免费&#xff0c;付费&#xff0c;会员&#xff0c;广告&#xff09;&#xff0c;支持蓝奏文件描述设置为简介&#xff08;改动&#xff1a;首页.iyu&#…

【算法】二叉树中的dfs

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、计算布尔二叉树的值二、求根节点到叶节点数字之和三、二叉树剪枝四、验证搜索二叉树五、二叉搜索树中…

该从哪些方面提升系统的吞吐量?

更多大厂面试内容可见 -> http://11come.cn 该从哪些方面提升系统的吞吐量&#xff1f; 我们平时自己做的项目一般没有用户量&#xff0c;都是练手项目&#xff0c;所以并不会在吞吐量上做出很多的优化&#xff0c;但是这样的话&#xff0c;又会导致项目和其他人相比并没有…

mysql设置远程访问权限,允许其他IP访问

文章目录 更改mysql配置文件登录mysql 更改mysql配置文件 查找.ini或者.cnf文件 更改bind-address为0.0.0.0 [mysqld] character-set-serverutf8mb4 bind-address0.0.0.0 default-storage-engineINNODB [mysql] default-character-setutf8mb4 [client] default-character-s…

ppt保存文件奇怪问题

我发现ppt中的形状保存成jpg,png和pdf时&#xff0c;格式不一样 比如 当右键单击时&#xff0c;然后选择另存为图片 png格式 jpg格式 pdf格式 感觉还是很奇怪&#xff0c;就pdf的格式比较靠谱一点

Java---类和对象第一节

目录 1.面向对象初步认识 1.1什么是面向对象 1.2面向对象和面向过程的区别 2.类的定义和使用 2.1简单认识类 2.2类的定义格式 2.3类的实例化 2.4类和对象的说明 3.this关键字 3.1访问本类成员变量 3.2调用构造方法初始化成员变量 3.3this引用的特性 4.对象的构造以…

国内有哪些知名的网络安全厂商?

首先就是360&#xff0c;这个我相信大家并不陌生了吧&#xff0c;你的电脑装过360么&#xff1f; 360在个人终端服务那是妥妥的扛把子&#xff0c;但是在企业服务里虽然有他们的身影却略显不足。 第二个就是深信服&#xff0c;网络安全的老牌大佬&#xff0c;业务覆盖了全球5…

什么是XXE漏洞,日常如何做好web安全,避免漏洞威胁

随着网络技术的不断发展&#xff0c;网站安全问题日益受到人们的关注。当前随着技术发展&#xff0c;网站存在一些常见的可能被攻击者利用的漏洞&#xff0c;而在众多网站安全漏洞中&#xff0c;XXE&#xff08;XML External Entity&#xff09;漏洞是一个不容忽视的问题。今天…

linux性能监控之slabtop

slabtop命令是以实时的方式显示内核slab缓冲区的细节信息&#xff0c;是linux自带的命令 [rootk8s-master ~]# slabtop --helpUsage:slabtop [options]Options:-d, --delay <secs> delay updates-o, --once only display once, then exit-s, --sort <char&…

【WEEK11】 【DAY6】员工管理系统第七部分【中文版】

2024.5.11 Saturday 接上文【WEEK11】 【DAY5】员工管理系统第六部分【中文版】 目录 10.8.删除及404处理10.8.1.修改list.html10.8.2.修改EmployeeController.java10.8.3.重启10.8.4. 404页面处理10.8.4.1.把404.html文件移入10.8.4.2.重启并运行 10.8.5.退出登录状态10.8.5.1…

51基于单片机的温室大棚系统设计

设计摘要&#xff1a; 本设计旨在基于51单片机和蓝牙技术&#xff0c;实现一个功能完善的温室大棚系统。该系统具备以下主要功能&#xff1a;首先&#xff0c;通过连接的显示屏能够实时地显示当前的温度和湿度信息&#xff0c;方便用户了解温室内的环境变化。其次&#xff0c;…

Codeforces Round 605 (Div. 3) A~D

本人水平不高&#xff0c;开这个专栏主要是督促自己补题&#xff0c;有些题对目前的我来说还比较难&#xff0c;还补不动&#xff0c;等以后能力上来了再补。。。 原题链接&#xff1a;Dashboard - Codeforces Round 605 (Div. 3) - Codeforces 目录 A. Three Friends B. Sn…

✨✨使用vue3打造一个el-form表单及高德地图的关联组件实例✨

✨1. 实现功能 &#x1f31f;表单内显示省市县以及详细地址 点击省市县输入框时&#xff0c;打开对应地图弹窗&#xff0c;进行位置选择选择位置回显入对应输入框表单内的省市县以及地址输入框同外嵌表单走相同的校验方式触发校验后点击reset实现清除校验与清空数据 &#x1f…