[サイトマップ] [トップページ]

トップページ > 授業のページ > コンピュータプログラミングII >
プログラミング課題


標題 更新日
第8回課題 6/9 Fri 13:10

第8回課題

  1. [pe8-1.c] (必須) まず,下記のプログラムを実行して, 予想どおりの結果が得られるか,確認しなさい。

    次に, 関数 incByVal と incByRef を使って,1 から 5 までの整数を,それぞれ 1 回ずつ表示するよう, このプログラムに必要な変更を施しなさい。

    ただし,incByVal に関わる変更は,関数 incByVal の本体のみとすること。 また,関数 incByRef は戻り値を返さないまま (void) とすること。

    #include <stdio.h>
    
    int  incByVal(int);
    void incByRef(int);
    
    int main()
    {
        int i, a = 0, b = 0;
      
        for (i = 0; i < 5; ++i) {
            a = incByVal(a);
            printf("a = %d\n", a);
        }
    
        for (i = 0; i < 5; ++i) {
            incByRef(b);
            printf("b = %d\n", b);
        }
    
        return 0;
    }
    
    int incByVal(int c)
    {
        ++c;
    
        return 0;
    }
    
    void incByRef(int c)
    {
        ++c;
    }
    

  2. この課題は次回の課題とします。 [pe8-2.c] (必須) プログラム内のコメントに従って下線部を埋めなさい。

    また,このプログラムの実行結果より,同じ配列の各要素がメモリ(記憶域)上に連続して配置されることを確認しなさい。

    なお,最初の printf で使われている %lu は sizeof 演算子によって得られる値の型である unsigned long int 型の値を表示するためのものである。

    #include <stdio.h>
    
    int main()
    {
         int a[] = {10, 20, 30, 40, 50};
         int size;
         int i;
         __(1)__ = NULL; /* ポインタ変数 p の宣言と初期化 */
                        /* p には size や a の要素のアドレスを格納する */
    
         /* int 型のサイズ */
         printf("size of int is %lu bytes.\n", ____(2)____ );
         putchar('\n');
    
         /* 配列 a の要素数を sizeof 演算子で求める */
         size = ________(3)_________ ;
         printf("number of elements of array \"a\" is %d.\n", size);
    
         /* 変数 size のアドレス */
         printf("address of \"size\" is %p.\n", __(4)__ );
    
         /* 配列要素 a[0] のアドレス(方法 1) */
         printf("address of a[0] is %p.\n", __(5)__ );
    
         /* 配列要素 a[0] のアドレス(方法 2) */
         printf("address of a[0] is %p.\n\n", __(6)__ );
    
         /* 配列 a の各要素の添字,アドレス,値 */
         printf("subscript, address and value of a[i]:\n");
         for (i = 0; i < size; i++) {
              printf("  %d, %p , %d \n", i, __(7)__ , __(8)__);
         }
         putchar('\n');
    
         /* ポインタ変数 p の初期値 */
         printf("initial value of p is %p.\n", p);
    
         /* ポインタ変数 p を使って a[0] のアドレスと値を表示する */
         p = __(9)__ ;
         printf("a[0]: %p, %d\n", __(10)__ , __(11)__ );
    
         /* ポインタ変数 p を使って a[3] のアドレスと値を表示する */
         p += __(12)__ ;
         printf("a[3]: %p, %d\n", __(13)__ , __(14)__ );
    
         /* ポインタ変数 p を使って a[1] のアドレスと値を表示する */
         p -= __(15)__ ;
         printf("a[1]: %p, %d\n", __(16)__ , __(17)__ );
    
         /* ポインタ変数 p を使って size のアドレスと値を表示する */
         p = __(18)__ ;
         printf("size: %p, %d\n", __(19)__ , __(20)__ );
    
         return 0;
    }
    
  3. [pea8-1.c] 第6回課題 4 のプログラムを次のとおりに動作するプログラムに変更しなさい。

    2次元配列を探索する関数に対して,探索キーの値が見つかった行と列を,それぞれポインタ引数を通じて関数 main の変数に代入するためのパラメータを追加する。 関数 main では,その変数の値を利用して,探索キーの値が二次元配列に存在ときに,

    n was found at ( row, col ).
    と表示するようにする。ここで n は探索キーであり,row と col は探索キーが見つかった行と列である。 例えば,5 の入力に対しては 5 was found at (0, 2). のように出力されるようにする。



第7回課題 6/2 Fri 19:37

