『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なし()、および複数表示されます.
(2)プログラムを作成しtest.cと名付け,ファイルに「if」,「while」,「for」が現れる回数を統計する.
[参考解答]
(3)一つのCプログラムを読み込んで、プログラムの中のすべての左かっこ"{"と右かっこ"}"が単独で1行を占め、新しいプログラムは別の.cファイルに保存し、処理したプログラムを画面に表示し、表示時に行番号を付ける.
[参考解答]
(4)1つのCプログラムを読み込み、m、nの2つの数字を入力し、m行目からのn行コードを注釈として使用し(すなわち、これらの行の前に"//")、新しいプログラムを別の.cファイルに保存する.
[参考解答]
(5)(拡張、参考解答を提供しない)C++プログラムを読み込んで、そのフォーマットを整理して、規範に従ってレイアウトさせます.①すべての左かっこ「{」と右かっこ「}」が単独で1行を占めています.②各文が単独で1行を占めています.③各行は統一的な縮尺配置を採用しています(毎回「{」は、その次の行のプログラムで、最初の意味のある記号の前のスペース数を4増やし、1つの"}"に遭遇するたびに、その次の行のプログラムで、最初の意味のある記号の前のスペース数を4減らします.
終わったの?どうしてそんなことができるの?CodeBlocksに「source code formatter」プラグインを作ることができます!何?マイクロソフトの製品に「集積開発環境(IDE)」があるので、応募しませんか?へへ、給料を見てからにしましょう.考えてはいけないわけではありません.
【プロジェクト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)」があるので、応募しませんか?へへ、給料を見てからにしましょう.考えてはいけないわけではありません.