《C语言及程序设计》实践参考——处理C语言源代码的程序

原创 2015年07月07日 11:18:30

返回:贺老师课程教学链接

【项目3 - 处理C语言源代码的程序】
用C语言写的源程序是一种文本文件。本项目将以C语言的源程序为操作对象,完成对源程序的一系列处理,如判断是否有main函数、将某些行加上注释等。各功能可以分别编制一个程序实现(建议用这种简单的方案),也可以将其集成在一起(向着自己做出IDE努力)。
(1)读入一个C++程序,判断其中是否只有一个main()函数,输出“暂时没有发现问题”,或者“没有main()函数”,或者“不能定义多个main()函数”;
提示1:简单处理,可以只比较判断“main()”,考虑实际上的各种可能,main后面的括号中有任意多个空格及void的都应该算在内。建议按最简单的情形处理。
提示2:建议设计一个函数,将读到的代码与字符串“main()”进行比较。函数用于判断s1是否“包含”在读入的一行s2中,调用时,形参s1处的实参用”main()”即可,这样写提升了“抽象”级别,更容易实现,对应更高的代码质量。
[参考解答]

#include <stdio.h>
#include <stdlib.h>
int appear(char*s1,char*s2);
int main( )
{
    char line[256];
    char main_fun[8]="main";
    int main_num=0;//初时,尚未发现

    //将文件中的数据读入到字符数组中
    FILE *fp;
    if((fp=fopen("source.c","r"))==NULL)
    {
        printf("源程序文件不存在!\n");
        exit(1);
    }
    while(!feof(fp))
    {
        fgets(line,255,fp);
        main_num+=appear(line,main_fun);
        if (main_num>1)  //多于1个,没有必要再去读取
            break;
    }
    fclose(fp);

    //识别结论
    if(main_num==0)
        printf("error: no \"main\".");
    else if (main_num==1)
        printf("right: a \"main\" be exist.");
    else
        printf("error: more than one \"main\".");
    printf("\n");
    return 0;
}

//返回s2在s1中出现了几次
int appear(char*s1,char*s2)
{
    int n=0,flag;
    char *p,*q;
    for(; *s1!='\0'; s1++)
    {
        if (*s2==*s1) /*判断字符串中是否有和要判断的字串首字符相同的字符*/
        {
            flag=1;
            p=s1 ; /*s1 p 为第一个相同字符的地址*/
            q=s2;
            for(; *q!='\0';) /*如果有则判断接下去的几个字符是否相同*/
            {
                if (*q++!=*p++)
                {
                    flag=0;
                    break;
                }
            }
            if (flag==1) n++;
        }

    }
    return(n);
}

(2)读入一个C语言程序,使程序中的所有左花括号“{”和右花括号“}”都单独占一行,新程序保存到另一个.c文件中,并在屏幕上显示处理过的程序,显示时加上行号。
[参考解答]

#include <stdio.h>
#include <stdlib.h>

int main( )
{
    char ch1,ch2;
    FILE *fpin, *fpout;
    if((fpin=fopen("source.c","r"))==NULL)
    {
        printf("源程序文件不存在!\n");
        exit(1);
    }
    if((fpout=fopen("newsource.c","w+"))==NULL)
    {
        printf("无法建立输出文件!\n");
        exit(1);
    }
    ch1='\0';
    while(!feof(fpin))
    {
        ch2=fgetc(fpin);
        //读到了花括号,且前一个符号不是换行,应该加入一个换行
        if((ch2=='{'||ch2=='}')&&(ch1!='\n'))
            fputc('\n',fpout);
        else
            //当前读到的不是换行,但前一个是花括号,此时也该加
            if((ch1=='{'||ch1=='}')&&(ch2!='\n'))
                fputc('\n',fpout);
        fputc(ch2,fpout);  //输出当前读入的符号
        ch1=ch2;
    }
    rewind(fpout);
    printf("经过处理后的源程序是\n");
    char line[256];
    int n = 1;
    while (!feof(fpout))
    {
        fgets(line,255,fpout);
        printf("%d\t%s", n, line);
        n++;
    }
    fclose(fpin);
    fclose(fpout);
    return 0;
}

注:此解仍有些缺憾。花括号已经单独占一行(前后可能有空格)时,也要换行。感兴趣的同学可以想办法改进程序,避免出现这样的问题。

