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 export runnable jar(导出可执行jar包) runnable jar可以执行的
    mave常用指令
    771. Jewels and Stones珠宝数组和石头数组中的字母对应
    624. Maximum Distance in Arrays二重数组中的最大差值距离
    724. Find Pivot Index 找到中轴下标
    605. Can Place Flowers零一间隔种花
    581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
    747. Largest Number At Least Twice of Others比所有数字都大两倍的最大数
    643. Maximum Average Subarray I 最大子数组的平均值
    414. Third Maximum Number数组中第三大的数字
  • 原文地址:https://www.cnblogs.com/Higgerw/p/12040196.html
Copyright © 2011-2022 走看看