コンピュータIIA(月曜3限)課題と解答

20080512の課題

もっとも短い C のプログラム(コンパイラでワーニングのでない)を作成せよ。 答えは asakawa.comp2a@gmail.com 宛に、件名「20080512-null-自分の学生番号」 として送信せよ。かならず自分宛に Cc: すること。
解答例

  1. 自分の学生番号の下二桁を16進数と見なして、10進数に変換せよ
  2. 自分の学生番号の下二桁を16進数と見なして、8進数に変換せよ
  3. 自分の学生番号の下二桁を16進数と見なして、2進数に変換せよ
  4. 3. で求めた2進数の1の補数を求めよ
  5. 3. で求めた2進数の2の補数を求めよ
  6. 自分の携帯電話番号の下二桁を16進数とみなして、10進数に変換せよ
  7. 自分の携帯電話番号の下二桁を16進数とみなして、8進数に変換せよ
  8. 自分の携帯電話番号の下二桁を16進数とみなして、2進数に変換せよ
  9. 8. で求めた2進数の1の補数を求めよ
  10. 8. で求めた2進数の2の補数を求めよ
  11. 3. で求めた数に10.で求めた数を足し、引き算の答となっていることを確かめよ

答えは asakawa.comp2a@gmail.com 宛に、件名は「20080512-digit-自分の学生番号」 とし、必ず自分宛に Cc: すること。
解答は各自異なるため省略

20080519の課題

本日の課題をお送りします。
本日のハンドアウト3ページ目の問題をすべて解答せよ。すなわち 次の16進数の引き算を2の補数を使って足し算に直して計算せよ。 そしてその答えが10進数に直した場合の引き算と一致しているこ とを確かめよ。

  1. 89(16)-84(16)=
  2. 56(16)-25(16)=
  3. 09(16)-73(16)=
  4. 41(16)-47(16)=
  5. 12(16)-95(16)=
  6. 64(16)-72(16)=
  7. 41(16)-55(16)=
  8. 82(16)-58(16)=
  9. 35(16)-23(16)=

提出先は asakawa-comp2a@ml.twcu.ac.jp メールの件名は「20080519-自分の学生番号」とすること 提出を確認するため、必ず自分宛に Cc: しておくこと 提出期限は 5 月 25 日 23:59

20080526の課題

本日(5月26日)の課題をお送りします。
次の二つのプログラムをコンパイルするとワーニングが出る。このプログ ラムをワーニングが出ないように修正せよ。なお、修正の仕方は一通りで はない。複数の修正方法が存在する。修正したプログラムを提出せよ。 複数の正解が存在するが、提出する修正したプログラムはそのうちの一つ で良い。

提出先は asakawa-comp2a@ml.twcu.ac.jp、 件名は「20080526-自分の学生番号」とし、必ず @cis.twcu.ac.jp から送信 し、自分宛に Cc: しておくこと。

------------------------ ここから -----------------------------
#include <stdio.h>

int main(void)
{
    int hennakazu;

    printf("10進数を入力してください");
    scanf("%lx", &hennakazu);
    printf("入力された数は %12lld です。\n", hennakazu);
    return 0;
}
------------------------ ここまで -----------------------------

解答例

------------------------ ここから -----------------------------
#include <stdio.h>

int main(void)
{
    char char_var;
    short short_var;
    int int_var;
    long lint_var;
    long long int llint_var;

    printf("char 型の10進数を入力してください :");
    scanf("%d", &char_var);
    printf("入力された数は %12d です。\n", char_var);

    printf("short 型の10進数を入力してください :");
    scanf("%d", &short_var);
    printf("入力された数は %12d です。\n", short_var);

    printf("int 型の10進数を入力してください :");
    scanf("%d", &int_var);
    printf("入力された数は %12d です。\n", int_var);

    printf("long int 型の10進数を入力してください :");
    scanf("%d", &lint_var);
    printf("入力された数は %12d です。\n", lint_var);

    printf("long long int 型の10進数を入力してください :");
    scanf("%d", &llint_var);
    printf("入力された数は %12d です。\n", llint_var);

    return 0;
}
------------------- ここまで ----------------------------------

