Problem I: 源代码的格式

Time Limit: 1 Sec  Memory Limit: 64 MB
Submit: 1471  Solved: 634

[Submit][Status][Web
Board
]

Description

众所周知,每当讨论合理的代码格式时,程序员们都会发动一场关乎信仰的战争。当一个新的程序团队在一个工程上开工时,他们经常会带来有些不同的代码风格并且希望把老的源代码按照他们自己的代码风格排版。除此之外,没有经验的程序员还经常会无视好的、始终不变的代码风格的重要性,这会大大增加他所在团队和他自己的负担。这种情况使得代码排版工具的市场越来越大。
你加入了一个叫做“Salvation”的新的代码排版工具的概念验证工程。这个工程只是个并未瞄准实际用途,而是用来证明你分析语法、格式化高级语言能力的的试验性工程。你的任务是编写将一种叫做TRIVIAL (The Rival Implementation-Agnostic Language)的语言的代码排版程序。这种语言的词汇很少并且语法结构简单。这种语言没有任何关键字和控制结构,因为这种语言的所有构造都表示为函数调用和封装。
词汇包括标识符,圆、花括号,逗号和分号。标识符仅由数字0~9和拉丁字母a~z,A~Z组成。单词之间可能由空白符分开,文件开头和最后的空白符也是可以存在的。空白符包括空格,制表符(ASCII码为9)和换行符(由一对ASCII码组成,分别为13,10)。
合法的TRIVIAL程序由下面的结构产生:
  • 程序 ::= 代码块
  • 代码块 ::= '{' 声明集 '}'
  • 声明集 ::= 声明 | 声明 声明集
  • 声明 ::= 语句 ';'
  • 语句 ::= 标识符 ['(' 参数 ')'] [代码块]
  • 参数 ::= 声明 | 声明 ',' 参数