(3)读入一个C语言程序,输入m、n两个数字,从第m行起的n行代码将作为注释使用(即在这些行前面加上”//”),新程序保存到另一个.c文件中,并在屏幕上显示处理过的程序,显示时加上行号。
[参考解答]

#include <stdio.h>
#include <stdlib.h>

int main( )
{
    char line[256];
    FILE *fpin, *fpout;
    if((fpin=fopen("source.c","r"))==NULL)
    {
        printf("源程序文件不存在!\n");
        exit(1);
    }
    if((fpout=fopen("newsource.c","w+"))==NULL)
    {
        printf("无法建立输出文件!\n");
        exit(1);
    }
    int m,n;
    printf("您要将第m行开始的n行代码作为注释,请输入m和n:");
    scanf("%d %d", &m, &n);
    int n1=0;
    fgets(line,255,fpin);
    while(!feof(fpin))
    {

        n1++;
        if(n1>=m&&n1<m+n)
        {
            fputc('/',fpout);
            fputc('/',fpout);
        }
        fputs(line,fpout);
        fgets(line,255,fpin);
    }
    rewind(fpout);
    printf("经过处理后的源程序是\n");
    n=0;
    fgets(line,255,fpout);
    while (!feof(fpout))
    {

        printf("%d\t%s", n, line);
        n++;
        fgets(line,255,fpout);
    }
    fclose(fpin);
    fclose(fpout);
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

《C语言及程序设计》实践参考——学生成绩统计

返回:贺老师课程教学链接【项目1-学生成绩统计】 每位同学的信息学号、姓名、C、高数、英语成绩。定义一个学生成绩的结构体数组,其中的数据成员包括学号(char num[13])、姓名(name)、三...
  • sxhelijian
  • sxhelijian
  • 2015年07月04日 15:11
  • 4990

编译原理课程设计-PL/0编译器的扩充(C语言完整版)

课程设计要求: 1、基本内容(成绩范围:“中”、“及格”或“不及格”) (1)扩充赋值运算:*= 和 /= (2)扩充语句(Pascal的FOR语句): ①FOR := TO DO ②F...
  • Ahoob
  • Ahoob
  • 2015年03月21日 19:05
  • 8002

《C语言及程序设计》实践参考——编程处理C源代码

返回:贺老师课程教学链接  实践要求【项目5-编程处理C源代码】在CodeBlocks等IDE中都提供了代码格式整理的功能。我们可以编写程序,处理的数据就是用C写的源代码文件。C源文件是一种文本文件,...
  • sxhelijian
  • sxhelijian
  • 2015年05月01日 08:23
  • 2038

《C语言及程序设计》实践参考——字符串处理函数

返回:贺老师课程教学链接  实践要求【项目4-字符串处理函数】指针是神奇的,指向整型的指针int *p1,可以操作整型数组int a[];指向字符型的指针char *p2,可以操作字符数组(字符串)c...
  • sxhelijian
  • sxhelijian
  • 2015年05月01日 08:19
  • 1543

《C语言及程序设计》实践参考——成绩处理函数版

返回:贺老师课程教学链接  项目要求【项目3 - 成绩处理函数版】  在数组score中将要存储了某小组C程序设计的成绩,请设计实现下面的各功能函数,并在main函数中调用,组合成一个完整的应用:(1...
  • sxhelijian
  • sxhelijian
  • 2015年04月29日 17:10
  • 1551

《C语言及程序设计》实践参考——学生成绩处理

返回:贺老师课程教学链接【项目2-学生成绩处理】(1)定义学生结构体,在结构体数组中,输入了学生学号和两门课的成绩,计算均分后,输出成绩单,请在下面的程序基础上,将程序补充完整。 #include ...
  • sxhelijian
  • sxhelijian
  • 2015年07月04日 12:16
  • 1567

《C语言及程序设计》实践参考——成绩处理

返回:贺老师课程教学链接   项目要求【项目2- 成绩处理】在数组score中将要存储某小组C++程序设计的成绩,请设计实现下面的各功能函数,并在main函数中调用,组合成一个完整的应用:(1)输入小...
  • sxhelijian
  • sxhelijian
  • 2015年04月26日 19:23
  • 1324

《C语言及程序设计》实践参考——二进制文件浏览器

返回:贺老师课程教学链接【项目5 - 二进制文件浏览器】 (1)做一个类似BinaryViewer的查看二进制文件的程序,输入文件名后,可以以16进制和ASCII对照的方式列出该文件的内容,可以参考...
  • sxhelijian
  • sxhelijian
  • 2015年07月07日 11:22
  • 1528

《C语言及程序设计》实践参考——输出小星星(全解)

返回:贺老师课程教学链接  项目要求(1)要输出的是:代码:#include int main( ) { int i,j,n=6; for(i=n;i...
  • sxhelijian
  • sxhelijian
  • 2015年03月09日 19:45
  • 13365

《C语言及程序设计》实践参考——命令行加法器

返回:贺老师课程教学链接【项目3 - 命令行加法器】建立项目add,设计一个用命令行能运行的加法器,其中加数的个数不定:输入:add 1 3输出 4输入:add 1 3.1 2 6输出 12.1输入:...
  • sxhelijian
  • sxhelijian
  • 2015年05月02日 11:43
  • 1914
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《C语言及程序设计》实践参考——处理C语言源代码的程序
举报原因:
原因补充:

(最多只允许输入30个字)