MP3播放器模拟程序

1、  编程题

 

1)  功能要求

    MP3 Player因为屏幕较小,显示歌曲列表的时候每屏只能显示几首歌曲,用户要通过上下键才能浏览所有的歌曲。

 

    现在要实现通过上下键控制光标移动来浏览歌曲列表,控制逻辑如下(以一屏能显示4首歌曲为例来说明):

A.       歌曲总数<=4的时候,不需要翻页,只是挪动光标位置。

      光标在第一首歌曲上时,按Up键光标挪到最后一首歌曲;光标在最后一首歌曲时,按Down键光标挪到第一首歌曲。

1

2

3

4

1

2

3

4

Up

1

2

3

4

1

2

3

4

Down

 

 

 

 

 

 

 


      其他情况下用户按Up键,光标挪到上一首歌曲;用户按Down键,光标挪到下一首歌曲。

 

1

2

3

4

1

2

3

4

Up

1

2

3

4

1

2

3

4

Down

 

 

 

 

 

 


B.       歌曲总数大于4的时候(以一共有10首歌为例):

      特殊翻页:屏幕显示的是第一页(即显示第1 – 4首)时,光标在第一首歌曲上,用户按Up键后,屏幕要显示最后一页(即显示第7-10首歌),同时光标放到最后一首歌上。同样的,屏幕显示最后一页时,光标在最后一首歌曲上,用户按Down键,屏幕要显示第一页,光标挪到第一首歌上。

1

2

3

4

7

8

9

10

Up

7

8

9

10

1

2

3

4

Down

 

 

 

 

 

 


      一般翻页:屏幕显示的不是第一页时,光标在当前屏幕显示的第一首歌曲时,用户按Up键后,屏幕从当前歌曲的上一首开始显示,光标也挪到上一首歌曲。光标当前屏幕的最后一首歌时的Down键处理也类似。

4

5

6

7

5

6

7

8

Down

3

4

5

6

Up

4

5

6

7

 

 

 

 

 


      其他情况,不用翻页,只是挪动光标就行。

 

2)  输入要求

    输入信息包括:

A.       基本信息,包括:

l         歌曲总数

l         一屏能显示的歌曲数

        注意:歌曲总数和一屏能显示的歌曲数都在1和99之间。

 

B.       用户操作前的情况,包括:

l         当前屏幕显示的第一首歌曲序号

l         光标当前所在的歌曲序号

        注意:歌曲序号从1开始。

 

C.       用户的操作序列

        如DDUUU,表示用户按了两次Down键,之后按了三次Up键

 

    输入的信息存放在一个txt文件(input.txt)中,程序通过读取该txt文件获取输入信息。

 

3)  输出要求

    输出用户操作后的屏幕状态,包括:

l         屏幕显示的第一首歌曲序号

l         光标所在的歌曲序号

 

    输出的信息存放在一个txt文件(output.txt)中。

 

4)  程序要求

    A, 你可以选定VC6/VS2003/V2005/VS2008的工程,作为答题环境;

    B, 请将在给定工程中完成程序,并将程序写在文件“CodeTest2009.cpp”中;如无必要请不要修改其他文件;

    C, 请通过函数InputPreCondition读取输入要求和提条件,通过函数OutputResult将结果输出;函数的说明请参见以下说明。

     int InputPreCondition(

              int      *pTotalItemsNum,  //[out]  Total Number of Song

              int      *pDispNumPerScr,  //[out]  Max Display Num per Screen

              int      *pFirstItemNo,    //[out] Num of First Item in Screen

              int      *pCurItemNo,      //[out] Num of the Item pointed by the Cursor

              COMMANDInfor_t     *pCommandList);    //[out] Operation Command List

 

       int OutputResult(int FirstItemNo,//[in]  Num of First Item in Screen

                    int CurItemNo);   //[in]   Num of the Item pointed by the Cursor

     D, 完成的程序要求逻辑正确,符合编码规范。

代码实现:

// CodeTest2009.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "io.h"

void JudgeCurItemNo(int TotalItemsNum,
     int DispNumPerScr,
     int FirstItemNo,
              int CurItemNo,
              COMMANDInfor_t *pCommandList); //声明函数
void FuncA(int TotalItemsNum,
     int DispNumPerScr,
     int FirstItemNo,
     int CurItemNo,
     COMMANDInfor_t *pCommandList);    //声明函数
void FuncB(int TotalItemsNum,
     int DispNumPerScr,
     int FirstItemNo,
     int CurItemNo,
     COMMANDInfor_t *pCommandList);       //声明函数

