C控制台模拟播放器

来源:互联网 发布:现货黄金模拟软件 编辑:程序博客网 时间:2024/05/16 05:35


// MusicPlayer.cpp :定义控制台应用程序的入口点。

//作者Tst

 

#include"stdafx.h"

#include"malloc.h"

#include<iostream>

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<windows.h>

#include<locale.h>

#include<time.h>

 

typedefstructMusicPlayer{

   charSong[20];    //存取歌曲名

   charSinger[10];  //存取歌曲作者

   structMusicPlayer *prior;   //前驱

   structMusicPlayer *crunt;   //指向当前节点

   structMusicPlayer *next;    //后驱

}Song,*LinkList;

 

LinkList gp;        //全局变量,数据交接

LinkList Temp_G_p;  //用于存储播放操作后的指针指向(crunt的位置)

char Song_Name[20]; //获取控制台输入的歌曲名(字符)

char author[20];    //获取控制台输入的作者名(字符)

int Count=1;        //计数器

 

/*创建歌单*/

LinkList CreatMusicmenu(){

   Temp_G_p =(LinkList)malloc(sizeof(Song));

   LinkList head,tail,r;

   inti = 1;

   head = (LinkList)malloc(sizeof(Song));

   head->next=NULL;

   tail =head;

   r = (LinkList)malloc(sizeof(Song));

   printf("歌曲名:");

   getchar();

   strncpy_s(r->Song,gets_s(Song_Name), 20);  //Song_Name的字符传递给Song

   printf("作者:");

   scanf_s("%s", author, 20);

   strncpy_s(r->Singer,author, 20);  //author的字符传递给Singer

   tail->crunt= r;  //赋值crunt,使其指向当前

 

   //printf("这是tail:%s\n",tail->crunt->Song);

   Temp_G_p->crunt= tail->crunt;  //tail改变之前初始化Temp_G_p->crunt

   //printf("这是Temp_G_p->crunt:%s\n",Temp_G_p->crunt->Song);

 

   tail->next= r;

   r->prior= tail;

   tail =tail->next;

   tail->next= head;

   head->prior= tail;

   printf("歌单已创建!\n");

   returnhead;

}

 

/*遍历*/

void Treval(LinkListH){

   LinkList p =H;

   inti = Count;//计数器

   intj = Count;//计数器

   if(p->next == p||p->prior == p){ //判断为空的条件

        printf("该歌单为空!\n");

   }

   else{

        printf("\t\t\t 歌单列表\n");

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

        while(p->next !=H){

            i--;

            printf("\t\t%d.%s - %s\n", j - i, p->next->Song,p->next->Singer);// j-i 用于自动更新歌曲的序号

            p= p->next;

        }

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

   }

}

 

/*新增歌曲*/

void Insert(LinkListH){

   LinkList p =H,r;

   r = (LinkList)malloc(sizeof(Song));

   printf("歌曲名:");

   getchar();

   strncpy_s(r->Song,gets_s(Song_Name), 20);  

   printf("作者:");

   /*注释部分引用后会输出乱码,尚未解决,换了输入的方法*/

   //getchar();

   //strncpy_s(r->Singer,gets_s(author), 5);

   scanf_s("%s", author, 20);

   strncpy_s(r->Singer,author, 20); 

   r->prior= p->prior;

   r->next= p;

   p->prior->next= r;

   p->prior=r;

   Count++;

}

 

/*修改歌曲信息*/

void Update(LinkListH){

   LinkList p =H;

   charchose;//计数器

   intposition;//定位变量

   if(p->next == p || p->prior == p){

        printf("该歌单为空!\n");

   }

   else{

        printf("确定修改?确认输入Y,退出输入N: ");

        getchar();

        scanf_s("%c", &chose);

        switch(chose){

        case'Y':

            printf("你要修改第几首歌曲信息?请输入序号:");

            scanf_s("%d", &position);

            for(inti = 1; i <= position; i++){

                 if(NULL == p->next){

                     break;

                 }

                 p= p->next;

            }

            printf("歌曲名:");

            getchar();

            strncpy_s(p->Song,gets_s(Song_Name), 20);

            printf("作者:");

            scanf_s("%s", author, 20);

            strncpy_s(p->Singer,author, 20);

            printf("正在修改,请稍候");

            for(inti = 0; i < 3; i++){

                 Sleep(850);

                 printf(".");

            }

            printf("\n");

            //Judgment();//此处应该有一个判断是否修改成功的语句

            printf("信息修改成功!\n");

            break;

        case'N':

            break;

        default:

            printf("指令错误,退出修改!\n");

            break;

        }

   }  

}

 

/*移除歌曲*/

void Del(LinkListH){

   LinkList p =H;

   intposition;

   if(p->next == p || p->prior == p){

        printf("该歌单为空!\n");

   }

   else{

        printf("你想删除第几首歌曲?请输入序号:");

        scanf_s("%d", &position);

        printf("正在移除,请稍候");

        for(inti = 0; i < 3;i++){

            Sleep(850);

            printf(".");

        }

        printf("\n");

        for(inti = 1; i <= position; i++){

            if(NULL == p->next){

                 break;

            }

            p= p->next;

        }

        p->prior->next= p->next;

        p->next->prior= p->prior;

        free(p);

        p =NULL;

        printf("移除成功!\n");

        Count--;

   }

}

 

/*顺序播放*/

