2000年11月15日 作成(7-3 ファイル入出力)
  関谷トップページへ アプリケーション演習、Cプログラミングトップページへ 作者へのメッセージ

アプリケーション演習・C言語プログラミング No.18 7-4 プログラムをチェックするプログラム

  2000.11.22 KPC 情報技術科 関谷

1.前回の実習へのコメント

現在の学習に集中すること

 新しいことを学習しているので、前の章の演習問題などが途中でも、それは後回しにして、現在の所に集中すること。そうしないと、現在の学習に付いていけなくなる。遅れている部分は、放課後にすること。

C言語ソースプログラムの様式について

 小生の勧める方法を実行してくれていない学生が居るが、その人達は、なぜ、取り入れないのですか?どんな課題のソースプログラムを誰がいつ作ったのか、そして、何が分かったのか(考察)が分からないのでは、レポートには、なり得ない。

プログラムの再利用について

 演習問題に限らず、テキストのプログラムは、段々と複雑になっている。従って、前のプログラムを元にして、違っている所を追加・編集する方法を取るのが良い。そうすれば、間違いも少なく出来る。プログラムの様式も統一できる。(考えずにタッチする「タイピングの練習」にならないが。)

2.今日の実習(7-4 プログラムをチェックするプログラム、演習)

7-4 プログラムをチェックするプログラム

プログラム 7−5 括弧のチェック

 プログラム7−5は、C言語ソースプログラムを読み、括弧のチェックをするプログラム例である。(最後に解説があるが、このプログラムでは、括弧が文字として使われているときには、正しい結果が得られない。)

 入力するソース・ファイル名は、コマンドラインの引数から取る。

 処理は、ファイル名を使ってファイルを開く。parcheck()関数で、EOFになるまで読み込み、表示すると共に、括弧なら、parec()関数で外部配列par[][]にセットする。

 読み終わって、外部配列par[][]を調べ、レベルごとの括弧の対応をcpar()関数を呼び、チェックする。

 実行例(入力文字の出力、対応する括弧のチェックリスト−左と右の括弧出現番号の添え字)がある。p.112では、外部配列parの表があり、使用している変数とその値が説明してある。外部配列の表では、括弧の出現番号が添え字になっている。

 括弧の出現番号でプログラムの処理は良いが、デバッグなどの実用では、行番号(と桁番号)を付加して、括弧の開始行と括弧の閉じる行との行番号(と桁番号)をj,kにそれぞれ付けるのが良い。そのためには、外部配列をpar[][6]として、par[][4]に行番号(、par[][5]に桁番号)をセットする。行番号のセットは、parcheck()で、初期値を1として、読み込んだ文字cが'\n'のときに+1する。(桁番号のセットは、'\n'のときに0にし、そうでなければ+1する。)

<実習上の注意やコメント>

1)プログラムは、C言語のプログラムの様式に合わせて作成のこと。なお、考察を先頭部分に書くのが良い。

2)ソースプログラムの入力方法:元になるプログラム7-1を貼り付けて、それを編集するのが早いし、様式も統一できる。入力の間違いも少ないであろう。

3)ソースプログラムの最初に、#include を付けること。

4)ANSI Cとしては、関数のプロトタイプ宣言をmain()関数の前に、付けること。
void parcheck(FILE *fp);
void parec(int c, int i, int g, int m, int s);
void cpar(int j, int i, int c, int d, int p, int q, int r);

  5)表のプリントを追加したが、その部分のリスト(行,桁あり)
	printf("\nTable Print\n  k   c   g   m   s gyo keta\n");  
	for(k = 0; k < i; k++) {
		printf("%3d   %c", k, par[k][0]);
		for(j = 1; j < 6; j++) {
			printf(" %3d", par[k][j]);
		}
		printf("\n");
	}

実行結果の例

Program7-5 Cプログラムの括弧のチェック 2000.11.22 KPC sekiya
1.表のプリントを追加した。
2.括弧の通し番号に(行番号 桁番号)を追加した。
main() // test.c for pro7-5.c 2000.11.22 KPC sekiya 
{
	int i=0;
	char s[20];
	
	while((s[i++] = getchar()) != '\n')
		;
}

Table Print
  k   c   g   m   s gyo keta
  0   (   0   1   0   1   5
  1   )   0   1   0   1   6
  2   {   1   0   0   2   1
  3   [   1   0   1   4   8
  4   ]   1   0   1   4  11
  5   (   1   1   0   6   7
  6   (   1   2   0   6   8
  7   [   1   2   1   6  10
  8   ]   1   2   1   6  14
  9   (   1   3   0   6  25
 10   )   1   3   0   6  26
 11   )   1   2   0   6  27
 12   )   1   1   0   6  36
 13   }   1   0   0   8   1

(   0 of(  1,  5)   )   1 of(  1,  6) ok
{   2 of(  2,  1)   }  13 of(  8,  1) ok
[   3 of(  4,  8)   ]   4 of(  4, 11) ok
(   5 of(  6,  7)   )  12 of(  6, 36) ok
(   6 of(  6,  8)   )  11 of(  6, 27) ok
[   7 of(  6, 10)   ]   8 of(  6, 14) ok
(   9 of(  6, 25)   )  10 of(  6, 26) ok

7章の演習問題 5)−6)

演習7−5) データファイルflint.datからデータを入力し、浮動小数点数に変換してから、それぞれの2乗、3乗を求め、データファイルflout.datに記憶させなさい。

 文字列から整数に、あるいは、その逆に変換する問題が3)と4)でした。それの応用がこの浮動小数点数の問題である。
 文字列からの変換では、小数点が来たら、今度は、1/10ずつ小さくなった値を加えることになる。文字列に変換するときには、誤差の問題を考えると、小数点3桁くらいで終わってもよいであろう。

演習7−6)名前と電話番号をキーボードから入力して、データファイルdname.datに記憶する。

 単純に、2種の文字列の入力とファイル出力である。区切り文字を’, ’などにすると良いであろうが、解答例ではそれを考慮していない。

3.レポート

3.1 レポート用ファイルの作成

 レポートは、実習した全部のプログラムを順番に貼り付けて、レポート用のテキストファイルを作成のこと。

3.2 提出フォルダとファイル名

・フォルダ:w:\アプリケーション演習¥C言語75_par11.22
・ファイル名:nn氏名ap18.txt