基礎プロI 100本ノック 中級編
No. 40 even or odd
整数値を入力させ、その値が偶数ならばeven、奇数ならばoddと表示するプログラムを作成せよ。
【実行例、下線部は入力例】 $ ./knock40 input number: 6 6 is even. $ ./knock40 input number: 7 7 is odd. $
偶数=2で割り切れる=2で割った余りが0
No. 41 1桁の自然数?
整数値を入力させ、その値が一桁の自然数かそうでないか判定するプログラムを作成せよ。
【実行例、下線部は入力例】 $ ./knock41 input number: 6 6 is a single figure. $ ./knock41 input number: 10 10 is not a single figure. $ ./knock41 input number: -3 -3 is not a single figure. $ ./knock41 input number: 0 0 is not a single figure. $
一桁の自然数=0より大きく、かつ、9以下の整数、として判定すればよい。
No. 42 小さい順?
整数値を3つ入力させ、それらの値が小さい順(等しくてもよい)に並んでいるか判定し、小さい順に並んでいる場合はOK、そうなっていない場合はNGと表示するプログラムを作成せよ。
【実行例、下線部は入力例】 $ ./knock42 input number 1: 1 input number 2: 2 input number 3: 3 OK $ ./knock42 input number 1: 1 input number 2: 1 input number 3: 3 OK $ ./knock42 input number 1: 2 input number 2: 1 input number 3: 3 NG $
No. 43 2次方程式の解の判別
2次方程式 ax^2 + bx + c = 0 (x^2はxの2乗の意味)の係数a, b, cを入力し、2次方程式の解が2つの実数解か、重解か、2つの虚数解かを判別するプログラムを作成せよ。
【実行例、下線部は入力例】 $ ./knock43 input a: 4 input b: -3 input c: 1 2つの虚数解 $ ./knock43 input a: 1 input b: 2 input c: 1 重解 $ ./knock43 input a: 3 input b: 2 input c: -4 2つの実数解 $
No. 44 通貨換算
換算したい金額(円単位)と1ドル何円かを整数値で入力すると、入力した金額が何ドル何セントか計算して表示するプログラムを作成せよ。1セントは1/100ドルである。結果は整数値でよい(1セント未満の端数切り捨て)。
【実行例、下線部は入力例】 $ ./knock44 何円? 10000 1ドルは何円? 120 10000円は83ドル33セント $ ./knock44 何円? 15000 1ドルは何円? 125 15000円は120ドル0セント $
まず何ドルになるかを整数値で計算する。次に、1ドルに満たない金額をセントに換算する。浮動小数点型の変数を使ってもよいが、使わない方法を考えてみよう。
No. 45 タクシー料金
初乗り料金が1700mまで610円、それ以降は313mごとに80円のタクシーがある。このタクシーに乗った距離をm単位で入力し、料金を計算するプログラムを作成せよ。
【実行例、下線部は入力例】 $ ./knock45 距離 10000 金額 2770 $ ./knock45 距離 2013 金額 690 $ ./knock45 距離 2014 金額 770 $
313mごとの区間は1mでも進んでしまったら80円かかることに注意。
No. 46 入場料
神山美術館の入場料金は、一人600円であるが、5人以上のグループなら一人550円、20人以上の団体なら一人500円である。人数を入力し、入場料の合計を計算するプログラムを作成せよ。
【実行例、下線部は入力例】 $ ./knock46 人数 3 料金 1800 $ ./knock46 人数 7 料金 3850 $ ./knock46 人数 22 料金 11000 $
No. 47 値の入れ替え
異なる整数値を2つ入力し、それぞれ別の変数に格納する。そして、それらの変数の値を入れ替えた後、それぞれの変数の値を表示するプログラムを作成せよ。単に順序を変えて表示するだけではダメ。必ず変数の値を入れ替えること。下の実行例の場合、まず変数aに2、bに5が入力された状態から、aの値が5、bの値が2になるように入れ替える。
【実行例、下線部は入力例】 $ ./knock47 input a: 2 input b: 5 a = 5, b = 2 $
No. 48 繰り返し計算
最初に2以上の整数値を入力し、次の規則で計算し、計算回数と計算結果を表示し、計算結果が1になるまで繰り返すプログラムを作成せよ。
規則:ある値が偶数ならその値を1/2にする。奇数ならその値を3倍して1を足す。
【実行例、下線部は入力例】 $ ./knock48 input number: 3 1: 10 2: 5 3: 16 4: 8 5: 4 6: 2 7: 1 $
No. 49 九九
九九の表を、2重の繰り返しを使って表示するプログラムを作成せよ。2重の繰り返しを使わず単に表示するだけではダメ。値の間はタブ(\t)を使って間をあけること。
【実行例】 $ ./knock49 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81 $
No. 50 foobar
1から100までの値を繰り返しで表示するが、3の倍数の時はfoo、5の倍数の時はbarと数字の代わりに表示するプログラムを作成せよ。なお、3と5の両方の倍数の時はfoobarと表示される。
【実行例】 $ ./knock50 1 2 foo 4 bar foo (途中省略) 97 98 foo bar $
No. 51 お支払い
指定した金額を100円玉と10円玉と1円玉だけで、できるだけ少ない枚数で支払いたい。金額を入力するとそれぞれの枚数を計算して表示するプログラムを作成せよ。
【実行例、下線部は入力例】 $ ./knock51 input money: 12345 100円玉123枚, 10円玉4枚, 1円玉5枚 $
問題文は「できるだけ少ない」となっているが、金額の大きな硬貨を優先して使うように計算すれば自然とそうなる。
No. 52 閏年
西暦を入力したらその年が閏(うるう)年かどうかを判定するプログラムを作成せよ。なお、4で割り切れる年のうち、100で割り切れないか、400で割り切れる年は閏年である。
【実行例、下線部は入力例】 $ ./knock52 input year: 2015 2015年は閏年でない $ ./knock52 input year: 2016 2016年は閏年である $ ./knock52 input year: 2100 2100年は閏年でない $ ./knock52 input year: 2000 2000年は閏年である $
No. 53 素因数分解
自然数の入力値を素因数分解して結果を表示するプログラムを作成せよ。
【実行例、下線部は入力例】 $ ./knock53 input number: 840 2 2 2 3 5 7 $
まず2で割り切れる間は割っていき、2で割り切れなくなったら3で、と、割る数を1ずつ大きくしながら繰り返す。
No. 54 最大最小
まずデータの個数を入力させ、次にデータの個数だけ整数値を入力させる。この入力データの中で最大値と最小値を求め表示するプログラムを作成せよ。データの個数は100個までとする。なお、データの個数とデータはファイルからリダイレクトで入力させればよいので、入力のためのメッセージは不要である(実行例を参照すること)。
【実行例、データファイルは下のリンクから取得せよ】 $ ./knock54 < small.data 最小値 = 128, 最大値 = 962 $ ./knock54 < middle.data 最小値 = 20, 最大値 = 988 $ ./knock54 < large.data 最小値 = 5, 最大値 = 996 $
リダイレクトでデータを入力するプログラム例はこちら redirect.c
入力データはこちら(右クリックで「リンク先をダウンロード」。ブラウザの設定によってはファイルの拡張子に.txtが追加されるが、その場合は適宜変更すること。「別名でダウンロード」を選んで、プログラムを置いているディレクトリに保存するとよい。)
small.data
middle.data
large.data
No. 55 夢想花again
「とんで」を9回「まわって」を3回繰り返した後「まわる」と表示して改行する、を3回繰り返すプログラムを作成せよ。「とんで」「まわって」と3行文の繰り返しは必ず繰り返し構文を使うこと。
【実行例】 $ ./knock55 とんでとんでとんでとんでとんでとんでとんでとんでとんでまわってまわってまわってまわる とんでとんでとんでとんでとんでとんでとんでとんでとんでまわってまわってまわってまわる とんでとんでとんでとんでとんでとんでとんでとんでとんでまわってまわってまわってまわる $
No. 56 2進数変換
0〜65535の整数値を入力させ、入力値を16桁の2進数に変換して表示するプログラムを作成せよ。
【実行例、下線部は入力例】 $ ./knock56 input number: 127 0000000001111111 $ ./knock56 input number: 10000 0010011100010000 $ ./knock56 input number: 65535 1111111111111111 $
ヒント:16桁分の2進数を記憶する配列を用意する。2で割った余り(0か1)を最初の桁の値とし、2で割った値を新たな値とし、さらに2で割った余りを次の桁の値とする。これを繰り返していけば1の桁から順に値が求まるので、表示するときは逆順に表示すればよい。
No. 57 テスト集計
まず受験者数を入力させ、次に受験者数ごとに英語、数学、国語の点数をスペースで区切って入力させる(具体的な入力方法は下記のscanfの使い方の説明、および入力データの中身を見よ)。入力が終了したら、英語、数学、国語の平均点、および各受験生の合計点を計算して表示するプログラムを作成せよ。受験者数は100人までとする。なお、データの個数とデータはファイルからリダイレクトで入力させればよいので、入力のためのメッセージは不要である(実行例を参照すること)。
【実行例、データファイルは下のリンクから取得せよ】 $ ./knock57 < examSmall.data 平均点 英語:46, 数学:51, 国語:55 個人合計点 0: 141 1: 114 (途中省略) 8: 96 9: 188 $ ./knock57 < examMiddle.data 平均点 英語:55, 数学:53, 国語:54 個人合計点 0: 136 1: 64 (途中省略) 48: 265 49: 167 $ ./knock57 < examLarge.data 平均点 英語:52, 数学:51, 国語:51 個人合計点 0: 151 1: 241 (途中省略) 98: 107 99: 178 $
複数の値をスペースで区切って一度に入力させるには、次のようにscnaf関数の書式指定文字列を使う:
scanf("%d %d %d", &eng, &math, &lang);
入力データはこちら(右クリックで「リンク先をダウンロード」)
examSmall.data
examMiddle.data
examLarge.data
No. 58 棒グラフ
0以上の整数値を5つ入力させ、それぞれの値に対して、次の形式でグラフを描くプログラムを作成せよ。
形式:左端に値を表示し、適切に空白を空けて":"を書く(:で揃えるためにタブ\tを使うとよい)。その後ろに値の数だけ*を描くが、5個おきに空白を1つ入れる。具体例は下記の実行例を参照すること。
【実行例、下線部は入力例】 $ ./knock58 input data[0]: 7 input data[1]: 10 input data[2]: 14 input data[3]: 15 input data[4]: 21 7 :***** ** 10 :***** ***** 14 :***** ***** **** 15 :***** ***** ***** 21 :***** ***** ***** ***** * $
ヒント:入力値は配列に格納する。グラフを描くためには、値のループと、*を描くループの二重ループとなる。
No. 59 行列の和
3x3行列の和を求めて表示するプログラムを作成せよ。行列の値は2次元配列で表現し、繰り返しを使って計算すること。
3x3行列とは縦3つ、横3つの9つの要素(値)をひとまとめにして扱うものである。2つの3x3行列の和は次式のように、それぞれ同じ位置にある値を足したものとして計算できる。
例えばa12という要素は、1行目2列目の要素という意味である。それぞれ同じ位置にある要素を足せばよい。
なお、入力値は1行ずつ3つの値をスペースで区切って入力するようにするとよい。このためには、scanf("%d %d %d", &a[0][0], &a[0][1], &a[0][2]);のように書く(No. 57参照)。
【実行例、下線部は入力例】 $ ./knock59 1つめの行列 1 2 3 4 5 6 7 8 9 1つめの行列 2 3 4 5 6 7 8 9 1 和 3 5 7 9 11 13 15 17 10 $
C言語の配列の添字は0から始まることに注意。上記の実行例で、和の行列の表示は各列の値を揃えるためにタブ(\t)を使っている。