本文转载自http://blog.csdn.net/sxhelijian/article/details/9094921
(1)读入一个C++程序,判断其中是否只有一个main()函数,输出“暂时没有发现问题”,或者“没有main()函数”,或者“不能定义多个main()函数”;
提示1:简单处理,可以只比较判断”main()”,考虑实际上的各种可能,main后面的括号中有任意多个空格及void的都应该算在内。建议按最简单的情形处理。
提示2:不出意外,很多同学将试图直接将读到的代码与字符串”main()”直接比较,建议做成一个函数,判断s1是否在读入的一行s2中,调用时,形参s1处的实参用”main()”即可,这样写提升了“抽象”级别,更容易实现,对应更高的代码质量。
程序代码
#include <fstream>
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
//计算代码中main()函数的个数
int appear(char*s1,char*s2);
int main( )
{
char line[256];//保存source.cpp中的一行代码
char main_fun[8]="main()";//需要判断的main(0函数
int main_num=0;//保存代码中存在的main()函数的个数
//将文件中的数据读入到字符数组中
ifstream sourceFile("source.cpp",ios::in);//以输入的方式打开文件
if(!sourceFile)//测试是否成功打开
{
cerr<<"source code read error!"<<endl;
exit(1);//退出程序
}
//当文件读取结束时退出循环
while(!sourceFile.eof())
{
//每循环一次读取一行字符到字符数组line中以\n结束
sourceFile.getline(line,255,'\n');
//得到代码中main()函数的个数
main_num += appear(line,main_fun);
if(main_num>1) //多于1个,没有必要再去读取
{
break;
}
}
sourceFile.close();//关闭文件
//识别结论
if(main_num==0)
{
cout<<"代码中没有main()函数";
}
else if (main_num==1)
{
cout<<"代码中存在一个main()函数";
}
else
{
cout<<"代码中存在多个main()函数";
}
cout<<endl;
system("pause");
}
//返回s2在s1中出现了几次
int appear(char*s1, char*s2)
{
int n=0;
int flag;
char *p,*q;
for(; *s1!='\0'; s1++)
{
if(*s2 == *s1) //判断两个字符串中的第一个字符是否相同
{
flag=1;//当两个字符串中的第一个字符是否相同时,flag标记为1
p=s1;//p为字符串s1中第一个字符的地址
q=s2;//q为字符串s2中第一个字符的地址
for(; *q!='\0';) /*如果有则判断接下去的几个字符是否相同*/
{
if (*q++ != *p++)//当字符不相等时
{
flag=0;//标记为0
break;//退出循环
}
}
if (flag==1)//当代码中存在"main()"时执行n++
{
n++;//n表示代码中"main()"的个数
}
}
}
return n;
}
测试程序
在测试前先创建一个source.cpp文件,并且将source.txt文件放到工程目录下
当source.cpp文件的代码中没有"main()"函数
source.cpp中的代码
#include <iostream>
using namespace std;
const double x1=0.3, x2=0.8; //式子中出现的两个常数定义为全局常变量,方便,易维护
double f(double); //先声明
int
{ 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; //返回值
}
测试结果
当source.cpp文件的代码中有一个"main()"函数时
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; //返回值
}
测试结果
当source.cpp文件的代码中有多个"main()"函数时(两个或两个以上main()函数)
source.cpp文件中的代码
#include <iostream>
using namespace std;
const double x1=0.3, x2=0.8; //式子中出现的两个常数定义为全局常变量,方便,易维护
double f(double); //先声明
int main()
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; //返回值
}
测试结果