题解 | #MP3光标位置#
MP3光标位置
http://www.nowcoder.com/practice/eaf5b886bd6645dd9cfb5406f3753e15
#include <stdio.h>
/*
处理命令一共有四种情况
1、命令为向上,且歌曲数量>4
2、命令为向下,且歌曲数量>4
3、命令为向上,且歌曲数量<=4
4、命令为向下,且歌曲数量<=4
*/
static int show(char c, int *screen, int *head, int *tail, int *index, int musicNum)
{
/* 1、命令为向上,且歌曲数量>4 */
if(c == 'U' && musicNum > 4)
{
/* 若光标在第一页第一首歌,则翻页,在最后一首歌,并更新屏幕 */
if(*index == 1)
{
*tail = musicNum;
*head = musicNum - 3;
*index = musicNum;
int temp = *tail;
for(int i = 3; i >= 0; i--)
{
screen[i] = temp--; //更新屏幕
}
}
/* 若光标在第一页,而且在第一页的最后一首歌,则屏幕下移 */
else if(*index == *head)
{
(*head)--;
(*index)--;
(*tail)--;
int temp = *head;
for(int i = 0; i <= 3; i++)
{
screen[i] = temp++; //更新屏幕
}
}
/* 不是第一行,光标下移即可 */
else
{
(*index)--;
}
}
else if(c == 'D' && musicNum > 4)
{
/* 若光标在最后一页最后一首歌,则翻页,在第一页第一首歌,并更新屏幕 */
if(*index == musicNum)
{
*head = 1;
*tail = 4;
*index = 1;
int temp = *head;
for(int i = 0; i <= 3; i++)
{
screen[i] = temp++;
}
}
/* 若光标在最后一页,不是最后一首歌,则屏幕上移 */
else if(*index == *tail)
{
(*head)++;
(*index)++;
(*tail)++;
int temp = *head;
for(int i = 0; i <= 3; i++)
{
screen[i] = temp++;
}
}
/* 不是第一行,光标上移即可 */
else
{
(*index)++;
}
}
else if(c == 'U' && musicNum <= 4)
{
/* 是第一行,光标移到最后一行 */
if(*index == 1)
{
*index = musicNum;
}
/* 不是第一行,光标上移 */
else
{
(*index)--;
}
}
else if(c == 'D' && musicNum <= 4)
{
/* 是第一行,光标移到第一行 */
if(*index == musicNum)
{
*index = 1;
}
/* 不是第一行,光标下移 */
else
{
(*index)++;
}
}
else
{
printf("input failed!!!\n");
return -1;
}
return 0;
}
int main()
{
int musicNum = 0;
scanf("%d", &musicNum);
int m = musicNum >= 4 ? 4 : musicNum;
int screen[m];
memset(screen, 0, m*sizeof(int));
/* 屏幕数据初始化 */
for(int i = 0; i < m; i++)
{
screen[i] = i+1;
//printf("screen[%d] = [%d]\n", i, screen[i]);
}
/* 初始化第一行显示的歌曲,最后一行显示的歌曲和光标所在的位置 */
int head = screen[0];
int tail = screen[m-1];
int index = screen[0];
/* 获取并处理命令 */
char c;
while(scanf("%c", &c) != EOF)
{
if(c == 'U' || c == 'D')
{
show(c, screen, &head, &tail, &index, musicNum);
}
}
for(int i = 0; i < m; i++)
{
printf("%d ", screen[i]);
}
printf("\n");
printf("%d\n", index);
return 0;
}