C语言实现KTV歌曲系统


#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"
#define N 20
#define FILENAME "songs.txt"
struct song
{
	int num;			/*歌曲编号*/
	char name[30];		/*歌曲名称*/
	char singer[30];	/*歌手姓名*/
	char editor[30];	/*专辑名称*/
	char type[30];		/*歌曲流派*/
	int date;			/*出版年份*/
	char address[30];	/*发行地区*/
	int time;			/*歌曲时长*/
	int times;			/*点唱人数*/
	float score;		/*评价分数*/
};
/*******************************************************       
功能:显示菜单
参数:无   
返回值:无
 *******************************************************/
void scan()
	 {

        printf("+++++++++++++++++++++++++++++++++++++++++++++++++++*++++++\n");
        printf("+               KTV歌曲管理系统                          +\n");
	printf("+                                                        +\n");
        printf("+                 1.  输入信息                           +\n");
        printf("+                 2.  输出信息                           +\n");
        printf("+                 3.  按歌曲编号查                       +\n");
        printf("+                 4.  按歌曲名查                         +\n");
        printf("+                 5.  按专辑名称查                       +\n");
        printf("+                 6.  按歌手姓名查                       +\n");
	printf("+                 7.  添加歌曲信息                       +\n");
        printf("+                 8.  删除歌曲信息                       +\n");
	printf("+                 9.  修改歌曲信息                       +\n");
	printf("+                 10. 点歌功能                           +\n");
        printf("+                 11. 评价功能                           +\n");
        printf("+                 12. 按点唱人数排序                     +\n");
        printf("+                 13. 按评价分数数排序                   +\n");
        printf("+                 14. 从文件读                           +\n");
        printf("+                 15. 程序结束                           +\n");		
        printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");

 }
/*******************************************************       
功能:登陆函数,验证口令
参数:
参数1:n
  类型:char []
  说明:用户输入口令   
返回值:1或0
  类型:int
  说明:1表示通过验证;0表示没有通过
 *******************************************************/
 int login(char password[])
 {
     static char key[20]="123";
     if(strcmp(password,key)==0)
       return 1;
     else
       return 0;
  }
/*******************************************************       
功能:从文件读信息到结构体数组中
参数:
参数1:songs[]
  类型:song []
  说明:用来存储从文件读到的歌曲信息
返回值:i
  类型:int
  说明:表示实际读取到的个数
 *******************************************************/
 int readFromFile(struct song songs[])
 {
	FILE *fp=NULL;
	int i=0;
	fp=fopen(FILENAME,"rb");  /*打开文件*/

	if(fp!=NULL)
	{

		while(!feof(fp))    /*从文件中读入歌曲*/
		{
     
			if(i>=N)
				break;
			if(fread(songs+i,sizeof(struct song),1,fp)==1)
				i++;
		}

		fclose(fp);
	}
    return i;
}

/*******************************************************       
功能:判断歌曲是否唯一
参数:
参数1:songs[]
  类型:song []
  说明:存储歌曲信息的数组
参数2:N
  类型:int
  说明:表示实际数组的长度 
参数2:songsnum
  类型:int
  说明:要判断的歌曲编号 
返回值:1或0(flag)
  类型:int
  说明:1表示歌曲唯一;0表示歌曲不唯一。
 *******************************************************/
int unique(struct song songs[],int n,int songsnum,int cur)
{
	
	int flag=1,i;
	for(i=0;i<n;i++)
	{
		if(songs[i].num==songsnum&&i!=cur)
		{ 
			flag=0;
			break;
		}
	}
	return flag;
}
 /*******************************************************       
功能:输入信息到结构体数组中
参数:
参数1:songs[]
  类型:song []
  说明:用来存储歌曲信息的数组
参数2:N
  类型:int
  说明:表示实际数组的长度 
返回值:i
  类型:int
  说明:表示增加信息后,实际数组的长度
 *******************************************************/

