演習問題11(スライド) (7/27)

Download Report

Transcript 演習問題11(スライド) (7/27)

演習11
第1問
年と月を入力して以下のようなカレンダー
を出力するプログラムを作りなさい。
指定された月の一日(ついたち)の曜日
と月の日数がわからないとカレンダーは
作れない
一日(ついたち)の曜日
ツェラーの公式から求める
月の日数
2月以外は固定
2月は28日(平年)、29日(閏年)
ツェラーの公式
hの値
0:日曜~6:土曜日
1月は前年の13月、2月は前年の14月として扱う
Xを越えない最大の整数をあらわす
XをYで割った余り
ツェラーの公式
if (m<=2)
{
yy=y-1;
mm=m+12;
}
else
{
yy=y;
mm=m;
}
1月は前年の13月、
2月は前年の14月と
して扱う
一日の曜日を求める
Y=yy%100;
C=yy/100;
h=((26*(mm+1))/10+5*C+C/4+Y+Y/4)%7;
月の日数(dm)を求める
if (m==2)
{
/* 閏年なら29日、平年なら28日 */
}
else if (m=4||m==6||m==9||m==11)
{
dm=30;
else
{
dm=31;
}
月の日数(dm)を求める
閏年となる条件
(i) yが4で割り切れる年は閏年
(ii) ただしyが100で割り切れる場合は平年
(iii) ただしyが400で割り切れる年は閏年
(i)
(iii)
(ii)
変数のまとめ
•
•
•
•
•
y 年
m 月
yy 年(補正後)
mm 月(補正後)
h
一日の曜日
(0:日曜日〜6:土曜日)
• dm 月の日数
日付の出力
日月火水木金土日月火水木金土…
123456789…
土曜日のあとで改行
土曜日のあとで改行
日付の出力
h
日月火水木金土日月火水木金土…
W 01234560123456…
123456789…
d
h日分の空白
土曜日のあとで改行 土曜日のあとで改行
W 0→6,0→6, 0→6を繰り返す
d 1→dm
部分をまとめてプログラムにする
(1)変数の定義
(2)年、月を入力
(3)一日の曜日を求める
(4)月の日数を求める
(5)年、月を出力
(6)日ー土を出力
(7)日付の部分を出力する
動作を確認する
• 一日の曜日と月の日数が正しいことを確認
2015年7月
2012年2月
2015年2月
2020年7月
(cal 7 2015の結果と比較)
(cal 2 2012の結果と比較)
(cal 2 2015の結果と比較)
(cal 7 2020の結果と比較)
実行例
tacibana$ ./a.out
2015 7
2015年 7月
日 月 火 水 木 金 土
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
tacibana$ cal 7 2015
7月 2015
日 月 火 水 木 金 土
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
tacibana$ ./a.out
2012 2
2012年 2月
日 月火 水 木 金 土
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
tacibana$ cal 2 2012
2月 2012
日 月 火 水 木 金 土
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
第2問
xy平面上の3点A、B、Cで表される三
角形ABCが原点を内部に含むかどうかを
判定するプログラムを作りなさい。
原点を含む
原点を含まない
判定方法
原点Zを頂点とする三角形ZAB、ZAC、
ZBCの面積の和とABCの面積を比較する
原点を含む場合
判定方法
原点Zを頂点とする三角形ZAB、ZAC、
ZBCの面積の和とABCの面積を比較する
原点を含まない場合
判定方法
原点Zを頂点とする三角形ZAB、ZAC、
ZBCの面積の和とABCの面積を比較する
面積をSabc、Szab、Szac、Szbcとすると
if (Sabc < Szab+Szac+Szbc)
printf("原点を含まない\n");
else
printf("原点を含む\n");
注意点
double型の数(浮動小数点数)の比較は大小
関係を含んだ形で行う
Sabc == Szab+Szac+Szbc
Sabc != Szab+Szac+Szbc
等しい→差の絶対値がとても小さな値
三角形の面積(1)
Szab、Szac、Szbcについては
Cが原点であると考える
三角形の面積(2)
結果がdouble型になる
Sabc = 0.5*fabs((Xa-Xc)*(Yb-Yc)-(Ya-Yc)*(Xb-Xc));
1/2 と書くとint型の演算になり0になる
Szab = 0.5*fabs(Xa*Yb-Ya*Xb);
Szac = 0.5*fabs(Xa*Yc-Ya*Xc);
Szbc = 0.5*fabs(Xb*Yc-Yb*Xc);
Szab、Szac、Szbcについては
Cが原点であると考える
部分をまとめてプログラムにする
(1)変数の定義
(2)座標の入力
(3)三角形の面積の計算
(4)原点が内側に含まれるかの判定
テストデータ
原点を含むもの
(-1,4) (2,-3) (-4,0)
原点を含まないもの
(-1,4) (5,5) (6,-3)
実行例
tacibana$ ./a.out
-1 4 2 -3 -4 0
A(-1,4)
B(2,-3)
C(-4,0)
Sabc 16.5
Szab 2.5
Szbc 6
Szac 8
Szab+Szbc+Szac 16.5
原点は三角形ABCの中に含まれる
tacibana$ ./a.out
-1 4 5 5 6 -3
A(-1,4)
B(5,5)
C(6,-3)
Sabc 24.5
Szab 12.5
Szbc 22.5
Szac 10.5
Szab+Szbc+Szac 45.5
原点は三角形ABCの中に含まれない
提出物と提出方法(1)
• ソースコードと実行結果を印刷し提出す
る
– ソースコードにはきちんとインデントを付け
ること
– 学籍番号、名前をソースコードの先頭にコメ
ントとして入れること
– ソースコードはコンパイルエラーが無い状態
であること
– 実行結果は問題で指定されたものであること
– 印刷したソースコードと実行結果はステイプ
ルでとじること
– 以上が守られていない場合は再提出とする
提出物と提出方法(2)
• 実行結果の印刷方法
– 「プログラムの作成と実行」「13 実行結果の
印刷」を参考に行う
– (1) pwd でカレントディレクトリを確認
– (2) プログラムの実行
– (3) 実行結果をマウスで選択
– (4) シェル->選択したテキストを書き出す...
– (5) カレントディレクトリを選択
– (6) ファイルに書く
– 印刷の例)ターミナルの出力結果 ./out.txt
pr –n out.txt | lpr