c语言大作业点歌系统,基于C语言的KTV点歌系统

0x00. 前言

更换了编辑器为markdown,来码一个以前的编程作业,KTV点歌系统.

0x01. 选题

模拟KTV点歌系统。用户可按歌名查找某首歌曲或按歌手名查找其所有歌曲,点歌后显示所点歌曲歌词。管理员可添加和删除歌曲,每个歌曲的歌词用一个单独的文件存储。

0x02. 软件的功能要求

查询歌手的歌曲功能、

查询歌曲的歌词功能、

登录管理员功能、

增添歌曲及其歌词功能、

删除歌曲(文件)功能、

修改管理员密码功能 等

0x03. 作为验收的依据,选取的测试用例及对应的验收数据

把歌手以txt文件命名,文件内每行都是他(她)的一首歌曲,歌词也是以txt文件命名存在同个文件夹内。

查询/删除歌曲:可选择下图1的所有内容。

查询歌手:可选择下图2的所有内容。

登录管理员:登录密码是初始化的 'admin123'。

增添歌曲:歌曲名直接输入、歌词内容直接复制粘贴(末尾行要输入quit然后回车)

图片1

图片2

0x04. 各模块的描述

函数定义

函数总体上是很简单的 ,除了登录函数login返回一个int整数表示不同的登录状态,其他的函数都是无传参、无返回值的。

main函数的第一个while循环,根据输入数字选择功能,以实现下面三个功能:查询歌曲歌词(select_song函数)、查询歌手歌曲(select_singer函数)、登录功能(login函数);如果没输入1 2 3就退出程序。值得注意的是登录函数返回值传给state变量保存,登陆成功后state == 1。

main函数第二个while循环便是依据state变量判断是否已登录,如果没有登录就直接结束了程序,state为1就作为管理员运行第二个while循环。这个循环和上一个循环的实现异曲同工,完全是根据输入选择不同功能,输入非1 2 3就结束循环退出程序。

0x05. 软件结构图

0x06. 使用说明

基于GCC编译器或VC6编译器。

文本文件是UTF-8编码,如果用cmd直接执行会显示乱码,我用的是cmder前端命令行工具,它支持UTF-8编码,可以正常显示。

文件夹结构:

0x07. 测试结果

1. 点歌结果

2. 查询歌手

3. 登录管理员

可以清楚地看到,登录初始密码为admin123,登陆后会进入管理员界面,可以选择添加歌曲、删除歌曲、更改密码等功能。

3.1 添加歌曲

值得注意的是,上面歌词最后一行输入quit回车来确认歌词提示输入完毕,结束输入歌词过程。此时打开歌曲目录能找到新添加的文件:黑猫警长.txt:

3.2 删除刚刚添加的歌曲

3.3 管理员更改登录密码

0x08. 代码

#include

#include

#include

char admin_password[16] = "admin123";

void select_song();

void select_singer();

int login();

void del_song();

void add_song();

void change_password();

int main()

{

int num=0,state=0;

// char choice;

char namebuf[32]={0},singerbuf[32]={0};

printf("大爷来玩啊??boo~\n");

while(1)

{

printf("***********************************************************\n");

printf("**点歌请输入1 查看歌手信息请输入2 输入3登录管理员 否则退出*\n");

printf("***********************************************************\n");

scanf("%d",&num);

if(num == 1)

select_song();

else if(num == 2)

select_singer();

else if(num == 3)

{

state = login();

if(state == 1) //如果登录成功马上跳出次循环,开启下一层循环,选择管理员操作

break;

}

else //输入数据非1 2 3就跳出循环 结束程序

break;

}

//普通用户无法执行次循环

while(state == 1){

printf("######################################################\n");

printf("##删除歌曲选择1 添加歌曲选择2 更改密码选择3 否则退出##\n");

printf("######################################################\n");

scanf("%d",&num);

if(num == 1)

del_song();

else if(num == 2)

add_song();

else if(num == 3)

change_password();

else

break;

}

printf("\n欢迎下次再来!\n");

return 0;

}

void select_song()

