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

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


更新日
2018-07-20

第14回課題

  1. [pe14-1.c] (必須) 次の指示に従ってプログラムを作成しなさい。
    1. リスト 5.3 のプログラムが動作することを確認してから, カードを 5 枚だけ 1 人に配る(最初の 5 枚だけを一列に表示する)ように, 関数 deal を変更しなさい。 deal の変更は関数本体のみとする。

    2. 次の関数定義を先のプログラムの末尾に追加しなさい。
      char *checkPairs(Card *wdeck)
      {
           int i, j;
           char *result = "";
      
           for (i = 0; i < 4; i++) {
                for (j = i + 1; j < 5; j++) {
      /***
                     printf("i:%d %d %s - j:%d %d %s\n", 
                            i, wdeck[i].face, wdeck[i].suit,
                            j, wdeck[j].face, wdeck[j].suit);
      ***/
                     if (wdeck[i].face == wdeck[j].face) {
                            result = "PAIR(S)";
                     }
                }
           }
      
           return result;
      }
      
    また,関数 main における関数 deal の呼び出し箇所の後ろに,関数 checkPairs の戻り値を表示するコードを追加することにより,配られた 5 枚のカードに同じ数 (face) のものが含まれていれば,PAIR(S) と表示するようにしなさい。

  2. [pe14-2.c] (必須) 前のプログラムの関数 checkPairs を,手札がポーカーのワンペアであるかどうかを判定する関数 isOnePair に書き換えなさい。 この関数は,ワンペアのときに ONE PAIR という文字列を返し,そうでないときには空の文字列を返すこととする。

    ツーペアやスリーカード,フォーカードの場合にワンペアと判定しないようにすること。 そのためには isOnePair の本体でペア数を数えるカウンタ用変数を用意する必要があろう。

    さらに,main で isOnePair を呼び出して,ワンペアの場合には,その旨を表示するプログラムにしなさい。

  3. [pea14-1.c] 前のプログラムを,ワンペアに加え,他の少なくと も一つ以上のポーカーの役も判定できるように,役を判定する関数の定 義と呼び出しを追加しなさい。



2018-07-12

第13回課題

  1. [pe13-1.c] (必須) 次の指示に従い,プログラムを作りなさい。
    1. C 言語のキーワード typedef と構造体を使って,平面上の点の座 標を格納するための Point 型を定義しなさい。Point 型は, x 座 標と y 座標を保持するために,double 型のメンバー x と double 型のメンバー y を持つこととする。
    2. 平面上の点を原点を中心に反時計回りに45度回転させた点の座標を計算する関数 rot45deg を作りなさい。

      この関数は Point 型の値を受け取り,回転後の座標を求めて, Point 型の値として返すものとする。 すなわち,この関数のプロトタイプ宣言は

      Point rot45deg(Point p);
      である。なお,パラメータ名 p はプロトタイプ宣言では省略できる。

      また,座標 (x0, y0) の点を 原点を中心に反時計回りに45度回転させた点の座標 (x, y) は 次式で計算できる。

      \begin{displaymath}
x = \frac{\sqrt{2}}{2}(x_0 - y_0),\
y = \frac{\sqrt{2}}{2}(x_0 + y_0)
\end{displaymath}

    3. 関数 main の中で Point 型の変数 a を宣言し, a に座標 (2, 0) の点としての初期値を設定しなさい。

      次に, 関数 rot45deg を用いて,a を 45 度回転させた後の座標を求めて表示しなさい。 なお,a の回転を行う文は a = rot45deg(a); である。

      さらに,もう一度,45度回転させた後の座標も表示するプログラムにしなさい。

      出力例)

      Initial coordinates: (2.000000, 0.000000)
      Rotation: (1.414214, 1.414214)
      Rotation: (0.000000, 2.000000)
      

  2. [pe13-2.c] (必須) リスト 5.3 のプログラムが動作することを確認してから, カード 5 枚だけを 1 人に配る(最初の 5 枚だけを一列に表示する)ように, 関数 deal を変更しなさい。 deal の変更は関数本体のみとする。

  3. [pea13-1.c] Point 型(課題1で定義した型)の値(平面上の点)と角度(単位はラジアン)を受け取って, 与えられた角度だけ点を回転させる関数 rotate を作りなさい。 関数の戻り値も Point 型とする。

    座標 (x0, y0) の点を 原点を中心に反時計回りに t ラジアンだけ回転させた点の座標 (x, y) は 次式で計算できる。

    \begin{displaymath}
%x = \cos t\,x_0 - \sin t\,y_0,\
x = x_0 \cos t - y_0 \sin...
...
%y = \sin t\,x_0 + \cos t\,y_0
y = x_0 \sin t + y_0 \cos t 
\end{displaymath}

    さらに,関数 main も定義して,関数 rotate を使う適当なプログラムを作成しなさい。



