2010/5/15 | 投稿者: sub

import java.io.InputStreamReader;
import java.io.IOException;
import java.io.BufferedReader;
import java.lang.Math;
import java.lang.String;
import java.lang.System;

public class test022{
public static void main(String[] A00) {
int L00 = 100;

BufferedReader L01 = new BufferedReader(
new InputStreamReader(System.in));

while (L00 > 0) {
int L02 = 0;
try {
System.out.println("--------------------------");
System.out.println("所持金:" + L00);
System.out.print("いくら賭けますか?:");
L02 = Integer.parseInt(L01.readLine());
if (L00 < L02 || L02 <= 0) {
System.out.println("お客さん、冗談はやめてくださいよ。");
continue;
}
L00 -= L02;

} catch (IOException L03) {
System.out.println("入力エラーが発生したので終了します。");
System.exit(1);
} catch (NumberFormatException L04) {
System.out.println("数字を入力してください。");
continue;
}

System.out.print("スロットの数字:000");

long L05 = System.currentTimeMillis() + 1000;

int L06;

do {
L06 = (int)(Math.random() * 1000);
System.out.printf("\b\b\b%03d", L06);
} while (System.currentTimeMillis() < L05);

System.out.println();

if (L06 == 777) {
L00 += (L02 * 1000);
System.out.println("大当たり!");
} else if (L06 % 111 == 0) {
L00 += (L02 * 100);
System.out.println("当たり!");
}

}
}
}


(以下引用)
コマンドラインで遊ぶスロットマシーンです。掛け金を決めて、Enterキーを押すと、スロットが回って数字が出ます。777で1000倍、7以外のゾロ目で100倍という配当になってます。

mainメソッド一本でやっちゃったんで、ローカル変数が多く、変数名解析が案外難しいかも。まず始めに「所持金」と「掛け金」の変数を特定するといいでしょう。

スロットの回転は、バックスペースで前の数字を消しながら、新しい数字を表示することで表現しました。回転の時間は1秒間。システムの現在時間を利用して計測してます。このシステム時間はエポックタイムなどと呼ばれ、1970年1月1日0時0分0秒からの経過時間が、ミリ秒(1秒=1000ミリ秒)で表されます。


実行結果の一例
--------------------------
所持金:100
いくら賭けますか?:200
お客さん、冗談はやめてくださいよ。
--------------------------
所持金:100
いくら賭けますか?:99
スロットの数字:611
--------------------------
所持金:1
いくら賭けますか?:1
スロットの数字:800


ためしに200円賭けたら怒られてしまいました(笑)
所持金が0になって終了しました。



さて、今回のソースはかなり複雑ですねー…。

(1)while文について
これはまあいいでしょう。
while(式){
  文(複数可)
}

のように使います。
式はブール型(true、false)の値を返すものでないといけません。式の値がtrue の場合、文を実行します。文を実行した後、再び式の判別を行い、値がtrueである場合再び文の実行を行います。式の値がtrueである限り、文の実行を繰り返します。式が初めから falseを返す場合、whileブロック中の文は一度も実行されません。

(2)try、catch、finallyについて
0

2010/5/11 | 投稿者: sub

import java.lang.Integer;
import java.lang.NumberFormatException;
import java.lang.String;
import java.lang.System;

public class test020{
public static void main(String[] A00) {
final int L00 = 6;
int L01 = 0;
int L02 = 0;
int L03 = 0;

if (A00.length < 3) {
System.out.println("使用例 >java Animal 1969 6 26");
System.exit(1);
}

try {
L01 = Integer.parseInt(A00[0]);
L02 = Integer.parseInt(A00[1]);
L03 = Integer.parseInt(A00[2]);
} catch (NumberFormatException L04) {
System.out.println("生年月日には数字を指定してください。");
System.exit(1);
}

int L05 = (L01 + L02 + L03) % L00;

System.out.printf("%d年%d月%d日生まれのあなたは...%n", L01, L02, L03);

switch (L05) {
case 0:
System.out.println("穏やかな心をもったヒツジです。");
break;
case 1:
System.out.println("おっとりマイペースのコアラです。");
break;
case 2:
System.out.println("自分が一番のライオンです。");
break;
case 3:
System.out.println("孤独が大好きなオオカミです。");
break;
case 4:
System.out.println("お調子者のサルです。");
break;
case 5:
default:
System.out.println("不思議な性格のタスマニアンデビルです。");
break;
}
}
}


