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

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


標題 更新日
第14回課題 7/20 Thu 22:14

第14回課題

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

    2. 次の関数定義を先のプログラムの末尾に追加しなさい。
      char *checkPairs(Card *wdeck)
      {
          int i, j;
          static char *result;
      
          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;
      }
      
    3. 関数 main における関数 deal の呼び出し箇所の後ろに,関数 checkPairs の戻り値を表示するコードを追加することにより,配られた 5 枚のカードに同じ数 (face) のものが含まれていれば,PAIR(S) と表示するようにしなさい。

    以下は関数 checkPairs 内のコメント ( /*** と ***/ ) を外した場合の実行例である。

    実行例 1

           5 of Diamonds
           9 of Hearts  
           2 of Hearts  
           4 of Diamonds
           8 of Diamonds
    
    i:0 5 Diamonds - j:1 9 Hearts
    i:0 5 Diamonds - j:2 2 Hearts
    i:0 5 Diamonds - j:3 4 Diamonds
    i:0 5 Diamonds - j:4 8 Diamonds
    i:1 9 Hearts - j:2 2 Hearts
    i:1 9 Hearts - j:3 4 Diamonds
    i:1 9 Hearts - j:4 8 Diamonds
    i:2 2 Hearts - j:3 4 Diamonds
    i:2 2 Hearts - j:4 8 Diamonds
    i:3 4 Diamonds - j:4 8 Diamonds
    

    実行例 2

           3 of Hearts  
           8 of Spades  
           1 of Hearts  
           1 of Diamonds
           6 of Hearts  
    
    i:0 3 Hearts - j:1 8 Spades
    i:0 3 Hearts - j:2 1 Hearts
    i:0 3 Hearts - j:3 1 Diamonds
    i:0 3 Hearts - j:4 6 Hearts
    i:1 8 Spades - j:2 1 Hearts
    i:1 8 Spades - j:3 1 Diamonds
    i:1 8 Spades - j:4 6 Hearts
    i:2 1 Hearts - j:3 1 Diamonds
    i:2 1 Hearts - j:4 6 Hearts
    i:3 1 Diamonds - j:4 6 Hearts
    PAIR(S)
    

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

    ツーペアやスリーカード,フォーカードの場合にワンペアと判定しないようにすること。 そのためには isOnePair の本体でペアがいくつあるかを数え,一つの場合のみワンペアとすればよい。

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

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



第13回課題 7/13 Thu 23:51

第13回課題

  1. [pe13-1.c] (必須) 第12回課題 1 (pe12-1.c) のプログラムを次のとおりに変更しなさい。
    • 点の座標を表示する次の関数定義をプログラムに追加し(下線部には適当な語を入れる), 関数 main の本体において,この関数を呼び出して pointA の座標を表示するようプログラムを変更しなさい。
      void printCoord(____________ pnt)
      {
           printf("(%___, %___)\n", _______, _______ );
      }
      
    • struct point 型のもの(オブジェクト)のアドレス(ポインタ)を受け取って, 点の座標を表示する関数 printCoordRef を定義しなさい。 関数 main の本体において,この関数を呼び出して pointB の座標を表示するようプログラムを変更しなさい。
    • 2点間の距離の計算を行う関数 calcDist を定義しなさい。 calcDist は struct point 型の値を二つ受け取り,距離を double 型で返すように作ること。 関数 main の本体で,calcDist を呼び出して距離を求めるようプログラムを変更しなさい。
    • 上記の変更を行ったプログラムは,次を出力すること。
      (1.00, 1.50)
      (4.00, 5.50)
      distance: 5.00
      
    • キーワード typedef を使って,struct point 型を Point 型として扱うようにしなさい。 プログラム全体において struct point 型に代え Point 型を使うようにしなさい。

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

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

      Point rot45deg(Point);
      である。

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

      $\displaystyle \begin{array}{c}