2018-07-05

第12回課題

  1. [pe12-1.c] (必須) 次のプログラムは,点の座標を格納する point 構造体を定義し, 点 pointA の x, y 座標を表示するものである。 構造体変数 pointA のメンバー x と y に 1.0 と 1.0 が入るように pointA を初期化し, その後,メンバー y の値を 1.5 に変更してから,point A の座標を表示するプログラムとなるよう, 下線部を埋めなさい。

    次に,このプログラムにおいて,点の座標を保持する新たな変数 pointB を宣言して座標 (4.0, 5.5) を与えるコードを加え,その座標も表示するようにしなさい。

    さらに, pointA と pointB の距離を計算して表示するプログラムにしなさい。

    なお,距離の計算には,平方根を求める数学ライブラリ関数 sqrt を使うこと。 また,ソースコードの後に記したとおりの出力をするプログラムにすること。

    #include <stdio.h>
    
    struct point {
         double x;
         double y;
    };
    
    int main()
    {
         _______________ pointA = ______________ ;
    
         _______ = _______ ;
    
         printf("A: (%.2f, %.2f)\n", ______ , ______ );
    
         return 0;
    }
    
    実行結果
    A: (1.00, 1.50)
    B: (4.00, 5.50)
    distance: 5.00
    

  2. [pe12-2.c] (必須) プログラム中のコメントの指示に従って下線部を埋めなさい。 ipoint は,整数 (int 型) を座標値とする点のための構造体であり, x 座標のためのメンバー x と y 座標のためのメンバー y を持つ。 プログラムの実行結果はソースコードの後に示したとおりである。 なお,ポインタ変数を使った点の座標表示では配列の添字記法は使わないこと。
    #include <stdio.h>
    
    #define NUMBER 5 /* 配列の要素数 */
    
    /* 構造体 ipoint の定義 */
    _______ ipoint {
         ________ ;
         ________ ;
    };
    
    int main()
    {
         _____________ pnt[_____]; /* NUMBER 個の要素を持つ構造体 ipoint 型の配列 */ 
         _____________ p; /* 構造体 ipoint 型を指すポインタ変数 */
         int i;
    
         /* pnt の各要素(点)に x 座標と y 座標を設定 */
         for (i = ___; _______; _______) {
              ________ = i;
              ________ = i * 2;
         }
    
         /* 全ての点の座標を表示 */
         for (i = ___; _______; _______) {
              printf("(%___, %___)\n", pnt[i]_____, pnt[i]_____);
         }
         putchar('\n');
    
         /* ポインタ変数 p を使って全ての点の座標を表示 */
         p = ___;
         for (i = ___; _______; _______) {
              printf("(%___, %___)\n", p____, p____);
              ___ ;
         }
    
         return 0;
    }
    
    実行結果
    (0, 0)
    (1, 2)
    (2, 4)
    (3, 6)
    (4, 8)
    
    (0, 0)
    (1, 2)
    (2, 4)
    (3, 6)
    (4, 8)
    



2018-06-28

第11回課題

  1. [pe11-1.c] (必須) キーボードから文字を読み込んで,それがアルファベットであれば大文字にして表示するプログラムを作りなさい。 文字の入力と出力は EOF (Ctrl-d) が入力されるまで繰り返し行うようにすること。

    このプログラムは,入力 1aB2C!d に対しては ABCD を出力する。

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

  3. [pea11-1.c] 標準ライブラリ関数 strcat と同様の働きをする関数 mystrcat を定義しなさい。 また,関数 mystrcat を使ったプログラムを作成しなさい。



2018-06-22

第10回課題

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

  2. [pe10-2.c] (必須) 次の文
    char * suit[] = {"Hearts", "Diamonds", "Clubs", "Spades"};
    により宣言・初期化された配列 suit を使って,
    Hearts
    Diamonds
    Clubs
    Spades
    と出力するプログラムを作りなさい。繰り返しの構文を使うこと。

    次に,suit の各要素が指している文字列が辞書順になるように,suit の要素を入れ替えるコードを追加しなさい。 なお,汎用的なソート用のコードを書く必要はなく,suit に限定して辞書順になればよい。

    さらに,その配列 suit を用いて,次の出力

    Clubs
    Diamonds
    Hearts
    Spades
    を行うコードを追加しなさい。

  3. [pea10-1.c] 以下の指示に従ってプログラムを完成させなさい。
    1. char 型ポインタが指す(または,char 型配列に格納された)文字列のうち,先頭から size 個の文字を別の文字型配列にコピーし,さらにコピー先の配列の内容を文字列にする関数
      char *arrayncopy(char *dest, const char *src, const int size)
      を作りなさい。 ここで dest はコピー先の配列(の先頭アドレス)であり,src はコピー元の文字列(の先頭アドレス),size はコピーする要素数である。

    2. 次のとおりに宣言・初期化された配列 str1 のうち,Hello の部分だけを別の配列 str2 にコピーして,str2 の内容を表示するプログラムを作りなさい。 関数 arrayncopy を用いて配列をコピーし,その戻り値を使って表示を行うこと。
      char str1[] = "Hello World!";



