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

作者:夏晓林

地点:烟大计控

时间: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。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值