综合实践报告(7)C程序源码操作(内附五套代码)

来源:互联网 发布:先锋网络电视 编辑:程序博客网 时间:2024/06/07 21:13
特别说明:提供的五套代码均已提交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 文件中,并在屏幕上显示处理过的程序,显示时加上行号。

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();}






2 0
原创粉丝点击