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

特别说明:提供的五套代码均已提交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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值