解答例

20080602の課題

本日の課題をお送りします。今回の課題は正解が一つのため、メーリングリスト には解答を流さないでください。解答は asakawa.comp2a@gmail.com まで送っ てください。件名は「20080602-自分の学生番号」として、かならず自分宛に Cc: してください。提出期限は6月8日23:59までとします。

  1. まず、次のプログラムを実行せよ。
    ーーーーーーーーーーここからーーーーーーーーーーーーーーーー
    #include <stdio.h>
    #include <float.h>
    
    int main(void)
    {
        float f;
        double x;
        long double ld;
    
        printf("\nTesting the precision of float, double, and long double : \n");
        f = 1.0f + 1.0e-7;
        printf("  1.0 + 1.0e-7 = %.10f\n", f);
        f = 1.0f + 1.0e-8;
        printf("  1.0 + 1.0e-8 = %.10f\n", f);
        x = 1.0l + 1.0e-15;
        printf("  1.0 + 1.0e-15 = %.20lf\n", x);
        x = 1.0l + 1.0e-16;
        printf("  1.0 + 1.0e-16 = %.20lf\n", x);
        ld = 1.0L + 1.0e-19;
        printf("  1.0 + 1.0e-19 = %.30Lf\n", ld);
        ld = 1.0L + 1.0e-20;
        printf("  1.0 + 1.0e-20 = %.30Lf\n", ld);
    
        printf("\nThe experiment above is explained by constants from float.h :\n");
        printf("  precision of float : %e\n", FLT_EPSILON);
        printf("  precision of double : %.15le\n", DBL_EPSILON);
        printf("  precision of long double : %.30Le\n", LDBL_EPSILON);
    
        return 0;
    }
    ーーーーーーーーーーここまでーーーーーーーーーーーーーーーー
    表示された結果のうち、
    1.0 + 1.0e-7 が 1.0000001
    にならず、同様に
    1.0 + 1.0e-15 が 1.000000000000001
    にならず、
    1.0 + 1.0e-19 が 1.0000000000000000001
    という、きれいな数にならない理由を、FLT_EPSILON, DBL_EPSILON,
    LDBL_EPSILON との関係から考察せよ。
    
    解答例
  2. ハンドアウト p.28, 演習 3.9 の double-io.c を改良して long double 型の データをキーボードから入力し e 変換、f 変換、g 変換で出力するプログラ ム long_double-io.c を作れ。
    解答例
  3. 次のような出力をするプログラム fixed_double.c を作れ。
    ーーーーーーーーーここからーーーーーーーーーーーーーーーーー
    $ ./fixed_double
    doulbe 型の数を入力してください : 0.12345678
    入力された数は 0.12346    です。
    ーーーーーーーーーここまでーーーーーーーーーーーーーーーーー
    ここで 0.12345678 はキーボードから入力するものとする。
    
    解答例

20080609の課題

ハンドアウト p.35 の演習 4.8 の tax.c, 演習 4.9 の triangle.c, 演習 4.10 の fahr2cel.c を作成せよ。

今回の課題も正解が一つのため、メーリングリストには解答を流さないでくだ さい。解答は浅川個人宛 asakawa.comp2a@gmail.com まで送ってください。 件名は「20080609-自分の学生番号」として、かならず自分宛にCc: してくだ さい。期限は 6 月 15 日 23:59 とします。

20080616の課題

浅川です

本日 6 月 16 日分の課題をお送りします。例によって、課題の宛先は、 asakawa.comp2a@gmail.com です。件名は「20080616-自分の学生番号」 としてください。提出期限は 6 月 22 日 23:59 とします。

今回はやさしいなー(^_^)

20080623の課題

浅川です

本日の課題をお送りします。

