都道府県穴埋めゲーム

問題を解くにはまずプログラムの全体の流れを抑えると思いますが、
具体的にどのようにされていますでしょうか。


自分の取り組み方として、問題文から何を
どうしたいのかを確認します。

そこから、どのような流れになるか想像します。
例えば、Aファイルからレコードを取り出し、そのレコードの
データを書きかえて、Bファイルに登録する場合は以下のように
考えます。
 (1)Aファイルのオープン
 (2)Aファイルからレコードを読む
 (3)該当するレコードに対し、書き換え処理を行う
 (4)処理したレコードをBファイルに書き込む

ただ、この流れを想定して問題のプログラムを見たとき、
なぜ、このようなことをしているのか?
という不明点がでてきます。
すると、全体にどのような影響があるか解らなくなり、
全体像が把握しきれなくなります。

例えば、上記の不明点が変数に値を代入していて、
別の箇所でもその変数を使用している場合、
何をしているかがわからなくなり、
お手上げ状態になってしまいます。

みなさんのプログラムに対する全体象のとらえ方や、
上記のような状態になったとき、どのような対処を
しているかを教えていただけないでしょうか。

ちなみにCASLを勉強しています。
(CASLに変数はありませんが、例として記述させていただきました)

A 回答 (2件)

局部的な動きを確認する場合・・・ですかぁ。



質問者さんのやりかたは、原則どおりで実に正しく王道の方法です。
ですので、以下の私の方法は「間違えることもある邪道」だと了解の
上、理解してみてください。

注目するのは「主な処理」です。

例えば、ループで何かの結果を貯める処理の場合、どこかに

DATA = DATA + INPUT(I) (vbの場合、他言語の場合は敷衍して下さい)

みたいな、データを貯める処理があると思います。これを回すループ
を見つけてしまえば、それ以外の処理は「メイン」ではありません。

また、何かを差し替える処理であっても、

OUTPUT = INPUT

の式が、どこかにあるはずですよね。コレが分かれば、その命令の前
は入力データを整える処理、後は単なる出力になりますから、差し替え
処理の条件分岐を探す・・・ということになります。

要は「キモになる処理」の命令を想定して見つけてしまうんです。キモ
以外のコードは事前・事後の処理で、そう言う処理は大概アタリマエの
準備ですから無視・・・というか理解は後回しでも大丈夫。重要な分岐
と処理さえ押さえれば、後は芋づる式に理解できます。

ただ、前にも書きましたが、この方法は「キモになる処理」のパターン
を多く知っていること、プログラムが、奇をてらわないマトモな処理
であることが前提になります。この2点のどちらかが外れると、泥沼に
陥りますので、ヤバイと思ったら即座に王道に戻る必要があります。

基本情報処理では、それほどヘンな処理は出ませんが、タマに「意表
を突く処理」が出るコトがあります。特にアセンブラやJavaではその
傾向がありますので、ヤマが外れると辛いです。逆に経験上、COBOLの
処理は比較的マトモな場合が多いので、ロジックが苦手な人はCOBOLを
狙うと良いかもしれません。ま、とっつきは非常に悪い言語ですがね。
    • good
    • 0

他人の作ったプログラムは、どのようなものでも読みにくいですよね。



で、実際の業務なら、実際にそのプログラムを動かして、レジスター
などの動きを毎ステップフォローすると、何とか分かる場合が多いの
ですが、試験問題でそんなことも出来ませんし、そもそもCASLのような
アセンブラでは、ステップを追っても何をやってるか分からないことが
多いです。

ですので、私は結果から追っていきます。大概の問題では、最終的に
何が出力されるかは明示されていますので、出力データは容易に当たり
をつけることが出来ます。出力データが分かれば、それをどうやって
計算しているかを順次追いかけていく・・・という方法が取れます。
当然、変数やレジスターは、ステップごとの変化をしっかり書き出す
ようにしておかないと、手がかりを見落としますよ。

ただ、実際にやってみると、CASLは「アセンブラプログラムのクセ」に
慣れておかないと、追いかけることすら出来ない場合が少なくないです。

ですので、どうしてもCASLという場合は、アセンブラのコードをたくさん
読み、出来ればエミュレータで動作させて見ることを繰り返すしかない
と私は思います。逆に言えば、一見難しい他の言語の方が、ロジックを
追いかける上ではむしろ分かりやすい、とも言えます。

情報処理試験を社内外で教えて来た経験からです。参考になれば幸いです。
    • good
    • 0
この回答へのお礼

返事が遅くなってしまい、すみません。

全体の把握方法のアドバイス、有難うございました。
では、局部的な動きを確認する場合についても、相談させて下さい。

自分のやり方は簡単なデータを使用してトレースしています。

たとえば、文字列の中に空白が存在した場合、
空白を別の文字列で置き換えるというプログラムがあったとします。

その場合、正常なデータ(空白が無いデータ)でまずはトレースし、
次に空白であった場合でトレースします。
要はデータが変化しないパターンでトレースした後で、
データが変化するパターンでトレースします。

このような手順を踏まないと、文字が空白であるかの分岐で両方の
分岐をみながらトレースすることになると思います。
すると、フローの整理がつかなくなると思います。

ただし、この方法では時間がかかってしまいます。
そこで、分岐が存在するプログラムはどのようにトレースしていますでしょうか。
ここら辺が固まれば、局部的な箇所もスムーズにトレースできるのでは
ないかと考えています。

お礼日時:2009/04/15 11:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!