ひぐぺん工房トップへ おかげさまで28周年!

ひぐぺん工房(松浦健一郎・司ゆき) - HigPen Works
Follow @higpenworks
・今までの仕事 ・書籍 ・最近の業務 ・対応可能言語 ・お見積

『C言語[完全]入門』
Q&A

以下の回答で問題が解決しなかった場合には、 こちらから ご連絡ください。

補足


2024/01/15
Q.増刷や改訂の予定を知りたい
A.
増刷や改訂に関しては、出版社が方針を決定し、著者の私共は出版社から直前に連絡を受ける…という状況です。
※お問い合わせへの回答メールが戻ってきてしまうので、こちらで回答させていただきました。

2024/01/15
Q.未研磨・未改装の本を入手したい
A.
未研磨・未改装の本の入手方法については、申し訳ありません、私共には心当たりがありません(研磨・改装について、あまり意識したことがありませんでした)。
※お問い合わせへの回答メールが戻ってきてしまうので、こちらで回答させていただきました。

2024/02/03
Q.「n<(w-4)/2*(h-3)/2」と「m[(w-4)+(h-3)*w]='G'」の意味(Chapter19, p.662)
A.
dig.cに記述された、以下の式について補足します。
(1) n<(w-4)/2*(h-3)/2
(2) m[(w-4)+(h-3)*w]='G'

wは迷路の幅、hは迷路の高さです。p.658のように、迷路の周囲には文字+、各行の末尾には改行文字∖n、配列の末尾にはヌル文字∖0を配置してあります。例えば次のような迷路では、wは6、hは5です。説明のために、非常に小さな迷路の例にしました。以下で□は格子点を表します。
+++++∖n
+###+∖n
+#□#+∖n
+###+∖n
+++++∖n∖0

式(1)(2)に含まれる(w-4)は、wから「+を2個、#を1個、∖nを1個、で合計4個」を取り除いた文字数を計算しています。上記の例では、(w-4)は2です。これを2で割って「(w-4)/2」を計算すると1となり、幅方向の格子点の個数(上記の例では1個)が求まります。

式(1)(2)に含まれる(h-3)は、hから「+を2個、#を1個、で合計3個」を取り除いた文字数を計算しています。上記の例では、(h-3)は2です。これを2で割って「(h-3)/2」を計算すると1となり、高さ方向の格子点の個数(上記の例では1個)が求まります。

幅方向の格子点の個数と、高さ方向の格子点の個数を乗算すれば、全ての格子点の個数が求まります。したがって式(1)の「(w-4)/2*(h-3)/2」は、全格子点の個数を表します。式(1)の「n<(w-4)/2*(h-3)/2」は、処理済みの格子点の個数(n)が、全格子点の数に満たない限り、処理を続けるための条件式です。

式(2)の「(w-4)+(h-3)*w」は、右下端の格子点(ゴールの位置)に相当する、配列の添字を計算しています。右下端の格子点は、左から(w-4)桁目、上から(h-3)行目の位置にあります(いずれも0から数えます)。配列には1行あたりw個の文字があるので、「(h-3)*w」で(h-3)行目の左端の添字が計算できます。これに(w-4)を加算して「(w-4)+(h-3)*w」とすれば、右下端の格子点(ゴールの位置)の添字になります。

以下はwが8、hが7の例です。上記の方法で式(1)(2)を計算し、格子点の個数やゴールの位置が正しく求まることを確認してみてください。
+++++++∖n
+#####+∖n
+#□#□#+∖n
+#####+∖n
+#□#□#+∖n
+#####+∖n
+++++++∖n∖0

2024/04/09
Q.「path」か「*path」か(Chapter17, p.600)
A.
ext.cの「printf("%s/%s\n", path, entry->d_name)」における「path」は、「*path」ではなく、掲載されている「path」が正しいです。このプログラムの「path」と「*path」は、次のような意味です。
printf関数において、変換指定の%sに対する引数は文字列(文字を指すアドレス)です。そのため*path(文字コード)ではなく、path(文字を指すアドレス)を渡しています。

上記を理解するには、文字列・配列・アドレス・ポインタといった知識を連携させる必要があるので、少し難易度が高いです。本書における関連項目を以下に挙げますので、ご参照いただけましたら幸いです。

最終更新 2024/04/09
トップページへ
©ひぐぺん工房 禁無断転載
最新刊『Java[完全]入門』 
このサイトはリンクフリーです。
このサイトはChromeで動作検証しています。ブラウザにかかわらず表示に乱れがありましたらどうぞお知らせ下さい。メールを送る