本日の課題以下の通りです。例によって asakawa.comp2a@gmail.com に送って下さい。件名は「20080623-自分の学生番号」とし、必ず自分 宛に Cc: してください。期限はいつものとおりで、6 月 29 日 23:59 で す。

  1. ハンドアウト 42 ページの演習 5.4
    解答例
  2. ハンドアウト 42 ページの演習 5.5
    解答例
  3. ハンドアウト 43 ページの演習 5.7
    解答例
  4. ハンドアウト 44 ページの演習 5.8
    解答例
  5. 西暦年(int 型) を scanf() 文で入力し、その年が閏年であるか否かを判定するプログラムを作成せよ。その年が閏年であるか否かは、
    1. 4 割り切れれば閏年
    2. ただし 100 で割り切れる年は平年
    3. ただし 400 で割り切れる年は閏年
    である。
    解答例

20080630の課題

浅川です

本日分の課題をお送りします。頑張って解いてください。質問はいつでも歓 迎します。授業中にも言いましたが、最低限コンパイルエラーが出ないプロ グラムを提出してください。自分の頭の中で考えただけのプログラムではい けません。

例によって課題の提出先は asakawa.comp2a@gmail.com です。 件名は「20080630-自分の学生番号」とし、必ず自分宛に Cc: してください。 期限はいつものとおりで、7 月 06 日 23:59 です。

ただし 3 番の余力のある人向けのプログラムだけは、メーリングリストに流 してください。asakawa-comp2a@ml.twcu.ac.jp です。件名は 「20080630-factorial-自分の学生番号」とし、かならず自分宛に Cc: してく ださい。
このプログラムだけメーリングリストに流してもらう意図ですが、追加ポイ ントとして評価します。プログラムの独創性や完成度を評価します。つまり 早く提出すれば独創性が認められやすいことになります。加えて、自分より 先に提出されたプログラムを参考にして作っても良く、この場合まったく同 じプログラムを提出しても評価されません。より良いプログラムを作ってみ てください。一度提出した人も再提出を認めます。

