您的位置:首页 > 编程语言 > C语言/C++

C语言综合实践main()函数匹配,括号换行,加注释

2017-04-23 12:58 267 查看
作者:夏晓林

地点:烟大计控

时间:2017.04.23

题目大意:用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文件中,并在屏幕上显示处理过的程序,显示时加上行号。

c语言代码:

(1):

#include <stdio.h>
#include <stdlib.h>
int is_sub_sring(char*s1,char*s2);
int main( )
{
char hang[200];
char a[7]="main()";
int num=0;//用于统计main()的数量
FILE *fp;
if((fp=fopen("source.c","r"))==NULL)
{
printf("源程序不存在!\n");
exit(1);
}
while(!feof(fp))//若不结束
{
fgets(hang,81,fp);
num=num+is_sub_sring(hang,a);
}
fclose(fp);
if(num==0)
printf("没有main()函数\n");
else if (num==1)
printf("暂时没有发现问题\n");
else
printf("不能定义多个main()函数\n");
return 0;
}
int is_sub_sring(char*s1,char*s2)
{
int n=0,y;//n用于统计数目,y用于判断
char *p,*q;
for(; *s1!='\0'; s1++)
{
if (*s2==*s1)
{
y=1;
p=s1;
q=s2;
for(; *q!='\0';)//第一个字符相同继续往后判断
{
if (*q++!=*p++)//不相同
{
y=0;
break;
}
}
if (y==1)//相同
n++;
}
}
return n;
}代码(2):
#include <stdio.h>
#include <stdlib.h>
int main( )
{
char ch1,ch2;
FILE *fp1, *fp2;
if((fp1=fopen("source.c","r"))==NULL)
{
printf("源程序不存在!\n");
exit(1);
}
if((fp2=fopen("newsource.c","w+"))==NULL)
{
printf("无法建立新文件!\n");
exit(1);
}
ch1='\0';
while(!feof(fp1))//若不结束
{
ch2=fgetc(fp1);//从文件中读入字符
if((ch2=='{'||ch2=='}')&&(ch1!='\n'))//读到了花括号且前一个字符不是换行
fputc('\n',fp2);//加上换行
else if((ch1=='{'||ch1=='}')&&(ch2!='\n')) //前一个字符是花括号并且当前字符不是换行
fputc('\n',fp2);//加上换行
fputc(ch2,fp2); //将当前字符写入新建的文件中
ch1=ch2;//依次向后读取
}
rewind(fp2);//移动文件指针的最简单函数,功能是将文件的位置指针移到文件的起始位置
printf("处理过的源程序是:\n");
char hang[200];
int n = 1;
while (!feof(fp2))//若不结束
{
fgets(hang,80,fp2);//读入字符串
printf("%d\t%s", n, hang);
n++;
}
fclose(fp1);
fclose(fp2);
return 0;
}代码(3):
#include <stdio.h>
#include <stdlib.h>
int main( )
{
char hang[200];
int m,n,i;
FILE *fp1, *fp2;
if((fp1=fopen("source.c","r"))==NULL)
{
printf("源程序不存在!\n");
exit(1);
}
if((fp2=fopen("newsource.c","w+"))==NULL)
{
printf("无法建立新文件!\n");
exit(1);
}
printf("请输入m和n:\n");
scanf("%d%d",&m,&n);
for(i=1; i<m; i++)//m行之前
{
fgets(hang,80,fp1);
fputs(hang,fp2);
}
for(i=m; i<m+n; i++)//加//的
{
fputc('/',fp2);
fputc('/',fp2);
fgets(hang,80,fp1);
fputs(hang,fp2);
}
for(i=m+n; !feof(fp1) ; i++)//加完//之后的
{
fgets(hang,80,fp1);
fputs(hang,fp2);
}
rewind(fp2);//移动文件指针的最简单函数,功能是将文件的位置指针移到文件的起始位置
printf("处理过的源程序是:\n");
int num = 1;
while (!feof(fp2))//若不结束
{
fgets(hang,80,fp2);//读入字符串
printf("%d\t%s", num, hang);
num++;
}
fclose(fp1);
fclose(fp2);
return 0;
}体会心得:

        熟练运用文件的打开关闭,读写字符函数fgetc,fputc,读写字符串函数fgets,fputs。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