int input(struct song songs[],int n)
{ 
	int i=n;
	int endFlag=0;
	printf("请输入歌曲信息,以歌曲编号为零结束:\n");
	while(i<N)
	{
		while(1)
		{
			int flag;
			printf ("编号:");
			scanf("%d",&songs[i].num);
			if(songs[i].num==0)
			{
				endFlag=1;
				break;
			}
			flag=unique(songs,i,songs[i].num,i);
			if(flag) break;
			printf("该编号已经存在,请重新输入!\n");
		}
		if(endFlag==1)
			break;
		printf ("歌曲名:");
		scanf("%s",songs[i].name);
		printf ("歌手:");
		scanf("%s",songs[i].singer);
		printf ("专辑:");
		scanf("%s",songs[i].editor);
		printf ("流派:");
		scanf("%s",songs[i].type);
		printf ("发行日期:");
		scanf("%d",&songs[i].date);
		printf ("发行地区:");
		scanf("%s",songs[i].address);
		printf("时长: ");
		scanf("%d min",&songs[i].time);
		i++;
	
		
	}
	return i;
}
/*******************************************************
功能:删除歌曲信息
参数:
参数1:songs[]
  类型:song []
  说明:用来存储歌曲信息的数组
参数2:N
  类型:int
  说明:表示实际数组的长度 
返回值:i
  类型:int
  说明:表示删除信息后,实际数组的长度
*******************************************************/
//int N=i;
int del(struct song songs[],int n)                           
{
	 int i,j,found=0;
	 char delname[20];
	 char choice;
	 printf("请你输入要删除的歌曲名称:\n");      /*删除的歌曲的信息*/
	 scanf("%s",delname);
	 for(i=0;i<n;i++)
	 {
		  if(strcmp(songs[i].name,delname)==0)
		  { found++;
			printf("找到啦!\n");
			printf("编号:%d\n",songs[i].num);
			printf("歌名:%s\n",songs[i].name);
			printf("歌手:%s\n",songs[i].singer);
			printf("专辑:%s\n",songs[i].editor);
			printf("流派:%s\n",songs[i].type);
			printf("发行日期:%d\n",songs[i].date);
			printf("发行地区:%s\n",songs[i].address);
			printf("时长:%d min\n",songs[i].time);
	 	    printf("你确实要删除这首歌吗?(Y/N)");
		    getchar();
		    scanf("%c",&choice);
		    if(choice=='Y'||choice=='y')
			{
			  for(j=i;j<n;j++)
				songs[j]=songs[j+1];
			  n--;
 	 	      printf("删除成功!\n");
			} 
			i--;
		  }
	 }
    if(found==0)
        printf("\n指定的歌曲不存在!\n");

	return n;
	 
}
/*******************************************************
功能:修改歌曲信息
参数1:songs[]
  类型:song []
  说明:用来存储歌曲信息的数组
参数2:N
  类型:int
  说明:表示实际数组的长度 

返回值:无
*********************************************************/
void changecommunicate(struct song songs[],int n)
{
	
	int i,found=0;
	char chcname[20];
	int choicecom;
	printf("请你输入你要修改的歌曲名称:\n");/*修改的歌曲的信息*/
	scanf("%s",chcname);
	for(i=0;i<n;i++)
	{
		if(strcmp(songs[i].name,chcname)==0)
		{   found++;
			printf("以下为您所要修改的歌曲的信息:\n");
			printf("歌曲名称为%s\n",songs[i].name);
			printf("歌手姓名%s\n",songs[i].singer); 
			printf("专辑名称为%s\n",songs[i].editor);
			printf("歌曲流派为%s\n",songs[i].type);	
			printf("出版年份为%d\n",songs[i].date);
			printf("发行地区为%s\n",songs[i].address);
			printf("歌曲时长为%d min\n",songs[i].time);
			printf("请你选择要修改的东西:\n");
			printf("*****************************************\n");
			printf("1修改专辑名称\n");
			printf("2修改歌手姓名\n");
			printf("0退出系统\n");
			printf("*****************************************\n");
			scanf("%d",&choicecom);
			switch(choicecom)
			{
			case 1:
				{
					printf("输入新专辑:");
					scanf("%s",songs[i].editor);
				}
			  break;
			case 2:
				{
					printf("输入新歌手姓名:");
					scanf("%s",songs[i].singer);
				}
			  break;
			case 0:
			  return;
			default:
			  printf("输入有错\n");
			}
       
		  }
	}
	if(found==0)
		printf("所选歌曲不存在:\n");
}
 /*******************************************************       
功能:将结构体数组中的歌曲信息显示到屏幕和文件中
参数:
参数1:songs[]
  类型:song []
  明:用来存储歌曲信息的数组
参数2:N
  类型:int
  说明:表示实际数组的长度 
返回值:无
 *******************************************************/