第7回課題

  1. [pe7-1.c] (必須) コメントに従い,下線部 (1) から (4) に適当なものを入れて,プログラムを完成させ なさい。
    #include <stdio.h>
    
    int main()
    {
        int i = 10;
        int *p;       /* ポインタ変数 p の宣言 */
    
    /* 変数 i のアドレスを 2 通りの方法で表示する (変数 p への初期値設定) */
        printf("address of i: %p\n", &i);
        __(1)__ = __(2)__ ;
        printf("address of i: %p\n\n", p);
    
    /* 変数 i の値を 2 通りの方法で表示する */
        printf("i: %d\n", i);
        printf("i: %d\n\n", __(3)__ p);
    
    /* p を使って変数 i の値を 10 増やし,その値を表示する */
        __(4)__ += 10;
        printf("i: %d\n", i);
    
        return 0;
    }
    

  2. [pe7-2.c](必須) int 型の一次元配列と要素数を受け取って, 配列内の最初の要素から要素数分の値の平均を求めて double 型の値として返す関数 arrayAverage を書きなさい。

    関数 main 内で,1年間の各月の日数が入った一次元配列を用意し,その全要素の平均値(1月あたりの日数の の平均値)を arrayAverage で求めてみなさい。

    次に,2個のサイコロを使ったサイコロ振りのシミュレーションを行い, サイコロの出目の平均値を表示する部分をプログラムに追加しなさい。

    サイコロ振りは全部で 100000 回行うこととする。配列を一つ用意し,各回の出目を配列の各要素に入れること。

    平均値の計算と表示は,サイコロ振り1回目から2回目までの2回の平均から始めて, 回数を増やしながら複数回行うこと。 例えば,回数を 2, 4, 8 ... と 100000 回を超えない範囲で 2 倍していくことが考え られる。 また,4回のサイコロ振りの出目には,配列の最初の要素から4つ分の要素の値を使うと よい。

    平均値の計算には関数 arrayAverage を使うこと。

    以上において,配列の用意と平均値の表示は,すべて関数 main において行い, arrayAverage では平均値を計算して返す処理以外を行わないこと。

  3. [pea7-1.c] 前の 2. のプログラムを,関数 main をファイル pea7-1.c で定義し,それ以外の関数 を pea7-1a.c で定義する形に変更して,コンパイルし実行しなさい。 また,pea7-1a.c において, int 型の一次元配列とその要素数を受け取って, 配列内の値の総和を求めて double 型の値として返す関数 arraySum を定義しなさい。 さらに,関数 arrayAverage を,arraySum を呼び出だすように変更するとともに,関数 main では平均値のみでなく和も表示するようにしなさい。

  4. [pea7-2.c] 一次元配列の要素の順序を逆順にする関数 reverseArray を作りなさい。 この関数は,引数として int 型の一次元配列とその要素数を受け取り,引数を通じて呼 び出し元の配列の内容を逆順に変更するものとする。

    さらに,関数 main 内で適当な配列を作成してから全要素を表示した後で,reverseArray を使 って配列の要素を逆順にしてから配列の全要素を再度表示するプログラムを作りなさい。



第6回課題 5/26 Fri 10:03

第6回課題

  1. [pe6-1.c] (必須) int 型の一次元配列とその要素数を受け取って, 配列内の値の総和を求めて返す関数 arraySum を書きなさい。

    さらに,関数 main から 関数 arraySum を呼び出して, 各月の日数 (うるう年でない; すなわち2月の日数は28日) から 1 年間の日数を求めて出力するプログラムにしなさい。

    各月の日数を格納する配列は main 内で用意して,arraySum に渡すこと。 arraySum の戻り値(一年間の日数)を表示するコードも main に書くこと。 また,関数 arraySum が,パラメータを通じて main 内の配列を書き換えることのできないプログラムにすること。

  2. [pe6-2.c] (必須) 1 x 1 から 9 x 9 までの九九の結果を2次元配列に格納し,表示するプログラムを作りなさい。

  3. [pea6-1.c] リスト 2.10 の関数 printArray を,2 行 3 列の二次元配列のみならず,任意の行数の二次元配列を受け取って内容を出力する関数に書き換えなさい。なお,列数は 3 列に固定である。 そのためには,printArray のパラメータに二次元配列の行数 n を受け取るパラメータを追加して,関数定義の頭部を
    void printArray(int a[][3], int n)
    とするとともに,関数本体に必要な変更を加えればよい。

    また,リスト 2.10 のプログラムを, 変更した printArray を用いて array1 と array2 の内容を表示した後で,さらに 3 行 3 列の配列 array3 (値は任意に与えてよい)の内容も表示するプログラムとしなさい。

  4. [pea6-2.c] ある値が表の中に存在するかどうかを出力するプログラムを作りなさい。

    プログラムにおいて,表は2行4列の二次元配列で実現することとし, 二次元配列には予め次の値を入れておくこととする。

    2 3 5 7
    11 13 17 19

    探す値はキーボードから入力することとし, 値が二次元配列に存在すれば,このプログラムは

    n was found.
    のように出力し,存在しなければ
    n was not found.
    のように出力するようにしなさい。 ここで,n は入力した値である。 例えば,5 の入力に対しては 5 was found. のように出力されるようにする。

    なお,見つかった値が2次元配列内のどこにあるか,も表示できればなおよい。



