特别说明:提供的五套代码均已提交ytuoj,再提交 绝对为100%重复,此代码用于交流探讨,借鉴需有度
用 C 语言写的源程序是一种文本文件。本项目以 C 语言的源程序为操作对象,完成对源程序的一系列处理,如判断是否有 main 函数、将某些行加上注释等。各功能可以分别编制一个程序实现(建议用这种简单的方案),也可以编制一个程序文件,各功能作为程序中的模块。
(1)读入一个 C 程序,判断其中是否只有一个 main()函数,输出“暂时没有发现问题”,或者“没有main()函数”,或者“不能定义多个 main()函数”。
提示 1:简单处理,可以只比较判断“main()”,考虑实际上的各种可能,main 后面的括号中有任意多个空格及 void 的都应该算在内。建议按最简单的情形处理。
提示 2:建议设计一个函数 is_sub_sring(char *s1, char* s2),函数用于判断 s1 是否“包含”在读入的一行 s2 中。调用时,用“main()”与读到的代码与字符串进行比较,形参 s1 对应的实参用“main()”即可。这样写提升了“抽象”级别,更容易实现,对应更高的代码质量。
(2)读入一个 C 语言程序,使程序中的所有左花括号“{”和右花括号“}”都单独占一行,修改的程序保存到另一个.c 文件中,并在屏幕上显示处理过的程序,显示时加上行号。
(3)读入一个 C 语言程序,输入 m、n 两个数字,从第 m 行起的 n 行代码将作为注释使用(即在这些行前面加上“//”),修改的程序保存到另一个.c 文件中,并在屏幕上显示处理过的程序,显示时加上行号。
(1)读入一个 C 程序,判断其中是否只有一个 main()函数,输出“暂时没有发现问题”,或者“没有main()函数”,或者“不能定义多个 main()函数”。
提示 1:简单处理,可以只比较判断“main()”,考虑实际上的各种可能,main 后面的括号中有任意多个空格及 void 的都应该算在内。建议按最简单的情形处理。
提示 2:建议设计一个函数 is_sub_sring(char *s1, char* s2),函数用于判断 s1 是否“包含”在读入的一行 s2 中。调用时,用“main()”与读到的代码与字符串进行比较,形参 s1 对应的实参用“main()”即可。这样写提升了“抽象”级别,更容易实现,对应更高的代码质量。
(2)读入一个 C 语言程序,使程序中的所有左花括号“{”和右花括号“}”都单独占一行,修改的程序保存到另一个.c 文件中,并在屏幕上显示处理过的程序,显示时加上行号。
(3)读入一个 C 语言程序,输入 m、n 两个数字,从第 m 行起的 n 行代码将作为注释使用(即在这些行前面加上“//”),修改的程序保存到另一个.c 文件中,并在屏幕上显示处理过的程序,显示时加上行号。
C++主要代码(string类型 片段匹配)
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char str[9999]; // str 删除多余空格后的
int cint[25],cmain[25],cmi=0; // int字段的记录,main()字段的统计,int main()相匹配的字段
char s[99][99],a[999][99];// s输入的原始数据 ,a按空格临时储存的数据
string strl[99]; //string 类型依空格为界储存数据
int Findint(string a[],int n) //找出 所有的 int ,返回找到了k个
{
int i,k=0;
string strint="int";
for(i=0; i<n; i++)
{
if(a[i]==strint)
cint[k++]=i;
}
return k;
}
int Findmain(string a[],int n) //找出 所有的 main() {,返回找到了几个
{
int i,k=0;
string aa="main()",b="main(",c=")",d="main",e="(";
for(i=0; i<n; i++)
{
if(a[i]==aa||(a[i]==b&&a[i+1]==c)||(a[i]==d&&a[i+1]==e&&a[i+2]==c))
cmain[k++]=i; //所有可能的 main后括号的情况
}
return k;
}
int main()
{
int i=0;
while(gets(s[i++])){}
int j=0,m,n=i-1,k=0,p=0,q; //n记录原始输入多少行代码
for(i=0; i<n; i++) //把输入代码 储存在一行代码里
{
for(k=0; k<strlen(s[i]); k++)
str[j++]=s[i][k];
str[j++]=' ';
}
j=0;
k=0;
for(i=0; i<strlen(str); i++) //把长串 按空格转化成j个string类型临时储存
{
if(str[i]!=' ')
a[j][k++]=str[i];
if(str[i]==' ')
{
strl[j]=string(a[j]);
j++;
k=0;
if(str[i+1]==' ')
j--;
}
}
m=j; //记录 string类型的一共有m个
p=Findint(strl,m);
q=Findmain(strl,m);
for(i=0; i<q; i++) //匹配是否有合适的 int main()返回
{ // 即int 和main 序列 是差一的
for(j=0; j<p; j++)
{
if(cint[j]==(cmain[i]-1))
cmi++;
}
}
if(cmi==1)
cout<<"有一个main函数"<<endl;
else if(cmi==0)
cout<<"暂时没发现main"<<endl;
else if(cmi>1)
cout<<"有不止一个main函数"<<endl;
cout<<endl<<endl<<"格式化括号:"<<endl<<endl;
FILE *fp;
fp=fopen("1.c","w"); //打开文件1.c
int d=0;
for(i=0;i<n;i++)
{
cout<<d+1<<". ";
for(j=0;j<strlen(s[i]);j++)
{
if((s[i][j]=='{'||s[i][j]=='}')&&j!=0)
{ //未单独成行的花括号让其单独成行
d++; //分别在屏幕,文件显示
fprintf(fp,"\n");
cout<<endl<<d+1<<". ";
}
cout<<s[i][j];
fprintf(fp,"%c",s[i][j]);
}
d++;
fprintf(fp,"\n");
cout<<endl;
}
fclose(fp); //关闭上个操作的文件指针
fp=fopen("2.c","w");
int sta,en; //注释起的起始行 sta en
cout<<endl<<"请输入要注释起的行 开始+结束"<<endl;
cin>>sta>>en;
d=0;
for(i=0;i<n;i++)
{
d++;
cout<<d<<". ";
if(d>=sta&&d<=en) //符合在区间之内的
{
cout<<"//";
fprintf(fp,"//");
}
puts(s[i]);
fputs(s[i],fp);
fprintf(fp,"\n");
}
fclose(fp);
}
C主要代码(未用KMP匹配,普通匹配)
#include <string.h>
#include <stdio.h>
char str[9999]; // str 删除多余空格后的
int cmain; // 查找到的main的个数
char s[99][99];// s[i]输入的原始数据
void findmain() //查找函数中共出现了几次main()
{
cmain=0;
char s[7]= {"main()"};
int j;
for(int i=0; i<strlen(str); i++)
{
if(str[i]=='m')
{
for(j=1; j<6; j++)
{
i++;
if(str[i]!=s[j])
{
i=i+j+1;
break;
}
}
if(j==6)
cmain++;
}
}
}
int main()
{
int i=0;
while(gets(s[i++])) {} //分行输入
int j=0,m,n=i-1,k=0,p=0,q;
for(i=0; i<n; i++) //把输入代码 储存在一行代码里
{
for(k=0; k<strlen(s[i]); k++)
str[j++]=s[i][k];
str[j++]=' ';
}
findmain();
if(cmain==0)
printf("暂时没发现main函数\n");
else if(cmain==1)
printf("有一个main函数\n");
else
printf("不只有一个main函数\n\n");
printf("###格式化花括号操作###\n\n");
FILE *fp;
fp=fopen("7.1.c","w"); //打开文件1.c
int d=0;
for(i=0; i<n; i++)
{
printf("%d. ",d+1);
for(j=0; j<strlen(s[i]); j++)
{
if((s[i][j]=='{'||s[i][j]=='}')&&j!=0)
{
d++;
fprintf(fp,"\n");
printf("\n%d. ",d+1);
}
printf("%c",s[i][j]);
fprintf(fp,"%c",s[i][j]);
}
d++;
fprintf(fp,"\n");
printf("\n");
}
fclose(fp); //关闭上个操作的文件指针
printf("###批量注释操作###\n\n");
fp=fopen("7.2.c","w");
int sta,en; //注释起的起始行 sta en
printf("请输入要注释起的行 开始+结束\n\n");
scanf("%d%d",&sta,&en);
d=0;
for(i=0; i<n; i++)
{
d++;
printf("%d. ",d);
if(d>=sta&&d<=en)
{
printf("//");
fprintf(fp,"//");
}
puts(s[i]);
fputs(s[i],fp);
fprintf(fp,"\n");
}
fclose(fp);
}
C++代码 string类型find的应用
<span style="font-size:18px;">#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char str[9999]; // str 删除多余空格后的
int fmian=0;// 记录查找情况
char s[99][99];// s输入的原始数据 ,a按空格临时储存的数据
string strl; //临时性string类型
int i,j=0,m,n,k=0,p=0,q;
FILE *fp;
void Findmain()
{
//用串string自带的find函数查询
string s="main()";
int m=strl.find(s); //正向查询
int n=strl.rfind(s); //反向查询
if(!(m>0&&m<strlen(str))) //没找到情况
cout<<"没有main函数"<<endl;
else if(m==n)
cout<<"有一个main函数"<<endl; //找到相同时会
else if(m!=n)
cout<<"有多个main函数"<<endl;
}
void step1()
{
cout<<"***格式化花括号操作***"<<endl<<endl;
fp=fopen("7.1.cpp","w"); //打开文件1.c
int d=0;
for(i=0; i<n; i++)
{
cout<<d+1<<". ";
for(j=0; j<strlen(s[i]); j++)
{
if((s[i][j]=='{'||s[i][j]=='}')&&j!=0)
{
d++;
fprintf(fp,"\n");
cout<<endl<<d+1<<". ";
}
cout<<s[i][j];
fprintf(fp,"%c",s[i][j]);
}
d++;
fprintf(fp,"\n");
cout<<endl;
}
fclose(fp); //关闭上个操作的文件指针
}
void step2()
{
cout<<"***批量注释操作***"<<endl<<endl;
fp=fopen("7.2.cpp","w");
int sta,en; //注释起的起始行 sta en
cout<<endl<<"亲输入要注释起的行 开始+结束"<<endl;
cin>>sta>>en;
int d=0;
for(i=0; i<n; i++)
{
d++;
cout<<d<<". ";
if(d>=sta&&d<=en)
{
cout<<"//";
fprintf(fp,"//");
}
puts(s[i]);
fputs(s[i],fp);
fprintf(fp,"\n");
}
fclose(fp);
}
int main()
{
int i=0;
while(gets(s[i++])) {}
j=0;
n=i-1;
for(i=0; i<n; i++) //把输入代码 储存在一行代码里
{
for(k=0; k<strlen(s[i]); k++)
str[j++]=s[i][k];
str[j++]=' ';
}
strl=string(str);
Findmain();
step1();
step2();
}</span><span style="color:#000099;font-size:24px;">
</span>
C代码KMP匹配+子函数模块化思想
<pre name="code" class="cpp">#include <string.h>
#include <stdio.h>
char str[9999];
int cmain,n;
char s[99][99];
void input()
{
int i=0,k,j=0;
while(gets(s[i++])) {}
n=i-1;
for(i=0; i<n; i++) //把输入代码 储存在一行代码里
{
for(k=0; k<strlen(s[i]); k++)
str[j++]=s[i][k];
str[j++]=' ';
}
}
void KMPmain() //查找函数中共出现了几次main()
{
cmain=0;
int i=0,j=-1,next[7];
next[0]=-1;
char s[7]= {"main()"};
while(i<6)
{
if(j=-1||s[i]==s[j])
{
i++;j++;
next[i]=j;
}
else j=next[j];
}
i=0;j=0;
while(i<strlen(str)&&j<6)
{
if(j==-1||str[i]==s[j])
{
i++;j++;
}
else j=next[j];
}
if(j==6)
printf("找到一个main函数\n");
else
printf("没找到main函数\n");
}
void S1()
{
FILE *fp;
printf("格式化花括号操作:\n\n");
fp=fopen("7.1.c","w"); //打开文件1.c
int i,j,d=0;
for(i=0; i<n; i++)
{
printf("%d. ",d+1);
for(j=0; j<strlen(s[i]); j++)
{
if((s[i][j]=='{'||s[i][j]=='}')&&j!=0)
{
d++;
fprintf(fp,"\n");
printf("\n%d. ",d+1);
}
printf("%c",s[i][j]);
fprintf(fp,"%c",s[i][j]);
}
d++;
fprintf(fp,"\n");
printf("\n");
}
fclose(fp); //关闭上个操作的文件指针
}
void S2()
{
int i,j,d=0;
FILE *fp;
printf("###批量注释操作###\n\n");
fp=fopen("7.2.c","w");
int sta,en; //注释起的起始行 sta en
printf("请输入要注释起的行 开始+结束\n\n");
scanf("%d%d",&sta,&en);
d=0;
for(i=0; i<n; i++)
{
d++;
printf("%d. ",d);
if(d>=sta&&d<=en)
{
printf("//");
fprintf(fp,"//");
}
puts(s[i]);
fputs(s[i],fp);
fprintf(fp,"\n");
}
fclose(fp);
}
int main()
{
input();
KMPmain();
S1();
S2();
}
文件输入
#include <string.h>
#include <stdio.h>
#include<stdlib.h>
char str[9999];
int cmain,n;
char s[99][99];
FILE *fp;
void input()
{
int i=0,j,k;
if((fp=fopen("源代码.c","r"))==NULL)
{
printf("源代码文件不存在\n");
exit(0);
}
while(!feof(fp))
{
str[i++]=fgetc(fp);
}
i=0,k=0;
for(j=0; j<strlen(str); j++)
{
if(str[j]=='\n')
{
i++;
k=0;
}
else s[i][k++]=str[j];
}
n=i;
}
void BFmain()
{
cmain=0;
char s[7]= {"main()"};
int j;
for(int i=0; i<strlen(str); i++)
{
if(str[i]=='m')
{
for(j=1; j<6; j++)
{
i++;
if(str[i]!=s[j])
{
i=i+j+1;
break;
}
}
if(j==6)
cmain++;
}
}
if(cmain==0)
printf("暂时没发现main函数\n");
else if(cmain==1)
printf("有一个main函数\n");
else
printf("不只有一个main函数\n\n");
}
void chuli()
{
printf("格式化花括号操作:\n\n");
fp=fopen("7.1.c","w"); //打开文件1.c
int i,j,d=0;
for(i=0; i<n; i++)
{
printf("%d. ",d+1);
for(j=0; j<strlen(s[i]); j++)
{
if((s[i][j]=='{'||s[i][j]=='}')&&j!=0)
{
d++;
fprintf(fp,"\n");
printf("\n%d. ",d+1);
}
printf("%c",s[i][j]);
fprintf(fp,"%c",s[i][j]);
}
d++;
fprintf(fp,"\n");
printf("\n");
}
fclose(fp); //关闭上个操作的文件指针
printf("###批量注释操作###\n\n");
fp=fopen("7.2.c","w");
int sta,en; //注释起的起始行 sta en
printf("请输入要注释起的行 开始+结束\n\n");
scanf("%d%d",&sta,&en);
d=0;
for(i=0; i<n; i++)
{
d++;
printf("%d. ",d);
if(d>=sta&&d<=en)
{
printf("//");
fprintf(fp,"//");
}
puts(s[i]);
fputs(s[i],fp);
fprintf(fp,"\n");
}
fclose(fp);
}
int main()
{
input();
BFmain();
chuli();
}