第十四周项目四 处理C++源代码的程序(统计main函数、简单整理格式、在代码前加行号)


(1)


项目要求

在CodeBlocks等IDE中都提供了代码格式整理的功能。完成这种功能的程序,操作的数据是用C++写的源代码文件。C++源文件是一种文本文件,可以通过程序进行操作。
集成开发环境(IDE)对对程序进行编译,操作的“数据”是源程序。编译中,要对源程序进行词法检查和语法检查,后续还要进行目标代码生成、代码优化等工作。相关的技术将在《编译原理》课中学习。这些技术可以用在很多领域,当然也能够让我们对于编程语言有更深的了解。
  本项目将以C++源程序为操作对象,完成对源程序的一系列处理。各功能可以分别编制一个程序实现(建议用这种简单的方案),也可以将其集成在一起(向着自己做出IDE努力)。
(1)读入一个C++程序,判断其中是否只有一个main()函数,输出“暂时没有发现问题”,或者“没有main()函数”,或者“不能定义多个main()函数”;
提示1:简单处理,可以只比较判断”main()”,考虑实际上的各种可能,main后面的括号中有任意多个空格及void的都应该算在内。建议按最简单的情形处理。
提示2:建议设计一个函数,将读到的代码与字符串”main()”进行比较。函数用于判断s1是否“包含”在读入的一行s2中,调用时,形参s1处的实参用”main()”即可,这样写提升了“抽象”级别,更容易实现,对应更高的代码质量。


代码如下 

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <fstream>
using namespace std;

int compare(char *s1,char *s2)
{
    int num=0,num2;
    char *m,*n;
    for (; *s1!='\0'; s1++)
    {
        if (*s1==*s2)
        {
            num2=1;
            m=s1;
            n=s2;
            for (; *n!='\0';)
            {
                if (*m!=*n)
                {
                    num2=0;
                    break;
                }
                m++;
                n++;
            }
            if (num2==1)num++;
        }
    }
    return num;
}




