第十六周上机实践——项目6-处理C++源代码的程序

/*  
 *Copyright (c)2016,烟台大学计算机与控制工程学院  
 *All rights reserved.  
 *文件名称:main.cpp  
 *作    者:郭永恒  
 *完成日期:2016年6月27日  
 *版 本 号:v1.0  
 *  
 *问题描述:写一个处理c++源代码的程序,可以判断main函数个数,让花括号独占一行,可以去除注释或者注释一部分
 */    


Process.h:

#ifndef PROCESS_H_INCLUDED
#define PROCESS_H_INCLUDED

#include <vector>
#include <string>
using std::string;
using std::vector;

class Process
{
public:
    Process();
    ~Process();
    void deleteComment();
    void insertALineBreak();
    void commentSection();
    void display();
private:
    void read();
    void write();
    bool notSpace(string&);
    vector<string> codes;
    string filename;
};


#endif // PROCESS_H_INCLUDED


Process.cpp:

#include "Process.h"
#include <cctype>
#include <fstream>
#include <string>
#include <iostream>
#include <cstdlib>
using namespace std;
Process::Process()
{
    cout << " 请输入文件名:";
    cin >> filename;
    ifstream infile(filename);
    int main_num = 0;
    if(infile)
    {
        while(!infile.eof())
        {
            string str;
            getline(infile,str);

            if(str.find("main()") != -1 && str.find("main()") != str.rfind("main()"))
            {
                cout << " 含有多个main函数" << endl;
                exit(1);
            }
            else if(str.find("main()") != -1)
                ++main_num;
            if(main_num > 1)
            {
                cout << " 含有多个main函数" << endl;
                exit(1);
            }

            codes.push_back(str);
        }
    }
    else
    {
        cout << " 打开错误" << endl;
        exit(1);
    }
    infile.close();
}

Process::~Process()
{

    ofstream outfile("Result.cpp");
    for(string& str : codes)
        if(notSpace(str))
            outfile << str << endl;
    outfile.close();
}

void Process::insertALineBreak()
{
    int time = 0;
    for(string& str : codes)
    {
        int flag;
        if((flag = str.find("{")) != -1)
        {
            if(flag > 0 && str[flag-1] != '\n')
                str.insert(flag,"\n");
        }

        if((flag = str.find("}")) != -1)
        {
            if(flag < str.size() && flag > 0 && str[flag-1] != '\n')
                str.insert(flag,"\n");
        }
        ++time;
    }
    write();
    read();
}

void Process::commentSection()
{

    int n,m;
    cout << " 请输入n和m,注释n行和m行之间的部分(包括n行和m行):" << endl;
    cin >> n >> m;
    codes.insert(codes.begin()+n,string("/*"));
    codes.insert(codes.begin()+m+1,string("*/"));
    write();
    read();
}

void Process::deleteComment()
{
    int flag,time = 0,sstart,send;
    for(string& str : codes)
    {
        if((flag = str.find("//")) != -1)
            str.erase(flag);
        else if((flag = str.find("/*")) != -1)
        {
            str.erase(flag);
            sstart = time;
        }
        else if((flag = str.find("*/")) != -1)
        {
            str.replace(0,flag+2,"");
            send = time;

            for(vector<string>::iterator s = codes.begin()+sstart+1; s != codes.begin() + send; ++s)
                (*s).clear();
        }

        ++time;
    }
    write();
    read();
}

bool Process::notSpace(string& str)
{
    int judge = 0;
    for(char& c : str)
        if(isalpha(c) || isdigit(c) || ispunct(c))
            return true;
    return false;
}

void Process::display()
{
    int time = 1;
    for(string& str : codes)
        if(notSpace(str))
        {   cout << time << "\t";
            cout << str << endl;
            ++time;
        }
}

void Process::read()
{
    codes.clear();
    ifstream infile("Result.cpp");
    if(infile)
    {
        while(!infile.eof())
        {
            string str;
            getline(infile,str);
            codes.push_back(str);
        }
    }
    infile.close();
}

void Process::write()
{
    ofstream outfile("Result.cpp");
    for(string& str : codes)
        if(notSpace(str))
            outfile << str << endl;
    outfile.close();
}

main函数:

#include <iostream>
#include "Process.h"
using namespace std;

int main()
{
    Process pro;
    cout << " 处理前:" << endl;
    pro.display();
    pro.insertALineBreak();
    pro.deleteComment();
    cout << " 处理后:" << endl;
    pro.display();
    return 0;
}

运行结果:


程序缺陷太多了大哭

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值