{

FILE *fp;

char song_name[20]={0};

char buff[200] = {0};

char temp[20] = {0};

int len;

printf("请输入歌曲名:");

scanf("%s",song_name);

/*给该歌曲名加上文件路径(song文件夹里的歌名.txt文件)*/

strcpy(temp,song_name);

strcpy(song_name,"song//");

strcpy(&song_name[6],temp);

len=strlen(song_name);

strcpy(&song_name[len],".txt");

/*从该路径打开以歌曲命名的文件,提取歌词*/

if((fp=fopen(song_name,"r"))==NULL)

{

printf("不存在这首歌曲!\n");

}

else

{

printf("#############################################\n");

printf(" 正在播放:%s\n",temp);

printf("歌词:\n");

while(fgets(buff,200,fp)!=NULL)

printf("%s",buff);

printf("\n 播放完毕:%s",temp);

printf("\n#############################################\n");

fclose(fp);

}

}

void select_singer()

{

FILE *fp1;

char singer_name[20]={0};

char temp[20]={0};

char buff[100] = {0};

int len;

printf("请输入歌手名:");

scanf("%s",singer_name);

/*给该歌手加上文件路径*/

strcpy(temp,singer_name);

strcpy(singer_name,"singer//");

strcpy(&singer_name[8],temp);//strlen("singer//")=8

len=strlen(singer_name);

strcpy(&singer_name[len],".txt");

/*读取歌手文件中保存的该歌手的所有歌曲*/

if((fp1=fopen(singer_name,"r"))==NULL)

{

printf("不存在歌手!");

}

else

{

printf("歌手全部歌曲如下:\n");

printf("|--------------------------|\n");

while(fgets(buff,100,fp1)!=NULL)

{

printf("%s",buff);

}

fclose(fp1);

printf("\n|--------------------------|\n");

}

}

int login(){

int state=0;

char buf[16]={0};

printf("输入密码: ");

scanf("%s",buf);

if(strcmp(admin_password,buf)==0){

printf("登陆成功!\n");

state=1;

}

else

printf("登录失败,以普通用户身份访问系统。\n");

return state;

}

void del_song()

{

char song_name[32]={0},temp[64]={0};

int len = 0;

printf("输入要删除的歌曲名字:\n");

scanf("%s",song_name); //song_name = "xxx"

strcpy(temp,song_name); //先把歌曲名赋值给temp

strcpy(song_name,"song//");//song_name = "song//" song文件夹下存放歌曲文件

strcpy(&song_name[6],temp); //song_name = "song//xxx"

len=strlen(song_name);

strcpy(&song_name[len],".txt"); //song_name = "song//xxx.txt"

if (!remove(song_name))

printf("删除歌曲 %s 成功!\n",song_name); //删除成功

else

perror("删除歌曲失败!");//打印错误信息

}

void add_song()

{

char song_name[32]={0},temp[64]={0},buf[1024]={0};

int len = 0;

FILE *fp;

printf("输入要新建的歌曲名字:\n");

scanf("%s",song_name); //song_name = "xxx"

strcpy(temp,song_name); //先把歌曲名赋值给temp

strcpy(song_name,"song//");//song_name = "song//" song文件夹下存放歌曲文件

strcpy(&song_name[6],temp);//song_name = "song//xxx"

len=strlen(song_name);

strcpy(&song_name[len],".txt");//song_name = "song//xxx.txt"

fp = fopen(song_name,"w");

if(fp == NULL)

perror("歌曲添加失败");

else{ // 新建歌曲文件成功

printf("现在输入歌词内容,单行输入quit结束输入:\n");

printf("---------------------------------------\n");

scanf("%s",buf); //一次接受一行歌词

while( strcmp(buf,"quit") != 0 ){ //比较此行内容是否为quit,如果是就结束循环,关闭文件

buf[strlen(buf)]='\n'; //scanf字符串不接受换行符,为了美观人为在缓冲区歌词末尾加上换行符

fputs(buf,fp); //写入文件

memset(buf,0,sizeof(buf));

scanf("%s",buf); //一次接受一行歌词

}

printf("---------------------------------------\n输入完毕!\n");

fclose(fp);

}

}

void change_password()

{

char buf[32]={0};

printf("输入新的密码: ");

scanf("%s",buf);

memset(admin_password,0,sizeof(admin_password));

strcpy(admin_password,buf);

printf("更换成功!新密码:'%s'\n",admin_password);

}

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,我们可以了解到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; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值