わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

読み解き補足

昨日と一昨日の記事を読むと,次の疑問が浮かんでくると思います.

  • 「出力」なら“printf”とか,二次元座標の基本形(struct point)とか,どうして出てくるの?
  • 「出力は“printf”」以外に考えないの? (人口密度の型は「自分で決め」ているけど)

順に答えていきます.

出力と言ったらprintf,二次元座標を構造体で表すならstruct point {int x, y;};.これらはいずれも,丸暗記です.記憶しておいて,プログラミングで必要なときに思い出せるようにしておかないといけません.
他に覚えておくべきなのは…

  • コマンドライン引数といったら,int main(int argc, char *argv[])
  • 「かつ」は,&&.「または」は,||.
  • 関数定義の基本構成は
戻り値の型 関数名(引数の型と名前)
{
  変数宣言

  処理

  return 戻り値; /* 戻り値の型がvoidなら,不要 */
}

二つ目の点については,次の行動指針に基づいて,その都度判断してください.

  • たいていの問題には,それを解決する方法がいくつもあるもので,解答するときは,その中から最善の一つだけを提示すればいい

プログラミング課題で単に「出力しなさい」と書かれたとき,これだけを読むと,出力の方法はいろいろ考えられます.標準出力に書き出すほか,ファイルに書き出すのや,X Windows SystemとかOpenGLとかの関数を使って画面上に表示するということも,出力の形態としては,考えられます.
しかし,どれでもいいのかというと,ここでもプログラミング課題の読み解きと同じように,詳細化して考えましょう.
課題文の記述から,Xの関数を使うことは期待されていません.また,ファイルという言葉も出てきません.ということで消去法により,「標準出力に書き出す」方法を選べばいいということになります.
そして,プログラミング課題や解答例(コード例)をたくさん読むことで経験を積み,「出力」と言えば,「printfなどを使って,標準出力に書き出すこと」が当たり前のこととして,自分の頭に蓄積されることになります.
なお,プログラミング課題で「画面に表示するプログラムを作りなさい」と書かれている場合も,XとかOpenGLとかを考えることなく,標準出力に書き出せばいいでしょう.この件については思うところがあるので,後日また取り上げることにします.
ところで「標準出力」と「printf」の関連もまた,自明ではありません.標準出力に何かを書き出すのは,printfの他に,fprintfやfputsとstdoutを組み合わせるコードや,putchar,fputc,writeといった関数を使う手もあります*1
方法を挙げられるだけ挙げたら,次にそこから「最善の一つ」を選ぶ作業をしましょう.たいていの場合,printfが簡潔にかつ統一的に,標準出力に書き出す処理を記述できます*2
結局のところ,標準出力といえばprintfというステレオタイプを覚えておき,必要なときに頭から取り出し,それでうまくいかないんじゃないかと思ったら別の方法を考える,という手順をおすすめします.
私が学生に「○○と言えば××だね」と言ったとき,「○○」で連想できる語句には「××」以外にいろいろあり得ます.もし「××」と異なる語句,たとえば「△△」しか連想できなかったとしたら,まず「○○」で連想できるものを,すべて挙げてみてください.「××」も「△△」も忘れずに.そして,今考えている状況での最善の一つ,つまり「○○」と最も密接に関連するものを選び出しみましょう.私も私で過去に,その検討を(初めのうちは意識して,そのうち無意識に)していて,結論が「××」となり,その思考様式を省略して簡潔に「○○と言えば××だね」と言っているわけです.
もし教員の言うことが理解できなかったら,その場はそれを正しいと思って,記録しておきましょう.教員のいないところで,むしろ◇◇では? あるいはこれは? と思いを巡らせ,「いくつもの方法があり,最善な一つを選ぶ」の方針で自分なりの結論を出してみましょう.その後,先生や先輩・友人の発言,書籍やインターネットの記述と照らし合わせて,その結論を強化していくことも怠らずに.

*1:この脚注を読んだ学生へ.知らない関数名を見つけたら,そして本気でプログラミング技術を向上させたかったら,Googleでその単語を検索して,何をするものなのか,理解していきましょう.

*2:留意点もあって,例えば単純な文字列を出力したいときは,fputs(文字列, stdout);とするほうがいいでしょう.文字列に「"%"」を含む場合は,printf(文字列);としてはいけませんね.それと別に,1文字だけ出力したいときは,putcharが有用です.