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

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


更新日
7/31 Fri 10:35

第12回課題

  1. [pe12-1.c] (必須) 次のプログラムは,平面上の点の座標を格納する point 構造体を使って, 点 pointA の x 座標と y 座標を表示するものである。 point 構造体のメンバーは x と y であり,共に double 型とする。 プログラムでは, 構造体変数 pointA のメンバー x と y を,各々,1.0 と 1.5 で初期化し, その後,メンバー y の値を 2.5 に変更してから, point 構造体を受け取る関数 printCoordinates に pointA の座標を表示させる。 下線部(1)から(10)を埋めなさい。

    /* point operation */
    #include <stdio.h>
    
    struct point {
         __(1)__;
         __(2)__;
    };
    
    void printCoordinates(__(3)__);
    
    int main()
    {
         struct point pointA = __(4)__;
    
         __(5)__ = __(6)__;
    
         printCoordinates(__(7)__);
    
         return 0;
    }
    
    void printCoordinates(__(8)__ pnt)
    {
         printf("(%f, %f)\n", __(9)__ , __(10)__);
    
         return;
    }
    
  2. [pe12-2.c] (必須) 前のプログラムを,関数 printCoordinates に pointA のポインタ(アドレス)を渡すように書き換えなさい。 実行結果は前問と同じになるようにすること。

  3. [pea12-1.c] 先のプログラムの main 内に, 点の座標を保持する構造体変数 pointB を宣言して座標 (4,2) で初期化するコードを加えなさい。 さらに,二点の距離を求める関数 calcDistance を定義して, pointA と pointB の距離を表示するプログラムにしなさい。 calcDistance は,point 構造体型の変数を二つ受取り, 計算結果を double 型で返す関数とすること。



7/24 Fri 10:36

第11回課題

  1. [pe11-1.c] (必須) キーボードから入力する数字列を double 型の数値に変換し,その二乗を求めて表示するプログラムを作りなさい。 数字列の読み込みには関数 fgets を使うこと。 数字列には小数点が入ることもある。 数字列の長さは,小数点を含み10文字まで扱えるようにすること。

  2. [pe11-2.c] (必須) キーボードから入力した文字の並び(文字数は 20 文字を上限とする)を Hello, に続いて表示するプログラムを次の方法で作りなさい。 このプログラムは,例えば,world! と入力したら Hello, world! と出力するように作成する。
    1. 文字列 Hello, の入った char 型配列を予め用意しておく。
    2. fgets を用いて,上記とは別の配列にキーボードから文字列を格納する。
    3. strcat を使って Hello, の入った配列にキーボードからの入力文字列(配列に格納済み)をコピーし,表示する。
    用意した要素数を越える配列要素への代入はできないプログラムとすること。



7/17 Fri 10:36

第10回課題

  1. [pe10-1.c] (必須) 次のプログラムの下線部を,コメントの指示に従って埋めなさい。
     
    #include <stdio.h>
    
    int main()
    {
        char *p = NULL;
        
    /* 文字列リテラル "abc" の先頭アドレスを表示する */
        printf("Address of \"abc\": %__(1)__\n", "abc");
    
    /* 文字列リテラル "ABC" の先頭アドレスを p を使って表示する */
        ___(2)___ ;
        printf("Address of \"ABC\": %p\n", p);
    
    /* p を使って A と表示する */
        printf("print \"A\": %__(3)__\n", __(4)__ );
    
    /* p を使って BC と表示する */
        __(5)__ ; /* ポインタ演算 */
        printf("print \"BC\": %__(6)__\n", __(7)__ );
    
    /* p を使った 2 通りの方法で ABC と表示する */
        __(8)__ ; /* ポインタ演算 */
        printf("print \"ABC\": %__(9)__\n", p);
    
        printf("print \"ABC\": ");
        while (*p != __(10)__) {
          printf("%__(11)__", *p);
          __(12)__ ; /* ポインタ演算 */
        }
        printf("\n");
    
        return 0;
    }
    

  2. [pe10-2.c] (必須) 配列 str が,文字列リテラル "hello world" で初期化された char 型配列であるとする。 str に対して以下の動作を行うプログラムを作成しなさい。 完成したプログラムは Hello World と出力することになる。
    1. 配列 str 内の h と w が格納された要素に大文字の H と W を代入する。
    2. 配列 str に格納された文字を関数 printf で表示する。

  3. [pea10-1.c] 次の文
    char * suit[] = {"Hearts", "Diamonds", "Clubs", "Spades"};
    により宣言・初期化された配列 suit を使って,
    HEARTS
    DIAMONDS
    CLUBS
    SPADES
    と出力するプログラムを作りなさい。 標準ライブラリ関数 toupper を使うこと。



7/10 Fri 10:40