void output(struct song songs[],int n)
{
	int i;
	for(i=0;i<n;i++)
	{	
		printf ("编号:");	
		printf("%d\n",songs[i].num);
		printf ("歌曲名:");
		printf("%s\n",songs[i].name);
		printf ("歌手:");
		printf("%s\n",songs[i].singer);
		printf ("专辑:");
		printf("%s\n",songs[i].editor);
		printf ("流派:");
		printf("%s\n",songs[i].type);	
		printf ("发行日期:");
		printf("%d\n",songs[i].date);
		printf ("发行地区:");
		printf("%s\n",songs[i].address);
		printf("时长: ");
		printf("%d min\n",songs[i].time);
		printf("点歌次数:");
		printf("%d\n",songs[i].times);
		printf("评价分数:");
		printf("%f\n",songs[i].score);
	}
}
/*******************************************************       
功能:根据编号从数组中查找歌曲
参数:
参数1:songs[]
  类型:song []
  说明:用来存储歌曲信息的数组
参数2:N
  类型:int
  说明:表示实际数组的长度 
参数3:songsnum
  类型:int
  说明:表示要查找的歌曲的编号
返回值:无
 *******************************************************/
void queryInfonum(struct song songs[],int n, int num)
{
	int i;
	for(i=0;i<n;i++)
	{
		if(num==songs[i].num)
        {
			printf("找到啦!它的下标是 :%d\n", i);
			printf("编号:%d\n",songs[i].num);
			printf("歌名:%s\n",songs[i].name);
			printf("歌手:%s\n",songs[i].singer);
			printf("专辑:%s\n",songs[i].editor);
			printf("流派:%s\n",songs[i].type);
			printf("发行日期:%d\n",songs[i].date);
			printf("发行地区:%s\n",songs[i].address);
			printf("时长:%d min\n",songs[i].time);
			break;
        }
    }
    if(i>=n)
        printf("\n不存在!\n");
}

 
/*******************************************************       
功能:根据歌曲名从数组中查找歌曲
参数:
参数1:songs[]
  类型:song []
  说明:用来存储歌曲信息的数组
参数2:N
  类型:int
  说明:表示实际数组的长度 
参数3:songsname
  类型:char
  说明:表示要查找的歌曲的歌名
返回值:无
 *******************************************************/
void queryInfoname(struct song songs[],int n,char name[])
{ 
	int i,found=0;
	for(i=0;i<n;i++)
	{
		if(strcmp(name,songs[i].name)==0)
        {
			found++;
			printf("找到啦!它的下标是 :%d\n", i);
			printf("编号:%d\n",songs[i].num);
			printf("歌名:%s\n",songs[i].name);
			printf("歌手:%s\n",songs[i].singer);
			printf("专辑:%s\n",songs[i].editor);
			printf("流派:%s\n",songs[i].type);
			printf("发行日期:%d\n",songs[i].date);
			printf("发行地区:%s\n",songs[i].address);
			printf("时长:%d min\n",songs[i].time);
		
        }
    }
    if(found==0)
        printf("\n不存在!\n");
} 
/*******************************************************       
功能:根据歌手从数组中查找歌曲
参数:
参数1:songs[]
  类型:song[]
  说明:用来存储歌曲信息的数组
参数2:N
  类型:int
  说明:表示实际数组的长度 
参数3:songsinger
  类型:char
  说明:表示要查找的歌曲的歌手
返回值:无
 *******************************************************/
