綜合實踐報告(7)C程式原始碼操作(內附五套程式碼)
阿新 • • 發佈:2019-01-23
C主要程式碼(未用KMP匹配,普通匹配)#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++程式碼 string型別find的應用#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); }