zoukankan      html  css  js  c++  java
  • L3-019 代码排版 (30 分)

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

    为了对付这种选手,现请你编写一个代码排版程序,将写成一行的程序重新排版。当然要写一个完美的排版程序可太难了,这里只简单地要求处理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);}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);

      }

      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('
    ');
                    put_space(space_num);
                }
                flag = 1;
                putchar(s[i]);
                putchar('
    ');
                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('
    ');
                    start = 1;
                }
                else if(i < s.size() - 1) {
                    putchar('
    ');
                    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('
    ');
                start = 1;
            }
            else {putchar(s[i]);}
        }
        return 0;
    }
  • 相关阅读:
    C#终止线程的方法
    Socket编程(TCP、UDP)
    频率域滤波基础之五(读数字图像处理学习halcon)
    hihoCoder #1127:二分图最小点覆盖和最大独立集
    hihoCoder #1033 : 交错和 (数位Dp)
    HDU-5536 Chip Factory (字典树)
    hihoCoder #1040 (判断是否为矩形)
    hihoCoder:#1079(线段树+离散化)
    HDU-5532 Almost Sorted Array (LIS)
    UVALive-7303 Aquarium (最小生成树)
  • 原文地址:https://www.cnblogs.com/8023spz/p/10598159.html
Copyright © 2011-2022 走看看