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);
}