int main()
{
    char s[7]="main()",line[256];
    int num=0;

    ifstream infile("source.cpp",ios::in);
    if (!infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    while (!infile.eof())
    {
        infile.getline(line,255,'\n');
        num+=compare(line,s);
        if (num>1)
            break;
    }
    infile.close();

    cout<<"字符"<<s<<"在文件source.cpp中出现"<<num<<"次。"<<endl;

    return 0;
}


运行结果

只有一个main()函数


增加一个main函数



(2)


项目要求

读入一个C++程序,使程序中的所有左花括号“{”和右花括号“}”都单独占一行,新程序保存到另一个.cpp文件中,并在屏幕上显示处理过的程序,显示时加上行号。

代码如下

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <fstream>
using namespace std;


void format(char*file)//用字符指针
    {
    char line[256];
    int num=0;

    ifstream infile(file,ios::in);//同样必须写

    if (!infile)
        {
        cerr<<"open error!"<<endl;
        exit(1);
        }
    while(!infile.eof())
        {
        infile.getline(line,255,'\n');
        cout<<++num<<'\t'<<line<<endl;
        }
    }
int main()
    {
    char ch1,ch2='\0';
    ifstream infile("source.cpp",ios::in);
    if (!infile)
        {
        cerr<<"open error!"<<endl;
        exit(1);
        }
    ofstream outfile("newsource.cpp",ios::out);
    if(!outfile)
        {
        cerr<<"open[newsource.cpp]error!"<<endl;
        exit(1);
        }
    while (!infile.eof())
        {

        infile.get(ch1);
        if( (ch1=='{'||ch1=='}')&&(ch2!='\n'))//排除已换行的可能
            {
            outfile.put('\n');
            }
        else if ((ch2=='{'||ch2=='}')&&ch1!='\n')
            outfile.put('\n');
        outfile.put(ch1);
        ch2=ch1;//很重要!
        }
    infile.close();
    outfile.close();
    format("newsource.cpp");
    return 0;
    }


source.cpp

#include <iostream>
using namespace std;
const double x1=0.3, x2=0.8; //式子中出现的两个常数定义为全局常变量,方便,易维护
double f(double); //先声明
int main()
    {
    double x;
    cout<<"请输入x的值:";
    cin>>x;
    cout<<"解得: "<<f(x)<<"\n";    //调用函数
    return 0;
    }
double f(double x)
    {int a;
    if(x<x1){
        a=0;}
    else if(x<=x2)
        {
        a=(x-x1)/(x2-x1);
        }
    else
        {a=1;}
    return a;       //返回值
    }
void main()
    {
    return;}


运行结果



newsource.cpp

#include <iostream>
using namespace std;
const double x1=0.3, x2=0.8; //式子中出现的两个常数定义为全局常变量,方便,易维护
double f(double); //先声明
int main()
    
{
    double x;
    cout<<"请输入x的值:";
    cin>>x;
    cout<<"解得: "<<f(x)<<"\n";    //调用函数
    return 0;
    
}
double f(double x)
    
{
int a;
    if(x<x1)
{
        a=0;
}
    else if(x<=x2)
        
{
        a=(x-x1)/(x2-x1);
        
}
    else
        
{
a=1;
}
    return a;       //返回值
    
}
void main()
    
{
    return;
}


(3)


项目要求

读入一个C++程序,输入m、n两个数字,从第m行起的n行代码将作为注释使用(即在这些行前面加上”//”),新程序保存到另一个.cpp文件中,并在屏幕上显示处理过的程序,显示时加上行号。


代码如下

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <fstream>
using namespace std;
void check(char *file)
{
	char line[256];
	int n=1;
	ifstream infile(file,ios::in);
	if (!infile)
	{
		cerr<<"open error!"<<endl;
		exit(1);
	}
	while(!infile.eof())
	{
		infile.getline(line,255,'\n');
		cout<<n<<'\t'<<line<<endl;
		n++;
	}
}
int main()
    {
    int num=1,n,m;
    char line[256];
    cout<<"请输入要变为注释部分的起始行和结束行行数:"<<endl;
    cin>>n>>m;
    ifstream infile("source.cpp",ios::in);
    if (!infile)
        {
        cerr<<"open error!"<<endl;
        exit(1);
        }
    ofstream outfile("newsource.cpp",ios::out);
    if(!outfile)
        {
        cerr<<"open[newsource.cpp]error!"<<endl;
        exit(1);
        }
    while (!infile.eof())
        {
        infile.getline(line,255,'\n');
        if (num>=n&&num<=m)
            outfile.put('/').put('/');//注意写法!
        outfile.write(line,strlen(line));
        outfile.write("\n",1);
        num++;
        }
	cout<<"注释部分处理完毕,请打开文件查看!"<<endl;
    infile.close();
    outfile.close();

    check ("newsource.cpp");
    return 0;
    }




source.cpp

#include <iostream>
using namespace std;
const double x1=0.3, x2=0.8; //式子中出现的两个常数定义为全局常变量,方便,易维护
double f(double); //先声明
int main()
    {
    double x;
    cout<<"请输入x的值:";
    cin>>x;
    cout<<"解得: "<<f(x)<<"\n";    //调用函数
    return 0;
    }
double f(double x)
    {
    int a;
    if(x<x1)
        {
        a=0;
        }
    else if(x<=x2)
        {
        a=(x-x1)/(x2-x1);
        }
    else
        {
        a=1;
        }
    return a;       //返回值
    }
void main()
    {
    return;
    }


运行结果



newsource.cpp

#include <iostream>
using namespace std;
const double x1=0.3, x2=0.8; //式子中出现的两个常数定义为全局常变量,方便,易维护
double f(double); //先声明
int main()
    {
    double x;
//    cout<<"请输入x的值:";
//    cin>>x;
//    cout<<"解得: "<<f(x)<<"\n";    //调用函数
//    return 0;
//    }
//double f(double x)
//    {
//    int a;
//    if(x<x1)
//        {
//        a=0;
//        }
    else if(x<=x2)
        {
        a=(x-x1)/(x2-x1);
        }
    else
        {
        a=1;
        }
    return a;       //返回值
    }
void main()
    {
    return;
    }


学习心得

努力自己写了完整代码 还是有一些问题 感觉不看参考解答很难搞定…

本文很有复习价值=w=



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值