第9回課題

  1. [pe9-1.c] (必須) 次のコードの下線部 (1) から (10) をコメントに従って完成させなさい。 表示する際には必ず配列 a を用いること。
    #include <stdio.h>
    
    int main()
    {
         char a[] = "abcd";
         int i;
         
         printf("#1:");
         /* a と表示する */
         printf("__(1)__\n", __(2)__);
    
         printf("#2:");
         /* abcd と表示する */
         printf("__(3)__\n", __(4)__ );
    
         printf("#3:");
         /* abc と表示する */
         a[__(5)__] = '__(6)__' ;
         printf("%s\n", __(7)__ );
    
         printf("#4:\n");
         /* abc を 1 行につき 1 文字ずつ表示する。*/
         for (i = 0; ____(8)____ ; i++)
             printf("__(9)__", __(10)__);
         
         return 0;
    }
    
    実行結果は次のとおりになる。
    #1:a
    #2:abcd
    #3:abc
    #4:
    a
    b
    c
    

  2. [pe9-2.c] (必須) リスト 3.7 を英文 the quick brown fox jumps over the lazy dog 内の文字をアルファベット順に並べ替えて出力するプログラムに変更しなさい。空白文字の順序はアルファベットより前である。

    関数 main は以下のとおりにすること。 ただし,下線部には適当なものを入れること。 変数 num_char は配列 a に格納された文字列内の文字数(アルファベットと空白の個数)を保持する。 配列 a を別の文字列に変更しても動作するプログラムにすること。

    なお,C 言語では,文字同士を不等号などで比較することは可能であり, 例えば,'a' < 'b' は真である(文字の実体は文字コード(整数)だから)。

    int main()
    {
         char a[] = "the quick brown fox jumps over the lazy dog";
         int num_char = ___________ ;
    
         printf("Number of characters in a:\n");
         printf("%d\n", num_char);
    
         printf("Original array a:\n");
         printf("%s\n", a);
    
         bubbleSort(a, num_char);
    
         printf("Sorted array a:\n");
         printf("%s\n", a);
    
         return 0;
    }
    



7/3 Fri 10:12

第8回課題

  1. [pe8-1.c] (必須) 次のプログラムにおいて,注釈(コメント)部分 #a と #b の表示結果が同じになるように下線部を埋めなさい。 ただし,#b の下線部では配列の添字 [ ] を使わないこと。 また,#1 から #4 の表示結果も同じになるように下線部を埋めなさい。 同様に #5 と #6 の表示も同じになるようにしなさい。 なお,関数 main の中のコメントは記述不要である。
    #include <stdio.h>
    
    int main()
    {
        int a[5] = {1, 3, 5, 7, 9};
        int *p = NULL;
        int i;
    
        printf("#a %p\n", &a[0]);    /* #a */
        printf("#b %p\n", __(1)__ );   /* #b */
    
        printf("#1 ");
        for (i = 0; i < 5; ++i)
            printf("%d ", a[i]);       /* #1 */
        printf("\n");
    
    /* ポインタを使った配列参照 */
        __(2)__ ;
        printf("#2 ");
        for (i = 0; i < 5; ++i)
            printf("%d ", *(p + i));   /* #2 */
        printf("\n");
    
        printf("#3 ");
        for (i = 0; i < 5; ++i)
            printf("%d ", p[ __(3)__ ]);  /* #3 */
        printf("\n");
    
        printf("#4 ");
        for (i = 0; i < 5; ++i) {
            printf("%d ", *p);         /* #4 */
            __(4)__ ;
        } 
        printf("\n");
    
    /* 配列添字を使わない配列参照 */
        printf("#5 %d\n", a[3]);       /* #5 */
        printf("#6 %d\n", *(a __(5)__ )); /* #6 */
    
        return 0;
    }
    

  2. [pe8-2.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;
    }
    



6/26 Fri 10:46

第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] (必須) プログラム内のコメントに従って下線部を埋めなさい。

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

    なお,最初の 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] のアドレス */
         printf("address of a[0] is %p.\n\n", __(5)__ );
    
         /* 配列 a の各要素の添字,アドレス,値 */
         printf("subscript, address and value of a[i]:\n");
         for (i = 0; i < size; i++) {
              printf("  %d, %p , %d \n", i, __(6)__ , __(7)__);
         }
         putchar('\n');
    
         /* ポインタ変数 p の初期値 */
         printf("initial value of p is %p.\n", p);
    
         /* ポインタ変数 p を使って a[0] のアドレスと値を表示する */
         p = __(8)__ ;
         printf("a[0]: %p, %d\n", __(9)__ , __(10)__ );
    
         /* ポインタ変数 p を使って a[3] のアドレスと値を表示する */
         p += __(11)__ ;
         printf("a[3]: %p, %d\n", __(12)__ , __(13)__ );
    
         /* ポインタ変数 p を使って a[1] のアドレスと値を表示する */
         p -= __(14)__ ;
         printf("a[1]: %p, %d\n", __(15)__ , __(16)__ );
    
         /* ポインタ変数 p を使って size のアドレスと値を表示する */
         p = __(17)__ ;
         printf("size: %p, %d\n", __(18)__ , __(19)__ );
    
         return 0;
    }
    



6/19 Fri 11:19

第6回課題

  1. [pe6-1.c] (必須) double 型の一次元配列とその要素数を受け取って, 配列内の値の平均値を求めて返す関数 arrayAve を定義しなさい。

    さらに,関数 main から 関数 arrayAve を呼び出して, 次の値の平均値を求めて表示するプログラムを作りなさい。

    1.5 2.5 3.5 4.5 5.5

    平均値を求める元の値が入った配列を main 内で用意して,arrayAve に渡すこと。 arrayAve の戻り値(平均値)を表示するコードも main に書くこと。 また,関数 arrayAve が,パラメータを通じて main 内の配列を書き換えることのできないプログラムにすること。



6/12 Fri 11:20

第5回課題

  1. [pe5-1.c] (必須) 講義資料のリスト 2.4 とリスト 2.5 を参考にして, サイコロ振りのシミュレーションの結果を, ヒストグラムにするプログラムを作りなさい。 サイコロ振りの回数が多い場合でも,見やすいヒストグラムができるよう, 工夫することが望ましい。

  2. [pea5-1.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
    



6/5 Fri 10:38

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

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



5/29 Fri 08:30

第3回課題

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

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

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

    \begin{displaymath}
S = \sqrt{t(t - a)(t - b)(t - c)},\ t = (a + b + c) / 2
\end{displaymath}

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



5/22 Fri 10:50

第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 を入力したときに,画面に次の出力をするプログラムになればよい。

    ***
    ***
    ***
    



5/15 Fri 07:18

第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 を求めるプログラムを作りなさい。

    (データ型)





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