第5回課題 5/18 Thu 23:27

第5回課題

  1. [pe5-1.c] (必須) 1 年間の日数を, 各月の日数から計算して出力するプログラムを作りなさい。 各月の日数は,プログラム内で配列に格納しておくこと。 合計の計算には for ループを用いること。 なお,2 月の日数は 28 日とする。

  2. [pe5-2.c] (必須) キーボードから入力した整数の和を求めて出力するプログラムを作りなさい。 ただし,最初に合計したい整数の個数(10を上限とする) をキーボードから通常の int 型変数に入力し, 2 番目以降に入力された整数の合計を求めることとする。 例えば 10 と 2 と 5 と 7 の和を求めるには 4 10 2 5 7 と入力する (入力値は改行で区切ってよい)。 合計の対象となる整数は配列に格納すること。 用意した配列の範囲外を利用しないように, 例えば次のようなコードで,必ず適切な入力値であることのチェックを行うこと。
    if (n > ARRAYSIZE) {
      printf("Too many integers\n");
      return 1;	
    }
    
    ここで n は合計する整数の個数であり, ARRAYSIZE は配列の要素数として使用されている記号定数とする。

    また,整数の入力を全て終えた後で,次のように合計の対象となる入力値をすべて表示し,それらの合計を求めて表示すること。

    integers: 10 2 5 7
    sum: 24
    

  3. [pea5-1.c] 二つのサイコロを使ったサイコロ振り 200 回をシミュレートして, 2 から 12 までの各目が出た回数,割合(%),ヒストグラムを出力するプログラムを作りなさい。 プログラムを実行する度にサイコロ振りの結果が変わるプログラムにすること。 見やすい出力となるように工夫すること。



第4回課題 5/12 Fri 10:16

第4回課題

  1. [pe4-1.c] (必須) 下記のプログラムに対して,次の操作を順に行いなさい。

    1. 実行結果を予想してから,プログラムを実行してみなさい。
    2. 関数 count 内の変数 i の宣言部分を int i = 0; に変更しなさい。 実行結果を予想してから,実行しなさい。
    3. 関数 count が 1 から 10 までの整数を main に返し, それが表示されるようにプログラムを変更しなさい。 ただし,変更は関数 count の本体のみとする。

    #include <stdio.h>
    
    int count(void);
    
    int main()
    {
         int i;
    
         for (i = 0; i < 10; i++) {
             printf("loop %d:" , i);
             printf("count() returns %d\n", count());
         }
    
         return 0;
    }
    
    
    int count(void)
    {
         int i;
    
         return ++i;
    }
    

  2. [pe4-2.c] (必須) 講義資料のリスト 1.8 のプログラムを動作させ実行結果を確認しなさい。 さらに,このプログラムに,与えられた整数の階乗を通常の反復によって計算して返す関数 factorial_rep の定義と, この関数を呼び出すコードを追加することによって, 再帰による 1 から 10 までの整数の階乗に加え,反復による同様の計算と表示も行うプログラムを作成しなさい。 ただし,関数 factorial_rep の戻り値とパラメータの型は関数 factorial と同じとすること。

  3. [pea4-1.c] キーボードから入力する正の整数を変数 n に読み込んで 1 + 2 + ... + n を求めて表示するプログラムを作りなさい。ただし,再帰関数を作成して使うこと。



第3回課題 4/27 Thu 21:02

