C practice (Fukuoka University of Education)
最終更新日時 (Time-stamp: <2022/02/03 10:47:19 JST nakata>)
C言語のプログラミングの練習問題(初級)
printf 文の練習
  1. 以下のprintf文を確認するプログラムを組め。
    1. 画面に
      Hello World!
      
      と表示するプログラムは以下のとおりである。
      #include <stdio.h>
      int main(void){
        printf("Hello World!\n");
        return (0);
      }
      

    2. 上記のプログラムを実行せよ。さらに、 上記のプログラムで 「Hello World!」の部分を自分の名前に替えて実行せよ。
      (解答)

  2. 23と32をキーボードから読み込んで和である55を以下のように出力するプログラムを作成せよ。
    2つの整数を読み込んでください
    整数1: 23
    整数2: 32
    
     23
    +32
    ***
     55
    

    (解答)

  3. 三つの整数値を読み込んで平均値をdoubleで表示するプログラムを作成せよ。
    (解答)

  4. double で変数 x を宣言し、x=12.345とする。このとき、 以下を出力するプログラムを作成せよ。 ただし、以下を守ること。
    (解答)

  5. double で変数 x を宣言し、x=12.345とする。このとき、 x から数値を減算することにより、 整数1位と小数第2位を0にする10.305を出力するプログラムを作成せよ。 ただし、以下を守ること。
    (解答)

  6. 以下のように体重を読み込んで、標準身長を実数で表示するプログラムを作成せよ。
    体重 = (標準身長-100)×0.9
    によって求め、その小数点以下は1桁だけ表示すること。
    ========
    体重を入力してください:67.5
    標準身長は175.0です
    ========
    (解答)
math.hの練習
  1. math.hの使用の練習の ために以下のプログラムを作成せよ。その 使用の方法はここを見ること。
  2. 関数 sqrt を用いて√2の小数点以下をdouble型で長く表示してどの部分で誤差が生じているか確かめよ。 ただし、√2の近似は
    1.4142135623730950488016887242096980785696718753769480731766797....
    であるものとする。 「Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland」 では小数点第15桁まで正しいことを確認せよ。 なお、関数 sqrtは math.h で定義されている。

ifの練習
  1. 整数a, bを読み込んで |a-b|を出力するプログラムを作成せよ。
    ( 解答)

  2. 整数a, bを読み込んで ||a|-|b||を出力するプログラムを作成せよ。
    ( 解答)

  3. 整数a, b, c を読み込んで二次方程式 ax^2 + bx +c =0 の解を考える。 ただし、aは0でないとする。このとき、実数解の個数を出力するプログラムを作成せよ。 ( 解答)

  4. 整数a, b, c を読み込んで二次方程式 ax^2 + bx +c =0 の解を考える。 ただし、aは0でないとする。このとき、有理数解の個数を出力するプログラムを作成せよ。 ただし、math.hから平方根√を使っても良い。 math.hの 使用の方法はここを見ること。 ( 解答)

  5. 3つの整数の値をscanfで読みこんで中央値を出力するプログラムを作成せ よ。
    ( 解答)

  6. 西暦を入力して、その年が閏年(2月29日がある年) か平年(2月29日がない年) か判定するプログラムを作成せよ。 ただし、閏年は以下の規則の上で定義されているとする。 問題:次の年は閏年か平年か答えよ(2012年、2013年、1900年、2000年) ((4の倍数から分類) 解答 (400の倍数から分類) 解答)

  7. y年m月d日の曜日を求めるプログラムは 「h= (y + [y/4] - [y/100] + [y/400] + [(13m+8)/5] + d) を 7で割った余り」 であることが知られている。(Zeller の公式) ただし、以下を守って計算が行われる。 このとき次に答えよ。
    1. 今日が何曜日か確かめること。
    2. 1999年12月31日は何曜日か?
    3. 2000年1月1日は何曜日か?
    4. 自分の誕生日は何曜日か?
    ( 解答)

  8. 3つの整数の値をscanfで読みこんでa≧b≧cにならべかえるプログラムを作成せよ。 ただし、以下のそれぞれを行うこと。

    ( 解答) ( 解答)

  9. 4つの整数の値をscanfで読みこんでa≧b≧c≧dにならべかえるプログラムを作成せよ。 (挿入ソートの方法をとること)
    ( 解答)

  10. 4つの整数の値を scanfで読みこんで以下を表示するプログラムを作成せよ。 (できるだけ多くの別解を考えてみること)
    ( 解答)

  11. (ポーカーの問題)5つの整数の値を scanfで読みこんで以下を表示するプログラムを作成せよ。 (できるだけ多くの別解を考えてみること)
    ( 解答1) ( 解答2) ( 解答3) ( 解答4)