void queryInfosinger(struct song songs[],int n ,char singer[])
{
	int i,found=0;
	for(i=0;i<n;i++)
	{
		if(strcmp(singer,songs[i].singer)==0)
        {
			found++;
			printf("找到啦!它的下标是 :%d\n", i);
			printf("编号:%d\n",songs[i].num);
			printf("歌名:%s\n",songs[i].name);
			printf("歌手:%s\n",songs[i].singer);
			printf("专辑:%s\n",songs[i].editor);
			printf("流派:%s\n",songs[i].type);
			printf("发行日期:%d\n",songs[i].date);
			printf("发行地区:%s\n",songs[i].address);
			printf("时长:%d min\n",songs[i].time);
		
        }
    }
  if(found==0)
        printf("\n不存在!\n");
}
/*******************************************************       
功能:根据专辑从数组中查找歌曲
参数:
参数1:songs[]
  类型:song []
  说明:用来存储歌曲信息的数组
参数2:N
  类型:int
  说明:表示实际数组的长度 
参数3:songseditor
  类型:char
  说明:表示要查找的歌曲的专辑
返回值:无
 *******************************************************/
void queryInfoeditor(struct song songs[],int n ,char editor[])
{
	int i,found=0;
	for(i=0;i<n;i++)
	{
		if(strcmp(editor,songs[i].editor)==0)
        {   found++;
			printf("找到啦!它的下标是 :%d\n", i);
			printf("编号:%d\n",songs[i].num);
			printf("歌名:%s\n",songs[i].name);
			printf("歌手:%s\n",songs[i].singer);
			printf("专辑:%s\n",songs[i].editor);
			printf("流派:%s\n",songs[i].type);
			printf("发行日期:%d\n",songs[i].date);
			printf("发行地区:%s\n",songs[i].address);
			printf("时长:%d min\n",songs[i].time);		
        }
    }
   
    if(found==0)
        printf("\n不存在!\n");
}
/************************************************
点歌功能
   输入歌曲编号,点唱人数自动加1,显示"点歌成功"
**************************************************/
//for(i=0;i<N;i++)
		//songs[i].times=0;
void choice(struct song songs[],int n)
{
	int i,num;
	printf("请输入所选歌曲编号:");
	scanf("%d",&num);
	for(i=0;i<n;i++)
	{   if(songs[i].num==num)
		{
			songs[i].times+=1;
			printf("点歌成功!");
			break;
		}
	}
	if(i>=n)
        printf("\n所点的歌不存在!\n");
}
/********************************************
歌曲评价功能
输入歌曲编号和分数,此歌曲评价分数增加,显示"评价成功"。
**************************************************/
//for(i=0;i<N;i++)
		//songs[i].score=0;
