演習問題

Download Report

Transcript 演習問題

プログラミング演習I
http://www.ns.kogakuin.ac.jp/~ct13140/Prog.2010
プログラミング演習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
演習00-0
• “Hello,world![改行]”を表示するプロ
グラムを作成せよ.
7
演習00-1
• “Hello,[改行]world![改行]”を表示す
るプログラムを作成せよ.
8
演習00-2
• “Hello.[改行]”と10回表示するプログラ
ムを作成せよ.
9
演習00-3
• for文を用いて,0から19まで表示するプロ
グラムを作成せよ.
– 表示は,printf("%d\n", i); により行える.
10
演習00-4
• for文を用いて,56から74まで表示するプロ
グラムを作成せよ.
11
演習00-5
• 右図のように10個の整数を表示するプログラ
ムを作成せよ.必ずfor文を用いよ.
0
– ヒント:
これは,02,12,22,32,42…92である
1
4
9
16
25
:
81
12
演習00-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である.
13
演習00-7
10
4
k

• for文を用いて, k 1 を計算し,結果を表
示するプログラムを作成せよ.
– すなわち 14+24+34+…+94+104を求める.
– ヒント:正解は25333である.
14
演習01-0
• for文を用いて,1000から1009までの10個
の数字を表示するプログラムを作成せよ.
– 表示は,printf("%d\n", i);により行える.
実行結果
1000
1001
1002
1003
1004
:
1009
15
演習01-1
• for文を用いて,13,23,33,…,93,103を出
力するプログラムを作成せよ.
– 演習00-5と似ています.
実行結果
1
8
27
64
125
216
343
512
729
1000
16
演習01-2
20
k

• for文を用いて, k 1 を計算し,結果を表
示するプログラムを作成せよ.
– すなわち 1+2+3+…+19+20を求める.
– ヒント:正解は210である
17
演習01-3
• for文を用いて,100+101+102+…+199を
計算し,結果を表示するプログラムを作成せ
よ.
– ヒント:正解は14950である.
18
演習01-4
10
3
k

• for文を用いて, k 1 を計算し,結果を表示
するプログラムを作成せよ.
– すなわち 13+23+33+…+93+103を求める.
– 演習0-7とほとんど同じです.
– ヒント:答えは 3025
19
演習01-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
20
演習01-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になる.
21
演習01-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
22
20190
演習01-7
• for文を用いて,500, 503, 506,
509,…, 527の10個の整数を表示するプロ
グラムを作成せよ.
500
– 表示される数字は3ずつ増えている.
実行結果
503
506
509
512
515
518
521
524
527
23
演習01-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
24
演習01-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
25
演習01-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
26
演習01-11
• for文を用いて,10の階乗を求め出力するプ
ログラムを作成せよ.
– 1*2*3*…*9*10を求める.
実行結果
3628800
27
演習02-0
• for文を用いて,0, 1, 2, 3,…, 9の10
個の整数を表示するプログラムを作成せよ.
実行結果
0
1
2
3
4
5
6
7
8
9
28
演習02-1
• for文を用いて,0+1+2+3+…+9の10個の
整数の和を計算し表示するプログラムを作成
せよ.
実行結果 45
29
演習02-2
• 2重のfor文を用いて,右下のように表示さ
れるプログラムを作成せよ.
– ヒント:「0,1,2,3と表示」を3回繰り返す
実行結果
0
1
2
3
0
1
2
3
0
1
2
3
30
演習02-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
31
演習02-4
• 3重の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
32
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
演習02-5
• 3重の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
33
0
0
1
1
2
2
3
3
0
0
1
1
2
2
3
3
0
0
1
1
2
2
3
3
演習02-6
• 次のプログラムを作成せよ.
for文を用いて0から19までの20個の整数
を表示する.
ただし,次ページのルールに従え.
演習02-6 (con't)
• その数字が3の倍数であるが,5の倍数でない場合
は,数字の後に"?"を付ける.
• その数字が5の倍数であるが,3の倍数でない場合
は,数字の後に"!"を付ける.
• その数字が3の倍数であり かつ 5の倍数である場
合は,数字の後に"#"を付ける.
• その数字が3の倍数でなく かつ 5の倍数でない場
合は,数字のみを表示し何もつけない.
– 次スライドに実行結果,ヒントがある
演習02-6 (con't)
• 演習02-6の実行結果.
• ヒント
– 世界のナベアツ (に似ている)
– 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
演習03-0
f (x) = x3 - 18x2 + x - 18 とする.
• f (0), f (1), f (2) ,…, f (20) を表示せよ
演習03-1
f (x) = x3 - 18x2 + x - 18 とする.
• 方程式 f (x)=0 は,[0,20]の間に整数解が1個
存在する.それを求めよ.
– 2分法などではなく, f (0)=0か?, f (1)=0か? …と
x=20まで繰り返す.
– ヒント:解は x = 18 である.
演習03-2
f (x) = x3 - 18x2 + x - 18 とする.
• f (0), f (1)…f (20)の中で最も小さいものと,そ
のときの x を求めよ.
– ヒント:f (12)が最小
演習03-3
0.1x3+x-16 =0 の解は [0,8]に存在する.
解が x = 4 に着目し,
解が[0,4]にあるのか,[4,8]にあるのかを調査し,
その結果を表示するプログラムを作成.
• 区間最小値をmin, 最大値をmaxに格納.
– ヒント :
min=0, max=8 で開始し,
min=4, max=8 で終了するはず.
演習03-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文字」を表示する.
ただし,「全体」には符号(±)や小数点も含まれる.
演習3-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] にある */
区間を更新.
}
}
演習03-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)
演習03-7
0.1x3+x-5 = 0 の近似解をNewton-Raphson法を
用いて求め,近似解を表示するプログラムを作
成せよ.
解の精度は不問(適切に…).
ただし,下記は既知として使ってよい.
・ 解は[0,8]の区間に存在する.
・ 0.1x3+x-5は単調増加関数である.
演習03-8
同一の方程式(たとえば,0.1x3+x-5 = 0)の解を2
分法,はさみうち法,Newton-Raphson法を用い
て求め,収束までの試行回数を比較せよ.
収束の途中経過を表示するとわかりやすい.
演習04-0
• 画面に,右図の様に
#記号が10個縦に表示されるプログラ
ムを作成せよ.
#
#
#
#
#
#
#
#
#
#
演習04-1
• 画面に,下図の様に
#記号が20個横に表示されるプログラムを作
成せよ.
– ただし,
printf("####################");
の様なプログラムではなく,
for文で20回繰り返すプログラムにせよ.
####################
演習04-2
• 画面に,下図の様に
#記号が横20×縦10に表示されるプログラ
ムを作成せよ.
####################
####################
####################
####################
####################
####################
####################
####################
####################
####################
演習04-3
• 画面に,下図の様に表示されるプログラムを
作成せよ.
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
演習04-4
• 画面に,下図の様に表示されるプログラムを
作成せよ.
0000000000
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666
7777777777
8888888888
9999999999
演習04-5
• 画面に,下図の様に表示されるプログラムを
作成せよ.
#
##
###
####
#####
######
#######
########
#########
##########
演習04-6
• 画面に,下図の様に表示されるプログラムを
作成せよ.
##########
#########
########
#######
######
#####
####
###
##
#
演習04-7
• 画面に,下図の様に表示されるプログラムを
作成せよ.
– ヒント:左に空白を表示
してから,#を表示.
#
##
###
####
#####
######
#######
########
#########
##########
演習04-8
• 画面に,右図の様に表示される
プログラムを作成せよ.
1
22
22
333
333
333
4444
4444
4444
4444
55555
55555
55555
55555
55555
演習04-9
• 画面に,右図の様に表示される
プログラムを作成せよ.
#
##
###
####
#####
#
##
###
####
#####
#
##
###
####
#####
演習04-10
• 画面に,右図の様に表示される
プログラムを作成せよ.
#
#
#
##
##
##
### ### ###
#### #### ####
###############
演習05-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
演習05-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 を使います.
次のスライドに続く.
演習05-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
演習05-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上の手助けを使用して良い.
手助けの内容をコピー&ペーストすれば良い.
演習05-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上の手助けを使用して良い.
手助けの内容をコピー&ペーストすれば良い.
ヒント:答えは, 105.0 である.
演習06-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 
 