ループの練習

  1. 1+2+…+5=15 を確認するプログラムを組め。 (do-whileループ解答) (whileループ解答) (forループ 解答)

  2. 7! = 5040 を確認するプログラムを組め。 (do-whileループ解答) (whileループ解答) (forループ 解答)

  3. 二項係数 nCr=n!(r!*(n-r)!) を求めるプログラムを書くこと。ただし、以下の条件を守ること。 出力例は以下のようにする。
    % ./a.out
    nCrを計算します
    n = 10
    r = 8
    10C8 = 45
    
    % ./a.out
    nCrを計算します
    n = 10
    r = 11
    10C11 = 0
    
    % ./a.out
    nCrを計算します
    n = 10
    r = -2
    負の値はだめですよ!
    
    解答 (関数を用いた解答)

  4. 2つの異なる自然数を読み込み、小さい方をn1、 大きい方をn2とするとき、 n12+(n1+1)2+…+n22 の値を出力するプログラムを組め。 (forループ 解答) (whileループ解答) (do-whileループ解答)

  5. 1/1+1/2+…+1/5= 2.283333 を確認するプログラムを組め。
    1. do-while ループ、whileループまたはfor ループ を使って 足し算の途中経過も表示させること。 つまり、iまでの部分和を例えば以下のように表示させること。
      bubun wa = 1.000000
      bubun wa = 1.500000
      bubun wa = 1.833333
      bubun wa = 2.083333
      bubun wa = 2.283333
      
    2. 最後にn = 1000000 として 1/1+1/2+…+1/n は log(n) で近似されることを確かめよ。 数学的には
           log (n+1) < 1/1+1/2+…+1/n < 1+log(n)
           
      が正しいので、log (n+1) , 1/1+1/2+…+1/n , 1+log(n) を出力して値を比較 すること。 例えば、
      log(1000001)=13.815512 < 14.392727 <  14.815511=1+log(1000000)
      
      というようにする。 ただし収束のスピードが遅いのであまり値は近くないことが予想される。 また、log (n) を出力するには math.h を使用する。math.hの 使用の方法はここを見ること。
    (forループ 解答) (whileループ解答)

  6. 1/12+1/22+…+1/52= 1.463611 を確認するプログラムを組め。 例えば、
    1/1^2+1/2^2+...+1/5^2 = 1.463611
    1/1^2+1/2^2+...+1/10000^2 = 1.644834 (ideal 1.644934)
    
    のように出力すること。 (forループ 解答) (whileループ解答)

  7. (1/2)1 + (1/2)2 + …+(1/2)10を求めるプログラムを組め。 (for ループ 解答) (while ループ解答)

  8. 自然数を読み込んで、下記を表示するプログラムを組め。 例えば出力は以下のようにする。
    234892は6桁の自然数で最上位の桁の値は2です
    
    (while ループ解答)

  9. 自然数である a, b を読み込んで a ÷ b を任意の桁数だけ表示するプログラムを組め。 (forループ 解答) (whileループ解答)

  10. サイコロを3個投げたときに積が6の倍数になる場合の数を あらかじめ求めよ。さらに、数え上げが正しいことをプログラムで確かめよ。 (もし自分の数え上げが間違っていた場合は、 積が6の倍数になる場合を出力させて数え間違いを見付けること!)
    (whileループ解答)

  11. 000000~999999の6桁の数字の 上位3桁の数字の合計 と 下位3桁の数字の合計 が 同じ数字ならばラッキー((例)123060) 違う数字ならばラッキーでない((例)123456) とする。 6桁の数字の中のラッキーな数字の割合は何%あるか?正確な値を求めよ。 (解答 1重ループ使用) (解答 多重ループ使用)

  12. int 型の最大値、最小値は処理系によって異なる。 最大値は以下のようなプログラムにより表示ができる。
    #include <stdio.h>
    #include <limits.h>
    int main(void){
      printf("整数の最大値 = %d\n", INT_MAX);
      printf("整数の最小値 = %d\n", INT_MIN);
      return (0);
    }
    
    つまり、limits.h 内での 定数 INT_MAX, INT_MIN として整数の最大値、最小値が定義されている。 まず、このプログラムを実行すること。次に、 となる n はいくらか?ループを使って
     2,  4,  8,  16, ... 
    -2, -4, -8, -16, ... 
    
    などと表示して求めよ。 (解答)