void appraise(struct song songs[],int n)
{
	int i,num;
	float score;
	printf("请输入所选歌曲编号:");
	scanf("%d",&num);
	for(i=0;i<n;i++)
	if(songs[i].num==num)
	{	printf("请输入评价分数:");
		scanf("%f",&score);
		songs[i].score+=score;
		printf("评价成功!");
		break;
	}
	if(i>=n)
        printf("\n所点的歌不存在!\n");
}
/*按点唱人数从大到小排序*/
void sort1(struct song songs[],int n)
{

	int i,j;
	struct song	t;
	for(j=0;j<n-1;j++)
		for(i=0;i<n-j-1;i++)
			if(songs[i].times<songs[i+1].times)
			{
				t=songs[i];
				songs[i]=songs[i+1];	
				songs[i+1]=t;			
			}
	printf("编号 歌曲名称 点歌次数\n");
	for(i=0;i<n&&i<10;i++)
	{
		printf("%4d ",songs[i].num);
		printf("%10s ",songs[i].name);
		printf("%4d ",songs[i].times);
		printf("\n");
	}

}
/*按歌曲分数从大到小排序*/
void sort2(struct song songs[],int n)
{
	int i,j;
	struct song	t;
	for(j=0;j<n-1;j++)
		for(i=0;i<n-j-1;i++)
			if(songs[i].score<songs[i+1].score)
			{
				t=songs[i];
				songs[i]=songs[i+1];	
				songs[i+1]=t;
			}
	printf("编号 歌曲名称 评价分数\n");
	for(i=0;i<n&&i<10;i++)
	{
		printf("%4d ",songs[i].num);
		printf("%10s ",songs[i].name);
		printf("%6.0f ",songs[i].score);
		printf("\n");

	}
	
}
/*******************************************************       
功能:结构体数组中的歌曲信息输出到文件
参数:
参数1:songs
  类型:song []
  说明:用来存储从文件读到的歌曲信息
参数2:length
  类型:int
  说明:表示实际数组的长度 
返回值:无
 *******************************************************/
void writeToFile(struct song songs[],int length)
{
	FILE *fp=NULL;
	int i=0;

	fp=fopen(FILENAME,"wb");

	if(fp==NULL)
	{
		printf("打开文件出错!\n");
		exit(0);
	}

	for(i=0;i<length;i++)
		fwrite(songs+i,sizeof(struct song),1,fp);

	fclose(fp);

}


void main()
{
	struct song songs[N];
	char password[20];
	int choices = 0; /*select and store menu item  */
    int s=0;
    int num,sum=0,i;
	char name[20],singer[20],editor[20];
    /*====验证用户的口令,直到正确为止====*/
	do{
		printf("请输入口令:");
		scanf("%s",password);

		s=login(password);
     }while(s==0);
	/*====根据用户的选择,执行相应的操作.====*/
	for(i=0;i<N;i++)
		songs[i].times=0;
	for(i=0;i<N;i++)
		songs[i].score=0;
	sum=readFromFile(songs);
    while(1)
    {

		scan();
		printf("\n 请选择您的操作(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15):\n");
        scanf("%d",&choices);

		switch(choices)
        {

			case 1:
				sum=input(songs,sum);
				printf("\n现有%d个歌曲信息\n",sum);
				break;
			case 2:
				if(sum==0)
				printf("系统中没有歌曲信息,请先初始化!\n\n");
				else
				output(songs,sum);
				break;
			case 3:
				printf("请输入欲查找的歌曲编号:\n");
				scanf("%d",&num);
				queryInfonum(songs,sum,num);
				break;
			case 4:
				printf("请输入欲查找的歌曲名:\n");
				scanf("%s",name);
				queryInfoname(songs,sum,name);
				break;
            case 5:
				printf("请输入欲查找的专辑:\n");
				scanf("%s",editor);
				queryInfoeditor(songs,sum,editor );
				break;
            case 6:
				printf("请输入欲查找的歌手:\n");
				scanf("%s",singer);
				queryInfosinger(songs,sum,singer);
				break;
			case 7:
				sum=input(songs,sum);
				printf("\n现有%d个歌曲信息\n",sum);
				break;
			case 8:
				sum=del(songs,sum);
				break;
            case 9:
				changecommunicate(songs,sum);
				break;
			case 10:
				choice(songs,sum);
				break;
			case 11:
				appraise(songs,sum);
				break;
			case 12:
				sort1(songs,sum);
				break;	
			case 13:
				sort2(songs,sum);
				break;
		
			case 14:
				sum=readFromFile(songs);
				break;	
			case 15:
				writeToFile(songs,sum);
				exit(0);
				break;
        }
	}
}
  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