以下が実際の課題です。

  1. 次のプログラムは九九の表を表示するプログラムである。足りない部分 を補って、完成させよ。
    #include <stdio.h>
    
    int main(void)
    {
           int i,j;
    
           printf("    1  2  3  4  5  6  7  8  9\n");
           printf("------------------------------\n");
           for(i=2;i<=ここを書く
                   printf("%1d:", i);
                   for(j=1;j<=ここを書く
                           printf("ここも書く
                   }
                   printf("ここも書く
           }
           return 0;
    }
    
    解答例
  2. ハンドアウト p.46 演習 5.10 1から99までの奇数の和を求めるプログラムは if 文を用いる方法と if 文を用いない方法と2通りある。2通りのプログラムを書 け。
  3. ハンドアウト p.46 演習 5.11 の n の階乗を求めるプログラムを作れ。
    解答例
    以下は余力のある人向け: 階乗の計算はすぐに <limits.h> で定義されている INT_MAXを越えてしまう。 演算結果が INT_MAX を越えた時、計算を中止するようにプログラムを書き改 めよ。また、階乗の計算を long long int 型の変数で行わせるとどのくらいの桁 数まで計算できるようになるか。
    解答例
  4. ハンドアウト p.47 演習 5.12 2つの整数とその和をキーボードから入力し、 正解になるまで解答を要求するプログラム drill.c を作れ。
    解答例
  5. ハンドアウト p.47 演習 5.13 1から99までの奇数の和を求めるプログラムを while 文を用いて作れ。
    解答例
  6. ハンドアウト p.48 演習 5.14 正の整数 n を入力すると n, n-1, n-2, ..., 1 と 出力するプログラム countdown.c を do-while 文を用いて作れ。
    解答例

20080707の課題

浅川です

本日分の課題をお送りします。例によって、課題は asakawa.comp2a@gmail.com 宛に送ってください。メールの件名は「20080707-自分の学生番号」としてくださ い。提出期限は 7 月 13 日 23:59 とします。

  1. 二つの double 型の引数を受け取って、その積を返す関数 mul() を含むプログラム mul.c を書け。
  2. 一つの double 型の引数を受け取って、その 3 乗を返す関数 cube() を含むプログ ラム cube.c を書け。
  3. 正の整数を一つ scanf で入力するとその数だけアスタリスク * を出力するプログ ラム asterisk.c を書け。例えば 7 と入力すると ******* と出力するようにせよ。
  4. 正の整数を一つ入力するとその約数をすべて印刷するプログラムを divisor.c を書 け。サンプルオペレーションは以下の通り。
    $ cc -o divisor divisor.c -Wall
    $ ./divisor
    正の整数を入力してください:10
    1 2 5
    $ ./divisor
    正の整数を入力してください:100
    1 2 4 5 10 20 25 50
    $ ./divisor
    正の整数を入力してください:12
    1 2 3 4 6
    
  5. 次のプログラムは乱数生成関数 rand() を使ってサイコロを 6000 回振ったとき のシミュレーションをするプログラムである。このプログラムはサイコロのそれ ぞれの目が 6000 回中何回現れたかを表示する。ところがこのプログラムにはバ グがある。5 の目と 6 の目のところで正しく動作しない。正しく動作するように 書き改めよ。
    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    
    int main(void)
    {
           int i, face, one=0, two=0, three=0, four=0, five=0, six=0;
           time_t loadingtime;
    
           srand((unsigned)time(&loadingtime));
    
           for ( i=0; i<6000; i++) {
                   face = rand() % 6 + 1;
    
                   switch(face) {
                           case 1:
                                   ++one;
                                   break;
                           case 2:
                                   ++two;
                                   break;
                           case 3:
                                   ++three;
                                   break;
                           case 4:
                                   ++four;
                                   break;
                           case 5:
                                   ++five;
                           case 6:
                                   break;
                   }
           }
    
           printf("さいころの目 出現回数\n");
           printf("           1  %8d\n", one);
           printf("           2  %8d\n", two);
           printf("           3  %8d\n", three);
           printf("           4  %8d\n", four);
           printf("           5  %8d\n", five);
           printf("           6  %8d\n", six);
    
           return 0;
    }
    

20080714の課題

浅川です

本日分の課題をお送りします。いつものとおり課題は asakawa.comp2a@gmail.com まで送ってください。締め切りは 3 週間先の 8 月 3 日 23:59 とします。 件名は「20080714-自分の学生番号」 3 週間分あるのでちょっと多めです(^_^;)

  1. 数学関数をできるだけたくさん使ってみるプログラムを書け。
  2. 次のプログラムの誤りを正せ。
    #include <stdio.h>
    
    double cube(double x);
    
    int main(void)
    {
           double x;
    
           printf("double 型の変数を一つ入力してください:");
           scanf("%lf", &x);
           printf("3 乗は %lg です。\n", cube(x));
           return 0;
    }
    
    int cube(double x)
    {
           return x * x * x;
    }
    
  3. 以下はプログラムの断片である。間違いを見つけ、修正する方法 を説明せよ。
    double square(double num)
    {
       double num;
       return num * num;
    }
    
  4. 3 つの double 型の引数を受け取って、その最小値を返す関数 smallest() を書け。
  5. 2 つの int 型引数 a, b を受け取って a<=x<=b である int 型の乱数 x を 返す関数 rand2() を含むプログラム rand2.c を書け。ただし関数プロト タイプ宣言を用いること。
  6. 整数型引数を 1 個受け取って、その引数で指定された辺の長さを持つ アスタリスクで正方形を画面の左端に描画する関数 edge() を書け。例え ば edge(4) であれば、次のように表示される。
    ****
    ****
    ****
    ****
    

戻る

Shin-ichi ASAKAWA
asakawa@ieee.org