C语言实现KTV歌曲系统
生活随笔
收集整理的這篇文章主要介紹了
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;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歌曲系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 普通键盘这么修改就和mac一样的键盘
- 下一篇: 用JavaScript实现简易的网页音乐