■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■応用プログラミング演習問題集(基礎編)■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ・難易度の高い問題には,問題の後ろに【難】【やや難】が  ついています。 ・▲参考とあるのは,宇野毅明先生著の『Cで学ぶプログラミ  ングの基礎』(共立出版)内の問題に対応する問題番号です。 許可を得て使わせてもらっています.  プログラムを作成するためのヒントが書いてあるかもしれません。 ・1章に限り,宇野先生の本からの出題項目はありません。 ・講義では2.xのバージョンを使います。 Python3.xのバージョンはprintのあとに()が必要です。 ■■■■■■■■■■■■第1章■■■■■■■■■■■■ (基本的なファイルの扱い方,print文) ■問題1−1 PythonShell上で (1)Hello World (2)4+4*5の結果 を表示せよ. ■問題1−2 *.pyファイルをつくり, 11211 12121 21112 を一気に表示するようなプログラムを作りなさい. ●●●●●●●●●●●●第2章●●●●●●●●●●●● (変数と計算) ●例題2−1 「(33+44)×55」と「2.1+4.3+6.5」と「123+456を78で割った余り」を計算し,表示するプログラムを作ってみましょう. その際に,(33+44)*55=のように計算式も表示しましょう. (サンプルコード) print '(33+44)*55 = ',(33+44)*55 print '2.1+4.3+6.5 = ',2.1+4.3+6.5 print '(123+456)%78 = ',(123+456)%78 ●例題2−2 変数を使ったプログラムを作りましょう.変数xに123*45を代入した後,xの値を表示します. 1. 変数 x に 123*45 の計算結果を代入する 2. x の値を表示する という順番で命令を実行すればよいですね. (サンプルコード) x = 123*45 print x ●例題2−3 整数と小数を使ったプログラムを実行してみましょう. このプログラムは,小数である9.99と整数である50をそれぞれ10倍して表示します. (サンプルコード) y = 99.9 x = 50 print y*10,x*10 ●例題2−4 以下のプログラムは,xとyの値を3回表示するのですが,それぞれ,何と何が表示されると思いますか? プログラムがどのように動いて,変数には何が代入されるかを考えた上で,@ 10,10 A 10,20 B 20,20の中から選んで下さい. (サンプルコード) x = 10 y = 10 print x,y x = y+10 y = 20 print x,y x = x-10 y = y-x print x,y ■問題2−1 (1) 1+2+3+4+5の計算結果を表示しましょう. (2) 1*3*5*7*9の計算結果を表示しましょう. (3) 98*3+48*4+188+(208-50)*5の計算結果を表示しましょう. ■問題2−2 例題2−2のサンプルコードを用いて, (1) 変数xの名前を,自分の好きな名前に変えてみましょう.どのような名前にすると,エラーが出るか,調べましょう. (2) x=の後の計算式を 12+45のようにいろいろと変えてみましょう. (3) 1行目と2行目を入れ替えると何が起きるか試してみましょう.なぜそうなるのか,考えましょう(ヒント:コンピュータは最初の行から順番に命令を実行していきます) ■問題2−3 例題2−4のサンプルコードを用いて, (1) 各行の式に出てくる10や20などの数値を,自分の好きな数,例えば30や5に変更し,実行結果がどう変わるか調べましょう. (2) 4行目と5行目を入れ替えると,実行結果がどう代わるか,予測しましょう.また,7と8行目を入れ替えるとどのようになるかも予測しましょう. 予測したら,実際に入れ替えて実行し,予測があっているか確かめましょう. ■問題2−4 変数xに10*20を,yに30*40を代入し,xとyの値を表示するプログラムを作りなさい. ■問題2−5 変数xに1.5を代入し,xの値の1/10を表示するプログラムを作りなさい. ■問題2−6 変数xに10を代入してxの値を表示,次に20を代入してxの値を表示,最後に30を代入してxの値を表示する,というプログラムを作りなさい. また,行を適当に入れ替えて,動きがどう変わるか見てみなさい. ■■■■■■■■■■■■第3章■■■■■■■■■■■■ (入力,input文) 注意:Python 3.xではinput()関数は文字列を返すので,整数を入力したい場合にはint(input())と整数に変換する必要があります. ちなみに,Python 2.xで文字列を入力するには,raw_input()関数を使います. ■問題3−1(▲参考:例題3−1,例題3−2) inputが入力した数値を変数に代入している,ということを,プログラムを作って確認せよ. 代入された変数の値を表示すれば確認できるので,プログラムの基本的な構造は以下のようになる. 1. 変数xを宣言する 2. inputで変数xに整数を入力する 3. printで変数xの値を表示する (1)上の構造どおりのプログラムを作れ (2)変数xの名前を自分の好きな名前に変えてみよ. (3)数値を入力して表示する,という作業を2回するようにしましょう. (4)入力する前にseisuu = ?と表示するようにせよ. (5)小数を入力し,それを表示させるように変えよ ■問題3−2(▲参考:例題3−3) 入力した数値を使った計算をする.inputを使ってキーボードから2つの整数を入力して,その合計を表示する,というプログラムを作りたい. プログラムの基本的な構造は以下のようになる. 1. 整数変数を2つ宣言する 2. 整数を2つ入力し,宣言した変数に代入する 3. 2つの整数の和を表示する (1)上の構造どおりのプログラムを作れ (2)整数3つを入力して,その合計を表示するようにせよ (3)小数2つを入力して,その合計を表示するようにせよ (4)整数2つを入力して,その積を表示するようにせよ ■問題3−3(▲参考:3章おまけプログラム) 1,2,3章で勉強したinput,print,変数の3つだけで 借金返済計画を立てるプログラムを作りたい. 簡単のため,利子は無しとする. まず,借金の総額と,ひと月に返済する金額を入力すると, 返済にかかる年数を表示し, さらに,毎年のボーナスから返済する金額を入力すると, 返済完了が何年早まるかを表示し, その次に返済を完了したい年数を入力すると, ボーナスからいくら返せばよいかを表示するプログラムを作成せよ. 【難】 ■問題3−4(▲参考:問題3−1) キーボードから2つの整数と2つの小数を入力して, それらを表示するプログラムを作れ. ■問題3−5(▲参考:問題3−2) 整数を4つ入力して,それらの合計を表示するプログラムを作りなさい. 例えば,プログラムを実行して,10,20,33,44を入力すると, その合計の107が表示されます. ■問題3−6(▲参考:問題3−3) 整数を2つ入力して,それらの積を表示し, さらに整数を2つ入力してそれらの積を表示し, 最後に,今までに表示した2つの数の合計を表示するプログラムを作りなさい. 例えば,プログラムを実行して10,20,33,30 を入力すると, 実行結果が以下のようになるようにします. 10 20 seki = 200 33 30 seki = 990 goukei = 1190 ■問題3−7 xとyにキーボードから整数を入力し, その和差積を表示するようなプログラムを作りなさい. 【やや難】 (ヒント:aの絶対値は abs(a) ) ●●●●●●●●●●●●第4章●●●●●●●●●●●● (条件if文) ●例第4−1  「0<10という条件が成り立つならOKと表示する」というプログラムを作って,ifの使い方を練習しましょう.0は10より小さいので0<10は必ず成り立ちます. ですから,実行すると,OKが表示されます. (サンプルコード) if 0<10: print 'OK' ●例題4−2  もう少し難しい条件を判定しましょう.キーボードから入力した数に25000を足したものが,3500*9と等しいかどうかを判定するプログラムを作ります. それには,以下の順で命令を実行すればよいですね.  1. 変数xに数値を入力する  2. ifでx+25000と3500*9が等しいかどうか判定する  3. 等しいならOKを,そうでなければBoooを表示する 条件式では,等号に==を使うことを注意してください. (サンプルコード) x = input("Please enter an integer:") if x+25000 == 3500*9 : print 'OK' else: print 'Booo' ●例題4−3  ifの入れ子を使ったプログラムを作りましょう.入力した数が正の場合はpositiveと表示して,さらに100以上の場合は100ijou,100未満の場合は100mimanと表示しましょう.また,入力した数が正でない場合,0の場合はzero,負の場合はnegativeと表示しましょう. (サンプルコード) x = input("Please enter an integer:") if x > 0 : print('positive') if x >= 100 : print '100ijou' else : print '100miman' elif x == 0 : print 'zero' else : print 'negative' ●問題4−1 (1) 入力した数が0ならzeroと表示するプログラムを作りましょう. (2) 入力した数が100以上ならOKと表示するプログラムを作りましょう. (3) 入力した数が0以上ならpositive,そうでなければnegativeと表示するプログラムを作りましょう. (4) 入力した2つの数が等しいならequalと表示するプログラムを作りましょう. ●問題4−2 例題4−3のサンプルコードを用いて, (1) 入力した数が10か10より大きいか10未満かを判定するプログラムを作りましょう. (2) 入力した数が1なら1,2なら2,それ以外ならetcと表示させましょう. (3) 最初のifの条件式を(x<0)とすると,実行結果は元のプログラムと変わってしまいます. そこで,この条件式以外の部分を修正して,元のプログラムと同じ実行結果を出すプログラムに修正しましょう. ●問題4−3  キーボードから2つの数xとyを入力し,yがx以下ならx-yを表示し,yがxより大きければminus ni narimasuと表示するプログラムを作りなさい. ●問題4−4  まず,文字で絵を3種類作りましょう(例えば(´A`)のような絵).そして,キーボードから数を入力し, その数が1なら1番目の絵を,2なら2番目の絵を,3なら3番目の絵を表示するプログラムを作りなさい.それ以外の数が入力された場合は,何もしなくてよいです. ●問題4−5  キーボードから数値をxに入力し,ifを使って,xが偶数ならGuusuu,奇数ならKisuuと表示させるプログラムを作りなさい. xが偶数なら,xを2で割った余りが0となり,奇数であれば1になるので,xを2で割った余りを調べれば良いです.余りを計算するには%を使います. ●問題4−6  キーボードから入力した数が10以上20以下であればOKと表示するプログラムを作りなさい. ●問題4−7 文字で作った絵を2つ作りましょう.そして,キーボードから入力した数が10 以上20 以下なら1つ目の絵を,50以上60以下なら2つ目の絵を表示するプログラムを作りなさい. ●問題4−8 キーボードから数を入力し,その数が正ならその数を表示.そうでなければ,もうひとつ数を入力し,最初の数との積を表示するプログラムを作りなさい. 表示結果例 x = :-3 y = :2 seki -6 ■■■■■■■■■■■■第5章■■■■■■■■■■■■ (繰り返し文,while,for) ■問題5−1(while文)(▲参考:例題5−1,5−2,例題5−3) (1)「入力した数を表示する」という作業を,無条件に繰り返す    プログラムを作りなさい. (2)「2つの数を入力し,表示する」という作業を繰り返すようにせよ. (3)「入力した定価の税込価格を表示する」という作業を    繰り返すプログラムを作成せよ. (4)0を入力したら止まるプログラムにせよ (5)負の数を入力したら止まるプログラムにせよ ■問題5−2(while文)(▲参考:例題5−2) (1)「入力した数が7の倍数かどうかを判定する」という作業を繰り返す    プログラムを作りなさい. (2)3の倍数かどうかの判定を繰り返すようにせよ (3)負かどうかの判定を繰り返すようにせよ ■問題5−3(▲参考:例題5−4) (1)Hello!を10回表示するプログラムを作りなさい.    また,はじめのi=1をi=100にして,結果を出し,    そうなるわけを考察しなさい. (2)20回表示するプログラムにしなさい ■問題5−4(while文)(▲参考:例題5−5,例題5−6) (1)1から10までの整数を表示するプログラムを作りなさい. (2)1から20までの整数を表示するように書き換えよ. (3)-10から10までの整数を表示するように書き換えよ. (4)2,4,6,8,10 を表示するように書き換えよ.   (ヒント:iを2つずつ大きくすると…) (5)while i<=10: を while i<10: とするとどうなるか,試せ.    また,どうしてそうなるのか,考察せよ. ■問題5−5(for文)(▲参考:例題5−7) (1)問題5−4の各問をforループを用いて書き換えよ (2)10から1までの整数を大きい順で(10,9,8,… )表示せよ. (3)1から100までの偶数を表示せよ. ■問題5−6(▲参考:例題5−8) (1)「数を10回入力して表示する,    ただし,途中で0が入力されたら終了する」プログラムを作れ. (2)「数を20回入力するようにせよ (3)100を入力したら終わるようにせよ. (4)負の数を入力したら終わるようにせよ. (5)0か1を入力したら終わるようにせよ. (6)「入力した数を表示する作業を,0が入力されるまで繰り返す,    ただし,10回を過ぎたら終了する」プログラムをfor文を用いて作れ ■問題5−7(▲参考:例題5−9) (1)forの2重ループを使って,九九の表を書くプログラムを作成せよ.    ただし,表の罫線を書くのは大変なので,中身の数字だけを書く. (2)9×9 の足し算の答えを表にせよ. (3)12×12 の掛け算の答えを表にせよ. ■問題5−8(▲参考:例題5−10) ########## 1個の空白と10個の#を表示 ######## 2個の空白と8個の#を表示 ###### 3個の空白と6個の#を表示 #### 4個の空白と4個の#を表示 ## 5個の空白と2個の#を表示 上のような#で作った三角形を表示するプログラムを作成せよ. 【やや難】 ■問題5−9(whileとif文の練習1)(▲参考:問題5−2) 整数x1をまず入力させる. 次に整数x2をキーボードから入力させ, その数値がx1と同じならプログラムを終了し, 違うならば何らかの絵文字を表示させるプログラムを作成せよ. ■問題5−10(whileとif文の練習2)(▲参考:問題5−3) 1から100までのランダムな整数をxに代入し, xが偶然50になるまで,その数値を 表示させ続けるプログラムを作りなさい. (※最初の行にimport randomと宣言した上で,   x=random.randint(a,b)と書くことで,   xにaからbまでのランダムな整数を代入してくれる.) ■問題5−11(whileとif文の練習3)(▲参考:問題5−4) 数当てゲームを作りたい. 1から100までのランダムな整数を用意し, キーボードから入力した数がその数と同じならば 終了するプログラムを作成する. ただし,はずれたときは, 正解よりも大きかったか小さかったかを表示して ヒントを出すようにすること. 【やや難】 ■問題5−12(for,whileの使い分け)(▲参考:問題5−5) 2つの整数aとbをキーボードから入力させ, a以上b以下の整数をすべて表示させるプログラムを作れ (1)for文を使って作れ(whileは使わない) (2)while文を使って作れ(forは使わない) ■問題5−13(▲参考:問題5−9) 2つの整数a,bをキーボードから入力し, 縦がa文字,横がb文字の*で出来た四角を描くプログラムを作りなさい. たとえば,a=2,b=5なら, ***** ***** と表示される. (1)forを1回だけ使用して作れ (2)2重のforループを使用して作れ 【やや難】 ■問題5−14(▲参考:問題5−7) 九九の表を作るプログラムを,掛け算の答えだけでなく,それぞれが何と何の掛け算なのか,つまり3*5=15 のように表示するプログラムを作りなさい. 表が大きすぎるならば5×5で構いません. ■問題5−15(▲参考:問題5−8) 3×3×3のかけ算の表を表示するプログラムを作りなさい.1×1×1,1×1×2,1×1×3,1×2×1,...の順で表示するようにしなさい. ■問題5−16(▲参考:問題5−11) キーボードから数xを入力し,xの数だけ#を横に並べて表示する,という作業を繰り返すプログラムを作りなさい. ただし,入力した数が0なら終了するようにします.例えば,5,3,15,0と入力した場合にはこのようになります. 5 ##### 3 ### 15 ############### 0 ■問題5−17 1から100までの素数を書き出すプログラムを作りなさい 【難】 ●●●●●●●●●●●●第6章●●●●●●●●●●●● (繰り返し文の応用,補助変数・カウント・フラグ) ●例第6−1(補助変数) 「数を繰り返し入力し,前回と同じ数が入力されたら終了する」プログラムを,補助変数を使って作ってみましょう. 前回入力された数を記録するために,補助変数yを用意します.そして,ループ内で新たにxに数を入力する前に,yにxを代入して, 前回入力された値をyに保存するようにします.数の比較にはx==yやx!=yなどの表現を用います. (サンプルコード) y = input("x = ") x = input("x = ") while y != x : y = x x = input("x = ") ●例題6−2 10個の数を入力して,その中で最大のものを表示する,というプログラムを作りましょう. (サンプルコード) m = -9999 for i in range(10) : j = input("Please enter an integer:") if m < j : m=j print m ●例題6−3(カウント) 「入力した10個の数の中に10以上のものはいくつあるか」というプログラムを作りましょう. (サンプルコード) c = 0 for i in range(10) : j = input("Please enter an integer:") if j >=10 : c += 1 print c ●例題6−4(フラグ) 「入力した10個の数の中に5があるかどうか」を調べるプログラムを作りましょう.以下のプログラムでは,fをフラグにしています. (サンプルコード) f = 0 for i in range(10) : j = input("Please enter an integer:") if j == 5 : f = 1 if f == 1 : print '5 ga atta' ●問題6−1 (1) 前回入力した数より倍以上大きな数を入力したら終了するようなプログラムを作りなさい. (2) 前回入力した負の数と同じ数を入力したら終了するようにしましょう(1,-1,4,-4,5 と入力した時点では,前回入力した負の数は-4です). (ヒント:xが負のときだけ,yにxを代入しましょう.) (3) 2回前に入力した数と同じ数を入力したら終了するようにしましょう. ●問題6−2 (1) 「入力した10個の数の最小」を表示するプログラムを作りなさい. (2) 「10以下の数の中での最大」を表示するようなプログラムを作りなさい.ただし,10以下の数は必ず1つは入力される,とみなして良いとします. ●問題6−3 キーボードから10個の数字を入力し, (1) 負の数がいくつ入力されたかを表示するプログラムを作りなさい. (2) 偶数がいくつ入力されたかを表示するプログラムを作りなさい. ●問題6−4 (1) キーボードから入力した10個の数の中に5がなければ5 ga arimasenと表示するようにしましょう. (2) 入力した10個の数の中に負の数があるかどうかを表示するようにしましょう. ●問題6−5 数を10個入力してその合計を表示するプログラムを作りなさい. ●問題6−6 足し算だけの電卓を作りなさい.数を入力し,今まで入力した数の合計を表示する,という作業を繰り返すプログラムです. さらに,0 を入力したときは終了するようにしなさい.例えば,10,20,63,0 と入力すると,このようになります.「10 10 20 30 63 93 0」 ●問題6−7 入力した10個の数の中に1と0,どちらが多いかを判定するプログラムを作りなさい. ●問題6−8 入力した数が素数かどうかを判定するプログラムを作りなさい.(ヒント:ある数xが素数ならば,2以上x未満の数で,xを割り切るものがありません. そこで,2からx-1までのループを作り,それぞれでxを割った余りが0になるかどうか判定し,0になったらフラグ変数にそのことを記録しましょう) ●問題6−9 問題6−8のプログラムを使って,1 から入力した数nまでの素数を表示するプログラムを作りなさい. ●問題6−10 最初の行でimport randomと入力した上で、x= random.randint(1,100)という命令は,xに0〜99の適当な(ランダムな)数を代入するものです. これを100回行って,xに30以下の数が何回代入されたかを表示するプログラムを作りなさい. ●問題6−11 10個の数を入力し,「前回と同じ数を入力した回数」を勘定するプログラムを作りなさい.例えば,2,2,4,4,4と入力すると,3回と表示します.