『C言語及びプログラム設計』実践参考——プログラミング処理Cソースコード

7129 ワード

戻ってきます:賀先生の課程の教育のリンクの実践の要求
【プロジェクト5-プログラミング処理Cソース】
コードフォーマットの機能はCodeBlocksなどのIDEで提供されている.私たちはプログラムを書くことができて、処理するデータはCで書いたソースコードファイルです.Cソースファイルは、プログラムで操作できるテキストファイルです.
(1)1つのCプログラムを読み込んで、その中に1つのmain()関数しかないかどうかを判断し、「一時的に問題が発見されなかった」、あるいは「main()関数がない」、あるいは「複数のmain()関数を定義できない」を出力する.
ヒント1:簡単な処理で、「main()」だけを比較して判断することができ、実際の様々な可能性を考慮すると、mainの後ろの括弧には他にもいろいろな書き方があります.最も簡単な状況で処理することをお勧めします.
ヒント2:読み込んだコードを文字列「main()」と比較する関数を設計することをお勧めします.関数は、s 1が読み込まれた1行のs 2に「含まれる」かどうかを判断するために使用され、呼び出されると、形参s 1の実参は「main()」でよい.これにより、書き込みは「抽象」レベルを向上させ、より容易に実現され、より高いコード品質に対応する.
[参考解答]
テスト時にsourceを作成します.cファイルは、main()、mainなし()、および複数表示されます.
#include 
#include
#include
int appear(char*s1,char*s2);
int main( )
{
    char line[256];
    char main_fun[8]="main()";
    int main_num=0;//  ,    

    //               
    FILE *fp = fopen("source.c","r");  //          
    if(fp==NULL)       //        
    {
        printf("source code read error!
"); exit(1); } while(!feof(fp)) { fgets(line,256, 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().
"); 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)プログラムを作成しtest.cと名付け,ファイルに「if」,「while」,「for」が現れる回数を統計する.
[参考解答]
#include 
#include
#include
int appear(char*s1,char*s2);
int main( )
{
    char line[256];
    int if_num=0, while_num, for_num=0;

    //               
    FILE *fp = fopen("test.c","r");  //          
    if(fp==NULL)       //        
    {
        printf("source code read error!
"); exit(1); } while(!feof(fp)) { fgets(line,256, fp); // if_num+=appear(line,"if"); while_num+=appear(line,"while"); for_num+=appear(line,"for"); } fclose(fp); // printf("if: %d
", if_num); printf("while: %d
", while_num); printf("for: %d
", for_num); 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); }
注:本物のIDEで語分析を行う場合、if、for、whileなどのキーワードを見つけ、文法規定の要求に合致するかどうかを識別する必要があります.そして、このような作業は、1回の「スキャン」で完了し、採用された技術は、このような簡単な行文字列マッチングではありません.
(3)一つのCプログラムを読み込んで、プログラムの中のすべての左かっこ"{"と右かっこ"}"が単独で1行を占め、新しいプログラムは別の.cファイルに保存し、処理したプログラムを画面に表示し、表示時に行番号を付ける.
[参考解答]
#include 
#include
#include
void formatPrograme(char *sourcefile, char *targetfile);
void outprogram(char *filename);
int main( )
{
    formatPrograme("source.c", "target.c");
    printf("         :
"); outprogram("target.c"); return 0; } void formatPrograme(char *sourcefile, char *targetfile) { char ch1, ch2; // FILE *fpin = fopen(sourcefile,"r"); // if(fpin==NULL) // { printf("source code read error!
"); exit(0); } FILE *fpout = fopen(targetfile,"w"); // if(fpout==NULL) // { printf("source code write error!
"); exit(0); } ch1='\0'; while(!feof(fpin)) { ch2= fgetc(fpin); // , , if((ch2=='{'||ch2=='}')&&(ch1!='
')) fputc('
', fpout); else // , , if((ch1=='{'||ch1=='}')&&(ch2!='
')) fputc('
', fpout); fputc(ch2, fpout); // ch1=ch2; } fclose(fpout); fclose(fpin); } void outprogram(char *filename) { char line[256]; int n = 1; // FILE *fp = fopen(filename,"r"); // if(fp==NULL) // { printf("source code read error!
"); exit(1); } while(!feof(fp)) { fgets(line,256, fp); // printf("%d\t%s
", n, line); n++; } fclose(fp); return; }

(4)1つのCプログラムを読み込み、m、nの2つの数字を入力し、m行目からのn行コードを注釈として使用し(すなわち、これらの行の前に"//")、新しいプログラムを別の.cファイルに保存する.
[参考解答]
#include 
#include
#include
void formatPrograme(char *sourcefile, char *targetfile);
void outprogram(char *filename);
int main( )
{
    formatPrograme("source.c", "target.c");
    printf("    !
"); return 0; } void formatPrograme(char *sourcefile, char *targetfile) { int m, n; char line[256]; // FILE *fpin = fopen(sourcefile,"r"); // if(fpin==NULL) // { printf("source code read error!
"); exit(0); } FILE *fpout = fopen(targetfile,"w"); // if(fpout==NULL) // { printf("source code write error!
"); exit(0); } printf(" m n , m n:"); scanf("%d %d", &m, &n); int n1=0; while(!feof(fpin)) { fgets(line,255,fpin); n1++; if(n1>=m&&n1

(5)(拡張、参考解答を提供しない)C++プログラムを読み込んで、そのフォーマットを整理して、規範に従ってレイアウトさせます.①すべての左かっこ「{」と右かっこ「}」が単独で1行を占めています.②各文が単独で1行を占めています.③各行は統一的な縮尺配置を採用しています(毎回「{」は、その次の行のプログラムで、最初の意味のある記号の前のスペース数を4増やし、1つの"}"に遭遇するたびに、その次の行のプログラムで、最初の意味のある記号の前のスペース数を4減らします.
終わったの?どうしてそんなことができるの?CodeBlocksに「source code formatter」プラグインを作ることができます!何?マイクロソフトの製品に「集積開発環境(IDE)」があるので、応募しませんか?へへ、給料を見てからにしましょう.考えてはいけないわけではありません.