(以下引用)
入力された日付を無理やり計算するという、インチキ臭いアルゴリズムですが、実際にやってみると、「お、当たってるかも!?」と思ったりしちゃいます。まあ、占いってだいたいそんなものなんでしょうね。



実行する際に
java test020 1986 1 23
のように入力すると
1986年1月23日生まれのあなたは...
穏やかな心をもったヒツジです。

となります。

これは、1986 + 1 + 23 = 2010、2010 % 6 = 0
という計算によってcase 0が実行されたためです。
caseが0から5まであるのは、(L01 + L02 + L03) % 6によって計算される結果が0から5までだからだったんですね。


ちなみに、実行する際に
java test020
と入力すると
使用例 >java Animal 1969 6 26
と、使用例を教えてくれます。





(1)switch文について
ここでswitch文の使い方を勉強しておきましょう。

public class test021{
public static void main(String[] args) {
int lot = 10; //(1)
switch (lot) { //(2)
//(3)該当するcase値の文を実行
case 1: System.out.println("車が当選!"); break;
case 2: System.out.println("旅行が当選!"); break;
case 3: System.out.println("冷蔵庫が当選!"); break;
case 4: System.out.println("ビデオが当選!"); break;
default: System.out.println("はずれです。"); break;
}
}
}


実行結果は
はずれです。
となる。
lot = 10だったため、defaultが実行されたわけですね。


