某编程大赛中设计有一个挑战环节,选手可以查看其他选手的代码,发现错误后,提交一组测试数据将对手挑落马下。为了减小被挑战的几率,有些选手会故意将代码写得很难看懂,比如把所有回车去掉,提交所有内容都在一行的程序,令挑战者望而生畏。

为了对付这种选手,现请你编写一个代码排版程序,将写成一行的程序重新排版。当然要写一个完美的排版程序可太难了,这里只简单地要求处理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 > && 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 = ;
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 - ])) return false;
if(s.substr(d,) == "if" && (s[d + ] == ' ' || s[d + ] == '(')) return true;
if(s.substr(d,) == "for" && (s[d + ] == ' ' || s[d + ] == '(')) return true;
if(s.substr(d,) == "while" && (s[d + ] == ' ' || s[d + ] == '(')) return true;
flag = ;
if(s.substr(d,) == "else" && (s[d + ] == ' ' || s[d + ] == '{')) return true;
return false;
}
void perfect(string &s) {
for(int i = s.size() - ;i >= ;i --) {
int ise = ;
if(s[i] == ')') {
int d = ,j = i - ;
while(d && j >= ) {
if(s[j] == ')') d ++;
else if(s[j] == '(') d --;
j --;
}
i = j + ;
}
else if(judge(s,i,ise)) {
int j = i;
while(j < s.size() && isalpha(s[j])) j ++;
if(ise) {
j = trim_space(s,j,);
int d = ;
while(d != && ++ j < s.size()) {
if(s[j] == '(') d ++;
else if(s[j] == ')') d --;
}
j ++;
}
j = trim_space(s,j,);
if(s[j] != '{') {
s.insert(j,"{");
j ++;
int flag = ;
while(j < s.size()) {
if(s[j] == ';' && flag == ) {
s.insert(j + ,"}");
break;
}
else if(s[j] == '(') flag ++;
else if(s[j] == ')') flag --;
else if(s.substr(j,) == "if") flag ++;
else if(s.substr(j,) == "else") flag --;
else if(s[j] == '{') flag ++;
else if(s[j] == '}') {
flag --;
if(flag == && s[ignore_space(s,j + ,)] != 'e') flag --;
if(flag == ) {
s.insert(j + ,"}");
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 = ,space_num = ,start = ;
string s;
getline(cin,s);
perfect(s);
for(int i = ignore_space(s,,);i < s.size();i ++) {
if(start) {
start = ;
if(s[i] == '}') put_space(space_num - );
else put_space(space_num);
}
if(s[i] == '{') {
int d = ignore_space(s,i - ,-);
if(!flag || !check(s[d])) {
putchar('\n');
put_space(space_num);
}
flag = ;
putchar(s[i]);
putchar('\n');
space_num ++;
start = ;
i = ignore_space(s,i + ,) - ;
}
else if(s[i] == '}') {
space_num --;
putchar(s[i]);
i = ignore_space(s,i + ,) - ;
if(s[i + ] == '}') {
putchar('\n');
start = ;
}
else if(i < s.size() - ) {
putchar('\n');
start = ;
}
}
else if(s[i] == '(') {
int d = ,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 + ,) - ;
}
else if(s[i] == ';') {
putchar(s[i]);
i = ignore_space(s,i + ,) - ;
putchar('\n');
start = ;
}
else {putchar(s[i]);}
}
return ;
}

L3-019 代码排版 (30 分)的更多相关文章

  1. swift代码排版-参考

    代码排版包括: 空行.空格.断行和缩进等内容.代码排版内容比较多工作量很多,但是非常重要. 空行 空行将逻辑相关的代码段分隔开,以提高可读性.下列情况应该总是添加空行: 类型声明之前. import语 ...

  2. 04-树6 Complete Binary Search Tree(30 分)

    title: 04-树6 Complete Binary Search Tree(30 分) date: 2017-11-12 14:20:46 tags: - 完全二叉树 - 二叉搜索树 categ ...

  3. PTA 7-2 二叉搜索树的结构(30 分)

    7-2 二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大 ...

  4. 【PAT】1053 Path of Equal Weight(30 分)

    1053 Path of Equal Weight(30 分) Given a non-empty tree with root R, and with weight W​i​​ assigned t ...

  5. 【PAT】1091 Acute Stroke(30 分)

    1091 Acute Stroke(30 分) One important factor to identify acute stroke (急性脑卒中) is the volume of the s ...

  6. PTA 1004 Counting Leaves (30)(30 分)(dfs或者bfs)

    1004 Counting Leaves (30)(30 分) A family hierarchy is usually presented by a pedigree tree. Your job ...

  7. 《从零开始学Swift》学习笔记(Day 59)——代码排版

    原创文章,欢迎转载.转载请注明:关东升的博客 代码排版包括: 空行.空格.断行和缩进等内容.代码排版内容比较多工作量很多,但是非常重要. 空行 空行将逻辑相关的代码段分隔开,以提高可读性.下列情况应该 ...

  8. 家谱处理(30 分)(字符串的处理substr)

    家谱处理(30 分) 人类学研究对于家族很感兴趣,于是研究人员搜集了一些家族的家谱进行研究.实验中,使用计算机处理家谱.为了实现这个目的,研究人员将家谱转换为文本文件.下面为家谱文本文件的实例: Jo ...

  9. 二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历

    二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历   二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则 ...

随机推荐

  1. 服务消费和负载(Ribbon)

    使用RestTemplate调用服务 在上一篇教程中,我们是这样调用服务的,先通过 LoadBalancerClient 选取出对应的服务,然后使用 RestTemplate 进行远程调用. Load ...

  2. html5游戏之Box2d物理引擎集成

    前面两章我们已经研究了如何使用Box2d来模拟游戏世界,这一章就把所有的东西拼凑在一起,最终完成我们的游戏. 一.定义物体 典型的物体: {type:'ground',name:'dirt',x:50 ...

  3. Java工厂方法模式

    工厂方法模式: /** * 工厂方法模式:也叫工厂模式,属于创建型模式,父类工厂(接口)负责定义产品对象的公共接口, * 而子类工厂负责创建具体的产品对象. * 目的:是为了把产品的实例化操作延迟到子 ...

  4. Saiku权限控制(四)

    Saiku的权限控制主要包含两方面的权限: 数据源(Cube)权限控制 和 保存好的文件以及目录权限控制 一.新增Saiku用户信息与角色信息 Saiku默认的用户就是admin,这也是权限最高的一个 ...

  5. pycharm模板

    使用pycharm的模板 File - Settings (ctrl+alt+s) Editor - File and Code Templates - Python Script 可以使用部分变量. ...

  6. Linux3.10.0块IO子系统流程(3)-- SCSI策略例程

    很长时间以来,Linux块设备使用了一种称为“蓄流/泄流”(plugging/unplugging)的技术来改进吞吐率.简单而言,这种工作方式类似浴盆排水系统的塞子.当IO被提交时,它被储存在一个队列 ...

  7. 菜鸟翻译:国外的一个关于.net core的学习系列 第一天(安装并运行.NET core 到windox系统里面)

    原文地址: Day 1 - Installing and Running .NET Core on a Windows Box 免责声明:我不是.NET Core 的团队成员.我使用的工具是公开可用的 ...

  8. Array和ArrayList有什么区别?

    Array和ArrayList的区别: 1.Array可以包含基本数据类型和对象类型,而ArrayList只能包含对象类型 2.Array有固定的大小,而ArrayList是动态变化的. 3.Arra ...

  9. 集成学习-xgboost

    等同于xgboost是个准曲率很高的集成学习框架,在很多比赛中成绩优异. 大多数的集成学习都使用决策树作为基分类器,主要是因为本身要训练多个分类器,而决策树速度很快,总体时间相对较少. 决策树 在讲x ...

  10. 『翻译』Android USB Host

    USB Host When your Android-powered device is in USB host mode, it acts as the USB host, powers the b ...