课程设计:源程序编译

问题描述:用C语言写的源程序是一种文本文件。本项目以C语言的源程序为操作对象,完成对源程序的一系列处理,如判断是否有main函数、将某些行加上注释等。各功能作为程序中的模块。
 (1)读入一个C程序,判断其中是否只有一个main()函数,输出“暂时没有发现问题”,或者“没有main()函数”,,或者“不能定义多个main()函数”。
提示1:简单处理,可以只比较判断“main()”,考虑实际上的多个各种可能,main后面的括号中有任意多个空格及void的都应该计算在内。建议按最贱单的情况处理。
提示2:建议设计一个函数is_sub_string(char * s1,char * s2),函数用于判断s1是否“包含”在读入的一行s2中。调用时,用“main()”与读到的代码与字符串进行比较,形参s1对应的实参用
“main()”
即可。这样提升了“抽象”的级别,更容易实现,对应更高的代码质量。
 (2)读入一个C语言程序,使程序中的所有左大括号“{”和右大括号“}”都单独占一行修改后的程序保存到另一个.c文件中,并在屏幕上显示处理过的程序,显示时加上行号。
 (3)读入一个C语言程序,读入m,n两个数字,从第m行起的n行代码将作为注释使用(即在这些行前面加上“//”),修改后的程序保存在另一个.c文件中,并在屏幕上显示处理过的程序,显示时
加上行号。
作者:何知令

完成时间:2017年4月22日

/*
问题描述:用C语言写的源程序是一种文本文件。本项目以C语言的源程序为操作对象,完成对源程序的一系列处理,如判断是否有main函数、将某些行加上注释等。各功能作为程序中的模块。
 (1)读入一个C程序,判断其中是否只有一个main()函数,输出“暂时没有发现问题”,或者“没有main()函数”,,或者“不能定义多个main()函数”。
提示1:简单处理,可以只比较判断“main()”,考虑实际上的多个各种可能,main后面的括号中有任意多个空格及void的都应该计算在内。建议按最贱单的情况处理。
提示2:建议设计一个函数is_sub_string(char * s1,char * s2),函数用于判断s1是否“包含”在读入的一行s2中。调用时,用“main()”与读到的代码与字符串进行比较,形参s1对应的实参用
“main()”
即可。这样提升了“抽象”的级别,更容易实现,对应更高的代码质量。
 (2)读入一个C语言程序,使程序中的所有左大括号“{”和右大括号“}”都单独占一行修改后的程序保存到另一个.c文件中,并在屏幕上显示处理过的程序,显示时加上行号。
 (3)读入一个C语言程序,读入m,n两个数字,从第m行起的n行代码将作为注释使用(即在这些行前面加上“//”),修改后的程序保存在另一个.c文件中,并在屏幕上显示处理过的程序,显示时
加上行号。
作者:何知令
完成时间:2017年4月22日
*/
#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fp1,*fp2,*fp3;//文件指针
    int i;//用作循环
    int right,have=0;//用作循环出口
    char judge[10]= {"ain()"}; //用于判断与文件字符串比较
    char ch,C,M[10];//读出的字符和若读出m则往后读的5个字符存储位置
    printf("**************************************************\n");
    printf("第一部分:\n");
    if((fp1=fopen("main.txt","r"))==NULL)
    {
        printf("cannot open main.txt!");
        exit(1);
    }
    while((ch=fgetc(fp1))!=EOF)
    {
        if(ch=='m')//找到m字符
        {
            for(i=0; i<5; i++)
            {
                M[i]=fgetc(fp1);//往后记录其后五个字符
            }
            right=0;//初始化符合的字符数
            for(i=0; i<5; i++)
            {
                if(judge[i]==M[i])//判断对应字符是否正确
                    right++;
            }
            if(right==5)//若全对,则“有”++
                have++;
        }
    }
    if(have==0)
        printf("没有main()函数\n");
    if(have==1)
        printf("暂时没有发现问题\n");
    if(have>1)
        printf("不能定义多个main()函数\n");
    rewind(fp1);//把文件指针移回文件头
    printf("**************************************************\n");
    printf("第二部分:\n");
    if((fp2=fopen("C.txt","w+"))==NULL)
    {
        printf("cannot open C.txt!");
        exit(1);
    }
    C='\0';
    while((ch=fgetc(fp1))!=EOF)
    {
        if((ch=='{'||ch=='}')&&C!='\n')//若当前字符为括号,且前一字符为换行,加入换行
            fputc('\n',fp2);
        else if((ch!='\n')&&(C=='{'||C=='}'))//若前一字符为括号,且当前字符不为换行,加入换行
        {
            fputc('\n',fp2);
            for(i=0; i<3; i++) //增加的点,开始做时发现换行后不太像编译后的源程序,加入三个空格使之更接近编码规范
                fputc(' ',fp2);
        }
        fputc(ch,fp2);//把当前读入的符号输出文件
        C=ch;//记录前一读入的字符
    }
    rewind(fp2);//把文件指针移回文件头
    printf("1.");
    i=2;
    while((ch=fgetc(fp2))!=EOF)
    {
        printf("%c",ch);
        if(ch=='\n')
        {
            printf("%d.",i);
            i++;
        }
    }
    printf("\n");
    rewind(fp1);
    fclose(fp2);
    printf("*************************************************\n");
    int m,n;
    int line=1;
    printf("第三部分:\n");
    scanf("%d %d",&m,&n);
    if((fp3=fopen("d.txt","w+"))==NULL)
    {
        printf("cannot open c.txt!");
        exit(1);
    }
    if(m==1)//若第一行就要求加入,没有‘/n’判断只能直接加
    {
        fputc('/',fp3);
        fputc('/',fp3);
    }
    while(1)
    {
        ch=fgetc(fp1);//遍历每一个字符
        fputc(ch,fp3);//将相应字符输出到另一个文件中
        if(ch==EOF)//循环结束条件
            break;
        if(ch=='\n')
            line++;
        if(line>=m&&line<m+n)
        {
            if(ch=='\n')
            {
                fputc('/',fp3);
                fputc('/',fp3);
            }
        }
    }
    rewind(fp3);
    printf("处理过的源代码为:\n");
    printf("1.");
    i=2;
    while((ch=fgetc(fp3))!=EOF)
    {
        printf("%c",ch);
        if(ch=='\n')
        {
            printf("%d.",i);
            i++;
        }
    }
    printf("\n");
    printf("************************************************\n");
    fclose(fp1);
    fclose(fp3);
    return 0;
}
程序执行结果展示:

知识点总结:文件,循环

学习心得:起初啥也不会,还是看老贺的代码才明白怎么做。。但只看了怎样进行的文件操作,其余的都是自己做的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值