Cygwinでデバッグ

例題

例題を思いつくまま書き連ねてみます。

  1. #include <stdio.h>
    の "stdio" の読み方を記せ。
  2. 以下のプログラムを読んで、次の問に答えよ。
    #include <stdio.h>
    
    int five_times(int x) {  /* (1) */
        x *= 5;              /* (2) */
        return x;            /* (3) */
    }
    
    int main(void) {
        int x = 5;                      /* (4) */
        int y = 10;                     /* (5) */
        
        printf("%d\n", five_times(x));  /* (6) */
        printf("%d\n", five_times(x));  /* (7) */
        printf("%d\n", five_times(y));  /* (8) */
        printf("%d\n", five_times(y));  /* (9) */
        return 0;
    }
    1. (3) で返される x の変数と同じものは (1)〜(2), (4), (6), (7) のうちどれであるか。
    2. (2) で x の値は5倍になるが、(6) と (7) の表示は同じになるか。
    3. (2) で x の値は5倍になるが、(8) と (9) の表示は同じになるか、それともコンパイルエラーになるか。

問題分割の方法

底辺 b, 高さ h の三角形を考える。ただし b, h ともに整数で、10≦b≦20, 10≦h≦20 の範囲をとるものとする。この中で、面積が 70 以上 100 以下になるものの数を数えたい。次の指示に従って、プログラムを完成させなさい。

  1. 底辺 b, 高さ h の三角形の面積を返す関数 double triangle(int b, int h) を作りなさい。
  2. main() 関数で、底辺5, 高さ5 の三角形の面積を、関数 triangle() を用いて計算し、printf() で表示しなさい。正当な値が表示されることも合わせて確認しなさい。
  3. main() 関数を作り直して、底辺 10〜20, 高さ 10〜20 の範囲の三角形の面積をすべて表示するようにしなさい。for ループが2重の入れ子になることを期待している。
  4. (内側の)ループの中に if 文を追加して、三角形の面積が 70〜100 の場合のみ、表示するように変更しなさい。
  5. 数を数えるための変数 int count を main() 関数の中で宣言し、これを利用して三角形の面積が 70〜100 となるものの数を数えなさい。
  6. main() 関数の最後で「条件を満たす三角形は x 個あります。」と表示しなさい。
  7. ループ内の printf() をコメントにしなさい。消さずにコメントで残しておくのがよい。

位取り

次のような場合の時刻を表示せよ。時刻は 12:34:56 のような形式(24時間制)で表示するとする。(解答例は filehms.c

  1. (例) ある時計台では、7時〜21時の間、毎時0分に時報が鳴る。時報の鳴る時刻を表示せよ。
    • 出力例
       7:00:00
       8:00:00
       9:00:00
      10:00:00
      ...
      20:00:00
      21:00:00
    • プログラム例
      int i;
      for (i=7; i<=21; i++) {
          printf("%2d:00:00\n", i);
      }
  2. ある駅では、7時から21時30分まで、30分おきに電車が出発する。電車が出発する時刻を表示せよ。
    • 出力例
       7:00:00
       7:30:00
       8:00:00
       8:30:00
      ...
      21:00:00
      21:30:00
  3. ある駅では、7時から、30分おきに1本ずつ、合計14本の電車が出発する。電車が出発する時刻を表示せよ。
  4. ある駅では、7時から、30分おきに1本ずつ、合計15本の電車が出発する。電車が出発する時刻を表示せよ。
    • プログラムのヒント(途中まで)
         int i, h=7, m=0, s=0;
      
         for (i=0; i<15; i++) {
             printf("%2d:%02d:%02d\n", h, m, s);
             m = m + 30;
             ...
  5. ある駅では、7時から、35分おきに1本ずつ、合計15本の電車が出発する。電車が出発する時刻を表示せよ。
  6. ある駅では、7時から、65分おきに1本ずつ、合計15本の電車が出発する。電車が出発する時刻を表示せよ。
  7. ある駅では、7時から、65分おきに1本ずつ、合計20本の電車が出発する。電車が出発する時刻を表示せよ。

     

  8. 深夜の宿直の交代は 20時から始まって3時間ごとで、翌朝8時まで続く。交代の時刻を表示せよ。
  9. 20時から翌朝8時までの宿直の間、50分ごとに冷蔵庫の庫内温度を記録する。記録すべき時刻を出力せよ。
    • 出力例
      20:00:00
      20:50:00
      21:40:00
      ....
  10. 20時から翌朝8時までの宿直の間、50分ごとに冷蔵庫の庫内温度を記録する。50分ごとにアラームの鳴る時計を利用したが、精度不良のため、実際には49分51秒ごとに記録していた。記録していた時刻を出力せよ。
    • 出力例
      20:00:00
      20:49:51
      21:39:42
      ....

if/else の使い方と return の使い方

ある通信会社のデータ通信の毎月の料金プランは次のようになっている。

  1. 契約をした時点で1000円の基本料金が発生する。また、1000MB まで追加料金なしで通信できる。
  2. 通信量が 1000MB を超えると、超えた通信量に対して1MB あたり2円の従量料金が加算される。
  3. ただし、通信量が 3000MB を超えると、基本料金を含めて5000円の定額となる。

通信量 x(MB) に対する課金額を計算する関数を次の2通りの処理方法で作りなさい。

なお、x として負の通信量が与えられた場合は、 エラーを表すために -1 を返しなさい。

main関数では、0MB, 1000MB, 3000MB のような、条件の境界となる通信量に対して、関数の値が正しいか確認しなさい。また、-1000MB〜5000MBの通信量に対して、fee1(), fee2() が同じ値を返すことも確認しなさい。

このように、関数1つを取り出して動作チェックを行う手法を「ユニットテスト」と言う。

考察せよ

次の2つのプログラムの違いを考察せよ。

間違いを直せ


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS