MP3光标位置
用含有四个元素的数组代表屏幕,一个指针代表光标位置
#include<iostream>
#include<string>
#include<vector>
using namespace std;
//up函数
vector<int> U1(vector<int> a, int* p, int n, int size) {
int i;
//小于等于四首歌的情况,不存在翻页,就只是光标位置移动
if (n <= 4) {
//如果光标在第一行,执行up后跳到最后一行
if (*p == 0) {
*p = size - 1;
}
//其余情况,光标只需要向上移动一格
else {
--* p;
}
}
//超过四首歌的情况
else {
//如果光标在第一行,并且页面是1,2 ,3,4这四首歌
if (*p == 0 && a[0] == 1) {
//页面跳转到末尾页
for (i = 0; i < 4; i++) {
a[i] = n - size + i + 1;
}
*p = 3;//p跳转到第四行
}
//光标还在第一行,但是页面不是1,2,3,4
else if (*p == 0 && a[0] != 1) {
//歌曲编号全部减一,光标位置还在第一行不动
for (i = 0; i < 4; i++) {
a[i]--;
}
}
//其余情况只需要移动光标
else {
--*p;
}
}
return a;
}
//down函数
vector<int> D1(vector<int> a, int* p, int n, int size) {
int i;
//小于等于四首歌情况
if (n <= 4) {
if (*p == size - 1) {
*p = 0;
}
else {
++* p;
}
}
//多于四首歌情况
else {
//页面是最后一页,且光标在最后一行
if (*p == 3 && a[3] == n) {
//页面转成1,2,3,4
for (i = 0; i < 4; i++) {
a[i] = i + 1;
}
*p = 0;//光标回到第一行
}
//页面不是最后一页,但是光标在最后一行
else if (*p == 3 && a[3] != n) {
for (i = 0; i < 4; i++) {
a[i]++;
}
}
//其余情况,只需移动光标
else {
++* p;
}
}
return a;
}
//用含有四个元素的数组代表屏幕,一个指针代表光标位置
int main() {
int n = 0;//几首歌
string s;//输入的命令
while (cin >> n) {
cin >> s;
int size = 4; //屏幕长度可以容纳几首歌
if (n <= 4) {
size = n; //小于四首歌情况,数组长度就是n
}
vector<int> a; //初始屏幕里是1,2,3,4
for (int i = 0; i < size; i++) {
a.push_back(i + 1);
}
int p = 0; //初始光标在第一行,即a[0]处
int i = 0;
while (i < s.size()) {
char c = s[i];
if (c == 'U') { //U执行up函数
a = U1(a, &p, n, size);
}
else if (c == 'D') { //D执行down函数
a = D1(a, &p, n, size);
}
i++;
}
//打印屏幕结果
for (auto& k : a) {
cout << k << ' ';
}
cout << endl;
//打印光标位置
cout << a[p] << endl;
}
return 0;
}