【p1098-字符串的展开】解题记录

来源:互联网 发布:韩国电影推荐 知乎 编辑:程序博客网 时间:2024/06/06 12:22

原题点 这里 。

这是一道简单的模拟题,但是有的地方还是需要周详地考虑的。

同样本题也很适合练习将重用代码分成函数来利用。

还有库函数的应用:

  • <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 格式变换 chchar 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;}
0 0