第3回課題

  1. [pe3-1.c] (必須) 10 回のコイン投げをシミュレートするプログラムを作りなさい。 コインが表なら Head,裏なら Tail と表示し, プログラムを実行する度に裏と表の出方が変わるようにすること。 この問題で作成する関数は main のみとする。

  2. [pe3-2.c] (必須) 三つの実数を受け取って,それらを三辺の長さとする三角形が成立する かどうかを判定する 関数 istriangle を作りなさい。 istriangle は,三角形が成立するならば整数 1(真)を,成立しないならば 0(偽)を返すこととする。

    ヒント: 三辺の長さを a, b, c とすると, a + b > c, b + c > a, c + a > b条件をすべて満たすならば,三辺は三角形を構成する

    この関数を用いて, キーボードから読み込んだ 3 つの実数を三辺とする三角形が成立するときに限り, その三角形の面積を求めて表示するプログラムを作りなさい。 三辺の長さから三角形の面積 S を求める式は次の通りである。

    $\displaystyle S = \sqrt{t(t - a)(t - b)(t - c)},\ t = (a + b + c) / 2
$

    ここで,C 言語では,変数名は小文字で始めるのが慣例であることに注意しなさい。 また,数学ライブラリ関数を利用する際の留意事項を確認しておきなさい。

  3. [pea3-1.c] トランプの全カード 52 枚の山から,カード 1 枚を引いて山に戻すことをシミュレートするために,引いたカードに記された数(Ace は 1, Jack は 11, Queen は 12, King は 13 とする)を返す関数 faceOfCard を定義しなさい。 faceOfCard はパラメータを持たず,関数本体において printf などを使った画面への出力を行わない関数にすること。

    定義した関数 faceOfCard を使ってカード引きを100回行い,引いた各カードの数および100回分の平均を表示するプログラムを作りなさい。プログラムを実行する度に,ランダムにカードの数が変わるようにすること。



第2回課題 4/20 Thu 20:20

第2回課題

  1. [pe2-1.c] (必須) 画面に Hello World! と表示して改行する関数 hello を作りなさい。 また,関数 main から関数 hello を呼び出すことで,画面に Hello World! と表示するプログラムとして完成させなさい。

  2. [pe2-2.c] (必須) double 型の数値を受け取って,その 3 乗値を求めて返す関数 cube を作りなさい。 戻り値のデータ型も double 型とする。 また,関数 main も定義 (= 作成) して,1 から 10 までの各整数の 3 乗を関数 cube で全て求めて表示するプログラムとして完成させなさい。

  3. [pea2-1.c] 整数を受け取って,その数を一辺とする正方形を * で描く関数 printsquare を定義しなさい。 さらに,関数 main からこの関数を呼び出して, キーボードから入力された整数値を * の個数とする正方形を描くプログラムにしなさい。

    例えばキーボードから 3 を入力したときに,画面に次の出力をするプログラムになればよい。

    ***
    ***
    ***
    



第1回課題 4/13 Thu 22:58

第1回課題

  1. [pe1-1.c](必須) 変数 a と b に標準入力(キーボード)から値を読み込み, それらの値を一度出力した後で,変数 ab に a と b の積を代入し,「? x ? = ?」(数の表示は小数点以下第2位まで)の形で結果を出力するプログラムの空白部分 (a) から (e) を埋めなさい。

    (変数,四則演算,scanf と printf による入出力)

    /* pe1-1.c: multiplication program */
    #include <stdio.h>
    
    int main()
    {
        double a, b, ab;
    
        scanf("%lf%lf", [(a)    ]);
        printf("a: %f\n", [(b)  ]);
        printf("b: %f\n", [(c)  ]);
    
        [(d)      ];
        [(e)                     ];
    
        return 0;
    }
    

  2. [pe1-2.c](必須) 変数 n に正の整数を読み込んで 1 + 2 + ... + n を求めるプログラムの空白部分 (a) から (e) を埋めなさい。 なお,このプログラムは n までの和を求める途中の過程も表示する。

    (反復構造,合計を求めるアルゴリズム)

    /* pe1-2.c: summation program */
    #include <stdio.h>
    
    int main()
    {
        [(a) ]  i, n, sum;
    
        printf("Enter integer.\n");
        scanf([(b)        ]);
    
        sum = [(c) ];
        for (i = 1; [(d)         ]) {
            sum += [(e)  ]
            printf("%d\t%d\n", i, sum);
        }
    
        return 0;
    }
    

  3. [pea1-1.c] 変数 n に正の整数を読み込んで 1 + 1/2 + ... + 1/n を求めるプログラムを作りなさい。

    (データ型)





[サイトマップ] [トップページ]