#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;elsereturn 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");elseoutput(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;}}
}

C语言实现KTV歌曲系统相关推荐

  1. C语言课程设计-KTV点歌系统

    需求分析: 1.设计题目:KTV点歌系统模拟(该系统是一个常用的ktv点歌系统,可以让用户根据自己的喜好进行添加.查看.删除等操作.系统应该具有便捷.稳定.功能齐全的特点.) 2.系统功能需求分析: ...

  2. Java 使用LinkedList模拟KTV点歌系统,首先先添加若干歌曲,如果歌曲列表中已有该歌曲,则不加入,否则追加。`然后选择列表中的其中一首置顶,最后选择列表中一首歌曲前置一位。

    使用LinkedList模拟KTV点歌系统 该系统的任务是执行3个操作:首先先添加若干歌曲,如果歌曲列表中已有该歌曲,则不加入,否则追加.`然后选择列表中的其中一首置顶,最后选择列表中一首歌曲前置一位 ...

  3. 对大一C语言的课程设计——KTV点歌系统的介绍(链表)

    写此博客的目的:一是为了让自己对链表的思考方式更加的清晰,二是对不清楚链表实现方式的讲解! 所有的菜单都没有进行讲解,太简单.另外建议写这种比较大的程序的时候,不要着急先写菜单,要先把每一个功能实现完 ...

  4. 大一课设ktv点歌系统c语言

    先给出要求: 设计一个KTV点歌系统,该系统的主要功能是管理员对歌曲进行管理.统计等操作.以及用户根据关键字或风格等对歌曲进行查询等操作 程序主函数:系统入口,监控程序运行. 系统界面要求:接收键盘输 ...

  5. 基于JAVA的KTV点歌系统,管理系统。

    开发环境,语言,工具 本系统的采用的开发语言是JAVA,主要使用到的框架是Swing框架,数据库使用的是Mysql5.7.开发工具使用的是Eclipse 主要功能与身份 身份:管理员,客户 客户主要功 ...

  6. KTV点歌系统数据库设计文档

    KTV点歌系统数据库设计文档 前台e-r图 后台 E-R 3.数据库字典 SwanInfo(歌星表) 中文名 英文名 数据类型 大小 约束 备注 歌星编号 SwanID varchar 20 主键, ...

  7. 星梦小组KTV点歌系统简介

    班 级:19级青鸟3班 组 名:星梦小组 班主任:王欣欣老师 指导老师:穆雄雄老师 组 长:刘娜 副组长:王宝兴.汪杰 小组成员:汪杰.方传森.王宝兴.赵燕涵.云善辉.丁长琨.翟选浩.蔺广兴.王建业. ...

  8. 【计算机毕业设计】KTV点歌系统

    一.系统截图(需要演示视频可以私聊) 摘 要 本论文主要论述了如何使用JAVA语言开发一个KTV点歌系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发. ...

  9. 毕业设计源码Java基于ssm的KTV点歌系统的实现

    毕业设计源码从哪找 毕业设计源码下载网站推荐 开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工 ...

最新文章

  1. Excel导入异常Cannot get a text value from a numeric cell解决
  2. java参数传递:值传递还是引用传递
  3. 数字图像处理2018-10-9
  4. 那些年,我在西安的“遇见”(一)
  5. Linux根文件系统学习总结
  6. WinForm中Partial部分类的使用
  7. Android:安卓工程结构介绍
  8. java集合---迭代器iterator
  9. rhel5下限值用户使用su切换身份
  10. 【C++grammar】代理构造、不可变对象、静态成员
  11. LeetCode 1199. 建造街区的最短时间(优先队列贪心)
  12. c语言i++和++i程序_使用C ++程序修改链接列表的内容
  13. Android 系统(189)---Android Handler:这是一份 全面、详细的Handler机制 学习攻略
  14. 半年成java大佬_通过自学60天成为java大佬 第一天 知识点总结 数据类型
  15. python的matplotlib库怎么安装_为Python安装matplotlib库
  16. 浅谈 Spring IOC
  17. ospf 指定dr_OSPF的基本配置及DR /BDR选举的实验
  18. Linux 操作系统原理 — 操作系统的本质
  19. GD32串口接收发送数据总结
  20. [小雨学编程之C#] 18.1 数据类型转换,数据类型别名

热门文章

  1. 人脸搜索引擎准得吓人,记者:我都不知道自己拍过这些照片
  2. java 客户端 tcp_一个简单的Tcp客户端
  3. 伪彩色图片中光标颜色的自动算法
  4. vi指令说明(简易版)
  5. day02_《谷粒商城》的完整流程(详细版一)
  6. 记账就使用电子记账本 用电脑记录安全放心
  7. TCP 聊天室v2 实现多人匿名聊天 C++,linux系统下
  8. 论文研读 —— 1. Modeling Motion Blur in Computer Generated Images
  9. ChatGPT拿下谷歌18万美元offer!通过L3入职测试,人类码农危?
  10. 认识c语言程序,认识C语言 -一个完整的C语言程序是什么样的?