プログラミング演習I http://www.ns.kogakuin.ac.jp/~ct13140/Prog.2009 プログラミング演習I 概要 • プログラミング論Iの内容を実際にコンピュー タで解く. – プログラミング力を付ける – アルゴリズムについて学ぶ – 主に数学的問題を解く – 使用する言語は C言語 2 プログラミング論Iと演習I • 論Iで理論を学び,演習Iでそれを実践してみ る. • 両科目を併せて取ることをお勧めします. 3 教科書 新C言語入門 ビギナー編 林 晴比古 (著) 出版社: ソフトバンククリエイティブ 4 テスト • プログラミング論I,II,プログラミング演習 I,IIの試験は「紙媒体のものは全て持ち込 み可」とします. – C言語の教科書の購入を強く推奨します. – 当然,授業,演習も教科書を持参し参照すること を強く推奨します. – 試験は筆記試験のみです. – 詳細は,Webページ参照 5 無料C言語コンパイラ(IDE) • Visual C++ 2008 Express Edition http://www.microsoft.com/japan/msdn/vstudio/express/ 6 コメント • C言語の教科書を必ず買いましょう. – 試験に持ち込みも可ですし, 教科書なしでの演習は不可能に近いです. コメント • プログラムは必ず正しくインデントしてください . – インデントしないと,皆様がプログラミングでミスを 犯す危険性が増えるのはもちろん, 教員もソースコードを読んで理解ができない/理 解が著しく困難となる. • 変数には意味のある名前をつけてください. – a や b だと,理解するのが困難です. 演習0-0 • “Hello,world![改行]”を表示するプロ グラムを作成せよ. 9 演習0-1 • “Hello,[改行]world![改行]”を表示す るプログラムを作成せよ. 10 演習0-2 • “Hello.[改行]”と10回表示するプログラ ムを作成せよ. 11 演習0-3 • for文を用いて,0から19まで表示するプロ グラムを作成せよ. – 表示は,printf("%d\n", i); により行える. 12 演習0-4 • for文を用いて,56から74まで表示するプロ グラムを作成せよ. 13 演習0-5 • 右図のように10個の整数を表示するプログラ ムを作成せよ.必ずfor文を用いよ. 0 – ヒント: これは,02,12,22,32,42…92である 1 4 9 16 25 : 81 14 演習0-6 10 k • for文を用いて, k 1 を計算し,結果を表 示するプログラムを作成せよ. – すなわち 1+2+3+…+9+10を求める. – ヒント x=0; x+=1; x+=2; x+=3; : ←xが0になる ←xが1増える.つまり,0から1に変わる. ← xが2増える.つまり,1から3に変わる. ← xが2増える.つまり,3から6に変わる. 正解は55である. 15 演習0-7 10 4 k • for文を用いて, k 1 を計算し,結果を表 示するプログラムを作成せよ. – すなわち 14+24+34+…+94+104を求める. – ヒント:正解は25333である. 16 演習1-0 • for文を用いて,1000から1009までの10個 の数字を表示するプログラムを作成せよ. – 表示は,printf("%d\n", i);により行える. 実行結果 1000 1001 1002 1003 1004 : 1009 17 演習1-1 • for文を用いて,13,23,33,…,93,103を出 力するプログラムを作成せよ. – 演習0-5とほとんど同じです. 実行結果 1 8 27 64 125 216 343 512 729 1000 18 演習1-2 20 k • for文を用いて, k 1 を計算し,結果を表 示するプログラムを作成せよ. – すなわち 1+2+3+…+19+20を求める. – ヒント:正解は210である 19 演習1-3 • for文を用いて,100+101+102+…+199を 計算し,結果を表示するプログラムを作成せ よ. – ヒント:正解は14950である. 20 演習1-4 10 3 k • for文を用いて, k 1 を計算し,結果を表示 するプログラムを作成せよ. – すなわち 13+23+33+…+93+103を求める. – 演習0-7とほとんど同じです. – ヒント:答えは 3025 21 演習1-5 • for文を用いて, 1000+1 1000+1+2 1000+1+2+3 : 1000+1+2+3+4+…+9+10 を出力するプログラムを作成せよ – 次のスライドにヒントがあります. 実行結果 1001 1003 1006 1010 1015 1021 1028 1036 1045 1055 22 演習1-5 ヒント x x x x x = 1000; += 1; += 2; += 3; += 4; ←これでxが1000になる ←これでxが1000+1になる. ←これでxが1000+1+2になる. ←xが1000+1+2+3になる. ←xが1000+1+2+3+4になる. 23 演習1-6 • • 1000, 1001, 1002, 1003, for文を用いて,1000から1019ま 1004, 1005, での20個の数字の合計を表示す 1006, 1007, るプログラムを作成せよ. 1008, – つまり1000+1001+1002+…+1019 1009, 1010, を計算する. 1011, 1012, 途中経過も表示せよ. 1013, 1014, 1015, 1016, 1017, 1018, 実行結果 1019, 1000 2001 3003 4006 5010 6015 7021 8028 9036 10045 11055 12066 13078 14091 15105 16120 17136 18153 19171 24 20190 演習1-7 • for文を用いて,500, 503, 506, 509,…, 527の10個の整数を表示するプロ グラムを作成せよ. 500 – 表示される数字は3ずつ増えている. 実行結果 503 506 509 512 515 518 521 524 527 25 演習1-8 • for文を用いて,500.0, 500.3, 500.6, …, 502.7の10個の実数と,その合計を表 示するプログラムを作成せよ. 500.000000 – 表示される数字は0.3ずつ 増えている. – 浮動小数点の表示は以下で可能 double d; printf("%lf\n", d); 500.300000 500.600000 500.900000 501.200000 501.500000 501.800000 502.100000 502.400000 502.700000 実行結果 合計=5013.500000 26 演習1-9 • for文を用いて,1000, 998, 996,…, 982の10個の整数を表示するプログラムを 作成せよ. – 表示される数字は2ずつ減っている. – ヒント 1000 998 996 994 ← ← ← ← 1000 1000 1000 1000 – – – – 2*0 2*1 2*2 2*3 1000 998 996 994 992 990 988 986 984 実行結果 982 27 演習1-10 • for文を用いて,1000, 998, 996,…, 982の10個の整数の和を求め表示するプロ グラムを作成せよ. – 表示される数字は2ずつ減っている. – ヒント 1000 998 996 994 ← ← ← ← 1000 1000 1000 1000 – – – – 2*0 2*1 2*2 2*3 実行結果 9910 28 演習1-11 • for文を用いて,10の階乗を求め出力するプ ログラムを作成せよ. – 1*2*3*…*9*10を求める. 実行結果 3628800 29 演習2-0 • for文を用いて,0, 1, 2, 3,…, 9の10 個の整数を表示するプログラムを作成せよ. 実行結果 0 1 2 3 4 5 6 7 8 9 30 演習2-1 • for文を用いて,0+1+2+3+…+9の10個の 整数の和を計算し表示するプログラムを作成 せよ. 実行結果 45 31 演習2-2 • 2重のfor文を用いて,右下のように表示さ れるプログラムを作成せよ. – ヒント:「0,1,2,3と表示」を3回繰り返す 実行結果 0 1 2 3 0 1 2 3 0 1 2 3 32 演習2-3 • 2重のfor文を用いて,右下のように表示さ れるプログラムを作成せよ. 実行結果 1 1 1 1 2 2 2 2 3 3 3 3 1 2 3 4 1 2 3 4 1 2 3 4 33 演習2-4 • 2重のfor文を用いて,右のように表示さ れるプログラムを作成せよ. 実行結果 0 0 0 0 0 0 0 1 0 1 0 1 0 2 0 2 0 2 1 0 1 0 1 0 1 1 1 1 1 1 1 2 1 2 1 2 2 0 2 0 2 0 2 1 2 1 2 1 2 2 2 2 34 2 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 演習2-5 • 2重のfor文を用いて,右のように表示さ れるプログラムを作成せよ. 実行結果 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 35 0 0 1 1 2 2 3 3 0 0 1 1 2 2 3 3 0 0 1 1 2 2 3 3 演習3 • 次のプログラムを作成せよ. for文を用いて0から19までの20個の整数 を表示する. ただし,次ページのルールに従え. 演習3 (con't) • その数字が3の倍数であるが,5の倍数でない場合 は,数字の後に"?"を付ける. • その数字が5の倍数であるが,3の倍数でない場合 は,数字の後に"!"を付ける. • その数字が3の倍数であり かつ 5の倍数である場 合は,数字の後に"#"を付ける. • その数字が3の倍数でなく かつ 5の倍数でない場 合は,数字のみを表示し何もつけない. – 次スライドに実行結果,ヒントがある 演習3 (con't) • 演習3の実行結果. • ヒント – xが3の倍数であるか否かの調査は if( x % 3 == 0 ) で行える. 0# 1 2 3? 4 5! 6? 7 8 9? 10! 11 12? 13 14 15# 16 17 18? 19 演習4-0 f (x) = x3 - 18x2 + x - 18 とする. • f (0), f (1), f (2) ,…, f (20) を表示せよ 演習4-1 f (x) = x3 - 18x2 + x - 18 とする. • 方程式 f (x)=0 は,[0,20]の間に整数解が1個 存在する.それを求めよ. – 2分法などではなく, f (0)=0か?, f (1)=0か? …と x=20まで繰り返す. – ヒント:解は x = 18 である. 演習4-2 f (x) = x3 - 18x2 + x - 18 とする. • f (0), f (1)…f (20)の中で最も小さいものと,そ のときの x を求めよ. – ヒント:f (12)が最小 演習4-3 0.1x3+x-16 =0 の解は [0,8]に存在する. 解が x = 4 に着目し, 解が[0,4]にあるのか,[4,8]にあるのかを調査し, その結果を表示するプログラムを作成. • 区間最小値をmin, 最大値をmaxに格納. – ヒント : min=0, max=8 で開始し, min=4, max=8 で終了するはず. 演習4-4 演習4-3の処理を1回行うと, min と max が [0,8] → [4,8] と更新される. 同じ処理を2回 [4,8] → [4,6] となる. 実行結果の例 この処理を for文を ans : from 0.00000000 to 8.00000000 ans : from 4.00000000 to 8.00000000 用いて10回行う ans : from 4.00000000 to 6.00000000 ans : from 4.00000000 to 5.00000000 プログラムを作成せよ. ans : from 4.50000000 to 5.00000000 ans : from 4.75000000 to 5.00000000 次スライドにヒント ans : from 4.75000000 to 4.87500000 ans : from ans : from ans : from ans : from 4.81250000 to 4.81250000 to 4.81250000 to 4.81250000 to 4.87500000 4.84375000 4.82812500 4.82031250 ヒント 浮動小数点の変数を,細かい桁まで表示す るのは, double d = 1.23456789012345; printf("%20.15lf\n", d); で可能. 上記は,「全体で20文字,小数点以下15文字」を表示する. ただし,「全体」には符号(±)や小数点も含まれる. 演習4-5 2文法プログラムの作成 0.1x3+x-16 =0 の近似解を2分法を用いて求め, 近似解を表示するプログラムを作成せよ. 解の精度は,誤差が10–5未満とする. ただし,下記は既知として使ってよい. ・ 解は[0,8]の区間に存在する. ・ 0.1x3+x-16は単調増加関数である. ヒント (い) 初期区間を [ 0, 8] とする. 区間が十分に小さいか検証. 小さいなら繰り返し終了. 小さくないなら以下を行う. 区間が大きい 区間の中間値を計算. 限り, 解が中間値より小さい/大きいを検証. 繰り返し 小さい→解は[最小値,中間値]にある. 大きい→解は[中間値,最大値]にある. 繰り返しの先頭に戻る. 解を表示する. ヒント (ろ) 0.1x3+x-16 double func(double x){ return 0.1*x*x*x + x - 16; } void main(){ 変数の宣言; while( 区間が十分に狭いか否か? ){ 区間の中間値を求める. 解が中間値より小さい/大きいかを調べて,区間を短くする. } 解を表示する. } ヒント (は) while( 0.00001 < 区間の長さ){ 中間値を計算; if( f (中間値)が負である ){ /* 解は [mid,max] にある */ 区間を更新. } else { /* 解は [min,mid] にある */ 区間を更新. } } 演習4-6 0.1x3+x-50 = 0 の近似解をはさみうち法を用いて 求め,近似解を表示するプログラムを作成せよ. 解の精度は不問(適切に…). ただし,下記は既知として使ってよい. ・ 解は[0,8]の区間に存在する. ・ 0.1x3+x-50は単調増加関数である. ヒント1 2点( a , f (a) )と( b , f (b) ) を通る近似直線は f (a ) f (b) y f (a) ( x a) a b この近似直線のx切片は bf (a) af (b) m f (a) f (b) 演習4-7 0.1x3+x-5 = 0 の近似解をNewton-Raphson法を 用いて求め,近似解を表示するプログラムを作 成せよ. 解の精度は不問(適切に…). ただし,下記は既知として使ってよい. ・ 解は[0,8]の区間に存在する. ・ 0.1x3+x-5は単調増加関数である. 演習4-8 同一の方程式(たとえば,0.1x3+x-5 = 0)の解を2 分法,はさみうち法,Newton-Raphson法を用い て求め,収束までの試行回数を比較せよ. 収束の途中経過を表示するとわかりやすい. 演習5-0 • 画面に,右図の様に #記号が10個縦に表示されるプログラ ムを作成せよ. # # # # # # # # # # 演習5-1 • 画面に,下図の様に #記号が20個横に表示されるプログラムを作 成せよ. – ただし, printf("####################"); の様なプログラムではなく, for文で20回繰り返すプログラムにせよ. #################### 演習5-2 • 画面に,下図の様に #記号が横20×縦10に表示されるプログラ ムを作成せよ. #################### #################### #################### #################### #################### #################### #################### #################### #################### #################### 演習5-3 • 画面に,下図の様に表示されるプログラムを 作成せよ. 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 演習5-4 • 画面に,下図の様に表示されるプログラムを 作成せよ. 0000000000 1111111111 2222222222 3333333333 4444444444 5555555555 6666666666 7777777777 8888888888 9999999999 演習5-5 • 画面に,下図の様に表示されるプログラムを 作成せよ. # ## ### #### ##### ###### ####### ######## ######### ########## 演習5-6 • 画面に,下図の様に表示されるプログラムを 作成せよ. ########## ######### ######## ####### ###### ##### #### ### ## # 演習5-7 • 画面に,下図の様に表示されるプログラムを 作成せよ. – ヒント:左に空白を表示 してから,#を表示. # ## ### #### ##### ###### ####### ######## ######### ########## 演習5-8 • 画面に,右図の様に表示される プログラムを作成せよ. 1 22 22 333 333 333 4444 4444 4444 4444 55555 55555 55555 55555 55555 演習5-9 • 画面に,右図の様に表示される プログラムを作成せよ. # ## ### #### ##### # ## ### #### ##### # ## ### #### ##### 演習5-10 • 画面に,右図の様に表示される プログラムを作成せよ. # # # ## ## ## ### ### ### #### #### #### ############### 演習6-0 • 2次元のfor文を組んで表示する. 右のように表示されるプログラムを作成せよ. 一桁目が 0~3の4通り, 二桁目が 0~4の5通り, よって,4*5=20通り表示 0,0 1,0 2,0 3,0 0,1 1,1 2,1 3,1 0,2 1,2 2,2 3,2 0,3 1,3 2,3 3,3 0,4 1,4 2,4 3,4 演習6-1 double a[5][3]; a[0][0] = 0.0; a[0][1] = 1.0; a[0][2] = 2.0; a[1][0] = 3.0; a[1][1] = 4.0; a[1][2] = 5.0; a[2][0] = 6.0; a[2][1] = 7.0; a[2][2] = 8.0; a[3][0] = 9.0; a[3][1] =10.0; a[3][2] =11.0; a[4][0] =12.0; a[4][1] =13.0; a[4][2] =14.0; として,a[][] を全て表示するプログラムを作成せよ. 当然 2段のfor loop を使います. 次のスライドに続く. 演習6-1 (con't) 実行結果は右のようにせよ. 注意:Web上の手助けを 使用して良い. 手助けの内容を コピー&ペーストすれば良い. double型は printf(“%lf”, d) で表示可能. a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] a[2][0] a[2][1] a[2][2] a[3][0] a[3][1] a[3][2] a[4][0] a[4][1] a[4][2] = = = = = = = = = = = = = = = 0.000000 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000 9.000000 10.000000 11.000000 12.000000 13.000000 14.000000 演習6-2 double a[5][3]; double b[5][3]; double c[5][3]; a[0][0] = 0.0; a[0][1] = 1.0; a[0][2] = 2.0; a[1][0] = 3.0; a[1][1] = 4.0; a[1][2] = 5.0; : b[4][0] =27.0; b[4][1] =28.0; b[4][2] =29.0; として, 5行3列の行列 a と,5行3列の行列b の加算結果を, c に代入する. そして,c を全て表示. c[i][j] = a[i][j] + b[i][j] をfor文で組めればOK 注意: Web上の手助けを使用して良い. 手助けの内容をコピー&ペーストすれば良い. 演習6-3 double a[5][3]; a[0][0] = 0.0; a[0][1] = 1.0; a[0][2] = 2.0; : a[4][0] =12.0; a[4][1] =13.0; a[4][2] =14.0; として, a[0][0]~a[4][2] の15個の合計を計算して,表示する. 注意: Web上の手助けを使用して良い. 手助けの内容をコピー&ペーストすれば良い. 演習7-0 • 下記の1行3列の行列Aと,3行1列の行列B の積を求めよ. – for文を用いても用いなくてもよい. – 答えは1行1列の行列で,要素は 53.18 となる . – Web Page上の手助けを用いよ. 7.8 1.2 3.4 5.6 9.1 1.2 7.8 3.4 9.1 5.6 2.3 2.3 69 演習7-1 • 1行10列の行列Aと,10行1列の行列Bの積 を求めよ.for文を用いよ. – 答えは1行1列の行列で,要素は 964.374585 となる. – WebPage上の手助けを用いよ. 70 演習7-2 • 下記の行列Aと行列Bの掛け算を計算するプ ログラムを作成せよ.for文は用いない. 1 .1 A 1 .3 2 .1 B 2 .3 1 .2 1 .4 2 .2 2 .4 • 結果は2行2列の行列.これをC[2][2]で 表し,c[0][0], c[0][1], c[1][0], c[1][1]を求めることになる. • この課題はとばしても良い • WebPage上の手助けを用いよ. 1.1 2.1 1.2 2.3 1.1 2.2 1.2 2.4 ヒント : A B 1.3 2.1 1.4 2.3 1.3 2.2 1.4 2.4 71 演習7-3 • 課題-2の行列Aと行列Bの掛け算を計算する プログラムを作成せよ.for文を用いる. 1 .1 A 1 .3 2 .1 B 2 .3 1 .2 1 .4 2 .2 2 .4 • 結果は2行2列の行列.これを c[2][2]で表し,c[0][0], c[0][1], c[1][0], c[1][1]を求めることになる. • WebPage上の手助けを用いよ. 72 演習7-3 ヒント a[0][0] a[0][1] b[0][0] b[0][1] , B A a[1][0] a[1][1] b[1][0] b[1][1] A B a[0][0] b[0][0] a[0][1] b[1][0] a[0][0] b[0][1] a[0][1] b[1][1] a[1][0] b[0][0] a[1][1] b[1][0] a[1][0] b[0][1] a[1][1] b[1][1] つまり, c[i ][ j ] a[i][0] b[0][ j ] a[i][1] b[1][ j ] 5.07 5.3 答えは 5.95 6.22 73 演習7-4 • 5行8列の行列Aと,8行3列の行列Bの掛け 算を行うプログラムを作成せよ. • ヒント c[i][ j ] a[i][0] b[0][ j ] a[i][1] b[1][ j ]a[i][7] b[7][ j ] • WebPage上の手助けを用いよ. 答えは, 14 42 70 98 126 14.28 43.08 71.88 100.68 129.48 14.56 44.16 73.76 103.36 132.96 74 演習8-0 • "#[改行]", "##[改行]", "###[改行]", "####[改行]" と表示する関数を作り,main関すから呼び 出せ.関数名は func(),引数はなし,戻り 値はvoidとせよ.つまり void func(){...}となる. 演習8-1 • 引数がなく,戻り値の型がint,戻り値 の値が3である関数three()を作成し, main()関数から呼び出せ. – main()関数の中では,関数three()の 戻り値を変数xに代入し,表示せよ. •こんな感じ↓ int x; x = three(); printf("x=%d\n", x); 演習8-2 • 引数がint型2個で,戻り値がその和である 関数を作成し,main()関数から呼び出せ. – ヒント int add(int a, int b){ return ????; } void main(){ int x; x = add(2,3); printf("x=%d\n", x); } 演習8-3 • 引数がint型3個で,戻り値がその和である 関数を作成し,main()関数から呼び出せ. 演習8-4 • main()関数よりfunc0()を呼び出し, func0()の中でfunc1を呼び出し, func1()の中でfunc2を呼び出すプログラ ムを作成せよ. – func0の中では"func0A"と表示し,func1を 呼び出し,"func0B"と表示せよ. – func1の中では"func1A"と表示し,func2を 呼び出し,"func1B"と表示せよ. – func2の中では"func2"と表示しせよ. 演習8-5 • "Hello,World!\n"と10回表示する関数 を作成し,それをmainから呼び出せ. – ヒント:関数の中にfor文を作成する. – ヒント:"Hello,World!"と10回表示するには int i; for(i=0; i<10; i++){ printf("Hello,World!\n"); } 演習8-6 • 0から9までを表示する関数を作成し,それを 呼び出せ. – ヒント:関数の中にfor文を作成する. – ヒント:0から9まで表示するには int i; for(i=0; i<10; i++){ printf("%d\n", i); } 演習8-7 • 1から10までの合計を計算して返す関数を作 成し,それを呼び出せ. – ヒント:関数の中にfor文を作成する. – ヒント:1から10までの合計は, int i, sum; sum = 0; for(i=1; i<=10; i++){ sum = sum+i; } 演習8-8 • 再帰により,n!(階乗)を求めるプログラムを 作成せよ. – 適切な引数を入れて,mainから呼び出せ. – 関数内にprintf()を入れ,動作を追跡せよ. 演習8-9 • 再帰により,nCr(組み合わせ)を求めるプロ グラムを作成せよ. 演習8-10 • 再帰により,フィボナッチ数列の第n項目を求 めるプログラムを作成せよ. – フィボナッチ数列:1,1,2,3,5,8,13,21,... 第n+2項目=第n項目+第n+1項目 演習9-0 n • nを入力し, k を求める関数sum1(int n) k 1 を作り,sum1(1), sum1(2), sum1(3) …sum1(10)を表示せよ. 演習9-1 • n 2 k nを入力し, を求める関数 k 1 sum2(int n)を作り, sum2(1),sum2(2),…,sum2(10)を表示 せよ. 演習9-2 n • 3 k nを入力し, を求める関数sum3(int k 1 n)と, n 4 k nを入力し, を求める関数sum4(int k 1 n), を作り, sum4(1),sum4(2),…sum4(10)を表示せ よ. 演習9-3 • nを入力し n n n n k 1 k 1 k 1 k 1 2 k 4 3 k 3 4 k 2 5 k を求める関数func0(int n)を作り, func0(1),func0(2)…func0(10)を表 示せよ. – 先ほどのsum1()~sum4()を使用せよ. 演習9-0 ~ 9-3 の解答 n= 1, n= 2, n= 3, n= 4, n= 5, n= 6, n= 7, n= 8, n= 9, n=10, sum1(n)= 1, sum1(n)= 3, sum1(n)= 6, sum1(n)=10, sum1(n)=15, sum1(n)=21, sum1(n)=28, sum1(n)=36, sum1(n)=45, sum1(n)=55, sum2(n)= 1, sum2(n)= 5, sum2(n)= 14, sum2(n)= 30, sum2(n)= 55, sum2(n)= 91, sum2(n)=140, sum2(n)=204, sum2(n)=285, sum2(n)=385, sum3(n)= 1, sum3(n)= 9, sum3(n)= 36, sum3(n)= 100, sum3(n)= 225, sum3(n)= 441, sum3(n)= 784, sum3(n)=1296, sum3(n)=2025, sum3(n)=3025, sum4(n)= 1, sum4(n)= 17, sum4(n)= 98, sum4(n)= 354, sum4(n)= 979, sum4(n)= 2275, sum4(n)= 4676, sum4(n)= 8772, sum4(n)=15333, sum4(n)=25333, func0(n)= 14 func0(n)= 96 func0(n)= 390 func0(n)= 1178 func0(n)= 2928 func0(n)= 6342 func0(n)=12404 func0(n)=22428 func0(n)=38106 func0(n)=61556 演習10-0 • 下記のように表示するプログラムを作成せよ . 2段に入れ子になったfor文を使うこと. (横に8列,縦に3行) ######## ######## ######## 演習10-1 • 下記のように表示するプログラムを作成せよ . 2段に入れ子になったfor文を使うこと. # ## ### #### ##### 演習10-2 • 下記のように表示するプログラムを作成せよ . 2段に入れ子になったfor文を使うこと. ***** #**** ##*** ###** ####* ##### 演習10-3 • 下記のように表示するプログラムを作成せよ . 2段に入れ子になったfor文を使うこと. .......... ....##.... ...####... ..######.. .########. ########## 演習10-4 • 下記のように表示するプログラムを作成せよ . 2段に入れ子になったfor文を使うこと. 1 12 123 1234 12345 演習10-5 • 下記のように表示するプログラムを作成せよ . 2段に入れ子になったfor文を使うこと. ....11.... ...2222... ..333333.. .44444444. 5555555555 演習10-6 • 下記のように表示するプログラムを作成せよ . 2段に入れ子になったfor文を使うこと. ....1 ...12 ..123 .1234 12345 演習10-7 • 下記のように表示するプログラムを作成せよ . 2段に入れ子になったfor文を使うこと. ....# ...#. ..#.. .#... #.... 演習10-8 • 下記のように表示するプログラムを作成せよ . 2段に入れ子になったfor文を使うこと. ....1 ...21 ..321 .4321 54321 演習11-0 • 引数yearがうるう年であるか否かを判別す る関数int is_uruu(int year)を作成 せよ. – 戻り値は,うるう年なら1を返し,そうでなければ0 を返す. • 関数is_uruuをmain関数より呼び出せ. • うるう年の条件は次スライドを参照 演習11-0 (con't) • 4の倍数なら,うるう年である. ただし100の倍数は,うるう年でない. ただし400の倍数は,うるう年である. 演習11-1 • y年m月が何日まであるかを求める関数 int maxday_of_month(int y, int m) を作成せよ. そして,main()関数より呼び出せ. – if文を使って 列挙するだけでよい.つまり, もしmが1,3,5,7,8,10,12なら31, もしmが4,6,9,11なら31, もしmが2なら,yがうるう年なら29,でなければ 28 演習11-2 • 西暦y年m月d日と西暦y年1月1日が,何日離 れているか計算する関数 int days_from(int y, int m, int d) を作成せよ. – 例:days_from(2112,1,1)は0 – day_from(2112,1,2)は1 – day_from(2112,3,4)は63 – day_from(2112,9,3)は246 演習11-3 • 西暦y年m月d日と西暦1900年1月1日が,何 日離れているか計算する関数を作成せよ. ただし,1900<=yとする. うるう年を考慮に入れよ. • 例:2000年1月1日なら36524日,2001年 12月31日なら37254日,2002年1月1日な ら37255日となる. 演習11-4 • 西暦y年m月d日が,何曜日であるかを求める関数 を作成せよ. – 日曜日なら戻り値0,月曜日なら1,火曜日なら2,水曜日 なら3,木曜日なら4,金曜日なら5,土曜日なら6. ただし,1900<=yとする.うるう年を考慮に入れよ. • ヒント:1900年1月1日は,月曜日である. 1900年1月1日とy年m月d日が何日離れているか 計算し,7で割ったあまりを求めれば良い. 演習11-5 • 西暦y年m月のカレンダーを表示するプログラ ムを作成せよ.下記のサンプルに従え. (表示をそろえるのは,かなり難しい) Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 演習12 • 以下の12-0から12-5を作成せよ. • 使用するデータはWeb上の手助けを用いよ. 演習12-? で使用するデータ 100 90 80 70 y 60 50 40 30 20 10 0 0 10 20 30 40 50 x 60 70 80 90 100 演習12-0 • int x[20] と int y[20] がある. x[20] と y[20] の全て(40個)を printf で表示せよ. – x[0]~x[19] と y[0]~y[19] の値はWeb 上の手助けを参照せよ. – 実行結果は,次スライド参照 演習12-0の実行結果 x[0] = 49 x[1] = 92 x[2] = 67 x[3] = 69 x[4] = 25 x[5] = 86 x[6] = 29 x[7] = 64 x[8] = 91 x[9] = 37 x[10] = 53 x[11] = 53 x[12] = 53 x[13] = 29 x[14] = 53 x[15] = 61 x[16] = 86 x[17] = 79 x[18] = 54 x[19] = 30 y[0] = 31 y[1] = 93 y[2] = 59 y[3] = 69 y[4] = 24 y[5] = 77 y[6] = 22 y[7] = 75 y[8] = 75 y[9] = 26 y[10] = 57 y[11] = 46 y[12] = 54 y[13] = 48 y[14] = 53 y[15] = 60 y[16] = 70 y[17] = 90 y[18] = 39 y[19] = 14 演習12-1 • x[20] と y[20]の平均を求め, printf で表示せよ. – 平均が整数になるとは限らないことに注意せよ. – 実行結果は以下の通りになるはずである. X平均=58.000000 Y平均=54.100000 演習12-2 • x[0]とx[]の平均の差がx[0]の偏差であ る. x[0]~x[19]の偏差,y[0]~y[19] の偏差を表示せよ. – ここでの"差"とは引き算結果のことであり,負の 数にもなることに注意せよ. – x[0]>xの平均 ならば,偏差は正. – x[0]<xの平均 ならば,偏差は負. – 実行結果は,次スライド参照 演習12-2の実行結果 x[0]の偏差=-9.000000 x[1]の偏差=34.000000 x[2]の偏差=9.000000 x[3]の偏差=11.000000 x[4]の偏差=-33.000000 x[5]の偏差=28.000000 x[6]の偏差=-29.000000 x[7]の偏差=6.000000 x[8]の偏差=33.000000 x[9]の偏差=-21.000000 x[10]の偏差=-5.000000 x[11]の偏差=-5.000000 x[12]の偏差=-5.000000 x[13]の偏差=-29.000000 x[14]の偏差=-5.000000 x[15]の偏差=3.000000 x[16]の偏差=28.000000 x[17]の偏差=21.000000 x[18]の偏差=-4.000000 x[19]の偏差=-28.000000 y[0]の偏差=-23.100000 y[1]の偏差=38.900000 y[2]の偏差=4.900000 y[3]の偏差=14.900000 y[4]の偏差=-30.100000 y[5]の偏差=22.900000 y[6]の偏差=-32.100000 y[7]の偏差=20.900000 y[8]の偏差=20.900000 y[9]の偏差=-28.100000 y[10]の偏差=2.900000 y[11]の偏差=-8.100000 y[12]の偏差=-0.100000 y[13]の偏差=-6.100000 y[14]の偏差=-1.100000 y[15]の偏差=5.900000 y[16]の偏差=15.900000 y[17]の偏差=35.900000 y[18]の偏差=-15.100000 y[19]の偏差=-40.100000 演習12-3 • x[20] と y[20]の共分散を求め, 表示せよ. – 結果は,以下のようになるはずである. 共分散=415.900000 演習12-4 • x[20]の分散と標準偏差を求め,表示せよ. 同様にy[20]の分散と標準偏差も表示せよ – 結果は,以下のようになるはずである. X分散=434.700000 X標準偏差=20.849460 Y分散=497.090000 Y標準偏差=22.295515 – ヒント:xの平方根を求めるには #include <math.h> をmainよりも前に書く. y = sqrt(x) で,yにxの平方根が入る. 演習12-5 • x[20] と y[20]の相関係数を求め, 表示せよ. – 結果は,以下のようになるはずである. 相関係数=0.894698 特別課題 • あまりにも優秀すぎて, 時間をもてあましている人へ 演習 Bronze • Othello用の表示プログラムを作成せよ. • 8×8の配列(int cell[8][8])を作り, そこに0,1,-1を格納する.それぞれ,空,黒 ,白を意味する. • そして,その情報を8×8のマス目として表示 するプログラムを作成せよ. – ただし,cell[y][x]とせよ. – 白「○」,黒「●」,空白「・」と表示せよ. 演習 Bronze (con’t) • 実行結果例 ・・・・・・・・ ・・・・・・・・ ・・・・・・・・ ・・・○●・・・ ・・・●○・・・ ・・・・・・・・ ・・・・・・・・ ・・・・・・・・ cell[3][3]=-1; cell[3][4]=1; cell[4][3]=1; cell[4][4]=-1; それ以外=0 の例 ・・・・・・・・ ・・・・・・・・ ・・・・・・・・ ・・・○●・・・ ・・・●●●・・ ・・・・・・・・ ・・・・・・・・ ・・・・・・・・ cell[3][3]=-1; cell[3][4]=1; cell[4][3]=1; cell[4][4]=1; cell[4][5]=1; それ以外=0 の例 ・・・・・・・・ ・・・・・・・・ ・・・・・・・・ ・・・○●・・・ ・・・○●●・・ ・・・○・・・・ ・・・・・・・・ ・・・・・・・・ cell[3][3]=-1; cell[3][4]=1; cell[4][3]=-1; cell[4][4]=1; cell[4][5]=1; cell[5][3]=-1; それ以外=0 の例 ・・・・・・・・ ・・・・・・・・ ・・・・・・・・ ・・・○●・・・ ・・●●●●・・ ・・・○・・・・ ・・・・・・・・ ・・・・・・・・ cell[3][3]=-1; cell[3][4]=1; cell[4][2]=1; cell[4][3]=1; cell[4][4]=1; cell[4][5]=1; cell[5][3]=-1; それ以外=0 の例 演習 Bronze (con’t) • 必然的に,以下の処理が必要となる. – cell[0][0]~cell[7][7]の64個すべてに ,0を代入. – その後, cell[3][3] = -1; cell[3][4] = 1; cell[4][3] = 1; cell[4][4] = -1; 演習 Silver • ユーザからの入力を受け付けるプログラムを 作成せよ. – Windowsであれば,getch()によりユーザから の入力を受け取ることができる. – 横座標としてA~Hの入力を受け付ける. • それ以外が入力されたら再入力を促す. • A~Hが入力されたら,0~7に変換. • Webページ上にヒントあり 演習 Silver (con’t) ヒント printf(“横座標(A-H)を入力してください.Q を入力で終了> "); ch = getch(); printf("\n"); // 大文字だったら,小文字に変換 if( 'A'<=ch && ch<='Z' ){ ??? } // 正しい入力か調査 if( ??? ){ ??? } else { ??? } 演習 Gold • 2人プレイ用Othelloを作成せよ。 – 8×8の配列を作り、そこに0,1,-1が格納されて いる。それぞれ、空、黒、白を意味する。そして、 その情報を8×8のマス目として表示。 – 人間(二人)の入力を受け取り、オセロをプレイ 可能とする。「石を置けるか否か」の判断や、石を 置いたときの「ひっくり返し」の処理を行う。 123 演習 Platinum • 1人プレイ用Othelloを作成せよ。 – 人間の相手をするコンピュータ – ヒント:開放度理論など 124 後期 以後, プログラミング演習II(後期)の 課題です. 演習13-0 • 区間 [ 6.0 , 9.0 ] を 30等分し,そ れぞれの区間の境界を xi とする. すなわち x0=6.0,x1=6.1,…,x30=9.0 である. x0~x30の31個の値をprintfで表示せよ. 126 演習13-1 • 区間 [ 6.0 , 9.0 ] を 30等分し,そ れぞれの区間の境界を xi とする. すなわち x0=6.0,x1=6.1,…,x30=9.0 である. f(x)=x2とする. f(x0)~f(x30)の31個の値をprintfで表示せ よ. 127 実行結果 f(6.000000)=36.000000 f(6.100000)=37.210000 f(6.200000)=38.440000 f(6.300000)=39.690000 f(6.400000)=40.960000 f(6.500000)=42.250000 f(6.600000)=43.560000 f(6.700000)=44.890000 f(6.800000)=46.240000 f(6.900000)=47.610000 f(7.000000)=49.000000 f(7.100000)=50.410000 f(7.200000)=51.840000 f(7.300000)=53.290000 f(7.400000)=54.760000 f(7.500000)=56.250000 f(7.600000)=57.760000 f(7.700000)=59.290000 f(7.800000)=60.840000 f(7.900000)=62.410000 f(8.000000)=64.000000 f(8.100000)=65.610000 f(8.200000)=67.240000 f(8.300000)=68.890000 f(8.400000)=70.560000 f(8.500000)=72.250000 f(8.600000)=73.960000 f(8.700000)=75.690000 f(8.800000)=77.440000 f(8.900000)=79.210000 f(9.000000)=81.000000 演習13-2 • 区間 [ 6.0 , 9.0 ] を 30等分し,そ れぞれの区間の境界を xi とする.すなわち x0=6.0,x1=6.1,…,x30=9.0 である. f(x)=x2とする. 区分求積法における区間[xi,xi+1]の短冊の 面積を表示せよ.短冊が30個あるので,面積 は30個表示される.短冊の縦の長さは, f(xi+1)ではなく, f(xi)を用いよ. ヒント:短冊の横の長さは(9.0-6.0)/30である. 129 実行結果 f(6.000000)=36.000000 f(6.100000)=37.210000 f(6.200000)=38.440000 f(6.300000)=39.690000 f(6.400000)=40.960000 f(6.500000)=42.250000 f(6.600000)=43.560000 f(6.700000)=44.890000 f(6.800000)=46.240000 f(6.900000)=47.610000 f(7.000000)=49.000000 f(7.100000)=50.410000 f(7.200000)=51.840000 f(7.300000)=53.290000 f(7.400000)=54.760000 f(7.500000)=56.250000 f(7.600000)=57.760000 f(7.700000)=59.290000 f(7.800000)=60.840000 f(7.900000)=62.410000 f(8.000000)=64.000000 f(8.100000)=65.610000 f(8.200000)=67.240000 f(8.300000)=68.890000 f(8.400000)=70.560000 f(8.500000)=72.250000 f(8.600000)=73.960000 f(8.700000)=75.690000 f(8.800000)=77.440000 f(8.900000)=79.210000 area=3.600000 area=3.721000 area=3.844000 area=3.969000 area=4.096000 area=4.225000 area=4.356000 area=4.489000 area=4.624000 area=4.761000 area=4.900000 area=5.041000 area=5.184000 area=5.329000 area=5.476000 area=5.625000 area=5.776000 area=5.929000 area=6.084000 area=6.241000 area=6.400000 area=6.561000 area=6.724000 area=6.889000 area=7.056000 area=7.225000 area=7.396000 area=7.569000 area=7.744000 area=7.921000 演習13-3 • 区分求積法により 9 2 x dx 6 を求めよ.(つまり30個の短冊の面積の合計) ただし,区間 [ 6.0 , 9.0 ] を30等分 し,短冊の縦の長さは,f(xi+1)ではなく, f(xi)を 用いよ. – ヒント:30個の短冊の面積の合計を出す.誤差が なければ答えは171である. 131 演習13-4 • 区分求積法により 9 2 x dx 6 ここが変わった だけの問題 を求めよ.(つまり30個の短冊の面積の合計) ただし,区間 [ 6.0 , 9.0 ] を300等 分し,短冊の縦の長さは,f(xi+1)ではなく, f(xi)を用いよ. 132 演習13-5 • 区分求積法台形公式により 9 2 x dx 6 を求めよ.(つまり30個の短冊の面積の合計) ただし,区間 [ 6.0 , 9.0 ] を30等分 し,短冊の縦の長さは,f(xi+1)ではなく, f(xi)を 用いよ. 133 演習13-6 • 区分求積法非台形公式により,右下の扇形 (1/4の円)の面積を求め表示せよ. 1.0 – 扇形の面積はπ/4である. 面積の4倍の値も表示せよ. – 分割数は100. 0.8 0.6 0.4 x, 1 x 2 0.2 0 0 0.2 0.4 0.6 0.8 1.0 演習13-7 • 区分求積法台形公式により,右下の扇形 (1/4の円)の面積を求め表示せよ. 1.0 – 扇形の面積はπ/4である. 面積の4倍の値も表示せよ. – 分割数は100. 0.8 0.6 0.4 x, 1 x 2 0.2 0 0 0.2 0.4 0.6 0.8 1.0 演習13-8 • 区分求積法台形公式により,右下の扇形 (1/4の円)の面積を求め表示せよ. 1.0 – 扇形の面積はπ/4である. 面積の4倍の値も表示せよ. – ただし,分割数を10, 100,1000,10000,100 000と変化させ,その結果 を比較せよ. 0.8 0.6 0.4 x, 1 x 2 0.2 0 0 0.2 0.4 0.6 0.8 1.0 実行結果 面積=0.776130, 面積=0.785104, 面積=0.785389, 面積=0.785398, 面積=0.785398, pi=3.104518 pi=3.140417 pi=3.141555 pi=3.141591 pi=3.141593 (分割 (分割 (分割 (分割 (分割 10) 100) 1000) 10000) 100000) 演習13-9 • xを0, 0.01, 0.02, 0.03,…,0.99と, yも0, 0.01, 0.02, 0.03,…,0.99と変化させる. – x,yともに100通り → (x,y)は100×100=10,000通り. • もし(x2+y2<1.0)なら,点(x,y)は扇形の内部. そうでなければ点(x,y)は扇形の外部にある. • 全10,000点のうち,内部にある点の数を数える. • 内部数/全数 ≒ 扇形面積/正方形面積 1.0 扇形の面積はπ/4,正方形の面積は1. 0.8 よって,4×(内部数/全数)=πとなり, 0.6 πの値を求めることができる. – 分割数を増やせば,より正確になる. x, y 0.4 0.2 0 0 0.2 0.4 0.6 0.8 1.0 演習14 • 以下の演習14において,f ( x) x である. – 演習14は,レポート課題(い)と同一である. y x y 2 1 x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 0 0 1 2 x 3 4 5 平方根について • C言語では平方根は関数sqrt()により求める. • x = sqrt( y ); ↑これで,xに が代入される. • 関数sqrtを使用するには,ファイルの冒頭近辺に y #include <math.h> と書く必要がある. – ただし,VisualC++の場合は, #include "stdafx.h" の後に,#include <math.h> と書く. 演習14-0 5 • 区分求積法により,3 xdx の近似値を求め, その値(面積)を表示するプログラムを作成 せよ. ただし,次スライドの様に,分割数は10とし, 短冊の高さとしては左側の値を用いよ. 3 y 2 1 0 0 1 2 3 x 4 5 6 演習14-1 5 • 区分求積法により,3 xdx の近似値を求め, その値(面積)を表示するプログラムを作成 せよ. ただし,次スライドの様に,分割数は10とし, 短冊の高さとしては右側の値を用いよ. 3 y 2 1 0 0 1 2 3 x 4 5 6 演習14-2 5 • 区分求積法により,3 xdx の近似値を求め, その値(面積)を表示するプログラムを作成 せよ. ただし,次スライドの様に,分割数は10とし, 台形公式を用いよ. 3 y 2 1 0 0 1 2 3 x 4 5 6 演習14-3 5 • 定積分3 xdx の値を,以下の様に算出手法を変化さ せて求め,それぞれの値を比較せよ. – 短冊の高さとして,(a)左側の値を用いる,(b)右側の値 を用いる,(c)台形公式を用いる,と変化させる. – 分割数を(a)10分割, (b)100分割, (c)1000分割, (d)10000分割, (e)100000分割 と変化させる. • 組み合わせは 3×5=15 通りあるので,それぞれ の手法で面積を求め,解析的に(数学を用いて)求 めた正確な値と比較せよ. 演習15-0 • 長さ10のint型配列 int a[10] がある. a[0]~a[9]には,0 または 1 が格納さ れている.a[0]~a[9]を表示するプログラ ムを作成せよ. 出力形式は,右下の例にならえ. a[10]の初期化部は,Web上位の手助けを コピーせよ. 例 a[0] = 0 a[1] = 1 a[2] = 1 すなわち, a[?] 半角空白 = 半角空白 数字 改行 148 演習15-1 • 長さ10のint型配列 int a[10] がある. a[0]~a[9]には,0 または 1 が格納さ れている. a[0]~a[9]の中に,何個“1”が含まれてい るか数え,それを出力せよ. 出力形式は,右下の例にならえ. a[10]の初期化部は,Web上位の手助けを コピーせよ. ans=7 149 演習15-2 • 長さ10のint型配列 int a[10] がある. a[0]~a[9]には,0 または 1 が格納さ れている. 1が2個連続並んでいる箇所のみを抽出して 出力せよ.出力形式は,右下の例にならえ. a[10]の初期化部は,Web上位の手助けを コピーせよ. a[1]==a[2]==1 a[2]==a[3]==1 a[3]==a[4]==1 a[6]==a[7]==1 150 演習15-3 • 長さ15x15のint型2次元配列 int a[15][15] がある.a[0][0]~ a[14][14]には,0 または 1 が格納されて いる. a[0][0]~a[14][14]を,次の条件に従って 出力せよ.もし,a[?][?]が“0”なら,“・”を出 力(全角の点を出力). a[?][?]が“1”なら, “@”を出力(全角のアットマークを出力) 出力形式は,次のページの指示に従え. 151 a[0][0] a[0][1] a[1][3] 横が1,縦が3 a[1][0] a[2][0] a[14][0] ・@@・@@・・@@・@・・・ @@・・@@・・@@@@・@@ ・・@・・・・@・@@@・@@ ・@@・@@・・@@・@・・・ @@・・@@・・@@@@・@@ ・・@・・・・・・@@@・@@ ・@@・@@・・@@・@・・・ @@・・@@・・@@@@・@@ ・・@・・・・・・@@@・@@ ・@@・@@・・@@・@・・・ @@・・@@・・@@@@・@@ ・・@・・・・・・@@@・@@ ・・・・@@@・@・@・・@@ ・・・・@@@・@・@・・@@ ・・・・@@@・@・@・・@@ 152 演習15-4 • 長さ15x15のint型2次元配列 int a[15][15] がある.a[0][0]~ a[14][14]には,0 または 1 が格納され ている. 縦横長さ2の正方形型に0が連続している箇 所を抽出し出力せよ. 次ページを参考にせよ. 153 ・@@・@@・・@@・@・・・ @@・・@@・・@@@@・@@ ・・@・・・・@・@@@・@@ ・@@・@@・・@@・@・・・ @@・・@@・・@@@@・@@ ・・@・・・・・・@@@・@@ ・@@・@@・・@@・@・・・ @@・・@@・・@@@@・@@ ・・@・・・・・・@@@・@@ ・@@・@@・・@@・@・・・ @@・・@@・・@@@@・@@ ・・@・・・・・・@@@・@@ ・・・・@@@・@・@・・@@ ・・・・@@@・@・@・・@@ ・・・・@@@・@・@・・@@ このように, 縦横2x2の 正方形に, 0が繋がっている 箇所を探す. 154 演習15-5 • 長さ15x15のint型2次元配列 int a[15][15] がある.a[0][0]~ a[14][14]には,0 または 1 が格納され ている. 2次元平面で考えて,連続して0となっている 正方形領域で,最大のものを見つけよ. ヒント:長さ5の正方形が見つかる. 155 この例では, 横座標0, 縦座標12を 左上の頂点とする 3x3の長方形が最大 この領域は, 3x3の正方形 ・@@・@@・・@@・@・・・ @@・・@@・・@@@@・@@ ・・@・・・・@・@@@・@@ ・@@・@@・・@@・@・・・ @@・・@@・・@@@@・@@ ・・@・・・・・・@@@・@@ ・@@・@@・・@@・@・・・ @@・・@@・・@@@@・@@ ・・@・・・・・・@@@・@@ ・@@・@@・・@@・@・・・ @@・・@@・・@@@@・@@ ・・@・・・・・・@@@・@@ ・・・・@@@・@・@・・@@ ・・・・@@@・@・@・・@@ ・・・・@@@・@・@・・@@ この領域は, 2x2の正方形 演習16-0 • int data[5]があり, data[0]~data[4]は順に 72,22,50,46,57であるとする. • これをバブルソートを用いて並び替えるプロ グラムを作成せよ. • Web上の手助けを用いて良い. 157 演習16-1 • int data[10]があり, data[0]~data[9]は順に, 22,45,51,59,69,72,75,83,89, 97で あるとする. • バイナリーサーチを用いて,51が何番目に存 在するかを調べるプログラムを作成せよ. • Web上の手助けを用いて良い. 158 演習16-2 • int data[5]があり, data[0]~data[4]は順に 72,22,50,46,57であるとする. • これをバケツソートを用いて並び替えるプロ グラムを作成せよ. • int data[5]に格納されている値は0以上 100未満であることを前提として良い. • Web上の手助けを用いて良い. 159 演習17 (0/5) • トランプのポーカーのプログラムを作ります. • 5枚のカードがあって,それの役を調査するプ ログラムを作ります. 160 演習17 (1/5) • 各カードは数とスート(マーク)があります.こ れはプログラム内では,ともにint型変数で 管理されているとします.変数の値と,トラン プの数の対応は,以下の通りとする. 変数 の値 0 1 2 3 4 5 6 7 8 9 10 11 12 トランプ 2 の数 3 4 5 6 7 8 9 10 J Q K A 161 演習17 (2/5) • 変数の値と,トランプのスート(マーク)の対 応は,以下の通りとする. 変数 の値 0 1 2 3 トランプ の数 スペード ダイア ハート クラブ 162 演習17 (3/5) •例 – 変数 int num[5], int suit[5] に5枚 のカードの数とマークが格納されているとする. – num[0]が 2,suit[0]が0, num[1]が 3,suit[1]が3, num[2]が12,suit[2]が2, num[3]が10,suit[3]が0, num[4]が 7,suit[4]が3なら → ♠4 ♣5 ♥A ♠Q ♣9 演習17 (4/5) • ジョーカーは無いものとする. • Webページの手助けを使用してよい. 164 役の説明 • ワンペア:同じ数字カードが2枚あると,それ がペアと呼ばれ,5枚の中にペアが1組ある. – 例:♠5 ♣5 ♥6 ♦7 ♦8 – スートは関係ない. • ツーペア:5枚の中にペアが2組ある. – 例:♠5 ♣5 ♥7 ♦7 ♦8 – スートは関係ない. 165 役の説明 • スリーカード:同じ数のカードが3枚ある. – 例:♠5 ♣5 ♥5 ♦7 ♦8 – スートは関係ない 166 役の説明 • ストレート:5枚のカードの数字が連続してい る. – 例:♠5 ♣6 ♥7 ♦8 ♦9 – スートは関係ない. • フラッシュ:5枚のカードのスートが全て同じ. – 例:♠5 ♠K ♠A ♠8 ♠7 – 数は関係ない. 167 役の説明 • フルハウス:5枚が,ワンペア(2枚)とスリー カード(3枚)で成り立っている. – 例:♠5 ♣5 ♥5 ♦7 ♠7 – スートは関係ない. • フォーカード:同じ数のカードが4枚ある. – 例:♠5 ♣5 ♥5 ♦5 ♦8 168 役の説明 • ストレートフラッシュ:ストレートであり,かつフ ラッシュである. – 例:♠5 ♠6 ♠7 ♠8 ♠9 • ロイヤルストレートフラッシュ:A,K,Q,J,10 の5枚で構成されるストレートフラッシュ – 例:♠10 ♠J ♠Q ♠K ♠A 169 演習17-0 • 5枚のカードを与えられて,そのカードが「フラ ッシュ」あるいは「ストレートフラッシュ」あるい は「ロイヤルストレートフラッシュ」になってい るか否かを調べる関数を作成せよ. • 関数は int is_flushes(int num[5], int suit[5]) とせよ. 170 演習17-0 – 引数は,以下の通りとする. 第一引数:長さ5のint型の配列. 1~5枚目のカードの数を表す. 第二引数:長さ5のint型の配列. 1~5枚目のカードのスートを表す. – 戻り値はint型であり,以下の条件を満たすこと . 5枚のカードがフラッシュまたはストレートフラッシ ュまたはロイヤルストレートフラッシュを満たして いる場合は,「1」を返す. そうでない場合は,「0」を返す. 171 演習17-0 解答例A int is_flushes(int if( suit[0] == suit[0] == suit[0] == suit[0] == ){ return 1; } else { return 0; } } num[5], int suit[5]){ suit[1] && suit[2] && suit[3] && suit[4] 172 演習17-0 解答例B int is_flushes(int num[5], int suit[5]){ int ok = 1; int i; for(i=0; i<4; i++){ if( suit[i] != suit[i+1] ){ ok = 0; break; } } return ok; } 173 演習17-1 • 5枚のカードを与えられて,そのカードが「スト レート」か「ストレートフラッシュ」 か「ロイヤル ストレートフラッシュ」になっているかを調べる 関数を作成せよ. int is_straightes(int num[5], int suit[5]) – 引数は,演習5-0と同様. – 戻り値はint型であり,ストレート,ストレートフラ ッシュ,ロイヤルストレートフラッシュになっている 場合は「1」を返し, そうでない場合は「0」を返す. 174 演習17-2 • 5枚のカードを与えられて,そのカードが「4カ ード」になっているか否かを調べる関数を作 成せよ. int is_4cards(int num[5], int suit[5]) – 引数,戻り値は,演習5-0と同様. 175 演習17-3 • 5枚のカードを与えられて,そのカードが「フル ハウス」になっているか否かを調べる関数を 作成せよ. int is_fullhouse(int num[5], int suit[5]) – 引数,戻り値は,演習5-0と同様. 176 演習17-4 • 5枚のカードを与えられて,そのカードが「3カ ード」になっているか否かを調べる関数を作 成せよ. int is_3cards(int num[5], int suit[5]) – 引数,戻り値は,演習5-0と同様. – 「4カード」になっていたら,「3カード」とは言えな いことに注意せよ. – 同様に,「フルハウス」も「3カード」とは言えない. 177 演習17-5 • 5枚のカードを与えられて,そのカードが「2ペ ア」になっているか否かを調べる関数を作成 せよ. int is_2pairs(int num[5], int suit[5]) – 引数,戻り値は,演習5-0と同様. – 「4カード」,「フルハウス」は「2ペア」とは言えない ことに注意せよ. – 当然,「3カード」も「2ペア」ではない. 178 演習17-6 • 5枚のカードを与えられて,そのカードが「1ペ ア」になっているか否かを調べる関数を作成 せよ. int is_1pair(int num[5], int suit[5]) – 引数,戻り値は,演習5-0と同様. – 同様に,他の役になっていたら「ワンペア」になら ないことに注意せよ. 179 演習18-0 (0/5) • 長さ20x10のint型2次元配列 int data[20][10] がある. • data[0][0]~a[19][9]には,0か1か2 が格納されている. – 変数の初期化に関しては,Web上の手助けを利 用して良い. • 次のページに続く 180 演習18-0 (1/5) • data[0][0]~data[19][9]を,次の条 件に従って出力せよ. – a[?][?]が“0”なら,“・”を出力. “・”は日本語入力モードで"/"を押す. – a[?][?]が“1”なら,“■”を出力. “■”は日本語入力モードで「しかく」と入力し変換する. – a[?][?]が“2”なら,“×”を出力. “×”は日本語入力モードで「ばつ」と入力し変換する. – a[?][?]がその他なら,“?”を出力. 181 演習18-0 (2/5) • 出力形式は,次のページの指示に従え. – 縦横が逆にならないよう注意! • もし"?"を発見したら,それはデータの誤り である.そのマスの値を"0"に修正せよ. 182 data[0][0] data[1][0] data[3][1] 横が1,縦が3. 演習18-0 (3/5) data[19][0] data[0][1] data[0][3] ・・・・■■・・・・ ・・・■■■・・・・ ・・■■■■・・・・ ・■■■■■・・・・ ■■■■■■・・・・ ■■・・・・・・・・ ・■■・・・・・・・ ・・■■・・・・・・ ・・・■■・・・・・ ■■■■■■■■■■ ・・・・■■・・・・ ■■■■■■■■■■ ・・・・・■■・・・ ・?・・・・■■・・ ・・・・・・・■■・ ・・・・・・・・■■ ・■■■■■■■■■ ■・■■■■■■■■ ■■・■■■■■■■ ■■■・■■■■■■ data[0][9] 183 演習18-0 (4/5) • 余裕があれば 右のように出力して みましょう. – 縦横の座標の数 を表示. 0 1 2 3 4 5 6 7 8 9 0・・・・■■・・・・ 0 1・・・■■■・・・・ 1 2・・■■■■・・・・ 2 3・■■■■■・・・・ 3 4■■■■■■・・・・ 4 5■■・・・・・・・・ 5 6・■■・・・・・・・ 6 7・・■■・・・・・・ 7 8・・・■■・・・・・ 8 9■■■■■■■■■■ 9 10・・・・■■・・・・10 11■■■■■■■■■■11 12・・・・・■■・・・12 13・?・・・・■■・・13 14・・・・・・・■■・14 15・・・・・・・・■■15 16・■■■■■■■■■16 17■・■■■■■■■■17 18■■・■■■■■■■18 19■■■・■■■■■■19 0 1 2 3 4 5 6 7 8 9 184 演習18-1 • 横一行すべて"1"である行を探し, それの全ての行番号をprintfで出力せよ. – 演習18-0のプログラムの続きとして記述せよ. 185 演習18-2 • 横一行すべて"1"である行のdata[][]の 値を,全て"2"に変更せよ. – 演習18-1のプログラムの続きとして記述せよ. 186 演習18-3 (0/2) • 演習18-2を行った状態(横一行そろっていた ら"2"に変更する)で, 再度 演習18-0の出力を行え. – 演習18-2のプログラムの続きとして記述せよ. 187 演習18-3 (1/2) 0 1 2 3 4 5 6 7 8 9 0・・・・■■・・・・ 0 1・・・■■■・・・・ 1 2・・■■■■・・・・ 2 3・■■■■■・・・・ 3 4■■■■■■・・・・ 4 5■■・・・・・・・・ 5 6・■■・・・・・・・ 6 7・・■■・・・・・・ 7 8・・・■■・・・・・ 8 9×××××××××× 9 10・・・・■■・・・・10 11××××××××××11 12・・・・・■■・・・12 13・・・・・・■■・・13 14・・・・・・・■■・14 15・・・・・・・・■■15 16・■■■■■■■■■16 17■・■■■■■■■■17 18■■・■■■■■■■18 19■■■・■■■■■■19 0 1 2 3 4 5 6 7 8 9 188 演習18-4 • 演習18-2を行った状態(横一行そろっていた ら"2"に変更する)で, data[?][?]が"2"の行は削除し, 削除された行の分は上のマスを下にずらして 表示せよ.(上から落ちてくる) – 演習18-3のプログラムの続きとして記述せよ. 189 0 1 2 3 4 5 6 7 8 9 0・・・・■■・・・・ 0 1・・・■■■・・・・ 1 2・・■■■■・・・・ 2 3・■■■■■・・・・ 3 4■■■■■■・・・・ 4 5■■・・・・・・・・ 5 6・■■・・・・・・・ 6 7・・■■・・・・・・ 7 8・・・■■・・・・・ 8 9×××××××××× 9 10・・・・■■・・・・10 11××××××××××11 12・・・・・■■・・・12 13・・・・・・■■・・13 14・・・・・・・■■・14 15・・・・・・・・■■15 16・■■■■■■■■■16 17■・■■■■■■■■17 18■■・■■■■■■■18 19■■■・■■■■■■19 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0・・・・・・・・・・ 0 1・・・・・・・・・・ 1 2・・・・■■・・・・ 2 3・・・■■■・・・・ 3 4・・■■■■・・・・ 4 5・■■■■■・・・・ 5 6■■■■■■・・・・ 6 7■■・・・・・・・・ 7 8・■■・・・・・・・ 8 9・・■■・・・・・・ 9 10・・・■■・・・・・10 11・・・・■■・・・・11 12・・・・・■■・・・12 13・・・・・・■■・・13 14・・・・・・・■■・14 15・・・・・・・・■■15 16・■■■■■■■■■16 17■・■■■■■■■■17 18■■・■■■■■■■18 19■■■・■■■■■■19 0 1 2 3 4 5 6 7 8 9 190 演習18-5 • 演習18-4を行った状態(横一行そろっている 行を削除)を左右反転し,それを表示せよ. – ゲームではこのような操作はない. – 演習18-4のプログラムの続きとして記述せよ. 191 0 1 2 3 4 5 6 7 8 9 0・・・・・・・・・・ 0 1・・・・・・・・・・ 1 2・・・・■■・・・・ 2 3・・・■■■・・・・ 3 4・・■■■■・・・・ 4 5・■■■■■・・・・ 5 6■■■■■■・・・・ 6 7■■・・・・・・・・ 7 8・■■・・・・・・・ 8 9・・■■・・・・・・ 9 10・・・■■・・・・・10 11・・・・■■・・・・11 12・・・・・■■・・・12 13・・・・・・■■・・13 14・・・・・・・■■・14 15・・・・・・・・■■15 16・■■■■■■■■■16 17■・■■■■■■■■17 18■■・■■■■■■■18 19■■■・■■■■■■19 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0・・・・・・・・・・ 0 1・・・・・・・・・・ 1 2・・・・■■・・・・ 2 3・・・・■■■・・・ 3 4・・・・■■■■・・ 4 5・・・・■■■■■・ 5 6・・・・■■■■■■ 6 7・・・・・・・・■■ 7 8・・・・・・・■■・ 8 9・・・・・・■■・・ 9 10・・・・・■■・・・10 11・・・・■■・・・・11 12・・・■■・・・・・12 13・・■■・・・・・・13 14・■■・・・・・・・14 15■■・・・・・・・・15 16■■■■■■■■■・16 17■■■■■■■■・■17 18■■■■■■■・■■18 19■■■■■■・■■■19 0 1 2 3 4 5 6 7 8 9 192 演習18-6 • 演習18-5を行った状態(左右反転した状態) で,下記の位置にL字型ブロックを配置できる か否かを調査し,結果(置けるor置けない) を表示せよ. – 対象座標は(2,0),(3,0),(3,1),(3,2). – L字型ブロックを置こうとする場所が空いていれ ば「置ける」.そうでない場合は「置けない」 – 演習18-5のプログラムの続きとして記述せよ. – ヒント:答えは「置ける」 193 0 1 2 3 4 5 6 7 8 9 0・・##・・・・・・ 0 1・・・#・・・・・・ 1 2・・・#■■・・・・ 2 3・・・・■■■・・・ 3 4・・・・■■■■・・ 4 5・・・・■■■■■・ 5 6・・・・■■■■■■ 6 7・・・・・・・・■■ 7 8・・・・・・・■■・ 8 9・・・・・・■■・・ 9 10・・・・・■■・・・10 11・・・・■■・・・・11 12・・・■■・・・・・12 13・・■■・・・・・・13 14・■■・・・・・・・14 15■■・・・・・・・・15 16■■■■■■■■■・16 17■■■■■■■■・■17 18■■■■■■■・■■18 19■■■■■■・■■■19 0 1 2 3 4 5 6 7 8 9 ここに,L字型ブロックを 置けるか否かを調査 194 演習18-7 • 演習18-5を行った状態で,下記の位置にL 字型ブロックを配置し,一番下まで落とした状 態を作成し,演習18-0の方法で表示せよ. – 対象座標は(2,0),(3,0),(3,1),(3,2). – 回転,横移動などの人間の操作は無いものとす る. – 演習18-6のプログラムの続きとして記述せよ. 195 0 1 2 3 4 5 6 7 8 9 0・・##・・・・・・ 0 1・・・#・・・・・・ 1 2・・・#■■・・・・ 2 3・・・・■■■・・・ 3 4・・・・■■■■・・ 4 5・・・・■■■■■・ 5 6・・・・■■■■■■ 6 7・・・・・・・・■■ 7 8・・・・・・・■■・ 8 9・・・・・・■■・・ 9 10・・・・・■■・・・10 11・・・・■■・・・・11 12・・・■■・・・・・12 13・・■■・・・・・・13 14・■■・・・・・・・14 15■■・・・・・・・・15 16■■■■■■■■■・16 17■■■■■■■■・■17 18■■■■■■■・■■18 19■■■■■■・■■■19 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0・・・・・・・・・・ 0 1・・・・・・・・・・ 1 2・・・・■■・・・・ 2 3・・・・■■■・・・ 3 4・・・・■■■■・・ 4 5・・・・■■■■■・ 5 6・・・・■■■■■■ 6 7・・・・・・・・■■ 7 8・・・・・・・■■・ 8 9・・■■・・■■・・ 9 10・・・■・■■・・・10 11・・・■■■・・・・11 12・・・■■・・・・・12 13・・■■・・・・・・13 14・■■・・・・・・・14 15■■・・・・・・・・15 16■■■■■■■■■・16 17■■■■■■■■・■17 18■■■■■■■・■■18 19■■■■■■・■■■19 0 1 2 3 4 5 6 7 8 9 196 演習18-8 • 演習18-7を行った状態で,演習18-7同様に 凸字型ブロックを下記の座標より落とせ. そして,その状態を演習18-0の方法で表示 せよ. – 対象座標は(1,0),(2,0),(2,1),(3,0). – 演習18-7のプログラムの続きとして記述せよ. 197 0 1 2 3 4 5 6 7 8 9 0・###・・・・・・ 0 1・・#・・・・・・・ 1 2・・・・■■・・・・ 2 3・・・・■■■・・・ 3 4・・・・■■■■・・ 4 5・・・・■■■■■・ 5 6・・・・■■■■■■ 6 7・・・・・・・・■■ 7 8・・・・・・・■■・ 8 9・・■■・・■■・・ 9 10・・・■・■■・・・10 11・・・■■■・・・・11 12・・・■■・・・・・12 13・・■■・・・・・・13 14・■■・・・・・・・14 15■■・・・・・・・・15 16■■■■■■■■■・16 17■■■■■■■■・■17 18■■■■■■■・■■18 19■■■■■■・■■■19 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0・・・・・・・・・・ 0 1・・・・・・・・・・ 1 2・・・・■■・・・・ 2 3・・・・■■■・・・ 3 4・・・・■■■■・・ 4 5・・・・■■■■■・ 5 6・・・・■■■■■■ 6 7・■■■・・・・■■ 7 8・・■・・・・■■・ 8 9・・■■・・■■・・ 9 10・・・■・■■・・・10 11・・・■■■・・・・11 12・・・■■・・・・・12 13・・■■・・・・・・13 14・■■・・・・・・・14 15■■・・・・・・・・15 16■■■■■■■■■・16 17■■■■■■■■・■17 18■■■■■■■・■■18 19■■■■■■・■■■19 0 1 2 3 4 5 6 7 8 9 198 演習18-9 • 演習18-8を行った状態で,演習18-7や188と同様に一文字型ブロックを下記の座標よ り落とせ.そして,演習18-0の方法で表示せ よ. – 対象座標は(0,0),(1,0),(2,0),(3,0). – 演習18-8のプログラムの続きとして記述せよ. 199 0 1 2 3 4 5 6 7 8 9 0####・・・・・・ 0 1・・・・・・・・・・ 1 2・・・・■■・・・・ 2 3・・・・■■■・・・ 3 4・・・・■■■■・・ 4 5・・・・■■■■■・ 5 6・・・・■■■■■■ 6 7・■■■・・・・■■ 7 8・・■・・・・■■・ 8 9・・■■・・■■・・ 9 10・・・■・■■・・・10 11・・・■■■・・・・11 12・・・■■・・・・・12 13・・■■・・・・・・13 14・■■・・・・・・・14 15■■・・・・・・・・15 16■■■■■■■■■・16 17■■■■■■■■・■17 18■■■■■■■・■■18 19■■■■■■・■■■19 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0・・・・・・・・・・ 0 1・・・・・・・・・・ 1 2・・・・■■・・・・ 2 3・・・・■■■・・・ 3 4・・・・■■■■・・ 4 5・・・・■■■■■・ 5 6■■■■■■■■■■ 6 7・■■■・・・・■■ 7 8・・■・・・・■■・ 8 9・・■■・・■■・・ 9 10・・・■・■■・・・10 11・・・■■■・・・・11 12・・・■■・・・・・12 13・・■■・・・・・・13 14・■■・・・・・・・14 15■■・・・・・・・・15 16■■■■■■■■■・16 17■■■■■■■■・■17 18■■■■■■■・■■18 19■■■■■■・■■■19 0 1 2 3 4 5 6 7 8 9 200 演習18-10 • 演習18-9を行った状態で,再度演習18-1 ~18-4の作業を行え. – すなわち,以下を行う. • 横一列全て1である行を探し行番号を表示する. • その行のdataの値を2にする. • その状態で18-0の出力を行う. • dataが2の行は削除し,上のマスはずらす • その状態で再度18-0の出力を行う. – 演習18-9のプログラムの続きとして記述せよ. 201 0 1 2 3 4 5 6 7 8 9 0・・・・・・・・・・ 0 1・・・・・・・・・・ 1 2・・・・■■・・・・ 2 3・・・・■■■・・・ 3 4・・・・■■■■・・ 4 5・・・・■■■■■・ 5 6■■■■■■■■■■ 6 7・■■■・・・・■■ 7 8・・■・・・・■■・ 8 9・・■■・・■■・・ 9 10・・・■・■■・・・10 11・・・■■■・・・・11 12・・・■■・・・・・12 13・・■■・・・・・・13 14・■■・・・・・・・14 15■■・・・・・・・・15 16■■■■■■■■■・16 17■■■■■■■■・■17 18■■■■■■■・■■18 19■■■■■■・■■■19 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0・・・・・・・・・・ 0 1・・・・・・・・・・ 1 2・・・・■■・・・・ 2 3・・・・■■■・・・ 3 4・・・・■■■■・・ 4 5・・・・■■■■■・ 5 6×××××××××× 6 7・■■■・・・・■■ 7 8・・■・・・・■■・ 8 9・・■■・・■■・・ 9 10・・・■・■■・・・10 11・・・■■■・・・・11 12・・・■■・・・・・12 13・・■■・・・・・・13 14・■■・・・・・・・14 15■■・・・・・・・・15 16■■■■■■■■■・16 17■■■■■■■■・■17 18■■■■■■■・■■18 19■■■■■■・■■■19 0 1 2 3 4 5 6 7 8 9 202 0 1 2 3 4 5 6 7 8 9 0・・・・・・・・・・ 0 1・・・・・・・・・・ 1 2・・・・■■・・・・ 2 3・・・・■■■・・・ 3 4・・・・■■■■・・ 4 5・・・・■■■■■・ 5 6×××××××××× 6 7・■■■・・・・■■ 7 8・・■・・・・■■・ 8 9・・■■・・■■・・ 9 10・・・■・■■・・・10 11・・・■■■・・・・11 12・・・■■・・・・・12 13・・■■・・・・・・13 14・■■・・・・・・・14 15■■・・・・・・・・15 16■■■■■■■■■・16 17■■■■■■■■・■17 18■■■■■■■・■■18 19■■■■■■・■■■19 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0・・・・・・・・・・ 0 1・・・・・・・・・・ 1 2・・・・・・・・・・ 2 3・・・・■■・・・・ 3 4・・・・■■■・・・ 4 5・・・・■■■■・・ 5 6・・・・■■■■■・ 6 7・■■■・・・・■■ 7 8・・■・・・・■■・ 8 9・・■■・・■■・・ 9 10・・・■・■■・・・10 11・・・■■■・・・・11 12・・・■■・・・・・12 13・・■■・・・・・・13 14・■■・・・・・・・14 15■■・・・・・・・・15 16■■■■■■■■■・16 17■■■■■■■■・■17 18■■■■■■■・■■18 19■■■■■■・■■■19 0 1 2 3 4 5 6 7 8 9 203 演習19 • 課題数が多いので,課題1個毎にプロジェクト を新規作成せずに,全課題を1個のプロジェ クト(1個のファイル)にすることを推奨します . 演習19-0 • char型変数 ch を宣言する. • chに 'A'を代入する. • ch をprintf()で表示する. – 結果,Aと表示されるはずである. – ヒント: 「chは文字1個か文字列か」に注意せよ. %dか? %cか? %sか? %pか? 205 演習19-1 • 'a'~'z'の26文字を順に表示する. • 表示形式は,右に習う. a b c d e f g h i : 演習19-2 • 'a'~'z'の26文字を逆順に表示する. • 表示形式は,右に習う. z y x w v u t s r : 演習19-3 • 'a'~'z'の26文字を順に表示する. 97 a • 表示形式は,右に習う. – 左の数字 97 は'a'の文字コード • ヒント,2桁以下の数字を 3桁分のスペースで表示するには printf("%3d", i); 98 99 100 101 102 103 104 105 b c d e f g h i 208 演習19-4 • char txt[7] = "Hello!"; を宣言し, txtを1文字ずつ表示して改行する. 右の様になる. H e l l o ! 209 演習19-5 • char txt[7] = "Hello!"; を宣言し, txtを1文字ずつ 文字コードと文字を表示して 改行する. 右の様になる. 72 101 108 108 111 33 H e l l o ! 210 演習19-6 • char txt[10] = "Hello!"; を宣言し, txtの文字数を数える. (答えは6文字である) – ヒント:文字列を前から調査していき, '\0'があったら文字列は終わりである. 211 演習19-7 • char txt[10] = "Hello!"; を宣言し, 1文字目の'H'を'h'に置き換えて, printf()で表示せよ. txtの文字数を数える. – ヒント:文字列をprintfで表示するには, printf("%s\n", txt); 212 演習19-8 • char txt[10] = "Hello!"; を宣言し, 小文字は大文字変更して (大文字はそのままでよい) printf() で表示せよ. 213 演習19-9 • char txt[10] = "Hello!"; を宣言し, txt[10] の中に,'l'(小文字のエル)が 何個あるか数えよ. 214 演習19-10 • 式を読み込んだら,計算結果を表示するプロ グラムを作成せよ. – "1+2" を読み込んだら,"3"を出力. – 式の中には,演算子が1個だけだとする. – 登場する数字は,1桁の自然数のみとする. – つまり,文字は3個あり, 順に,「数字」,「演算子」,「数字」が格納されて いる. 次スライドに続く 215 演習19-10 (con't) • 文字列を"1+2"として,実行してみよ. • 文字列を"3*4"として,実行してみよ. 演習19-11 • char txt[10] = "345"; を宣言し, 文字型配列"345"を,整数の345に変換せ よ. – ヒント:1文字読み込んで,'3'を整数3に変換. 方法は,txt[i]-'0'.結果,3となる. まだ読めるので読み込む. 3を10倍して30にし,読み込んだ4と足して34. 217 演習19-11 (con't) – ヒント:まだ読めるので読み込む. 34を10倍して340にし,読み込んだ5と足して 345となる. もう読み込めないので,終了. 218 演習19-12 • Stack機能を作成せよ. – 長さ100のint型配列を作る. これは,グローバル変数としてよい. – void push(int n)という関数を作り,int型の値を pushできるようにせよ. – int pop()という関数を作り,int型の値をpopできる ようにせよ. – int stack_length()という関数を作り,現在stack に積まれている整数の数を得られるようにせよ. – main()関数にて,「3をpush」「5をpush」「pop」を行え . 219 この問題はとばして良いです(難しすぎます) 演習19-13 • char txt[10] = "12+34+*"; を宣言し, これを逆ポーランド記法として解析し, 計算結果を出力せよ. 入力数字は必ず1桁と見なして良い. – ヒント:上記は( (1+2) * (3+4) )の意味. 220 この問題はとばして良いです(難しすぎます) 演習19-14 • char txt[10] = "*+12+34"; を宣言し,これをポーランド記法として解析し , 計算結果を出力せよ. 入力数字は必ず1桁と見なして良い. – ヒント:stackの最後の3要素が「演算子,数字, 数字」となっていたら演算を実行. – スタックに積まれている要素が数字か演算子か 判別できる必要がある. この問題はとばして良いです(難しすぎます) 演習19-15 • 通常の記法の式の処理系を作る. たとえば 28+3*(21-6) などを処理せよ. – 難易度はかなり高い. – 字句解析と構文解析を分けて考えるとやりやす い. 222 この問題はとばして良いです(簡単すぎます) 演習20-0 • 下記のように,#記号を横10個×縦15個の 長方形の形で表示せよ. • 当然(?), 二重のループを用いて実装せよ . 実行結果 ############################## ############################## ############################## ############################## ############################## この問題はとばして良いです(簡単すぎます) 演習20-1 • 下記のように,#記号を高さ5,幅5の三角形 の形で表示せよ. • 当然(?), 二重のループを用いて実装せよ . # ## 実行結果 ### #### ##### 演習21 • 演習21では,char型配列から,char型配 列にコピーを行うことがある. – 演習によっては,コピー元と,コピー先の長さが 異なる. この場合,コピー先の配列の長さが足りずに あふれてしまう危険性があるが, 本演習では「コピー先の配列は十分に長い」 ことを前提として良い. 演習21-0 • char型の配列srcが,下記のように初期化 されている. char src[] = "Desmond has a barrow in (中略) takes him by the hand."; • src[]を printf と %s を用いて,次スラ イドの出力形式に従って出力せよ. • 初期化部は,Web上の"手助け"を用いて良 い. 演習21-0 • 出力形式 – 最初の"21-0 : "は問題番号を意味している. – 下記は,表示領域の都合上,折り返されて表示さ れてしまっているが,途中に改行を入れる必要は ない. 実行結果 21-0 : Desmond has a barrow in the marketplace. Molly is the singer in a band. De smond say to Molly, girl I like your face. And Molly says this as she takes him by the hand. 演習21-1 • 前述のsrc[]の文字列としての長さを調べ, printfで表示せよ. • 出力形式は,下記の例に従うこと. • 文字列の長さを調べるのはstrlen()を用 いて良い. 実行結果 21-1 : length = 166 演習21-2 • 前述のsrc[] を char dst[1024] にコ ピーして,dst を下記の出力形式に従い printf と %s を用いて出力せよ. – 配列のうち'\0'までをコピーすれば良い. – strcpy を用いても良いが,以降の設問のため に自作することを推奨する. 実行結果 21-2 : Desmond has a barrow in the marketplace. Molly is the singer in a band. De smond say to Molly, girl I like your face. And Molly says this as she takes him by the hand. 演習21-3 • 前述のsrc[] を char dst[1024] にコ ピーせよ.ただし,src 内にある文字'a'は 文字'@'に置き換えてコピーせよ. そして,dst を下記の出力形式に従い printf と %s を用いて出力せよ. 実行結果 21-3 : Desmond h@s @ b@rrow in the m@rketpl@ce. Molly is the singer in @ b@nd. De smond s@y to Molly, girl I like your f@ce. And Molly s@ys this @s she t@kes him by the h@nd. 演習21-4 • 前述のsrc[] を char dst[1024] にコ ピーせよ.ただし,src 内にある小文字は, 大文字に置き換えてコピーせよ. そして,dst を下記の出力形式に従い printf と %s を用いて出力せよ. 実行結果 21-4 : DESMOND HAS A BARROW IN THE MARKETPLACE. MOLLY IS THE SINGER IN A BAND. DE SMOND SAY TO MOLLY, GIRL I LIKE YOUR FACE. AND MOLLY SAYS THIS AS SHE TAKES HIM BY THE HAND. 演習21-5 • 前述のsrc[] の中から,'t'と'h'と'e' の3文字が連続して登場する箇所を探し,そ れが配列の何個目であるかを表示せよ. 複数個発見したら,全て表示せよ. 出力形式は,下記の例に従え. 実行結果 21-5 : src[24] から src[26] が the です. 21-5 : src[50] から src[52] が the です. 21-5 : src[157] から src[159] が the です. 演習21-6 • 前述のsrc[] を char dst[1024] にコ ピーせよ.ただし,src 内にある"Molly" は"Emily"に置き換えてコピーせよ. そして,dst を下記の出力形式に従い printf と %s を用いて出力せよ. – ヒント:"Molly"と"Emily"はともに5文字. 実行結果 21-6 : Desmond has a barrow in the marketplace. Emily is the singer in a band. De smond say to Emily, girl I like your face. And Emily says this as she takes him by the hand. 演習21-7 • 前述のsrc[] を char dst[1024] にコ ピーせよ.ただし,src 内にある" a "は " the "に置き換えてコピーせよ. (" a "は,「空白」「a」「空白」である.) そして,dst を下記の出力形式に従い printf と %s を用いて出力せよ. – ヒント:" a "と" the "は長さが異なる. 実行結果 21-7 : Desmond has the barrow in the marketplace. Molly is the singer in the band . Desmond say to Molly, girl I like your face. And Molly says this as she takes him by the hand. 演習22 • プログラミング論IIの課題(に)を行え. http://www.ns.kogakuin.ac.jp/~ct13140/Prog.2009/ProgRo2/ro2_report_20091203_00.pdf 演習23 解説(A) • 24bitのBMPフォーマットの画像ファイルは, 各ピクセルにつき3バイトのデータが保存され ている. – 赤をR,緑をG,青をBとして, 各値が大きいほど 色素成分が強いことになる. 各値は最小で0,最大で255. (R,G,B)=(0,0,0)の場合は黒. (R,G,B)=(255,0,0)の場合は赤. (R,G,B)=(255,255,255)の場合は白. 演習23 解説(B) • プログラミング演習IIのWebページにある "bmp_rw"は,画像ファイル"H:\in.bmp" を読み込んで,画像ファイル"H:\out.bmp" を出力するプログラムである. – 変更を加えていなければ,"in.bmp"と全く同じ 内容の"out.bmp"を作り出す. 演習23 解説(C) • "bmp_rw"のプログラムは, (1)"H:\in.bmp"を読み込み,各ピクセルのデータを以下の様に bufiのアドレスのメモリに読み込む. (2)関数copy_pixelにおいて,bufiで示されるアドレスに格納され ているデータを,bufoで示されるアドレスにコピーする. (3)bufoのアドレスで示される領域に格納されているデータを "H:\out.bmp"に保存する. 座標 座標 座標 座標 座標 座標 座標 座標 座標 (0,0)の (0,0)の (0,0)の (1,0)の (1,0)の (1,0)の (2,0)の (2,0)の (2,0)の B G R B G R B G R 横の長さが100の場合,以下の順で格納される. (99,0)B→(99,0)G→(99,0)R→(0,1)B→(0,1)G→(0,1)R→(0,2)B 演習23 解説(D) • プログラム"bmp_rw"は, 関数 copy_pixel(unsigned char *bufo, unsigned char *bufi, int width, int height) において, bufiのアドレスからデータを読み込み,bufoのアドレスに データをコピーする. • widthは画像の横サイズ,heightは縦サイズである. 演習23-0 • プロジェクトを新規作成し,そのC++ソースコードを全て消し, 代わりにWebページにある"bmp_rw"の内容を貼り付けよ. • Webページにある"in.bmp"をダウンロードし,"H:\"に "H:\in.bmp"のファイル名で保存せよ. – これは,井の頭公園の桜の写真である. – 画像は,サイズ横1024ピクセル×縦768ピクセル,色数24ビット • この状態でコンパイル&実行し,"out.bmp"が正しく作成さ れるか確認せよ. – 結果:"out.bmp"が"in.bmp"と同一なら良い. 演習23-1 • 以下の様に"in.bmp"が"out.bmp"にコピ ーされるように関数copy_pixelを変更せよ – x座標がwidth/2未満,y座標がwidth/2未満 のピクセルはR=0,G=0,B=0とし, それ以外のピクセルは"in.bmp"のデータをそ のままコピーする. – 結果:左上1/4が真っ黒になる. 演習23-2 • 以下の様に"in.bmp"が"out.bmp"にコピ ーされるように関数copy_pixelを変更せよ – x座標がwidth/2以上,y座標がwidth/2以上 のピクセルはR=255,G=255,B=255とし, それ以外のピクセルは"in.bmp"のデータをそ のままコピーする. – 結果:右下1/4が真っ白になる. 演習23-3 • "in.bmp"を左右反転させて"out.bmp"に コピーされるよう,関数copy_pixelを変更 せよ. 演習23-4 • "in.bmp"のRGBの明るさを半減させて "out.bmp"にコピーせよ. – つまり,"in.bmp"のRの値を半分にして, "out.bmp"のRにコピーする. – G,Bも同様. • 例:"in.bmp"のあるピクセルが (R,G,B) = (100,120,250)だったら, "out.bmp"には(50,60,125)と書き込む. – 関数copy_pixelを変更せよ. – 結果:画像が暗くなる. 演習23-5 • "in.bmp"のRGBの明るさを倍増させて "out.bmp"にコピーする. – 倍増させた結果255を超えてしまった場合は ,255をコピーする. • 例:"in.bmp"のあるピクセルが (R,G,B) = (100,120,250)だったら, "out.bmp"には(200,240,255)と書き込む. – 関数copy_pixelを変更せよ. – 結果:画像が明るくなる. 演習23-6 • R以外の値は0にして,"in.bmp"を "out.bmp"にコピーする. • 例:"in.bmp"のあるピクセルが (R,G,B) = (100,120,250)だったら, "out.bmp"には(200,0,0)と書き込む. – 関数copy_pixelを変更せよ. – 結果:画像は赤のみになる. 演習23-7 • Gの値は2倍にして,それ以外の値はそのま まで"in.bmp"を"out.bmp"にコピーする. – ただし,2倍にして255を超えてしまった場合は 255とする. • 例:"in.bmp"のあるピクセルが (R,G,B) = (100,120,250)だったら, "out.bmp"には(100,120,255)と書き込む. – 関数copy_pixelを変更せよ. – 結果:画像は緑色が強くなる. 演習23-8 • x座標が 1<=x<width-1 かつ y座用が 1<=y<height-1 の場合は, "in.bmp"の(x-1,y-1)~(x+1,y+1)の 9ピクセルの平均値を, "out.bmp"の(x,y)にコピーする. それ以外はそのままコピーする. – 結果:画像がぼける. – 別名,ガウスぼかし.
© Copyright 2024 ExpyDoc