2018-06-14

第9回課題

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

  2. [pe9-2.c] (必須) 二つの char 型変数の値(内容)を交換する関数 aswap を作りなさい。

    さらに, キーボードから入力した 10 個の文字を格納できる配列を main に用意し, aswap を使って, 入力した 10 文字を逆順(左右対称)に入れ替えて表示するプログラムにしなさい。

    実行例
    Input string
    abcdefghijklmn
    Initial string: abcdefghij
    Swapped string: jihgfedcba
    

  3. [pea9-1.c] 講義資料で紹介したバブルソートプログラムには,繰り返し回数に無駄がある。 余分な繰り返しを無くすように,リスト 3.7 のプログラムを改良しなさい。



2018-06-08

第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", _____ );   /* #b */
    
        printf("#1 ");
        for (i = 0; i < 5; ++i)
            printf("%d ", a[i]);       /* #1 */
        printf("\n");
    
    /* ポインタを使った配列参照 */
        ____ ;
        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 */
        printf("\n");
    
        printf("#4 ");
        for (i = 0; i < 5; ++i) {
            printf("%d ", *p);         /* #4 */
            _____ ;
        } 
        printf("\n");
    
    /* 配列添字を使わない配列参照 */
        printf("#5 %d\n", a[3]);       /* #5 */
        printf("#6 %d\n", *(a ____ )); /* #6 */
    
        return 0;
    }
    

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

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

    ただし,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;
    }
    



2018-06-06

第7回課題

  1. [pe7-1.c] (必須) 次のプログラムをコメントに従って完成させなさい。
    #include <stdio.h>
    
    int main()
    {
        int i = 10;
        int *p;       /* ポインタ変数 p の宣言 */
    
    /* 変数 i のアドレスを 2 通りの方法で表示する (変数 p への初期値設定) */
        printf("address of i: %p\n", &i);
        ____ = ____ ;
        printf("address of i: %p\n\n", p);
    
    /* 変数 i の値を 2 通りの方法で表示する */
        printf("i: %d\n", i);
        printf("i: %d\n\n", ____ p);
    
    /* p を使って変数 i の値を 10 増やし,その値を表示する */
        ____ += 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;
         ______ = NULL; /* ポインタ変数 p の宣言と初期化 */
                        /* p には size や a の要素のアドレスを格納する */
    
         /* int 型のサイズ */
         printf("size of int is %lu bytes.\n", ___________ );
         putchar('\n');
    
         /* 配列 a の要素数を sizeof 演算子で求める */
         size = _____________________ ;
         printf("number of elements of array \"a\" is %d.\n", size);
    
         /* 変数 size のアドレス */
         printf("address of \"size\" is %p.\n", _____ );
    
         /* 配列要素 a[0] のアドレス */
         printf("address of a[0] is %p.\n\n", &a[0] );
    
         /* 配列 a の各要素の添字,アドレス,値 */
         printf("subscript, address and value of a[i]:\n");
         for (i = 0; i < size; i++) {
              printf("  %d, %p , %d \n", i, ___ , ___);
         }
         putchar('\n');
    
         /* ポインタ変数 p の初期値 */
         printf("initial value of p is %p.\n", p);
    
         /* ポインタ変数 p を使って a[0] のアドレスと値を表示する */
         p = ____ ;
         printf("a[0]: %__, %__\n", __ , __ );
    
         /* ポインタ変数 p を使って a[3] のアドレスと値を表示する */
         p += ____ ;
         printf("a[3]: %__, %__\n", __ , __ );
    
         /* ポインタ変数 p を使って a[1] のアドレスと値を表示する */
         p -= ____ ;
         printf("a[1]: %__, %__\n", __ , __ );
    
         /* ポインタ変数 p を使って size のアドレスと値を表示する */
         p = ____ ;
         printf("size: %__, %__\n", __ , __ );
    
         return 0;
    }
    



2018-06-04 第6回課題2の関数 printArray のパラメータ(2次元配列)に const 修飾子を付けて実習用コンピュータでコンパイルすると,
警告: passing argument 1 of ‘printArray’ from incompatible pointer type
との警告が出ますが,プログラムが正しく実行されるならば,この警告は無視して構いません。この警告を出さないように,main の中の配列宣言も const int にした場合,課題の意図とは意味は変わりますが,そのままで構いません。
2018-05-24