根据提供的引用内容,我们可以了解到KTV点歌系统需要实现的功能包括管理员对歌曲进行管理、统计等操作,以及用户根据关键字或风格等对歌曲进行查询等操作。下面是一个简单的KTV点歌系统C语言代码示例,实现了管理员和用户的基本功能: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_SONGS 1000 #define MAX_NAME 50 #define MAX_SINGER 50 #define MAX_STYLE 20 typedef struct { char name[MAX_NAME]; char singer[MAX_SINGER]; char style[MAX_STYLE]; int score; } Song; Song songs[MAX_SONGS]; int num_songs = 0; void add_song() { if (num_songs >= MAX_SONGS) { printf("The song list is full.\n"); return; } Song song; printf("Please enter the name of the song: "); scanf("%s", song.name); printf("Please enter the name of the singer: "); scanf("%s", song.singer); printf("Please enter the style of the song: "); scanf("%s", song.style); song.score = 0; songs[num_songs++] = song; printf("The song has been added successfully.\n"); } void delete_song() { char name[MAX_NAME]; printf("Please enter the name of the song you want to delete: "); scanf("%s", name); int i; for (i = 0; i < num_songs; i++) { if (strcmp(songs[i].name, name) == 0) { int j; for (j = i; j < num_songs - 1; j++) { songs[j] = songs[j + 1]; } num_songs--; printf("The song has been deleted successfully.\n"); return; } } printf("The song is not found.\n"); } void search_song() { char keyword[MAX_NAME]; printf("Please enter the keyword you want to search: "); scanf("%s", keyword); int i; for (i = 0; i < num_songs; i++) { if (strstr(songs[i].name, keyword) != NULL || strstr(songs[i].singer, keyword) != NULL || strstr(songs[i].style, keyword) != NULL) { printf("%s - %s (%s) [%d]\n", songs[i].name, songs[i].singer, songs[i].style, songs[i].score); } } } void rate_song() { char name[MAX_NAME]; printf("Please enter the name of the song you want to rate: "); scanf("%s", name); int i; for (i = 0; i < num_songs; i++) { if (strcmp(songs[i].name, name) == 0) { int score; printf("Please enter your score (0-10): "); scanf("%d", &score); if (score < 0 || score > 10) { printf("Invalid score.\n"); return; } songs[i].score += score; printf("Your score has been added successfully.\n"); return; } } printf("The song is not found.\n"); } void show_statistics() { int i; int total_score = 0; int num_rated_songs = 0; for (i = 0; i < num_songs; i++) { if (songs[i].score > 0) { total_score += songs[i].score; num_rated_songs++; } } if (num_rated_songs == 0) { printf("No song has been rated yet.\n"); } else { printf("The average score of rated songs is %.2f.\n", (float)total_score / num_rated_songs); } } int main() { while (1) { printf("Welcome to KTV song system.\n"); printf("Please select your role:\n"); printf("1. Administrator\n"); printf("2. User\n"); printf("3. Exit\n"); int role; scanf("%d", &role); if (role == 1) { printf("Please enter the password: "); char password[10]; scanf("%s", password); if (strcmp(password, "admin") != 0) { printf("Incorrect password.\n"); continue; } while (1) { printf("Administrator menu:\n"); printf("1. Add song\n"); printf("2. Delete song\n"); printf("3. Show statistics\n"); printf("4. Back to the previous menu\n"); int choice; scanf("%d", &choice); switch (choice) { case 1: add_song(); break; case 2: delete_song(); break; case 3: show_statistics(); break; case 4: goto end; default: printf("Invalid choice.\n"); break; } } } else if (role == 2) { while (1) { printf("User menu:\n"); printf("1. Search song\n"); printf("2. Rate song\n"); printf("3. Back to the previous menu\n"); int choice; scanf("%d", &choice); switch (choice) { case 1: search_song(); break; case 2: rate_song(); break; case 3: goto end; default: printf("Invalid choice.\n"); break; } } } else if (role == 3) { break; } else { printf("Invalid role.\n"); } } printf("Goodbye.\n"); end: return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟-宇的个人博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值