(2)Integer.parseInt()について
public static void main(String[] A00) {
の部分で、A00[]配列はString型、つまり「文字列」として指定されています
したがって、
L01 = Integer.parseInt(A00[0]);
L02 = Integer.parseInt(A00[1]);
L03 = Integer.parseInt(A00[2]);
の部分でint型に変換する必要があります
Integer.parseInt()メソッドはint型へ変換するためのメソッドです。
最初からint型で指定できないってことでしょうか?
0

2010/5/11 | 投稿者: sub

import java.lang.Math;
import java.lang.String;
import java.lang.System;
import java.math.BigDecimal;
import java.math.RoundingMode;

public class test019{
public static void main(String[] A00) {

System.out.println("小数を整数にする(Mathクラス)");

double L00 = 25.6;
System.out.println("元の値 :" + L00);
System.out.println("切り上げ:" + (int)Math.ceil(L00));
System.out.println("切り捨て:" + (int)Math.floor(L00));
System.out.println("四捨五入:" + Math.round(L00));

System.out.println("\n小数点第1位までにする(BigDecimalクラス)");

BigDecimal L01 = new BigDecimal("256.256");
System.out.println("元の値 :" + L01);
System.out.println("切り上げ:" + L01.setScale(1, RoundingMode.CEILING));
System.out.println("切り捨て:" + L01.setScale(1, RoundingMode.FLOOR));
System.out.println("四捨五入:" + L01.setScale(1, RoundingMode.HALF_UP));
}
}


実行結果は
小数を整数にする(Mathクラス)
元の値 :25.6
切り上げ:26
切り捨て:25
四捨五入:26

小数点第1位までにする(BigDecimalクラス)
元の値 :256.256
切り上げ:256.3
切り捨て:256.2
四捨五入:256.3





つまり
元の値L00に対して
(int)Math.ceil(L00)で切り上げ
(int)Math.floor(L00)で切り下げ
Math.round(L00)で四捨五入を計算してくれるわけですね。
ただし精度の問題上、小数を整数に変換するときにしか使うべきではないとか。

小数点第1位までにする(BigDecimalクラス)の方が面倒みたいです。
BigDecemalクラスというのは、java.mathパッケージに存在する、丸め動作を制御するためのクラスのようです。
このクラス内にオブジェクトを生成(インスタンス化)して使うようです。
つまり、
元の値L01に対して
L01.setScale(1, RoundingMode.CEILING)で切り上げ
L01.setScale(1, RoundingMode.FLOOR)で切り下げ
L01.setScale(1, RoundingMode.HALF_UP)で四捨五入を計算してくれるわけですね。
0

2010/5/10 | 投稿者: sub

もう少しわかりやすい例がありました。
以下は↓のサイトから引用しています。
http://www.tohoho-web.com/java/class.htm#new

例えば下記の例では、Person という名前のクラスを定義しています。Person クラスは、myName と myAge という属性を持っています。SetName()、GetName()、SetAge()、GetAge() というメソッドを持っています。
class Person {
String myName;
int myAge;
public void SetName(String name) {
myName = name;
}
public String GetName() {
return myName;
}
public void SetAge(int age) {
myAge = age;
}
public int GetAge() {
return myAge;
}
}

class test018{
public static void main(String[] args) {
Person tanaka = new Person(); // 田中さんオブジェクトを作る
tanaka.SetName("Tanaka"); // 田中さんの名前を設定する
tanaka.SetAge(26); // 田中さんの年齢を設定する

Person suzuki = new Person(); // 鈴木さんオブジェクトを作る
suzuki.SetName("Suzuki"); // 鈴木さんの名前を設定する
suzuki.SetAge(32); // 鈴木さんの年齢を設定する

System.out.println(tanaka.GetName());
System.out.println(tanaka.GetAge());
System.out.println(suzuki.GetName());
System.out.println(suzuki.GetAge());
}
}



ここで作成した Person クラスを使用するには後半部のようにします。
まず、new でインスタンス tanaka や suzuki を作成し、そのメソッドを呼び出しています。

実行結果は
Tanaka
26
Suzuki
32

です。

流れとしては、

Personクラス
文字列myName
整数myAge
SetNameメソッド
GetNameメソッド
SetAgeメソッド
GetAgeメソッド

test018クラス
mainメソッド
Personクラスに田中オブジェクト生成
田中オブジェクトに名前:田中を設定
田中オブジェクトに年齢:26を設定
Personクラスに鈴木オブジェクト生成
鈴木オブジェクトに名前:鈴木を設定
鈴木オブジェクトに年齢:32を設定
printlnメソッドで各値を出力

みたいな感じですね。
「mainメソッドがあるクラスにはファイル名と同じ名前をつける」という決まりがあるので、2つ目のクラスにはtest018と名付けました。
0

2010/5/9 | 投稿者: sub

以下、↓のサイトを引用
http://www.javaroad.jp/java_class1.htm


クラスとは
オブジェクト指向プログラミングの考えにおいて、この世にある様々なものはオブジェクトと見なすことができます。
例えば、現在使用しているコンピュータはオブジェクトであり、身近にある鉛筆・消しゴムなどもオブジェクトと言うことができます。
それらオブジェクトは状態(メンバ変数)と振る舞い(メソッド)を持っているとされています
現在使用しているコンピュータオブジェクトはメモリ容量・HDD容量といった状態と、演算処理・I/O処理といった振る舞いを持っていると言うことができます
オブジェクト指向プログラミングはこれら状態と振る舞いを持つオブジェクトの概念をソフトウェア開発の中に適用し、様々な機能を実現しようと言うものです。

その中でクラスの役割は同様な状態・振る舞いを持つオブジェクトの共通部分を集め、1つの型を構成することです

このことにより数多くのオブジェクトを1つのクラスに対する簡易な変更で表現できるようになります。
例えばXコンピュータ、Yコンピュータといったそれぞれのオブジェクトを一から作成しようとすると非常に多くの労力を費やすこととなります。
一方、型であるコンピュータクラスを用いてそこからXコンピュータ、Yコンピュータに固有の部分にだけ変更を加えるといったやり方をとると、その労力は大幅に削減することができます。

Javaでクラスを作成する上でメンバ変数、メソッド、コンストラクタが主要な構成要素となります。(その他、パッケージ、インタフェースなど他の構成要素もありますが、ここでは説明を簡略化するため、他の構成要素についての説明は省略します。)。




以下は典型的なクラスの例です。
オブジェクトが保有するメンバ変数の状態を表示するプログラムです。
クリックすると元のサイズで表示します

メンバ変数
オブジェクトが持っている状態を表します。この他変数としてはメソッド内だけで有効なローカル変数もあります。詳細はメンバ変数を参照してください。

メソッド
オブジェクトが持っている振る舞いを表します。詳細はメソッドを参照してください。

コンストラクタ
クラスからオブジェクトが生成される時に実行される初期化処理を担います。詳細はコンストラクタを参照してください。




ふ〜む…
この辺は読めばわかりますが。
実際にやってみましょうか。

public class test017{
int exValue;

test017(){
exValue = 10;
}

void exMethod(){
System.out.println(exValue);
}

public static void main(String[] args){
test017 exObject = new test017();
exObject.exMethod();
}
}


ちなみにExampleと書いてあった所を全部test017に変えました。
初めのExampleだけ変えればいいと思っていましたが、全部変えないといけないみたいです。
"Example"が定義されていなかったためコンパイルエラーになりました。
実行結果は
10
0




AutoPage最新お知らせ