原题点 这里 。
这是一道简单的模拟题,但是有的地方还是需要周详地考虑的。
同样本题也很适合练习将重用代码分成函数来利用。
还有库函数的应用:
- <cctype> 中的 isdigit(),islower(),toupper() 等可以方便地完成字符串的变换和检查。
- <cstdio> 中的 ungetc() 可以实现 cin.peek() 的功能。
算法方面就没什么知识了……
代码:
#include <cstdio>
#include <cctype>
using namespace std;
int p1, p2, p3;
// 等价于 cin.peek();
char get_next(){
char next= getchar();
ungetc(next, stdin);
return next;
}
// 按 p1 格式变换 ch
char transform(char ch){
if(p1==1) return ch;
if(p1==2) return toupper(ch);
if(p1==3) return '*';
}
// 打印 n 次
void put_n_times(int n, char ch){
for(int i=0; i<n; ++i) putchar(ch);
}
// 展开 [beg, end] 区间内的部分
// beg 和 end 不要忘记或是重复输出,
// 本程序是在主循环里输出 beg 和 end 。
void print_range(char beg, char end){
if(p3==1){
for(char i=beg+1; i<end; ++i){
put_n_times(p2, transform(i));
}
}
else if(p3==2){
for(char i=end-1; i>beg; --i){
put_n_times(p2, transform(i));
}
}
}
int main(){
scanf("%d%d%d\n", &p1, &p2, &p3);
char prev='\0', now;
while((now=getchar())!=EOF){
char next= get_next();
if(now=='-'){
if((isdigit(prev)&&isdigit(next)&&prev<next)||
(islower(prev)&&islower(next)&&prev<next)){
print_range(prev, next);
}
else putchar(now);
}
else putchar(now);
prev= now;
}
return 0;
}