x = \frac{1}{\sqrt{2}}(x_0 - y_0), \\
y = \fr...
...}{\sqrt{2}}(x_0 + y_0).
\end{array} %x = \frac{\sqrt{2}}{2}(x_0 - y_0), \\
$

      通常,ヘッダファイル math.h には,少なくとも double 型の精度で 2 の平方根の値 (1.4142...) を持つ記号定数 M_SQRT2 やその逆数 M_SQRT1_2 が定義されており,自分のコードに #include <math.h> を書くことによって使えるようになる。 2の平方根を計算せずに済ますために,これらの利用を試すとよい。なお,実習用コンピュータでは,ヘッダファイル math.h のマニュアル(英語)を man math.h で閲覧できる。

    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)
      

  3. [pea13-2.c] 座標 $(x_0, y_0)$ の点を 原点を中心に反時計回りに $\theta$ ラジアンだけ回転させた点の座標 (x, y) は 次式で計算できる。

    $\displaystyle \begin{array}{c}
x = ( \cos\theta ) x_0 - ( \sin \theta ) y_0, \...
...ta ) x_0 + ( \cos \theta ) y_0.
\end{array} %x = \cos t\,x_0 - \sin t\,y_0,\
$

    さて, 平面上の点を表す Point 型(前の問題で定義した型)の値(座標値)と角度を受け取って, その角度だけ点を回転させた結果(点の座標値)を求める関数 rotate を定義しなさい。 関数 rotate の戻り値は Point 型とすること。

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

    なお,通常,ヘッダファイル math.h には,少なくとも double 型の精度の円周率を値とする記号定数 M_PI が定義されており, #include <math.h> によって使えるようになる。

    【参考】点の回転は 2 x 2 の行列を使うと

    $\displaystyle \left(
\begin{array}{c}
x\\
y
\end{array} \right)
=
\left(...
...nd{array} \right)
\left(
\begin{array}{c}
x_0\\
y_0
\end{array} \right)
$

    と書ける。

    <<< 実行例 >>>
    Initial coordinates: (2.000000, 0.000000)
    45 deg Rotation: (1.414214, 1.414214)
    45 deg Rotation: (0.000000, 2.000000)
    180 deg Rotation: (-0.000000, -2.000000)
    



第12回課題 7/6 Thu 23:19

第12回課題

  1. [pe12-1.c] (必須) 次のプログラムは,平面上の点の座標を格納する point 構造体を定義し, 点 pointA の x, y 座標を表示するものである。

    まず, 構造体変数 pointA のメンバー x と y に 1.0 と 1.0 が入るように pointA を宣言・初期化し, その後,pointA のメンバー y の値を,代入文によって 1.5 に変更してから,pointA の座標を表示するプログラムとなるよう,下線部を埋めなさい。

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

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

    なお,距離の計算には,平方根を求める数学ライブラリ関数 sqrt を使うこと。 座標 $(x_1, y_1)$$(x_2, y_2)$ の点間の距離は $\sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}$である。

    また,ソースコードの後に記した実行結果を出力をするプログラムにすること。

    #include <stdio.h>
    
    struct point {
         double x;
         double y;
    };
    
    int main()
    {
         _______________ pointA = ______________ ;
    
         _______ = _______ ;
    
         printf("A: (%f, %f)\n", ______ , ______ );
    
         return 0;
    }
    

    実行結果

    A: (1.00, 1.50)
    B: (4.00, 5.50)
    distance: 5.00
    

  2. [pe12-2.c] (必須) プログラム中のコメントの指示に従って下線部を埋めなさい。 ipoint は,整数 (int 型) を座標値とする平面上の点のための構造体であり, 横座標のためのメンバー i と縦座標のためのメンバー j を持つ。 プログラムの実行結果はソースコードの後に示したとおりである。 なお,ポインタ変数を使った点の座標表示では配列の添字記法は使わないこと。
    #include <stdio.h>
    
    #define SIZE 5 /* 配列の要素数 */
    
    /* 構造体 ipoint の定義 */
    _______ ipoint {
         ________ ;
         ________ ;
    };
    
    int main()
    {
         _____________ pnt[_____]; /* SIZE 個の要素を持つ構造体 ipoint 型の配列 */ 
         _____________ p; /* 構造体 ipoint 型を指すポインタ変数 */
         int i;
    
         /* 配列 pnt の各要素(点)に横座標と縦座標の値を設定 */
         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)
    



