追加の問題
(練習と確認を兼ねて、実行時パラメータの値は処理の開始時に表示して下さい)
1.複利計算
(目的)実行時パラメータ、文字列配列、文字から数へ、繰り返し
n1:整数 元金
n2:浮動小数点数 年利率(%)
n3:整数 年数
これから、n3年後の利息を計算する。
n1 * (1D + n2/100D) * (1D + n2/100D) * ...
(n1等は文字列から数に変換したもの)
利息は上の式からn1を引くと出る。
次の形式で実行するとします。
java Compound n1 n2 n3
2.無限回複利計算
(目的)繰り返し
複利計算の特殊な場合を考えます。
1年の利率を100%とします。
利率を半分にして、その代わりに半年ごとに複利計算すると、1年の(見かけの利率は)
e = (1 + 1/2)(1 + 1/2) =
利率を1/3にして、その代わりに4か月ごとに複利計算すると、1年の(見かけの利率は)
e = (1 + 1/3)(1 + 1/3) =
一般に
利率を1/nにして、その代わりに1/n年ごとに複利計算すると、1年の(見かけの利率は)は次の式で計算できます。
e = (1 + 1/n)(1 + 1/n)
n=1から12まで計算して表にして(nとeの対を1行にして)表示しなさい。
次の形式で実行するとします。
java ECalc
これは、e(自然対数の底)= 2.71828...に近づくはずです。(これはeの定義であって、実際のeの計算法とは違います。)
3.ネズミ算(ウサギ算)
(目的)実行時パラメータ、文字列配列、文字から数へ、繰り返し
次の数列はフィボナッチの数列といいます。(興味があれば、webで調べなさい)
1, 2, 3, 5, 8, 13, 21,34,...
(前の二つの数を加えている)
最初の二つを実行時パラメータとして与えて、各項を計算し、表示する。
次の形式で実行するとします。
java FibonacciNumbern1 n2
n1,n2はそれぞれ第1、第2の数です。
4.1970-1-1からの通算日
JavaのDateクラスは、1970-1-1 00:00:00を基準にした時間(単位ms)を使っています。
この日から与えられた日までの通算日を計算する処理を作って下さい。
yyyy:整数 年
mm: 整数 月
dd:整数 日
((yyyy-1) –1970) * 365 + (yyyyのmm-ddまでの日数) + (1970年から(yyyy-1)年の間のうるう年の数)
うるう年=4で割り切れる年。ただし(4で割り切れても)、100で割り切れ、400で割り切れない年は平年とする。
次の形式で実行するとします。
java DaysSince1970 yyyy mm nn
5.おつり
(目的)実行時パラメータ、文字列配列、文字から数へ、繰り返し
x: 整数 購入額
y:整数 渡した金額
z:おつり
もし、x=yなら、「ちょうど頂きました。」と表示
もし、x>yなら、「(x-y)円不足です。」と表示
もし、x<yなら、「おつりは(y-x)円です。」と表示し、かつ、おつりを、1万円札、5千円札、千円札、500円硬貨、100円硬貨、50円硬貨、10円硬貨、5円硬貨、1円硬貨それぞれ何枚(何個)かを表示します。できるだけ高額の紙幣又は硬貨で払うとします。
次の形式で実行するとします。
java Payment x y
6.郵便番号の形式チェック
入力された文字列がnnn-mmmmになっていることをチェックし、nnnとmmmmに分けて表示する。
次の形式で実行するとします。
java PostalCodeChecker nnn-mmmm
7.クレジットカード番号のチェック
入力された文字列がnnnn-nnnn-nnnn-nnnnになっていることをチェックし、4個の数に分けて表示する。
チェックとして、各数値(1桁)を全部加えて、10で割った余りをチェック桁として表示しなさい。
1234-5678-9012-3456場合、 1+2+3+...+9+1+2+...+6=66 10で割ると余り6
次の形式で実行するとします。
java CreditCardNumberChecker nnnn-nnnn-nnnn-nnnn
8.メールアドレスのチェック
xxxx@nsp-ltd.co.jpの形式になっていることをチェックします。さらにxxxxの部分は次の条件を満たしているとします。
構成する文字は(漢字ではない)アルファベットと数字、-、_
先頭はアルファベット
最後はアルファベットか数字
次の形式で実行するとします。
java MailAddressChecker addr
9.ISBN-10のチェック
(参考サイト: http://ja.wikipedia.org/wiki/ISBN)
ISBN-10の形式:ISBN● - AAAA - BBBB –C
●、A、Bの各部分の割り当て桁数は決まっておらず、合計で9桁(必ず1桁のC部分を入れると10桁)となる範囲内で、それぞれの部分は増減する。
Cはチェック桁:計算法:モジュラス11 ウェイト10-2
チェックデジットを除いた左側の桁から10、9、8…2を掛けてそれらの和を取る。和を11で割って出た余りを11から引く。
例
ISBN4-10-109205-□の場合(下線の付いた数がISBNの各桁、下線が付かない数は係数)
10×4 + 9×1 + 8×0 + 7×1 + 6×0 + 5×9 + 4×2 + 3×0 + 2×5
= 40 + 9 + 0 + 7 + 0 + 45 + 8 + 0 + 10
= 119
119 ÷11 = 10 あまり 9
11 - 9 = 2
よって、このISBNのチェックデジットは2 である。なお、計算結果が 10 になった場合、10 の代わりに X(アルファベットの大文字)を用いる。また、11 になった場合は、0 となる。
形式が正しいことを確認した後、チェック桁を計算して、入力されたものと合致しているチェックする。正しい場合は「チェック桁:OK」、誤っている場合は「チェック桁:NG」と表示する。
java ISBN10Checker isbn
例に使うISBN
ISBN4-87148-100-X
ISBN0-8104-5109-3
ISBN4-7741-0778-4
(チェック桁の値を変更して、誤りを示すメッセージが出ることも確認する)
10.ISBN-13のチェック
(参考サイト: http://ja.wikipedia.org/wiki/ISBN)
ISBN-13の形式:ISBNnnn - ● - AAAA - BBBB - C
●、A、Bの各部分の桁数は決まっておらず、合計で9桁の範囲内でそれぞれの部分は増減する。
n部分- 「接頭記号」: nnn は978 または979 のいずれか(数字3桁)である。
Cはチェック桁:計算法: モジュラス10 ウェイト3・1(モジュラス10 ウェイト3)」
チェックデジットを除いた一番左側の桁から順に1、3、1、3…を掛けてそれらの和を取る。和を10で割って出た余りを10から引く。ただし、10で割って出た余りの下1桁が0の場合はチェック数字を0とする。
例
ISBN978-4-10-109205-□ のチェックデジットの場合 (下線の付いた数がISBNの各桁、下線が付かない数は係数)
9×1 + 7×3 + 8×1 + 4×3 + 1×1 + 0×3 + 1×1 + 0×3 + 9×1 + 2×3 + 0×1 + 5×3
= 9 + 21 + 8 + 12 + 1 + 0 + 1 + 0 + 9 + 6 + 0 + 15
= 82
82 ÷10 = 8 あまり 2
10 - 2 = 8
形式が正しいことを確認した後、チェック桁を計算して、入力されたものと合致しているチェックする。正しい場合は「チェック桁:OK」、誤っている場合は「チェック桁:NG」と表示する。
java ISBN13Checker isbn
例に使うISBN
ISBN978-4-12-003819-8
ISBN978-4-86191-293-1
ISBN978-4-02-273249-1
11.MyRot18
rotation13を応用して、演習してみましょう。
アルファベット26文字だけでなく、0から9の数字及び+と-を追加します。そして次の二つのぐるぷを構成します。
(1) 小文字aからz,+,0から4 --- 32文字
(1) 大文字AからZ,-,5から9 --- 32文字
先送りする数は32/2=16を使います。たとえば、AはQに変換されます。
対応を次に示します。
00000000001111111111222222222233(番号:10の位)
abcdefghijklmnopqrstuvwxyz+01234(変換前)
qrstuvwxyz+01234abcdefghijklmnop(変換後)
ABCDEFGHIJKLMNOPQRSTUVWXYZ-56789(変換前)
QRSTUVWXYZ-56789ABCDEFGHIJKLMNOP(変換後)
次の形式で実行するとします。
java MyRot13 文字列
12.3乗根
処理の仕方は平方根の問題を参考にしてください。
3乗根は次の式を繰り返すことで計算できます。
x2= ( 2 * x1 * x1 * x1 + n )/(3 * x1 * x1)
計算はすべてdouble型で行いなさい。
次の形式で実行するとします。
java CubicRoot n
13.πの近似値(1)
これは、解析を使った方法ではありません。円に内接する多角形の面積がその円の面積に近づく性質を使ったものです。
内接する多角形を、3角形、6角形、12角形,...頂点と中心を結んで出来る三角形の中心の角が1/2ずつ小さくなる列を考えます。半径はrとします。
6角形: a=r*cos30* r*sin30*2* 6= 6*r*r * sin60
12角形: a=r*cos15* r*sin15*2* 12=12*r*r * sin30
24角形: a=r*cos7.5* r*sin7.5*2* 24=24*r*r * sin15
...
演習なのでJavaの三角関数は使わないことにします。
一般に、
sin2α=pとすると
sinα=(1-sqrt(1-p*p))/2
したがって
p=sqrt( (1-sqrt(1-p*p))/2 )
とおくと、sin60,sin30,sin15,...の列が順次もとまる。
r=1とおいたとき、各多角形の面積はπに近づく。
ループ初期値
n=6
p= 0.866025403784439 // sin60
ループ
a=(double)n * p
p=sqrt( (1-sqrt(1-p*p))/2 ) //sqrtはJavaのAPIマニュアルMathクラス参照
nとpを印刷
次のnを設定
n=n*2
次のループへ
ループ回数をcountとして、処理を書きなさい。count=3として処理しなさい。
次の形式で実行するとします。
java PaiCal1
14.πの近似値(2)
前の問題で、nとcountを実行時パラメータとして与えるプログラムに変えなさい。
pの初期値はsin((π/180)*(360/(n))=sin(2*π/n)で計算しなさい。
π、sinはMathクラス参照のこと
次の形式で実行するとします。
java PaiCal2 n count
15.πの近似値(3)
外接円を使って近似します。
6角形: a=r* r*tan30*2* 6
12角形: a=r* r*tan15*2*12
24角形: a=r* r*tan7.5* 2*24
tan2α=pとおくと、
tanα=(sqrt(1+p*p)-1)/p
πの近似値(1)にならって処理を作成しなさい。
次の形式で実行するとします。
java PaiCal3
16.πの近似値(4)
前の問題で、nとcountを実行時パラメータとして与えるプログラムに変えなさい。
かつ、同じn角形の内接と外接の値を1行に表示するようにしなさい。
次の形式で実行するとします。
java PaiCal4 n count
17.πの近似値(5)):これは出来なくてもOK
前の問題で、sqrtを平方根の問題で作成した処理を使って計算しなさい。
次の形式で実行するとします。
java PaiCal5 n count
18.Rot13(その2---簡潔版):これは出来なくてもOK
rot13の処理を簡潔に処理する。a-zについて1文(if文)、A-Zについて1文(if文)だけ使う。
(どこかのwebサイトにあるかもしれませんが、見ないで考えることをお勧めします)
char型を使い、その大小からa-z,又はA-Zを判定する。charAtメソッドを使うとchar型として1文字取り出せる。そのchar型に13を足したものが求める文字(char型)で、これを文字列にするには、文字列 + (char型)を使う。
13を加えたときにzのchar型の値を超えた場合の処理は次の列をよく見て考えて下さい。
0から25のときは、0から25に対応し、26から51はまた0から25に対応する。
n 0,1,2,3,4,... ,25,26,27,28,29,...,51,52,...
nを26で割った余り 0,1,2,3,4, ,25, 0, 1, 2, 3, ,25, 0,...
19.Base64(1)
Base64は暗号としても使われます。また、任意のデータ(=文字に対応していないデータ)を通信回線で送信する際に利用されます。
一般のBase64は、現在の学習段階では難しいので、整数列 a1,a2,a3,...を与えて、それを対応する文字列c1,c2,c3に変換する処理を作って下さい。
a1,a2,a3,..の各項は0から63までの数値です。その数値に次の文字が対応します。
入力されたa1,a2,a3...が0から63までの数値であることをチェックする必要があります。
Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y
(最後のpadはここでは気にしない)
次の形式で実行するとします。
java Base64Coder1 a1,a2,a3,...
20.Base64(1a)
Base64(1)を少しだけ改良します。表示するc1,c2,c3,...を区切らないで、ひとつの文字列として表示する。実行の形式は前の問題と同じです。
21.Base64(2)
Base64で変換された文字列を元の数字列に戻す処理を作成してください。
例YokOHAmAなら 24,40,36,14,7,0,38,0
次の形式で実行するとします。
java Base64Decoder1 文字列
22.格子(1)
縦n行 横m列の格子を表示しなさい。
例を次に示します。格子のセルは3文字の大きさにする。+、-、|を使い分けてください。
+---+---+---+---+---+---+---+
| | | | | | | |
+---+---+---+---+---+---+---+
| | | | | | | |
+---+---+---+---+---+---+---+
次の形式で実行するとします。
java Grid1 n m
23.格子(2)
前の問題に追加します。
(p,q)の形式で指定したセルの位置に文字列aを書きなさい。セルは最初の行、列を(1,1)とします。データは(p,q,a)で設定します。p,qはそれぞれセルの位置を表す行番号と列番号で、aはセルの中に書く一文字のアルファベット又は数字です。
次の形式で実行するとします。
java Grid2 n m (p,q,a)
24.格子(3)
前の問題に追加します。
実行時パラメータ(p,q,a)の数を複数個(任意個)にします。
(p,q,a)を先頭から順に進めたときに、同じ位置が指定されたときは、「(p,q)は予約済です。」のメッセージを表示します。
次の形式で実行するとします。
java Grid3 n m (p,q,a) (p,q,a) . . .
(ヒント)
設定されたセルを記憶する必要があります。そのために行*列の長さの文字配列を確保します。
セル(p,q)に対して、(p-1)*m + (q-1)番目の配列要素を対応させます。たとえば(1,1)は0です。
(nは行の長さ---実行時パラメータで与えられる)
セルに何も設定されていないときは、対応する配列要素はnullです。何か設定されていれば、対応する配列要素はその値です。たとえば”a”です。
25.格子(4)
前の問題に追加します。
実行時パラメータ(p,q,a)の形が(p,q,a,c)の形も許します。ここでcは”c”又は”C”(引用符は含みません)のいづれかです。(p,q,a,c)がきた場合は、セル(p,q)にaが設定されていて、かつその文字がaに等しいことを確認します。
その条件が満たされれば、(p,q)を空白に戻して、「(p,q,a)は取り消しました。」のメッセージを表示します。
(p,q)にa以外の文字が設定されている場合は、「(p,q)にはxが設定されています。aでは取り消せません。」のメッセージを表示します。(注xはすでにセルに設定されている文字)。
また(p,q)にまだ文字が設定されていない場合は、「(p,q)はまだ予約されていませんので、aでは取り消せません。」のメッセージを表示します。
次の形式で実行するとします。
java Grid4 n m (p,q,a) (p,q,a) . . . (p,q,a,c) . . .
(ヒント)
キャンセルしたときは対応する配列要素をnullにします。
26.格子(5)
前の問題に追加します。
格子の並びを列車の並びに似せます。中央は通路とします。通路の両側に、それぞれ4席あります。2席ずつ向かい合っています。席の呼び方は、向かい合う4席を同じ行番号とし順にA,B,C,Dとします。その通路の相対する席は、行番号は同じで、E,F,G,Hとします。次の図を参照して下さい。
+===+===|||||===+===+
| 1A| 1B||||| 1E| 1F|
+---+---|||||---+---+
| 1C| 1D||||| 1G| 1H|
+===+===|||||===+===+
| | ||||| | |
+---+---|||||---+---+
| | ||||| | |
+===+===|||||===+===+
実行時のパラメタで(p,q)に相当するところは(pq)と改め、pqには1A等が入ります。
次の形式で実行するとします。
java Grid5 n (pq,a) (pq,a) . . . (pq,a,c) . . .
(列の数は固定ですのでmは入力しません)
27.格子(6)
前の問題に追加します。
席の指定の仕方を追加します。
左の窓側 pqの変わりにLW(リテラル)と入れる。
左の通路側 pqの変わりにLA(リテラル)と入れる。
右の窓側 pqの変わりにRW(リテラル)と入れる。
左の通路側 pqの変わりにRA(リテラル)と入れる。
これらのpqは(pq,a,c)の形式には使えません。
それぞれ条件を満足する空席を探し、割り当てます。
割り当てが出来たときは「aを...に割り当てました。」と表示する。
割り当てが出来なかったときは「aを割り当て出来ませんでした。」と表示する。
次の形式で実行するとします。
java Grid6 n (pq,a) (pq,a) . . . (pq,a,c) . . .
28.格子(7)
前の問題に追加します。さらに指定できる条件を加えます。
左の窓側進行方向 pqの変わりにLWT(リテラル)と入れる。
左の窓側進行逆方向 pqの変わりにLWA(リテラル)と入れる。
左の通路側進行方向 pqの変わりにLAT(リテラル)と入れる。
左の通路側進行逆方向 pqの変わりにLAA(リテラル)と入れる。
通路の右側についても左側と同じようにして、Lの代わりにRを使う。
次の形式で実行するとします。
java Grid7 n (pq,a) (pq,a) . . . (pq,a,c) . . .
29.格子(8) 未学習の内容を含む
前の問題を変更して、実行時パラメータの変わりに対話型で実行できるようにして下さい。
(入力をまだ学習していない場合は後回しか、独習してください)
次の形式で実行するとします。
java Grid8
(nも対話で取る)
30.格子(9) 未学習の内容を含む
前の問題を変更して、予約の状況をDBに保存して下さい。
(DBをまだ学習していない場合は後回しか、独習してください)
次の形式で実行するとします。
java Grid9