第6回課題

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

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

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

  2. [pe6-2.c] (必須) リスト 2.10 の関数 printArray を n 行 3 列の二次元配列の内容を出力する関数として書き換えなさい。 すなわち,二次元配列の行数 n を受け取るパラメータ(仮引数)を追加することにより, printArray を任意の行数の二次元配列を扱えるようにしなさい。 さらに, 引数として与えられた配列を誤って変更することのないように 関数 printArray を改良しなさい。

    次に, 改良した printArray を用いて, リスト 2.10 の array1 と array2 に加え, 3 行 3 列の配列 array3 (値は任意に与えてよい)も表示するプログラムを作成しなさい。

  3. [pea6-1.c] 50 行 3 列の二次元配列に対して, 各行の最初の要素に 1 から 50 の数を入れ,2 番目の要素にそ の数の 2 乗値を入れ,3 番目の要素に 3 乗値を入れなさい。 配列の内容は次のようになる。
    1, 1, 1
    2, 4, 8
    3, 9, 27
    ...
    50, 2500, 125000
    

    さらに,ユーザーがキーボードから入力した値が,その配列中にあるか どうかを調べ, 値が二次元配列に存在すれば

    n is found at (x, y).
    と表示し,存在しなければ
    n is not found.
    と表示するようにしなさい。 ここで,n は入力した値であり,x, y は値が見つかった行と列である。 例えば,9 の入力に対しては 9 is found at (3, 2). と出力されるようにする (9 は 3 の 2 乗であることを二次元配列に格納した数表から求めたことになる)。 なお,この検索を行う部分は関数化せず,main の中に記述してよい (二つの値を返す関数定義の方法をまだ扱っていないため)。



2018-05-18

第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 > SIZE) {
      printf("Too many integers\n");
      return 1;	
    }
    
    ここで n は合計する整数の個数であり, SIZE は配列の要素数として使用されている記号定数とする。

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

    integers: 10 2 5 7
    sum: 24
    

  3. [pea5-1.c] サイコロ振りのシミュレーションの結果を, ヒストグラムにするプログラムを作りなさい。 サイコロ振りの回数が多い場合でも,見やすいヒストグラムができるよう, 工夫することが望ましい。



2018-05-18

第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(void)
    {
         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 は,呼び出される度に “factorial(number) called” と出力する。 ここで number は factorial が受け取った引数の値。
    • 関数 factorial は, 計算結果を return で返す前に “n!=nの階乗” の形式で表示する。 (計算結果を格納する変数を用意して使う)
    • 関数 main での関数呼出しは factorial(5) のみとし, 画面への出力は全て関数 factorial が行う。

    実行結果

    factorial(5) called
    factorial(4) called
    factorial(3) called
    factorial(2) called
    factorial(1) called
    1!=1
    2!=2
    3!=6
    4!=24
    5!=120
    
  3. [pea4-1.c] 整数 (i と n とする) から,i の n 乗を計算して,戻り値として返す再帰関数 power を定義しなさい。

    さらに,関数 main を定義して,main から関数 power を呼び出すことにより,キーボードから二つの整数を読み込んでべき乗の計算結果を表示するプログラムにしなさい。 べき乗の再帰的定義は

    power(i,n) = i * power(i,n-1)
    power(i,1) = i
    である。



2018-04-27

第3回課題

  1. [pe3-1.c] (必須) コイン投げをシミュレートして,コインが表かどうかを返す関数 isHead を作成しなさい。 isHead の戻り値は,コインが表なら 1 とし,裏なら 0 とする。

    さらに,main から isHead を呼び出して,表なら Head と表示し,表でないなら Tail と表示するプログラムを作りなさい。 実行する度に,Head か Tail かがランダムに変わるプログラムとすること。

    なお,このプログラムでは関数 srand と関数 rand を用いるが,srand は rand が実行される前に 1 度だけ実行されればよいので,このプログラムでは srand の呼び出しは main 内で行うようにしなさい。

  2. [pe3-2.c] (必須) 前の問題で作成した関数 isHead を使って,コイン投げのシミュレーションを 1000 回行い,表と裏の出た回数を数えて表示するプログラムを作りなさい。 さらに表が出た割合と裏がでた割合を小数点以下第2位まで表示するようにしなさい。

    関数 isHead には変更を加えないこと。すなわち,1000 回の繰り返しや表示等は全て関数 main 内で行いなさい。

  3. [pea3-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 言語では,変数名は小文字で始めるのが慣例であることに注意しなさい。 また,数学ライブラリ関数を利用する際の留意事項を確認しなさい。



2018-04-20

第2回課題

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

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

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

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

    ***
    ***
    ***
    



2018-04-13

第1回課題

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

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

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

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

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

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

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

    (データ型)





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