第11回課題 6/30 Fri 13:55

第11回課題

  1. [pe11-1.c] (必須) 次の文
    char *suit[] = {"hearts", "diamonds", "clubs", "spades"};
    により宣言・初期化された配列 suit を使って,
    hearts
    diamonds
    clubs
    spades
    と出力するプログラムを作りなさい。 配列 suit の要素を参照するために for 等による繰り返しの構文を使うこと。

    さらに,文字列の先頭文字を大文字にした

    H D C S
    を出力するコードを追加しなさい。この出力も配列 suit と繰り返し構文で行うこと。 標準ライブラリ関数 toupper を使うこと。

  2. [pe11-2.c] (必須) キーボードから入力した文字の並び(文字数は 20 文字を上限とする)を Hello, に続いて表示するプログラムを次の方法で作りなさい。

    このプログラムは,例えば,world! と入力したら Hello, world! と出力するように作成する。

    1. 文字列 Hello, の入った char 型配列を予め用意しておく。
    2. fgets を用いて,上記とは別の配列にキーボードから文字列を格納する。
    3. strcat を使って Hello, の入った配列にキーボードからの入力文字列(配列に格納済み)をコピーし,表示する。
    用意した要素数を越える配列要素への代入はできないプログラムとすること。 なお,キーボードから入力する文字数を制限することによって,文字入力の終わりの改行文字が読み込まれず,出力の最後に改行が起きないことがあり得るが,ここではそのようなプログラムでもよしとする。

  3. [pea11-1.c] 次の文
    char *suit[] = {"hearts", "diamonds", "clubs", "spades"};
    により宣言・初期化された配列 suit を使って,
    HEARTS
    DIAMONDS
    CLUBS
    SPADES
    と出力するプログラムを作りなさい。 配列 suit の要素を参照するために for 等による繰り返しの構文を使うこと。 標準ライブラリ関数 toupper を使うこと。

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

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



第10回課題 6/23 Fri 02:19

第10回課題

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

  3. [pea10-1.c] 次のとおりに宣言・初期化された文字列 str1 を表示した後,始めの 5 文字 (Hello の部分) だけを別の配列 str2 にコピーしてから,str2 の内容を文字列にして表示するプログラムを作りなさい。

    char *str1 = "Hello World!";



第9回課題 6/16 Fri 09:39

第9回課題

  1. [pe9-1.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;
    }
    

  2. [pe9-2.c] (必須) 資料の「リスト 3.6 バブルソートプログラム」に次の変更を加えなさい。
    1. 配列 a の初期値を {2.3, 68.5, 8.2, 89.2, 6.6, 45.5} とする。 この変更に伴って必要となる,プログラムの書き換えを行う。

    2. 記号定数 SIZE の使用を止め(#define を削除),配列 a の宣言時に要素数を使わないようにする。 代わりに配列 a の要素数を保持する変数 n を main 内で宣言し,配列 a の要素数を求める式を使って変数 n を初期化する (宣言と同時に値を入れる)。

    3. 実行結果が次の通りとなるようにする。
      Before sorting
        2.3 68.5  8.2 89.2  6.6 45.5
      After sorting
        2.3  6.6  8.2 45.5 68.5 89.2
      
  3. [pea9-1.c] リスト 3.7 のプログラムを降順のソートを行うプログラムに変更しなさい。

    また,リスト 3.7 のソートプログラムにおける繰り返しの回数には無駄がある。 余分な繰り返しを無くすように,関数 bubbleSort を改良しなさい。



第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回課題 2023-04-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回課題 2023-04-13

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

    (データ型)





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