void SequetialPlay(LinkListH){//正向遍历链表

   LinkList p =H;

   if(p->next == p || p->prior == p){

        printf("该歌单为空!\n");

   }

   else{

        while(p->next !=H){

            printf("%s\n", p->next->Song);

            p= p->next;

            Sleep(2000);//线程沉睡

        }

   }

   Temp_G_p->crunt= p->crunt;

}

 

/*倒序播放*/

void ReversePlay(LinkListH){//逆向遍历链表

   LinkList p =H;

   if(p->next == p || p->prior == p){

        printf("该歌单为空!\n");

   }

   else{

        while(p->prior !=H){

            printf("%s\n", p->prior->Song);

            p= p->prior;

            Sleep(2000);

        }

   }  

}

 

/*循环播放*/

void CycPlay(LinkListH){

   LinkList p =H;

   if(p->next == p || p->prior == p){

        printf("该歌单为空!\n");

   }

   else{

        inti = 0, j = 0, n;

        printf("你希望循环播放几次:");

        scanf_s("%d",&n);

        printf("%d\n",Count);

        while(i < n)

        {

            while(j<Count)

            {

                 printf("%s\n", Temp_G_p->crunt->Song);

                 Temp_G_p->crunt= Temp_G_p->crunt->next;

               if(Temp_G_p->crunt ==H){

                     Temp_G_p->crunt= Temp_G_p->crunt->next;

                 }

                 //Sleep(900);//线程沉睡

                 j++;

            }

            j= 0;//重置j

            i++;

        }  

   }

}

 

/*下一首*/

void nextPlay(LinkListH){//逐个正向遍历

   LinkList p =H;

   if(p->next == p || p->prior == p){

        printf("此歌单为空!!\n");

   }

   else{

        printf("%s\n", Temp_G_p->crunt->Song);

        Temp_G_p->crunt= Temp_G_p->crunt->next;//指向当前的指针后移

 

        //跳过头节点,因为歌单链表的头不存储值,当前指针crunt输出NULL转为乱码。

        if(Temp_G_p->crunt ==H){

            Temp_G_p->crunt= Temp_G_p->crunt->next;

        }

   }

}

 

/*上一首*/

void prePlay(LinkListH){//逐个逆向遍历

   LinkList p =H;

   if(p->next == p || p->prior == p){

        printf("此歌单为空!!\n");

   }

   else{

        printf("%s\n", Temp_G_p->crunt->Song);

        Temp_G_p->crunt= Temp_G_p->crunt->prior;//指向当前的指针前移

 

        //跳过头节点,因为歌单链表的头不存储值,当前指针crunt输出NULL转为乱码。

        if(Temp_G_p->crunt ==H){

            Temp_G_p->crunt= Temp_G_p->crunt->prior;

        }

   }

}

 

/*switch模块控制*/

void Operate();//函数索引标签

void Operate1(){

   charflag;

   printf("\t\t     Menu\n");

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

   printf("\t\t1 -顺序播放\n");

   printf("\t\t2 -倒序播放\n");

   printf("\t\t3 -下一曲\n");

   printf("\t\t4 -上一曲\n");

   printf("\t\t5 -循环播放\n");

   printf("\t\t0 -返回上一级\n");

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

   printf("\t\t\t\t\t\t  输入指令:");

   while(true){

        scanf_s("%d", &flag);

        switch(flag){

        case1:

            SequetialPlay(gp);

            printf("\n\t\t\t\t\t\t  输入指令:");

            break;

        case2:

            ReversePlay(gp);

            printf("\n\t\t\t\t\t\t  输入指令:");

            break;

        case3:

            nextPlay(gp);

            printf("\n\t\t\t\t\t\t  输入指令:");

            break;

        case4:

            prePlay(gp);

            printf("\n\t\t\t\t\t\t  输入指令:");

            break;

        case5:

            CycPlay(gp);

            printf("\n\t\t\t\t\t\t  输入指令:");

            break;

        case0:

            Operate();//返回上一级

            break;

        }

   }

}

void Operate(){

   intflag;

   printf("\t\t\t\t\t\t  MuscicPlayer\n");

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

   printf("\t\t1 -创建歌单\n");

   printf("\t\t2 -浏览歌单\n");

   printf("\t\t3 -新增歌曲\n");

   printf("\t\t4 -修改歌曲信息\n");

   printf("\t\t5 -移除歌曲\n");

   printf("\t\t6 -进入播放界面\n");

   printf("\t\t0 -退出播放器\n");

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

   while(true)

   {

        printf("\t\t\t\t\t\t  输入指令:");

        scanf_s("%d",&flag);

        switch(flag){

        case1:

            gp= CreatMusicmenu();

            break;

        case2:

            Treval(gp);

            break;

        case3:

            Insert(gp);

            break;

        case4:

            Update(gp);

            break;

        case5:

           Del(gp);

            break;

        case6:

            Operate1();//进入播放界面

            break;      

        //case10://检验Count(不显示在指令表)

        // printf("%d", Count);

        // break;

        case0:

            printf("即将退出,请稍候");

            for(inti = 0; i < 3; i++){

                 Sleep(750);

                 printf(".");

            }

            printf("\n");

           return;

            break;

        default:

            //处理输入非指令的异常

            printf("指令表不包含指令\n");

            break;

        }

   }

}

 

/*主函数入口*/

void main(){

   Operate();

   system("pause");//控制闪屏

}


  

1 0
原创粉丝点击