67
演習06-1
• 1行10列の行列Aと,10行1列の行列Bの積
を求めよ.for文を用いよ.
– 答えは1行1列の行列で,要素は 964.374585
となる.
– WebPage上の手助けを用いよ.
68
演習06-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 
69
演習06-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上の手助けを用いよ.
70
演習06-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 
71
演習06-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
72
演習07
• 演習07は欠番です.
演習08-0
• "#[改行]",
"##[改行]",
"###[改行]",
"####[改行]"
と表示する関数を作り,main関数から呼び
出せ.関数名は func(),引数はなし,戻り
値はvoidとせよ.つまり void
func(){...}となる.
演習08-1
• 引数がなく,戻り値の型がint,戻り値
の値が3である関数three()を作成し,
main()関数から呼び出せ.
– main()関数の中では,関数three()の
戻り値を変数xに代入し,表示せよ.
•こんな感じ↓
int x;
x = three();
printf("x=%d\n", x);
演習08-2
• 引数がint型2個で,戻り値がその和である
関数を作成し,main()関数から呼び出せ.
– ヒント
int add(int a, int b){
return ????;
}
void main(){
int x;
x = add(2,3);
printf("x=%d\n", x);
}
演習08-3
• 引数がint型3個で,戻り値がその和である
関数を作成し,main()関数から呼び出せ.
演習08-4
• main()関数よりfunc0()を呼び出し,
func0()の中でfunc1を呼び出し,
func1()の中でfunc2を呼び出すプログラ
ムを作成せよ.
– func0の中では"func0A"と表示し,func1を
呼び出し,"func0B"と表示せよ.
– func1の中では"func1A"と表示し,func2を
呼び出し,"func1B"と表示せよ.
– func2の中では"func2"と表示しせよ.
演習08-5
• "Hello,World!\n"と10回表示する関数
を作成し,それをmainから呼び出せ.
– ヒント:関数の中にfor文を作成する.
– ヒント:"Hello,World!"と10回表示するには
int i;
for(i=0; i<10; i++){
printf("Hello,World!\n");
}
演習08-6
• 0から9までを表示する関数を作成し,それを
呼び出せ.
– ヒント:関数の中にfor文を作成する.
– ヒント:0から9まで表示するには
int i;
for(i=0; i<10; i++){
printf("%d\n", i);
}
演習08-7
• 1から10までの合計を計算して返す関数を作
成し,それを呼び出せ.
– ヒント:関数の中にfor文を作成する.
– ヒント:1から10までの合計は,
int i, sum;
sum = 0;
for(i=1; i<=10; i++){
sum = sum+i;
}
演習08-8
• 再帰により,n!(階乗)を求めるプログラムを
作成せよ.
– 適切な引数を入れて,mainから呼び出せ.
– 関数内にprintf()を入れ,動作を追跡せよ.
演習08-9
• 再帰により,nCr(組み合わせ)を求めるプロ
グラムを作成せよ.
演習08-10
• 再帰により,フィボナッチ数列の第n項目を求
めるプログラムを作成せよ.
– フィボナッチ数列:1,1,2,3,5,8,13,21,...
第n+2項目=第n項目+第n+1項目
演習09-0
n
• nを入力し, k を求める関数sum1(int n)
k 1
を作り,sum1(1), sum1(2), sum1(3)
…sum1(10)を表示せよ.
演習09-1
•
n
2
k
nを入力し, 
を求める関数
k 1
sum2(int n)を作り,
sum2(1),sum2(2),…,sum2(10)を表示
せよ.
演習09-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)を表示せ
よ.
演習09-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()を使用せよ.
演習09-0 ~ 09-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
演習13-0
• 1個の真偽値(char型とする)を受け取り,そ
のnotを返す関数を作り,not(0),not(1)
を表示.
x
z
not
入力
x
出力
z
0
1
1
0
演習13-1
• 2個の真偽値を受け取り,それらのorを返す
関数を作り,or(0,0)~or(1,1)を表示.
ヒント:「a==3またはb==4」は
if(a==3 || b==4 ){
..
「Shift」キーを押
}
しながら,
「¥」キーを押す.
x
y
z
or
入力
x
入力
y
出力
z
0
0
0
0
1
1
1
0
1
1
1
1
演習13-2
• 2個の真偽値を受け取り,それらのandを返す
関数を作り,and(0,0)~and(1,1)を表示.
ヒント:「a==3かつb==4」は
if(a==3 && b==4 ){
..
}
x
y
z
and
入力
x
入力
y
出力
z
0
0
0
0
1
0
1
0
0
1
1
1
演習13-3
• 半加算器は,以下の様な回路になる.
• 2個の真偽値(A,B)を受け取りCを返す関数
ha_c(char a, char b)を作成せよ.
– ただし,前に作成したnot,or,andを組み合わ
せて作成せよ
A
or
and
S
not
B
and
C
演習13-4
• 半加算器は,以下の様な回路になる.
• 2個の真偽値(A,B)を受け取りSを返す関数
ha_s(char a, char b)を作成せよ.
– ただし,前に作成したnot,or,andを組み合わ
せて作成せよ
A
or
and
S
not
B
and
C
演習13-5
• 全加算器は,以下の様な回路になる.
• 3個の真偽値(A,B,Ci)を受け取りCoを返
す関数fa_c(char a, char b, char
ci)を作成せよ.
– ただし,前に作成した関数を組み合わせて作成
せよ
A
B
Half
Adder
S
X
Half
Adder
C
S
C
Ci
or
Y
S
Z
Co
演習13-6
• 全加算器は,以下の様な回路になる.
• 3個の真偽値(A,B,Ci)を受け取りSを返す
関数fa_s(char a, char b, char
ci)を作成せよ.
– ただし,前に作成した関数を組み合わせて作成
せよ
A
B
Half S
Adder
C
X
Ci
Half S
Adder
C
or
Y
S
Z
Co
演習13-7
下記の回路を作る.A?,B?を入力.S?を表示.
A0B0
A1B1
A2B2
A3B3
FA
FA
FA
HA
C X
C
Y
C
Z
C
S
S
S
S
S0
S1
S2
S3
S4
プログラミング演習II
http://www.ns.kogakuin.ac.jp/~ct13140/Prog.2010
演習14-0
• 区間 [ 6.0 , 9.0 ] を 30等分し,そ
れぞれの区間の境界を xi とする.
すなわち x0=6.0,x1=6.1,…,x30=9.0
である.
x0~x30の31個の値をprintfで表示せよ.
125
演習14-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で表示せ
よ.
126
実行結果
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
演習14-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である.
128
実行結果
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
演習14-3
• 区分求積法により
9 2
x dx
6