int _tmain(int argc, _TCHAR* argv[])
{
    int TotalItemsNum = 0;      // Total Number of Song
 int DispNumPerScr = 0;      // Max Display Num per Screen
 int FirstItemNo  = 0;      // Num of First Item in Screen
    int CurItemNo  = 0;      // Num of the Item pointed by the Cursor
 COMMANDInfor_t  CommandList; // Command List


    InputPreCondition(&TotalItemsNum,
                &DispNumPerScr,
       &FirstItemNo,
       &CurItemNo,
       &CommandList);
 JudgeCurItemNo(TotalItemsNum,
       DispNumPerScr,
       FirstItemNo,
             CurItemNo,
             &CommandList);

 return 0;
}
void JudgeCurItemNo(int TotalItemsNum,
     int DispNumPerScr,
     int FirstItemNo,
              int CurItemNo,
              COMMANDInfor_t *pCommandList)
{
    if (TotalItemsNum <= DispNumPerScr)   //当歌曲总数小于等屏幕显示大小
 {
  FuncA(TotalItemsNum,
     DispNumPerScr,
     FirstItemNo,
     CurItemNo,
     pCommandList);
 }
 else
 {
     FuncB(TotalItemsNum,
     DispNumPerScr,
     FirstItemNo,
     CurItemNo,
     pCommandList);
 }
}
/* 情况A:当歌曲总数不大于屏幕显示的歌曲总数 ,对歌曲显示屏幕的序号无需要调整*/
void FuncA(int TotalItemsNum,
     int DispNumPerScr,
     int FirstItemNo,
     int CurItemNo,
     COMMANDInfor_t *pCommandList)
{
 int LastItemNo = 0;         //定义屏幕显示最后那首歌序号,初始化为0
 int i = 0;

 LastItemNo =FirstItemNo + DispNumPerScr -1; //屏幕显示最后首歌的序号
    if (LastItemNo >TotalItemsNum)    //屏幕最大显示序列号大于歌曲总数
 {
     LastItemNo = TotalItemsNum; //屏幕最大显示歌曲序号调整为歌曲总数
 }

 for (i ;i < pCommandList->Length; ++i)   //便利操作序列
 {
  if ('D' == pCommandList->aCommand[i])  
     {
         CurItemNo++;         //如果是D操作,光标下移
     }
  else if ('U' == pCommandList->aCommand[i])
     {
   CurItemNo--;         //如果是U操作,光标上移
  }

  if (CurItemNo > LastItemNo)    //光标指向的歌曲序号大于显示屏最后那歌曲序号
  {
      CurItemNo = 1;      //光标序号移到第一首歌
  }
  else if (CurItemNo < FirstItemNo)
  {
      CurItemNo = LastItemNo; //光标移到最后那首歌序号
  }
 } 
 OutputResult(FirstItemNo, CurItemNo); 
}
/* 情况B:当歌曲总数大于屏幕显示的歌曲总数 ,对歌曲显示屏幕的序号需要调整*/
void FuncB(int TotalItemsNum,
     int DispNumPerScr,
     int FirstItemNo,
     int CurItemNo,
     COMMANDInfor_t *pCommandList)
{
 int LastItemNo = 0;         //定义屏幕显示最后那首歌序号,初始化为0
 int i = 0;

 LastItemNo =FirstItemNo + DispNumPerScr -1; //屏幕显示最后首歌的序号
 for (i ;i < pCommandList->Length; ++i)   //便利操作序列
 {
  if ('D' ==pCommandList->aCommand[i])  
     {
         CurItemNo++;         //如果是D操作,光标下移
     }
  else if ('U' ==pCommandList->aCommand[i])
     {
   CurItemNo--;         //如果是U操作,光标上移
  }

  if (CurItemNo > LastItemNo)    //光标指向的歌曲序号大于显示屏最后那歌曲序号
  {
      FirstItemNo++;            //显示屏序号整体加1
   LastItemNo++;             //显示屏序号整体加1
   if (LastItemNo > TotalItemsNum)    //显示序号大于最后那首歌曲序号
   {
       CurItemNo = 1;              //光标序号移到第一首歌
    FirstItemNo = 1;            //显示屏序号从调整成从第一首歌开始
                LastItemNo =FirstItemNo + DispNumPerScr - 1;
   }
  }
  else  if(CurItemNo < FirstItemNo)   //光标指向的歌曲序号小于显示屏最后那歌曲序号
  {
      FirstItemNo--;            //显示屏序号整体减1
   LastItemNo--;             //显示屏序号整体减1
   if (FirstItemNo < 1)     //显示序号小于第一首歌曲序号
   {
                CurItemNo =  TotalItemsNum; //光标序号移到最后那首歌
       LastItemNo = TotalItemsNum; //显示屏序号调整
                FirstItemNo = LastItemNo - DispNumPerScr + 1;
   }
  }
 }
 OutputResult(FirstItemNo, CurItemNo);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值