約9ヶ月の成果

今日で僕が受ける大学1年のプログラミング講義は終了した。最初の頃はプログラミングというよりはパソコンの扱いやLaTeXの授業だったため、正確な期間はわからないが僕がC言語を学びだしてから大体8,9ヶ月といったところだろう。つまり今日の授業がこの9ヶ月の総決算だったということだ。


授業の内容は連結リストと二分木走査。

前回までに学んだポインタと構造体を用いて入れ子構造を作りそこに代入した値に処理をかけるというもの。具体的にはリスト構造へセルの挿入・削除、二分木構造へは先行順と後行順の走査だ。リスト構造というのは以前読んだ「アルゴリズムのキホン」という本で見たことがあり仕組みは知っていた。nextポインタとpreviewポインタをセルごとにつけておくことで挿入・削除が容易になり整頓しやすい仕組みだというものだった。二分木構造もそのときにヒープソートと一緒に見た覚えがあった。実際的な仕組みまではよく覚えていなかったが、二分木の構造を利用することで行うソーティング法があるのは覚えていた。

だが実際にプログラミングとして書いてみるとこれがまたさっぱりわからない。何故このような書き方をしているのか、この例題ソースはどういう動きをさせているのか、ちっともわかりやしなかった。結局最終的にはわからないところは自分でわかる仕組みに書き換えて作ったものを提出したのだが、やはり疑問は疑問として残る。どうやら僕は自分に都合のいいようにソースの書き換えができる程度の知識は得たが、疑問を自分で解決できるほどの素養までは会得できていなかったらしい。

そう思うと、この大学で1年間学んで得たものとしてはあまり納得がいかないものだった。



とりあえず疑問点を載せておこう。

連結リスト

pt = ( struct llist *) malloc(sizeof(struct llist));

右半分は構造体「llist」内メンバ分のメモリを動的に確保するというもの。だが左半分は?

ptは直前に struct llist *pt と宣言したものであり、単体だとアドレスを示すはず。

mallocの左側についた( struct llist *)の意味は?

・そもそもmain関数内で行われている処理の動きがわからない。

pとqはどういう並びでどういう関係の構造体であるか。概略図すらかけなかった。

・do while文を使う意味は?


二分木構造

・なぜ自分でTREEに0を代入しているのにTREEが0だったらという条件分岐をもうけるのか。

また、TREEが0である、ないという分岐の意味は?

・fflush(stdin)の意味は? 検索結果は「ストリームをフラッシュする」とでたがわからない。

別の結果では「\n(改行文字)を消去するため」とある。

だが入力が行われていない最初の部分においてはいらないのではないか。

・関数enter内にてgetchar()が2回連続して使用されるのは? 一度でいいのではないか。



また、どちらにも言えることだが、再帰処理・入れ子構造が多用されすぎていてきちんと把握できている自信がない。連結リストはdo whileでリスト全体を回している操作が存在するが、二分木に至っては繰り返し処理をしていない。変数や構造体だけでなく、関数や処理そのものまで再帰的になっているためにややこしい。


と、まぁ疑問点は多々あるがいつかこのブログを読み返している時には理解できるようになっていればいいと思う。とりあえずといった具合ではあるが、この大学で指定された教科書はC言語の部分を終えたことになる。演習問題は解いてないが。正直人に勧めるなんて気には絶対になれないような酷い書籍だったと思う。むしろもう一度きちんと学び直したほうがいいんじゃないだろうかと不安になるほどだ。


だが、まぁこれで僕はこの本に書かれていることは一通りやったことになるのだから、それくらいのことはできるようになったのだというつもりでいようと思う。今までのように自分がどの立場に立っているのかもわからなような状況からは何か変われたはずだ。