を求めよ.(つまり30個の短冊の面積の合計)
ただし,区間 [ 6.0 , 9.0 ] を30等分
し,短冊の縦の長さは,f(xi+1)ではなく, f(xi)を
用いよ.
– ヒント:30個の短冊の面積の合計を出す.誤差が
なければ答えは171である.
130
演習14-4
• 区分求積法により
9 2
x dx
6

ここが変わった
だけの問題
を求めよ.(つまり30個の短冊の面積の合計)
ただし,区間 [ 6.0 , 9.0 ] を300等
分し,短冊の縦の長さは,f(xi+1)ではなく,
f(xi)を用いよ.
131
演習14-5
• 区分求積法台形公式により
9 2
x dx
6

を求めよ.(つまり30個の短冊の面積の合計)
ただし,区間 [ 6.0 , 9.0 ] を30等分
し,短冊の縦の長さは,f(xi+1)ではなく, f(xi)を
用いよ.
132
演習14-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
演習14-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
演習14-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)
演習14-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
演習15
• 以下の演習15において,f ( x)  x である.
– 演習15は,レポート課題(い)と同一である.
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> と書く.
演習15-0
5
• 区分求積法により,3 x dx の近似値を求め,
その値(面積)を表示するプログラムを作成
せよ.
ただし,次スライドの様に,分割数は10とし,
短冊の高さとしては左側の値を用いよ.
3
y
2
1
0
0
1
2
3
x
4
5
6
演習15-1
5
• 区分求積法により,3 x dx の近似値を求め,
その値(面積)を表示するプログラムを作成
せよ.
ただし,次スライドの様に,分割数は10とし,
短冊の高さとしては右側の値を用いよ.
3
y
2
1
0
0
1
2
3
x
4
5
6
演習15-2
5
• 区分求積法により,3 x dx の近似値を求め,
その値(面積)を表示するプログラムを作成
せよ.
ただし,次スライドの様に,分割数は10とし,
台形公式を用いよ.
3
y
2
1
0
0
1
2
3
x
4
5
6
演習15-3
5
• 定積分3 x dx の値を,以下の様に算出手法を変化さ
せて求め,それぞれの値を比較せよ.
– 短冊の高さとして,(a)左側の値を用いる,(b)右側の値
を用いる,(c)台形公式を用いる,と変化させる.
– 分割数を(a)10分割, (b)100分割, (c)1000分割,
(d)10000分割, (e)100000分割 と変化させる.
• 組み合わせは 3×5=15 通りあるので,それぞれ
の手法で面積を求め,解析的に(数学を用いて)求
めた正確な値と比較せよ.
演習16-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[?] 半角空白 = 半角空白 数字 改行
147
演習16-1
• 長さ10のint型配列 int a[10] がある.
a[0]~a[9]には,0 または 1 が格納さ
れている.
a[0]~a[9]の中に,何個“1”が含まれてい
るか数え,それを出力せよ.
出力形式は,右下の例にならえ.
a[10]の初期化部は,Web上位の手助けを
コピーせよ.
ans=7
148
演習16-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 149
演習16-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”なら,
“@”を出力(全角のアットマークを出力)
出力形式は,次のページの指示に従え.
150
a[0][0]
a[0][1]
a[1][3]
横が1,縦が3
a[1][0]
a[2][0]
a[14][0]
・@@・@@・・@@・@・・・
@@・・@@・・@@@@・@@
・・@・・・・@・@@@・@@
・@@・@@・・@@・@・・・
@@・・@@・・@@@@・@@
・・@・・・・・・@@@・@@
・@@・@@・・@@・@・・・
@@・・@@・・@@@@・@@
・・@・・・・・・@@@・@@
・@@・@@・・@@・@・・・
@@・・@@・・@@@@・@@
・・@・・・・・・@@@・@@
・・・・@@@・@・@・・@@
・・・・@@@・@・@・・@@
・・・・@@@・@・@・・@@
151
演習16-4
• 長さ15x15のint型2次元配列 int
a[15][15] がある.a[0][0]~
a[14][14]には,0 または 1 が格納され
ている.
縦横長さ2の正方形型に0が連続している箇
所を抽出し出力せよ.
次ページを参考にせよ.
152
・@@・@@・・@@・@・・・
@@・・@@・・@@@@・@@
・・@・・・・@・@@@・@@
・@@・@@・・@@・@・・・
@@・・@@・・@@@@・@@
・・@・・・・・・@@@・@@
・@@・@@・・@@・@・・・
@@・・@@・・@@@@・@@
・・@・・・・・・@@@・@@
・@@・@@・・@@・@・・・
@@・・@@・・@@@@・@@
・・@・・・・・・@@@・@@
・・・・@@@・@・@・・@@
・・・・@@@・@・@・・@@
・・・・@@@・@・@・・@@
このように,
縦横2x2の
正方形に,
0が繋がっている
箇所を探す.
153
演習16-5
• 長さ15x15のint型2次元配列 int
a[15][15] がある.a[0][0]~
a[14][14]には,0 または 1 が格納され
ている.
2次元平面で考えて,連続して0となっている
正方形領域で,最大のものを見つけよ.
ヒント:長さ5の正方形が見つかる.
154
この例では,
横座標0, 縦座標12を
左上の頂点とする
3x3の長方形が最大
この領域は,
3x3の正方形
・@@・@@・・@@・@・・・
@@・・@@・・@@@@・@@
・・@・・・・@・@@@・@@
・@@・@@・・@@・@・・・
@@・・@@・・@@@@・@@
・・@・・・・・・@@@・@@
・@@・@@・・@@・@・・・
@@・・@@・・@@@@・@@
・・@・・・・・・@@@・@@
・@@・@@・・@@・@・・・
@@・・@@・・@@@@・@@
・・@・・・・・・@@@・@@
・・・・@@@・@・@・・@@
・・・・@@@・@・@・・@@
・・・・@@@・@・@・・@@
この領域は,
2x2の正方形
演習17-0
• int data[5]があり,
data[0]~data[4]は順に
72,22,50,46,57であるとする.
• これをバブルソートを用いて並び替えるプロ
グラムを作成せよ.
• Web上の手助けを用いて良い.
156
演習17-1
• int data[10]があり,
data[0]~data[9]は順に,
22,45,51,59,69,72,75,83,89, 97で
あるとする.
• バイナリーサーチを用いて,51が何番目に存
在するかを調べるプログラムを作成せよ.
• Web上の手助けを用いて良い.
157
演習17-2
• int data[5]があり,
data[0]~data[4]は順に
72,22,50,46,57であるとする.
• これをバケツソートを用いて並び替えるプロ
グラムを作成せよ.
• int data[5]に格納されている値は0以上
100未満であることを前提として良い.
• Web上の手助けを用いて良い.
158
演習18 (0/5)
• トランプのポーカーのプログラムを作ります.
• 5枚のカードがあって,それの役を調査するプ
ログラムを作ります.
159
演習18 (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
160
演習18 (2/5)
• 変数の値と,トランプのスート(マーク)の対
応は,以下の通りとする.
変数
の値
0
1
2
3
トランプ
の数
スペード
ダイア
ハート
クラブ
161
演習18 (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
演習18 (4/5)
• ジョーカーは無いものとする.
• Webページの手助けを使用してよい.
163
役の説明
• ワンペア:同じ数字カードが2枚あると,それ
がペアと呼ばれ,5枚の中にペアが1組ある.
– 例:♠5 ♣5 ♥6 ♦7 ♦8
– スートは関係ない.
• ツーペア:5枚の中にペアが2組ある.
– 例:♠5 ♣5 ♥7 ♦7 ♦8
– スートは関係ない.
164
役の説明
• スリーカード:同じ数のカードが3枚ある.
– 例:♠5 ♣5 ♥5 ♦7 ♦8
– スートは関係ない
165
役の説明
• ストレート:5枚のカードの数字が連続してい
る.
– 例:♠5 ♣6 ♥7 ♦8 ♦9
– スートは関係ない.
• フラッシュ:5枚のカードのスートが全て同じ.
– 例:♠5 ♠K ♠A ♠8 ♠7
– 数は関係ない.
166
役の説明
• フルハウス:5枚が,ワンペア(2枚)とスリー
カード(3枚)で成り立っている.
– 例:♠5 ♣5 ♥5 ♦7 ♠7
– スートは関係ない.
• フォーカード:同じ数のカードが4枚ある.
– 例:♠5 ♣5 ♥5 ♦5 ♦8
167
役の説明
• ストレートフラッシュ:ストレートであり,かつフ
ラッシュである.
– 例:♠5 ♠6 ♠7 ♠8 ♠9
• ロイヤルストレートフラッシュ:A,K,Q,J,10
の5枚で構成されるストレートフラッシュ
– 例:♠10 ♠J ♠Q ♠K ♠A
168
演習18-0
• 5枚のカードを与えられて,そのカードが「フラ
ッシュ」あるいは「ストレートフラッシュ」あるい
は「ロイヤルストレートフラッシュ」になってい
るか否かを調べる関数を作成せよ.
• 関数は
int is_flushes(int num[5], int suit[5])
とせよ.
169
演習18-0
– 引数は,以下の通りとする.
第一引数:長さ5のint型の配列.
1~5枚目のカードの数を表す.
第二引数:長さ5のint型の配列.
1~5枚目のカードのスートを表す.
– 戻り値はint型であり,以下の条件を満たすこと
.
5枚のカードがフラッシュまたはストレートフラッシ
ュまたはロイヤルストレートフラッシュを満たして
いる場合は,「1」を返す.
そうでない場合は,「0」を返す.
170
演習18-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]
171
演習18-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;
}
172
演習18-1
• 5枚のカードを与えられて,そのカードが「スト
レート」か「ストレートフラッシュ」 か「ロイヤル
ストレートフラッシュ」になっているかを調べる
関数を作成せよ.
int is_straightes(int num[5], int suit[5])
– 引数は,演習5-0と同様.
– 戻り値はint型であり,ストレート,ストレートフラ
ッシュ,ロイヤルストレートフラッシュになっている
場合は「1」を返し,
そうでない場合は「0」を返す.
173
演習18-2
• 5枚のカードを与えられて,そのカードが「4カ
ード」になっているか否かを調べる関数を作
成せよ.
int is_4cards(int num[5], int suit[5])
– 引数,戻り値は,演習5-0と同様.
174
演習18-3
• 5枚のカードを与えられて,そのカードが「フル
ハウス」になっているか否かを調べる関数を
作成せよ.
int is_fullhouse(int num[5], int suit[5])
– 引数,戻り値は,演習5-0と同様.
175
演習18-4
• 5枚のカードを与えられて,そのカードが「3カ
ード」になっているか否かを調べる関数を作
成せよ.
int is_3cards(int num[5], int suit[5])
– 引数,戻り値は,演習5-0と同様.
– 「4カード」になっていたら,「3カード」とは言えな
いことに注意せよ.
– 同様に,「フルハウス」も「3カード」とは言えない.
176
演習18-5
• 5枚のカードを与えられて,そのカードが「2ペ
ア」になっているか否かを調べる関数を作成
せよ.
int is_2pairs(int num[5], int suit[5])
– 引数,戻り値は,演習5-0と同様.
– 「4カード」,「フルハウス」は「2ペア」とは言えない
ことに注意せよ.
– 当然,「3カード」も「2ペア」ではない.
177
演習18-6
• 5枚のカードを与えられて,そのカードが「1ペ
ア」になっているか否かを調べる関数を作成
せよ.
int is_1pair(int num[5], int suit[5])
– 引数,戻り値は,演習5-0と同様.
– 同様に,他の役になっていたら「ワンペア」になら
ないことに注意せよ.
178
演習19-0 (0/5)
• 長さ20x10のint型2次元配列
int data[20][10] がある.
• data[0][0]~a[19][9]には,0か1か2
が格納されている.
– 変数の初期化に関しては,Web上の手助けを利
用して良い.
• 次のページに続く
179
演習19-0 (1/5)
• data[0][0]~data[19][9]を,次の条
件に従って出力せよ.
– a[?][?]が“0”なら,“・”を出力.
“・”は日本語入力モードで"/"を押す.
– a[?][?]が“1”なら,“■”を出力.
“■”は日本語入力モードで「しかく」と入力し変換する.
– a[?][?]が“2”なら,“×”を出力.
“×”は日本語入力モードで「ばつ」と入力し変換する.
– a[?][?]がその他なら,“?”を出力.
180
演習19-0 (2/5)
• 出力形式は,次のページの指示に従え.
– 縦横が逆にならないよう注意!
• もし"?"を発見したら,それはデータの誤り
である.そのマスの値を"0"に修正せよ.
181
data[0][0]
data[1][0]
data[3][1]
横が1,縦が3.
演習19-0
(3/5)
data[19][0]
data[0][1]
data[0][3]
・・・・■■・・・・
・・・■■■・・・・
・・■■■■・・・・
・■■■■■・・・・
■■■■■■・・・・
■■・・・・・・・・
・■■・・・・・・・
・・■■・・・・・・
・・・■■・・・・・
■■■■■■■■■■
・・・・■■・・・・
■■■■■■■■■■
・・・・・■■・・・
・?・・・・■■・・
・・・・・・・■■・
・・・・・・・・■■
・■■■■■■■■■
■・■■■■■■■■
■■・■■■■■■■
■■■・■■■■■■
data[0][9]
182
演習19-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
183
演習19-1
• 横一行すべて"1"である行を探し,
それの全ての行番号をprintfで出力せよ.
– 演習19-0のプログラムの続きとして記述せよ.
184
演習19-2
• 横一行すべて"1"である行のdata[][]の
値を,全て"2"に変更せよ.
– 演習19-1のプログラムの続きとして記述せよ.
185
演習19-3 (0/2)
• 演習19-2を行った状態(横一行そろっていた
ら"2"に変更する)で,
再度 演習19-0の出力を行え.
– 演習19-2のプログラムの続きとして記述せよ.
186
演習19-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
187
演習19-4
• 演習19-2を行った状態(横一行そろっていた
ら"2"に変更する)で,
data[?][?]が"2"の行は削除し,
削除された行の分は上のマスを下にずらして
表示せよ.(上から落ちてくる)
– 演習19-3のプログラムの続きとして記述せよ.
188
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 189
演習19-5
• 演習19-4を行った状態(横一行そろっている
行を削除)を左右反転し,それを表示せよ.
– ゲームではこのような操作はない.
– 演習19-4のプログラムの続きとして記述せよ.
190
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 191
演習19-6
• 演習19-5を行った状態(左右反転した状態)
で,下記の位置にL字型ブロックを配置できる
か否かを調査し,結果(置けるor置けない)
を表示せよ.
– 対象座標は(2,0),(3,0),(3,1),(3,2).
– L字型ブロックを置こうとする場所が空いていれ
ば「置ける」.そうでない場合は「置けない」
– 演習19-5のプログラムの続きとして記述せよ.
– ヒント:答えは「置ける」
192
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字型ブロックを
置けるか否かを調査
193
演習19-7
• 演習19-5を行った状態で,下記の位置にL
字型ブロックを配置し,一番下まで落とした状
態を作成し,演習19-0の方法で表示せよ.
– 対象座標は(2,0),(3,0),(3,1),(3,2).
– 回転,横移動などの人間の操作は無いものとす
る.
– 演習19-6のプログラムの続きとして記述せよ.
194
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 195
演習19-8
• 演習19-7を行った状態で,演習18-7同様に
凸字型ブロックを下記の座標より落とせ.
そして,その状態を演習19-0の方法で表示
せよ.
– 対象座標は(1,0),(2,0),(2,1),(3,0).
– 演習19-7のプログラムの続きとして記述せよ.
196
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 197
演習19-9
• 演習19-8を行った状態で,演習18-7や188と同様に一文字型ブロックを下記の座標よ
り落とせ.そして,演習19-0の方法で表示せ
よ.
– 対象座標は(0,0),(1,0),(2,0),(3,0).
– 演習19-8のプログラムの続きとして記述せよ.
198
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 199
演習19-10
• 演習19-9を行った状態で,再度演習19-1
~19-4の作業を行え.
– すなわち,以下を行う.
• 横一列全て1である行を探し行番号を表示する.
• その行のdataの値を2にする.
• その状態で19-0の出力を行う.
• dataが2の行は削除し,上のマスはずらす
• その状態で再度19-0の出力を行う.
– 演習19-9のプログラムの続きとして記述せよ.
200
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 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
演習20
• 課題数が多いので,課題1個毎にプロジェクト
を新規作成せずに,全課題を1個のプロジェ
クト(1個のファイル)にすることを推奨します
.
演習20-0
• char型変数 ch を宣言する.
• chに 'A'を代入する.
• ch をprintf()で表示する.
– 結果,Aと表示されるはずである.
– ヒント: 「chは文字1個か文字列か」に注意せよ.
%dか? %cか? %sか? %pか?
204
演習20-1
• 'a'~'z'の26文字を順に表示する.
• 表示形式は,右に習う.
a
b
c
d
e
f
g
h
i
:
演習20-2
• 'a'~'z'の26文字を逆順に表示する.
• 表示形式は,右に習う.
z
y
x
w
v
u
t
s
r
:
演習20-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
207
演習20-4
• char txt[7] = "Hello!";
を宣言し,
txtを1文字ずつ表示して改行する.
右の様になる.
H
e
l
l
o
!
208
演習20-5
• char txt[7] = "Hello!";
を宣言し,
txtを1文字ずつ
文字コードと文字を表示して
改行する.
右の様になる.
72
101
108
108
111
33
H
e
l
l
o
!
209
演習20-6
• char txt[10] = "Hello!";
を宣言し,
txtの文字数を数える.
(答えは6文字である)
– ヒント:文字列を前から調査していき,
'\0'があったら文字列は終わりである.
210
演習20-7
• char txt[10] = "Hello!";
を宣言し,
1文字目の'H'を'h'に置き換えて,
printf()で表示せよ.
txtの文字数を数える.
– ヒント:文字列をprintfで表示するには,
printf("%s\n", txt);
211
演習20-8
• char txt[10] = "Hello!";
を宣言し,
小文字は大文字変更して
(大文字はそのままでよい)
printf() で表示せよ.
212
演習20-9
• char txt[10] = "Hello!";
を宣言し,
txt[10] の中に,'l'(小文字のエル)が
何個あるか数えよ.
213
演習20-10
• 式を読み込んだら,計算結果を表示するプロ
グラムを作成せよ.
– "1+2" を読み込んだら,"3"を出力.
– 式の中には,演算子が1個だけだとする.
– 登場する数字は,1桁の自然数のみとする.
– つまり,文字は3個あり,
順に,「数字」,「演算子」,「数字」が格納されて
いる.
次スライドに続く
214
演習20-10 (con't)
• 文字列を"1+2"として,実行してみよ.
• 文字列を"3*4"として,実行してみよ.
演習20-11
• char txt[10] = "345";
を宣言し,
文字型配列"345"を,整数の345に変換せ
よ.
– ヒント:1文字読み込んで,'3'を整数3に変換.
方法は,txt[i]-'0'.結果,3となる.
まだ読めるので読み込む.
3を10倍して30にし,読み込んだ4と足して34.
216
演習20-11 (con't)
– ヒント:まだ読めるので読み込む.
34を10倍して340にし,読み込んだ5と足して
345となる.
もう読み込めないので,終了.
217
演習20-12
• Stack機能を作成せよ.
– 長さ100のint型配列を作る.
これは,グローバル変数としてよい.
– void push(int n)という関数を作り,int型の値を
pushできるようにせよ.
– int pop()という関数を作り,int型の値をpopできる
ようにせよ.
– int stack_length()という関数を作り,現在stack
に積まれている整数の数を得られるようにせよ.
– main()関数にて,「3をpush」「5をpush」「pop」を行え
.
218
この問題はとばして良いです(難しすぎます)
演習20-13
• char txt[10] = "12+34+*";
を宣言し,
これを逆ポーランド記法として解析し,
計算結果を出力せよ.
入力数字は必ず1桁と見なして良い.
– ヒント:上記は( (1+2) * (3+4) )の意味.
219
この問題はとばして良いです(難しすぎます)
演習20-14
• char txt[10] = "*+12+34";
を宣言し,これをポーランド記法として解析し
,
計算結果を出力せよ.
入力数字は必ず1桁と見なして良い.
– ヒント:stackの最後の3要素が「演算子,数字,
数字」となっていたら演算を実行.
– スタックに積まれている要素が数字か演算子か
判別できる必要がある.
この問題はとばして良いです(難しすぎます)
演習20-15
• 通常の記法の式の処理系を作る.
たとえば
28+3*(21-6)
などを処理せよ.
– 難易度はかなり高い.
– 字句解析と構文解析を分けて考えるとやりやす
い.
221
この問題はとばして良いです(簡単すぎます)
演習21-0
• 下記のように,#記号を横10個×縦15個の
長方形の形で表示せよ.
• 当然(?), 二重のループを用いて実装せよ
.
実行結果
##############################
##############################
##############################
##############################
##############################
この問題はとばして良いです(簡単すぎます)
演習21-1
• 下記のように,#記号を高さ5,幅5の三角形
の形で表示せよ.
• 当然(?), 二重のループを用いて実装せよ
.
#
##
実行結果 ###
####
#####
演習22
• 演習22では,char型配列から,char型配
列にコピーを行うことがある.
– 演習によっては,コピー元と,コピー先の長さが
異なる.
この場合,コピー先の配列の長さが足りずに
あふれてしまう危険性があるが,
本演習では「コピー先の配列は十分に長い」
ことを前提として良い.
演習22-0
• char型の配列srcが,下記のように初期化
されている.
char src[] = "Desmond has a barrow
in (中略) takes him by the hand.";
• src[]を printf と %s を用いて,次スラ
イドの出力形式に従って出力せよ.
• 初期化部は,Web上の"手助け"を用いて良
い.
演習22-0
• 出力形式
– 最初の"21-0 : "は問題番号を意味している.
– 下記は,表示領域の都合上,折り返されて表示さ
れてしまっているが,途中に改行を入れる必要は
ない.
実行結果
22-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.
演習22-1
• 前述のsrc[]の文字列としての長さを調べ,
printfで表示せよ.
• 出力形式は,下記の例に従うこと.
• 文字列の長さを調べるのはstrlen()を用
いて良い.
実行結果
22-1 : length = 166
演習22-2
• 前述のsrc[] を char dst[1024] にコ
ピーして,dst を下記の出力形式に従い
printf と %s を用いて出力せよ.
– 配列のうち'\0'までをコピーすれば良い.
– strcpy を用いても良いが,以降の設問のため
に自作することを推奨する.
実行結果
22-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.
演習22-3
• 前述のsrc[] を char dst[1024] にコ
ピーせよ.ただし,src 内にある文字'a'は
文字'@'に置き換えてコピーせよ.
そして,dst を下記の出力形式に従い
printf と %s を用いて出力せよ.
実行結果
22-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.
演習22-4
• 前述のsrc[] を char dst[1024] にコ
ピーせよ.ただし,src 内にある小文字は,
大文字に置き換えてコピーせよ.
そして,dst を下記の出力形式に従い
printf と %s を用いて出力せよ.
実行結果
22-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.
演習22-5
• 前述のsrc[] の中から,'t'と'h'と'e'
の3文字が連続して登場する箇所を探し,そ
れが配列の何個目であるかを表示せよ.
複数個発見したら,全て表示せよ.
出力形式は,下記の例に従え.
実行結果
22-5 : src[24] から src[26] が the です.
22-5 : src[50] から src[52] が the です.
22-5 : src[157] から src[159] が the です.
演習22-6
• 前述のsrc[] を char dst[1024] にコ
ピーせよ.ただし,src 内にある"Molly"
は"Emily"に置き換えてコピーせよ.
そして,dst を下記の出力形式に従い
printf と %s を用いて出力せよ.
– ヒント:"Molly"と"Emily"はともに5文字.
実行結果
22-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.
演習22-7
• 前述のsrc[] を char dst[1024] にコ
ピーせよ.ただし,src 内にある" a "は
" the "に置き換えてコピーせよ.
(" a "は,「空白」「a」「空白」である.)
そして,dst を下記の出力形式に従い
printf と %s を用いて出力せよ.
– ヒント:" a "と" the "は長さが異なる.
実行結果
22-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.
演習23
• プログラミング論IIの課題(に)を行え.
http://www.ns.kogakuin.ac.jp/~ct13140/Prog.2010/ProgRo2/ro2_report_20101209_00.pdf
演習24 解説(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)の場合は白.
演習24 解説(B)
• プログラミング演習IIのWebページにある
"bmp_rw"は,画像ファイル"H:\in.bmp"
を読み込んで,画像ファイル"H:\out.bmp"
を出力するプログラムである.
– 変更を加えていなければ,"in.bmp"と全く同じ
内容の"out.bmp"を作り出す.
演習24 解説(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
演習24 解説(D)
• プログラム"bmp_rw"は,
関数 copy_pixel(unsigned char *bufo,
unsigned char *bufi, int width, int height)
において,
bufiのアドレスからデータを読み込み,bufoのアドレスに
データをコピーする.
• widthは画像の横サイズ,heightは縦サイズである.
演習24-0
• プロジェクトを新規作成し,そのC++ソースコードを全て消し,
代わりにWebページにある"bmp_rw"の内容を貼り付けよ.
• Webページにある"in.bmp"をダウンロードし,"H:\"に
"H:\in.bmp"のファイル名で保存せよ.
– これは,井の頭公園の桜の写真である.
– 画像は,サイズ横1024ピクセル×縦768ピクセル,色数24ビット
• この状態でコンパイル&実行し,"out.bmp"が正しく作成さ
れるか確認せよ.
– 結果:"out.bmp"が"in.bmp"と同一なら良い.
演習24-1
• 以下の様に"in.bmp"が"out.bmp"にコピ
ーされるように関数copy_pixelを変更せよ
– x座標がwidth/2未満,y座標がheigth/2未
満のピクセルはR=0,G=0,B=0とし,
それ以外のピクセルは"in.bmp"のデータをそ
のままコピーする.
– 結果:左上1/4が真っ黒になる.
演習24-2
• 以下の様に"in.bmp"が"out.bmp"にコピ
ーされるように関数copy_pixelを変更せよ
– x座標がwidth/2以上,y座標がwidth/2以上
のピクセルはR=255,G=255,B=255とし,
それ以外のピクセルは"in.bmp"のデータをそ
のままコピーする.
– 結果:右下1/4が真っ白になる.
演習24-3
• "in.bmp"を左右反転させて"out.bmp"に
コピーされるよう,関数copy_pixelを変更
せよ.
演習24-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を変更せよ.
– 結果:画像が暗くなる.
演習24-5
• "in.bmp"のRGBの明るさを倍増させて
"out.bmp"にコピーする.
– 倍増させた結果255を超えてしまった場合は
,255をコピーする.
• 例:"in.bmp"のあるピクセルが
(R,G,B) = (100,120,250)だったら,
"out.bmp"には(200,240,255)と書き込む.
– 関数copy_pixelを変更せよ.
– 結果:画像が明るくなる.
演習24-6
• R以外の値は0にして,"in.bmp"を
"out.bmp"にコピーする.
• 例:"in.bmp"のあるピクセルが
(B,G,R) = (100,120,250)だったら,
"out.bmp"には(0,0,250)と書き込む.
– 関数copy_pixelを変更せよ.
– 結果:画像は赤のみになる.
演習24-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を変更せよ.
– 結果:画像は緑色が強くなる.
演習24-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)にコピーする.
それ以外はそのままコピーする.
– 結果:画像がぼける.
– 別名,ガウスぼかし.