zoukankan      html  css  js  c++  java
  • 基于C语言的KTV点歌系统

    0x00. 前言

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

    0x01. 选题

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

    0x02. 软件的功能要求

    • 查询歌手的歌曲功能、
    • 查询歌曲的歌词功能、
    • 登录管理员功能、
    • 增添歌曲及其歌词功能、
    • 删除歌曲(文件)功能、
    • 修改管理员密码功能 等

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

    把歌手以其姓名文件命名,文件内每行都是他(她)的一首歌曲,文件夹名singer;歌词以其歌曲文件命名,文件内是歌词内容,文件夹名song。文件下载地址

    • 查询/删除歌曲:可选择下图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<stdio.h>
    #include<stdlib.h>
    #include<windows.h>
    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~
    ");
    	while(1)
    	{
    		printf("***********************************************************
    ");
    		printf("**点歌请输入1 查看歌手信息请输入2 输入3登录管理员 否则退出*
    ");
    		printf("***********************************************************
    ");
    		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("######################################################
    ");
    		printf("##删除歌曲选择1 添加歌曲选择2 更改密码选择3 否则退出##
    ");
    		printf("######################################################
    ");
    		scanf("%d",&num);
    		if(num == 1)
    			del_song();
    		else if(num == 2)
    			add_song();
    		else if(num == 3)
    			change_password();
    		else
    			break;
    	}
    	printf("
    欢迎下次再来!
    ");
    	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("不存在这首歌曲!
    ");
    	}
    	else
    	{
    		printf("#############################################
    ");
    		printf("    正在播放:%s
    ",temp);
    		printf("歌词:
    ");
    		while(fgets(buff,200,fp)!=NULL)
    			printf("%s",buff);
    		printf("
        播放完毕:%s",temp);
    		printf("
    #############################################
    ");
    		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("歌手全部歌曲如下:
    ");
    		printf("|--------------------------|
    ");
    		while(fgets(buff,100,fp1)!=NULL)
    		{
    			printf("%s",buff);
    		}
    		fclose(fp1);
    		printf("
    |--------------------------|
    ");
    	}
    }
    
    int login(){
        int state=0;
        char buf[16]={0};
        printf("输入密码:  ");
        scanf("%s",buf);
        if(strcmp(admin_password,buf)==0){
            printf("登陆成功!
    ");
            state=1;
        }
        else
            printf("登录失败,以普通用户身份访问系统。
    ");
        return state;
    }
    
    void del_song()
    {
    	char song_name[32]={0},temp[64]={0};
    	int len = 0;
    	printf("输入要删除的歌曲名字:
    ");
    	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 成功!
    ",song_name); //删除成功
        else
            perror("删除歌曲失败!");//打印错误信息
    }
    void add_song()
    {  
        char song_name[32]={0},temp[64]={0},buf[1024]={0};
        int len = 0;
        FILE *fp;
        printf("输入要新建的歌曲名字:
    "); 
        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结束输入:
    ");
    	    printf("---------------------------------------
    ");
    	    scanf("%s",buf);  //一次接受一行歌词
    	    while( strcmp(buf,"quit") != 0 ){ //比较此行内容是否为quit,如果是就结束循环,关闭文件
    	        buf[strlen(buf)]='
    ';  //scanf字符串不接受换行符,为了美观人为在缓冲区歌词末尾加上换行符
    	        fputs(buf,fp); //写入文件
    	        memset(buf,0,sizeof(buf));
    	        scanf("%s",buf); //一次接受一行歌词
    	    }
    	    printf("---------------------------------------
    输入完毕!
    ");
    	    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'
    ",admin_password);
    }
    
  • 相关阅读:
    eclipse控制台出现中文乱码的问题
    运行jar包
    [MongoDB]------windos下的安装部署与基础使用
    SQLMap-----初识
    序言(第一次写随笔,怎么才能装成经常写的样子呢)
    php7.4编译(centos)
    NGINX 2
    NGINX 1
    LVS的DR模式与NET模式的负载均衡实验
    命令在线查询
  • 原文地址:https://www.cnblogs.com/Higgerw/p/12040196.html
Copyright © 2011-2022 走看看