某编程大赛中设计有一个挑战环节,选手可以查看其他选手的代码,发现错误后,提交一组测试数据将对手挑落马下。为了减小被挑战的几率,有些选手会故意将代码写得很难看懂,比如把所有回车去掉,提交所有内容都在一行的程序,令挑战者望而生畏。
为了对付这种选手,现请你编写一个代码排版程序,将写成一行的程序重新排版。当然要写一个完美的排版程序可太难了,这里只简单地要求处理C语言里的for、while、if-else这三种特殊结构,而将其他所有句子都当成顺序执行的语句处理。输出的要求如下:
默认程序起始没有缩进;每一级缩进是 2 个空格;
每行开头除了规定的缩进空格外,不输出多余的空格;
顺序执行的程序体是以分号“;”结尾的,遇到分号就换行;
在一对大括号“{”和“}”中的程序体输出时,两端的大括号单独占一行,内部程序体每行加一级缩进,即:
{
程序体
}
for的格式为:
for (条件) {
程序体
}
while的格式为:
while (条件) {
程序体
}
if-else的格式为:
if (条件) {
程序体
}
else {
程序体
}
输入格式:
输入在一行中给出不超过 331 个字符的非空字符串,以回车结束。题目保证输入的是一个语法正确、可以正常编译运行的 main 函数模块。
输出格式:
按题面要求的格式,输出排版后的程序。
输入样例:
int main() {int n, i; scanf("%d", &n);if( n>0)n++;else if (n<0) n--; else while(n<10)n++; for(i=0; i<n; i++ ){ printf("n=%d\n", n);}return 0; }
输出样例:
int main()
{
int n, i;
scanf("%d", &n);
if ( n>0) {
n++;
}
else {
if (n<0) {
n--;
}
else {
while (n<10) {
n++;
}
}
}
for (i=0; i<n; i++ ) {
printf("n=%d\n", n);
}
return 0;
}
格式要求挺高的,代码写的很乱,先把输入的字符串中if,for,while,else的格式进行调整该加大括号加大括号,空格数量需要修剪,都是一个空格,然后按照要求输出,对于小括号里的直接输出,每行开头结尾没有多余空格。左大括号左边不是判断语句需要换行。
代码:
#include <iostream> #include <cstdio> using namespace std; int ignore_space(const string &s,int d,int t) { while(d < s.size() && d > 0 && s[d] == ' ') { d += t; } return d; } int trim_space(string &s,int d,int t) { if(s[d] != ' ') s.insert(d," "); d += t; int i = 0; while(i + d < s.size() && s[i + d] == ' ') i ++; if(i) s.erase(d,i); return d; } bool judge(string s,int d,int &flag) { if(d && isalpha(s[d - 1])) return false; if(s.substr(d,2) == "if" && (s[d + 2] == ' ' || s[d + 2] == '(')) return true; if(s.substr(d,3) == "for" && (s[d + 3] == ' ' || s[d + 3] == '(')) return true; if(s.substr(d,5) == "while" && (s[d + 5] == ' ' || s[d + 5] == '(')) return true; flag = 0; if(s.substr(d,4) == "else" && (s[d + 4] == ' ' || s[d + 4] == '{')) return true; return false; } void perfect(string &s) { for(int i = s.size() - 1;i >= 0;i --) { int ise = 1; if(s[i] == ')') { int d = 1,j = i - 1; while(d && j >= 0) { if(s[j] == ')') d ++; else if(s[j] == '(') d --; j --; } i = j + 1; } else if(judge(s,i,ise)) { int j = i; while(j < s.size() && isalpha(s[j])) j ++; if(ise) { j = trim_space(s,j,1); int d = 1; while(d != 0 && ++ j < s.size()) { if(s[j] == '(') d ++; else if(s[j] == ')') d --; } j ++; } j = trim_space(s,j,1); if(s[j] != '{') { s.insert(j,"{"); j ++; int flag = 0; while(j < s.size()) { if(s[j] == ';' && flag == 0) { s.insert(j + 1,"}"); break; } else if(s[j] == '(') flag ++; else if(s[j] == ')') flag --; else if(s.substr(j,2) == "if") flag ++; else if(s.substr(j,4) == "else") flag --; else if(s[j] == '{') flag ++; else if(s[j] == '}') { flag --; if(flag == 1 && s[ignore_space(s,j + 1,1)] != 'e') flag --; if(flag == 0) { s.insert(j + 1,"}"); break; } } j ++; } } } } } void put_space(int k) { while(k --) { printf(" "); } } bool check(char s) { return s == ')' || s == 'e' || s == '{' || s == '}' || s == ';'; } int main() { int flag = 0,space_num = 0,start = 1; string s; getline(cin,s); perfect(s); for(int i = ignore_space(s,0,1);i < s.size();i ++) { if(start) { start = 0; if(s[i] == '}') put_space(space_num - 1); else put_space(space_num); } if(s[i] == '{') { int d = ignore_space(s,i - 1,-1); if(!flag || !check(s[d])) { putchar('\n'); put_space(space_num); } flag = 1; putchar(s[i]); putchar('\n'); space_num ++; start = 1; i = ignore_space(s,i + 1,1) - 1; } else if(s[i] == '}') { space_num --; putchar(s[i]); i = ignore_space(s,i + 1,1) - 1; if(s[i + 1] == '}') { putchar('\n'); start = 1; } else if(i < s.size() - 1) { putchar('\n'); start = 1; } } else if(s[i] == '(') { int d = 1,j = i; putchar(s[i]); while(d) { putchar(s[++ j]); if(s[j] == '(') d ++; else if(s[j] == ')') d --; } i = j; if(!flag) i = ignore_space(s,i + 1,1) - 1; } else if(s[i] == ';') { putchar(s[i]); i = ignore_space(s,i + 1,1) - 1; putchar('\n'); start = 1; } else {putchar(s[i]);} } return 0; }