わさっきhb

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

Cプログラミングは楽し

先週月曜日に実施した試験の採点を終え,昨日,成績報告処理をしました.また先ほど,解答例と解説のPDFファイルを更新しました.
採点をしていて,気になったのは,レポート課題も,試験の大問4(プログラム論述)も,十分な分量を記述していたことです.論述で,白紙や数行といった解答は見当たりませんでした.
その一方で,4択10問の大問1では,半分以上を×にせざるを得ない答案がいくつかありました.
試験だけで,学科の1年生の特徴を言うのは乱暴であるのを承知の上で,思ったのは,学生に十分な情報を提示していれば,学習を行い,それが答案に反映されているということです.
言葉にしてみると,「乱暴」どころか当たり前のことにも思えますが,教える側としてこのことに気づいたのが,講義形式のプログラミング授業の最終年度であるというのは,うれしさ半分,悲しさ半分です.
今年度は,各授業の終了時の小テストで,プログラムコードの断片(1行だとか,数行だとか,関数だとか)を日本語で書いてもらうことを実施し,試験でも80点満点の20点分で問いました.この経験が,2年以降のプログラミングで,「何をしたいかを明確にする」「書いたコードは,何をしているかをきちんと説明する」など,仕様に合ったプログラムを作る(デバッグを含みます)に役立つことを願います.
出題・採点をして,曖昧だったところが明確になったこともあります.

#include <stdio.h>

int main(void)
{
  double d1 = 3.14;
  double d2 = 33.14;

  printf("d1 = %f\n", d1);
  printf("d2 = %f\n", d2);

  return 0;
}

上のコードで,何が出力されるでしょうか.最初の行は「d1 = 3.140000」となる,というヒントをつけ加えると,どうでしょうか.
2行目は,手元の環境では「d2 = 33.140000」となりました.2行を並べて見ると,整数部は「3」と「33」で1文字違い,小数部はともに「140000」で同じとなります.
なぜ小数部は6桁なのか,そして3.14は(0.1と同じく)2進数では無限小数となるのに,なぜ後ろに0が並んでいるのかについて,1つの情報源に両方の答えが書かれていました.

f, F
double 引き数を丸めて [-]ddd.ddd の形の10進表現に変換する。小数点の後の桁数は、精度で指定された値となる。精度*1が指定されていない場合には 6 として扱われる。精度として明示的に 0 が指定されたときには、小数点以下は表示されない。小数点を表示する際には、小数点の前に少なくとも一桁は数字が表示される。

Man page of PRINTF

「6」は,明示されています.0の並びは,「引き数を丸めて」の部分が根拠となります.付記すると,「丸め誤差」という用語を取り上げています.四捨五入がその代表ですが,広く浅く知りたければ,wikipedia:端数処理がおすすめです.
(事情により,ここまででいったん公開します.続きを書いたら更新します.)

*1:「%f」を「%.4f」や「%.0f」に変更して,コンパイル・実行すると,違いを見ることができます.