合理的TRIVIAL程序的格式还应当包括下面几点:

  • 没有空行。
  • 不得使用制表符。
  • 文件开头的第一个字符应当是左花括号“{”(之前没有花括号),文件的最后一个字符应当是右花括号“}”(后面没有花括号)。
  • 每行前面都有4N个空格,N为缩进量。
  • 第一行和最后一行的缩进量为0.
  • 组成的代码块的行和被附上花括号“{”……“}”缩进量加一个级别。
  • 一行中,除在左花括号“{”和逗号“,”之后可以出现一个空格外,不得出现其他的空格。
  • 除最后一行外,每一行以分号“;”和左括号“{”结尾。这些字符不能在一行的中间或开头(包括最后一行)出现。
  • 右花括号“}”只能在一行开头的缩进空格之后出现。

参见样例输出中一个格式合理的TRIVIAL程序代码。

Input

输入包含合法的TRIVAL程序代码。每组数据不会超过2000字节。

Output

输出输入中给出的TRIVAL代码的合理格式。

Sample Input

{class(Point) { member ( int ( x ) ) ; member ( int ( y ) ) ; member ( fun ( Length ) { return ( sqrt ( sum ( sqr ( x ),sqr ( y ) ) ) ); } )
;};Main { repeat { set ( n,input ( int ) ) ; for ( int ( i,0 ) , lt ( i,n ) , inc ( i ) ) { print ( mult ( n,n ) ) ; }; };}; }

Sample Output

{ class(Point) { member(int(x)); member(int(y)); member(fun(Length) { return(sqrt(sum(sqr(x), sqr(y)))); }); }; Main { repeat { set(n, input(int));
for(int(i, 0), lt(i, n), inc(i)) { print(mult(n, n)); }; }; };}

一看可能有点不好做,其实,,,

主要思路,用一个长字符串保存下来剔掉空白符的代码,然后对格式进行转换就是了,注意是空白符不是空格,我开始用空格死活不对,下面是我的代码,简单暴力

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h> int main()
{
char a, s2[2005];
int i,j,num = 0, st = 0;
while((a = getchar()) != EOF)
if(!isspace(a))
s2[st++] = a;
for(i = 0; i < st; i++)
{
if(s2[i] == '{')
{
if(num == 0)
printf("{\n");
else
printf(" {\n");
num++;
for(j = 0; j < num; j++)
printf(" ");
}
else if(s2[i] == ',')
printf(", ");
else if(s2[i] == ';')
{
printf(";\n");
for(j = 0; j < num - 1; j++)
printf(" ");
if(s2[i + 1] != '}')
printf(" ");
}
else if(s2[i] == '}')
{
num--;
printf("}");
if(num == 0 && i != st - 1)
printf("\n");
}
else
printf("%c", s2[i]);
}
return 0;
}

SDUSToj第十一次作业源代码格式问题的更多相关文章

  1. 2017-2018-2 20179205《网络攻防技术与实践》第十一周作业 SQL注入攻击与实践

    <网络攻防技术与实践>第十一周作业 SQL注入攻击与实践 1.研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究 缓冲区溢出原理   在计算机内部,输入数据通常被存放在一个临时空间内, ...

  2. 软工 · 第十一次作业 - Alpha 事后诸葛亮(团队)

    软工 · 第十一次作业 - Alpha 事后诸葛亮(团队) 组长本次作业链接 现代软件工程 项目Postmortem 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场 ...

  3. 实验十一 团队作业7:团队项目设计完善&编码

    实验十一 团队作业7:团队项目设计完善&编码 实验时间 2019-6-6 Deadline: 2019-6-12 10:00,以团队随笔博文提交至班级博客的时间为准. 评分标准: 按时交 – ...

  4. 2019-2020-1 20199329《Linux内核原理与分析》第十一周作业

    <Linux内核原理与分析>第十一周作业 一.本周内容概述: 学习linux安全防护方面的知识 完成实验楼上的<ShellShock 攻击实验> 二.本周学习内容: 1.学习& ...

  5. 1903021121-刘明伟-java十一周作业-java面向对象编程

    项目 内容 课程班级博客链接 19级信计班(本) 作业要求链接 第十一周作业 博客名称 1903021121-刘明伟-java十一周作业-java面向对象 要求 每道题要有题目,代码(使用插入代码,不 ...

  6. 第十三次作业——回归模型与房价预测&第十一次作业——sklearn中朴素贝叶斯模型及其应用&第七次作业——numpy统计分布显示

    第十三次作业——回归模型与房价预测 1. 导入boston房价数据集 2. 一元线性回归模型,建立一个变量与房价之间的预测模型,并图形化显示. 3. 多元线性回归模型,建立13个变量与房价之间的预测模 ...

  7. 福大软工 · 第十一次作业 - Alpha 事后诸葛亮(团队)

    福大软工·第十一次作业-Alpha事后诸葛亮 组长博客链接 本次作业博客链接 项目Postmortem 模板 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描 ...

  8. 2017-2018-2 1723《程序设计与数据结构》第十一周作业 & 实验三 & (总体)第三周结对编程 总结

    作业地址 第十一次作业:https://edu.cnblogs.com/campus/besti/CS-IMIS-1723/homework/1933 (作业界面已评分,可随时查看,如果对自己的评分有 ...

  9. 实验十一 团队作业7—团队项目设计完善&编码测试

    实验十一 团队作业7—团队项目设计完善&编码测试 实验时间 2018-6-8 Deadline: 2018-6-20 10:00,以团队随笔博文提交至班级博客的时间为准. 评分标准: 按时交 ...

随机推荐

  1. this、apply、call的指向

    1.关于this this它总是返回一个对象,是指调用当前函数的对象,由于对象的属性可以赋给另一个对象,所以属性所在的当前对象是可变的,即this的指向是可变的. var person={ name: ...

  2. 有关在python中使用Redis(一)

    python作为一种处理数据的脚本语言本身有许多方法函数供大家使用,有时候为了提升数据处理速度(如海量数据的访问或者海量数据的读取),涉及分布式管理架构,可能需要用到Redis,Redis是一个开源的 ...

  3. filter和map的使 使得数组对象变数组

    let UnitList = this.paytypeData.filter( item => item.CheckBox === true ).map(axis => axis.Unit ...

  4. android动画ppt整理

    案例

  5. 收集的20个非常有用的Java程序片段

    下面是20个非常有用的Java程序片段,希望能对你有用. 1. 字符串有整型的相互转换 String a = String.valueOf(2); //integer to numeric strin ...

  6. SQL Server数据库log shipping 灾备(Part1 )

    1.概述 Log Shipping为SQL Server提供的数据库备份过程.它可以将数据库整个复制到另一台服务器上.在这种情况下,交易日志也会定期发送到备份服务器上供恢复数据使用,这使得服务器一直处 ...

  7. AutoIt上传非input控件方式的文件脚本

    AutoIt目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作.它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动 ...

  8. selenium-Python之上传文件

    对于web 页面的上传功能实现一般有一下两种方式 普通上传:普通的附件上传是将本地文件的路径作为一个值放在input标签中,通过form表单将这个值提交给服务器 插件上传:一般是指基于flash.ja ...

  9. LibreOJ #6208. 树上询问

    内存限制:512 MiB 时间限制:500 ms 标准输入输出 题目类型:传统 评测方式:文本比较 上传者: 匿名 树链剖分+线段树 屠龙宝刀点击就送 #include <vector> ...

  10. python 搜集参数

    def print_params(*params): print(params) print_params('Testing')print_params(1,2,3) #参数前的星号将所有值放置在同一 ...