アルファベットの表記
  1. 下記のようにVの字を書くこと。
    Vの字を書きます。
    大きさは?:4
    
    *     *
     *   *
      * *
       *
         
    (解答)

三角の描画の問題

  1. 演習問題4-18 と同様なプログラムを書き、三角形(ピラミッ ドの中身が空白のもの)を表示する。
    三角形を作りましょう。
    何段ですか: 6
         *
        * *
       *   *
      *     *
     *       *
    ***********
         
    (解答)
  2. 上記の問題と同様で、図のような傘の絵を書くこと。
    何段ですか:5
        *
       * *
      *   *
     *     *
    *********
        *
        *
        *
        *  *
         **
    
    (解答)

コラムの問題

  1. Column 4-1(教科書101ページ) の通り、九九の表の中で 4を含む数値が表示されないプログラムを実際に実行せよ。 (解答)
    ------------------------------
      1  2  3     5  6  7  8  9
      2     6  8 10 12    16 18
      3  6  9 12 15 18 21    27
         8 12 16 20    28 32 36
      5 10 15 20 25 30 35
      6 12 18    30 36
      7    21 28 35       56 63
      8 16    32       56    72
      9 18 27 36       63 72 81
    ------------------------------
    

  2. 上記の問題を一般化して、i=1,...,9のときに、九九の表の中で、i を含む数値が表示されないようにする。 をプログラムの中でカウントして、 について、 「最も表示されない個所の多いもの」、「最も表示されない個所の少ないもの」 に対してそれぞれ出力するプログラムを作成せよ。 (解答)
配列
  1. List 5-11 に関して70点以上を合格とする。合格者一覧を以下のように出力せよ。
    「合格者一覧」
    --------------
     1番 ( 83点)
     2番 ( 95点)
     3番 ( 85点)
     5番 ( 89点)
    
    さらに、最高点、最低点、合格者最低点を出力するプログラムを作成せよ。 ただし、合格者がいない場合は「合格者はいません」と出力するようにせよ。 (解答)

  2. 演習5-7を一般化して、 M行N列の行列とN行L列の行列の積を求めるプログラムを作成せよ。 (M,N,L)=(2,3,2)の場合と (M,N,L)=(2,2,2)の場合を確かめよ。行列の成分は整数とする。 (解答)

  3. 2行2列の行列A, B について、以下のように与えたとするとき、 AX=Bをみたす X を以下のフォーマットで出力せよ。 (解答)
    | 1 2 || x11 x12| =  |3 4 |
    | 3 4 || x21 x22|    |1 2 |
    
    ====>
    
    | x11 x12| =  |-5.00 -6.00 |
    | x21 x22|    | 4.00  5.00 |
    
  4. 2行2列の行列について、各成分をキーボードから入力し、 逆行列があるかどうかを判定し、 逆行列があればそれを出力するプログラムを作成せよ。 さらに、その逆行列と元の行列の積を計算して、単位行列になることを確かめよ。 (解答)

関数

  1. p.118の練習6-2を追加して、int 型整数の中央値を返す関数 int median(int x, int y, int z)を作成せよ。 (解答)

  2. 練習6-3とList6-3を利用して、3乗の差を返す関数を作成し、 1から100までの整数のうち、3乗の差が7000となる整数を出力せよ。 (解答)

  3. List6-3を参考にして、 3つの整数値をscanfで読み込んで、「それぞれの値の二乗の平均値」と 「平均値の二乗の値」を出力せよ。 その際、平均の関数を作成し、2乗の関数はList6-3を見ること。 ただし、受け渡しはすべてdouble で行い、整数値は1,2,3とすること。 なお、この2つの数のうち一般的にどちらが大きいかプログラムとは 別に数学的に考えてみよ。 (解答)

  4. List6-8を参考にして、 演習4-18のように読み込んだ整数の段数をもつピラミッドを表示する プログラムを作成せよ。 (解答)

ソート

  1. N個の整数の入った配列について 挿入ソートを行え (解答)