2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

java講座を一緒に受けよう!

1 : ◆WtRerEDlHI :05/03/07 16:20:44
ひょんなことから、今日から2週間、javaの家庭教師をすることになりました。
で、生徒がプログラム作ってる間暇なことが判明。
なので、もしよかったら参加しませんか?

詳しいルールは>>2以降です。
開催は朝9:00〜夜18:00までです。

2 : ◆WtRerEDlHI :05/03/07 16:22:09
ルール
sage進行
全ての質問に答えられるとは限りません。
(当然、生徒優先です。)



3 : ◆WtRerEDlHI :05/03/07 16:25:42
3月7日
javaのインストール
ttp://swsdlcuat.central.sun.com/ECom/docs/Welcome.jsp?StoreId=22&PartDetailId=jdk-1.5.0_02-oth-JPR&SiteId=JSC&TransactionId=noreg
上記をインストールします。
c:\の下にフォルダを作って、インストールしてください。
(ディフォルトでは、c:\Program files\〜になっています。変更してください。)
以下のようになります(細かい数字は、バージョンによって変わります。)
c:\j2sdk1.5.0_02


4 : ◆WtRerEDlHI :05/03/07 16:28:19
c:\の下にJavaProgramというフォルダを新しく作ります。
ここに、プログラムを入れます。
以降は、このフォルダの中で作業をします。

※最初は、エクリプスを使わないでやります。

5 : ◆WtRerEDlHI :05/03/07 16:32:56
まず、helloWorld.javaというテキストファイルを作ります。
中身は、以下のようにします。

文字の使い方
public class helloWorld {

public static void main(String[] args) {
// 文字を表示する
System.out.println("Hello World");
}

}



6 : ◆WtRerEDlHI :05/03/07 16:34:41
次に、バッチファイルを作ります。
j.batというテキストファイルを作って、中身を以下のようにします。
※最初の1行の数字は、インストールしたフォルダにあわせてください。

SET JAVA_HOME=D:\j2sdk1.5.2_06
SET PATH=%PATH%;%JAVA_HOME%\bin
SET CLASSPATH=.;%JAVA_HOME%\lib\tools.jar


7 : ◆WtRerEDlHI :05/03/07 16:37:42
これで準備が出来たので、DOSプロンプトを開きます。
cd c:\JavaProgram
で、プログラムのおいてあるフォルダに移動したら
j.bat
を実行して、設定をします。
これで準備完了

まずは、javaのプログラムをコンパイルします。
javac helloWorld.java
何も表示されなかったら成功です。

次に、コンパイルしたプログラムを実行します。
java helloWorld
画面にHello Worldと出たら成功です。
失敗した場合は、大文字小文字を間違えていないか
確認してください。
×javac helloworld.java


8 : ◆WtRerEDlHI :05/03/07 16:48:06
動いたのでプログラムの解説
>public class helloWorld {
helloWorldって名前のクラスを定義します。
クラスというのは、プログラムの塊みたいなものです。
javaでは、クラス名=ファイル名になります。

>public static void main(String[] args) {
今度は、メインというなまえの、メソッドを定義します。
javaでは、プログラムが実行されると、このmainが最初に
実行されます。

他の細かいpublicとかstaticとかは、とりあえず後で説明します。
いまは、こういうものだと思っておいてください。

{}で囲まれた単位がブロックになっています。
なので、helloWorldクラスの中に、mainメソッドがあると
いえます。


9 : ◆WtRerEDlHI :05/03/07 16:50:05
mainの中には、
>// 文字を表示する
>System.out.println("Hello World");
となっています。
//はコメントといって、それ以降の文字は無視されます。
プログラムに説明やメモを書くのに使います。
>System.out.println("Hello World");
は、画面に文字を出す命令です。
""でくくってある文字を出します。

10 : ◆WtRerEDlHI :05/03/07 16:50:36
なんとなくわかった?
というわけで、次のステップへ

11 : ◆WtRerEDlHI :05/03/07 16:52:26
変数の使い方1

helloWorld.javaを以下のように書き換えます。以降も、そんな感じで
やっていくので、バックアップを取りながらやりましょう。

public class helloWorld {

public static void main(String[] args) {
// 変数の定義
int x;

// xに0を代入
x = 0;

// 文字を表示する
System.out.println("x:" + x);
}

}

12 : ◆WtRerEDlHI :05/03/07 17:01:05
コンパイルして実行すると、
x:5
と出たと思います。

解説です。
>// 変数の定義
>int x;
xという名前のint型の変数を定義しています。
変数というのは、箱のようなものです。
intというのは、箱の種類をあらわします。
intは、整数を入れられる箱です。
まとめると、整数を入れられる箱xを作ったということです。

>// xに0を代入
>x = 0;
xに0をいれます。

>// 文字を表示する
>System.out.println("x:" + x);
xの中身を表示します。これは、こういうものだとおもっておいてください。




13 : ◆WtRerEDlHI :05/03/07 17:02:48
Q&A
・変数には最初なにがはいっているの?
→わかりません。変数に値を入れる前に、使おうとするとコンパイルエラーになります。
・変数の種類は?
→ほかにも、文字を入れる変数、小数点が使える変数など色々ありますが
あとでおしえます。


14 : ◆WtRerEDlHI :05/03/07 17:03:48
応用。割り算です。
/が÷の意味です。でてこないけど、*は×です。

計算
public class helloWorld {

public static void main(String[] args) {
// 変数の定義
int x;

// xに10を代入
x = 10;

// 計算
x = x / 5;

// 文字を表示する
System.out.println("x:" + x);
}

}

15 : ◆WtRerEDlHI :05/03/07 17:04:28
さらに応用です。

//男子800、女子700円で8時間働いた額を求める
public class helloWorld {

public static void main(String[] args) {
// 変数の定義と初期化
int jikyuDansei = 800;
int jikyuJosei = 700;
int kyuryoDansei = 0;
int kyuryoJosei = 0;

// 8時間バイトしたときの給料
kyuryoDansei = jikyuDansei * 8;
kyuryoJosei = jikyuJosei * 8;

// 文字を表示する
System.out.println("男性給料:" + kyuryoDansei);
System.out.println("女性給料:" + kyuryoJosei);
}

}

16 : ◆WtRerEDlHI :05/03/07 17:04:53
こんな感じでもOKですね。

//男子800、女子700円で8時間働いた額を求める(別の例)
public class helloWorld {

public static void main(String[] args) {
// 変数の定義と初期化
int jikyuDansei = 800;
int jikyuJosei = 700;
int kyuryo = 0;

// 8時間バイトしたときの給料
kyuryo = jikyuDansei * 8;
// 文字を表示する
System.out.println("男性給料:" + kyuryo);

// 8時間バイトしたときの給料
kyuryo = jikyuJosei * 8;
// 文字を表示する
System.out.println("女性給料:" + kyuryo);
}

}

17 : ◆WtRerEDlHI :05/03/07 17:21:22
以上、変数については、なんとなく分かってきたので
次は、メソッドを覚えます。

//メソッドのサンプル
public class helloWorld {

// メソッドの定義
private static void helloWorld() {
System.out.println("Hello World");
}

public static void main(String[] args) {
// 文字表示
helloWorld();
}

}

18 : ◆WtRerEDlHI :05/03/07 17:24:20
>private static void helloWorld() {
helloWorldというメソッドを作ります。
中身は
>System.out.println("Hello World");
なので、Hello Worldという字を出すメソッドです。
このメソッドは定義しただけなので、中身がいつ実行されるかは
わかりません。

mainは、
>// 文字表示
>helloWorld();
となっています。ここで、helloWorld()として、メソッドを呼び出しています。
実行結果はいかのようになります。

Hello World

19 : ◆WtRerEDlHI :05/03/07 17:25:01
次は、戻り値のあるメソッドです。

//メソッドのサンプル2
public class helloWorld {

// メソッドの定義
private static int pi() {
return 3;
}

public static void main(String[] args) {
int x;

x = pi();

System.out.println(x);
}

}

20 :デフォルトの名無しさん:05/03/07 17:25:17
先生。質問!
>>16において
変数 kyuryo の初期化は不要なように思えますが

21 : ◆WtRerEDlHI :05/03/07 17:29:36
>private static int pi() {
piというメソッドを定義します。
さっきまでvoidだった場所が、intになっています。
これは、メソッドの戻り値の型をあらわします。
>return 3;
returnは戻り値を返すという命令です。


>x = pi();
pi()メソッドの戻り値は3になるので、実行結果は
3
になります。




22 : ◆WtRerEDlHI :05/03/07 17:31:03
>>20
正解です。不要ですね。


23 : ◆WtRerEDlHI :05/03/07 17:32:13
ちなみに、コメントのつけ方や、変数の初期化などは後でまとめて
おしえます。いまはまあ、細かいことは言わずに、
まずは全体的な流れをおぼえるという感じでいきましょう。

24 : ◆WtRerEDlHI :05/03/07 17:33:26
メソッドの最後は、引数です。

//男子800、女子700円で8時間働いた額を求める
public class helloWorld {
public static void main(String[] args) {
// 変数の定義と初期化
int jikyuDansei = 800;
int jikyuJosei = 700;
int kyuryo = 0;
// 8時間バイトしたときの給料
kyuryo = kyuryoKeisan(jikyuDansei, 8);
// 文字を表示する
System.out.println("男性給料:" + kyuryo);
// 8時間バイトしたときの給料
kyuryo = kyuryoKeisan(jikyuJosei, 8);
// 文字を表示する
System.out.println("女性給料:" + kyuryo);
}

// メソッドの定義(給料計算メソッド)
private static int kyuryoKeisan(
int argJikyu, // 時給
int argJikan // 勤務時間
) {
// 給料
int kyuryo = 0;
// 時給と勤務時間から給料を求める
kyuryo = argJikyu * argJikan;
// 求めた給料を返却
return kyuryo;
}
}

25 : ◆WtRerEDlHI :05/03/07 17:41:08
メソッドの定義です。
>private static int kyuryoKeisan(
>int argJikyu, // 時給
>int argJikan // 勤務時間
>) {
()のなかで、argJikyuとargJikanというのを定義しています。
これを引数といいます。
呼び出すところでは、
>kyuryo = kyuryoKeisan(jikyuDansei, 8);
という感じでよびます。

こうすると、kyuryoKeisanメソッドを呼んだときに、
jikyuDanseiがargJikyuに、8がargJikanにはいります。

kyuryoKeisanメソッドのなかで、給料を計算して、結果を返します。

26 : ◆WtRerEDlHI :05/03/07 17:44:02
なんとなく分かったところで、次はif文です。

//if文
public class helloWorld {
public static void main(String[] args) {
int a = 2;
if (a == 1) {
System.out.println("aは1");
} else {
System.out.println("aは1以外");
}
}
}



27 : ◆WtRerEDlHI :05/03/07 17:46:22
if文は条件を判断する命令です。
>if (a == 1) {
()の中の式が正しかったら{}の中を、違ってたらelse {}の中を
実行します。

if ()の条件式の書き方
a == 1 :aが1と等しい
a != 1 :aが1と等しくない(1以外)
a > b
a >= b
a < b
a <= b
他にもありますが、基本はこんな感じです。


28 : ◆WtRerEDlHI :05/03/07 17:47:33
さっきの給料計算を改造して、6000以上だったら
ボーナス1000円もらえるようにしましょう。

答えは以下のとおり
// メソッドの定義(給料計算メソッド)
private static int kyuryoKeisan(
int argJikyu, // 時給
int argJikan, // 勤務時間
int argBonus // ボーナス
) {
// 給料
int kyuryo = 0;
// 時給と勤務時間から給料を求め規定額以上かを判定する
kyuryo = argJikyu * argJikan;
if (kyuryo >= 6000) {
kyuryo = kyuryo + 1000;
} else {
kyuryo = kyuryo;
}
// 求めた給料を返却
return kyuryo;
}


29 : ◆WtRerEDlHI :05/03/07 17:48:27
最後はfor文です
これは、繰り返しです。

//for文
public class helloWorld {
public static void main(String[] args) {
for (int i = 0; i < 10; ++i) {
System.out.println(i);
}
}
}

30 : ◆WtRerEDlHI :05/03/07 17:52:23
>for (int i = 0; i < 10; ++i) {
最初のint i=0
これは、繰り返しに使う変数定義です。
最初に一回だけ実行されます。

i<10
これは、繰り返しの条件です
i<10の間だけ、繰り返します。

++i
これは、増分を書くところで、ループの最後に呼ばれます。
(++iというのは、i=i+1の省略形です。)


まとめると、
i=0からはじまって、i=1,i=2....i=9まで繰り返すということです。

1からはじまって10までなら
for (i = 1; i <= 10; ++i)
または
for (i = 1; i < 11; ++i)
と書くといいでしょう。
どっちでもいいですが、上のほうが10回という数字に意味があるので
分かりやすいかと思います。


31 : ◆WtRerEDlHI :05/03/07 17:54:56
応用問題1
0から9までの数を表示するプログラムをつくりなさい。
ただし、5のばあいは、500を表示すること
応用問題2
掛け算の九九を表示するプログラムを作りなさい。
1*1〜9*9までを表示すること。

以上、正解は明日。

今日は、講座の終わりに書き込みましたが、明日からは講座をしながら
少しずつ書いていきたいと思います。

32 :デフォルトの名無しさん:05/03/07 17:57:30
先生。質問!
>>28におけるkyuryoKeisanの引数argBonus
は不要では無いでしょうか

33 : ◆WtRerEDlHI :05/03/07 18:03:49
>>32
あーごめんなさい。不要ですね。
(生徒が間違ったプログラムを作った名残です。ごめんなさい)


34 :デフォルトの名無しさん:05/03/08 02:14:14
良スレの予感

35 : ◆WtRerEDlHI :05/03/08 08:57:11
応用問題1の答え
//for文
public class helloWorld {
public static void main(String[] args) {
for (int i = 0; i <= 10; ++i) {
if (i == 5) {
System.out.println("500");
} else {
System.out.println(i);
}
}
}
}


36 : ◆WtRerEDlHI :05/03/08 08:57:42
応用問題2の答え
public class helloWorld {
public static void main(String[] args) {
for (int i = 1; i <= 9; i = i + 2) {
System.out.println(i + "の段");
for (int j = 2; j <= 8; j = j + 2) {
System.out.println(i + "*" + j + "=" + (i * j));
}
}
}
}

37 : ◆WtRerEDlHI :05/03/08 08:58:39
というわけで、今日の授業開始
まずは、昨日のおさらいもかねて、
九九を9の段から順番に表示するプログラムを作る

38 : ◆WtRerEDlHI :05/03/08 09:06:44
回答。簡単ですね。

public class helloWorld {
public static void main(String[] args) {
for (int i = 1; i <= 9; i = i + 2) {
System.out.println(i + "の段");
for (int j = 2; j <= 8; j = j + 2) {
System.out.println(i + "*" + j + "=" + (i * j));
}
}
}
}

39 : ◆WtRerEDlHI :05/03/08 09:14:43
今日は配列をやります。

public class helloWorld {

public static void main(String[] args) {
int[] x = { 0, 1, 2 };

for (int i = 0; i <= 2; ++i) {
System.out.println(x[i]);
}
}

}



40 : ◆WtRerEDlHI :05/03/08 09:17:22
>int[] x = { 0, 1, 2 };
xという変数を配列で定義して、値を初期化しています。

x[0] = 0;
x[1] = 1;
x[2] = 2;

という意味です。


41 : ◆WtRerEDlHI :05/03/08 09:22:27
別の書き方をするとこうなります。

public class helloWorld {

public static void main(String[] args) {
int[] x = new int[3];

x[0] = 10;
x[1] = 11;
x[2] = 12;

for (int i = 0; i <= 2; ++i) {
System.out.println(x[i]);
}
}

}




42 : ◆WtRerEDlHI :05/03/08 09:27:38
>int[] x = new int[3];
これは、xをint型の配列[]で定義して
そこにint型で[3]の配列を代入するみたいな意味です。

これで、x[0],x[1],x[2]の3個の箱が出来ます。
new int[3]の3は、箱の数です。箱の番号は0から始まるので、
箱の最大番号は2になるのを理解してください。

箱の番号を表す[]の中の数字を添え字といいます。
添え字と箱の中身は別です。
x[0] = 10
というのは、0番目の箱に10を入れるということです。

43 : ◆WtRerEDlHI :05/03/08 09:58:08
それでは、応用問題

10個箱を作って、1〜10間での数をいれたあと
表示するプログラムを作りなさい。

44 : ◆WtRerEDlHI :05/03/08 09:58:41
答え。あってるけど何か変です。

public class helloWorld {
public static void main(String[] args) {
int[] x = new int[10];
for (int h = 0; h <= 9; ++h){
x[h] = h + 1;
}
for (int i = 0; i <= 9; ++i) {
System.out.println(i + " : " + x[i]);
}
}
}


45 : ◆WtRerEDlHI :05/03/08 10:00:26
>for (int h = 0; h <= 9; ++h){
>x[h] = h + 1;
>}
ループ用の変数にhを使っていますが、これはiにしたほうがいいでしょう。
一般的にループ用の変数の名前にはiが使われます。

ちなみに、
うえのループとしたのループは別々の{}で囲まれているので
iも別々に定義されます。


46 : ◆WtRerEDlHI :05/03/08 10:19:01
じゃあ、逆に10〜1を入れるにはどうすればいい?

答えはこんな感じ
public class helloWorld {

public static void main(String[] args) {
int[] x = new int[10];

for (int i = 0; i <= 9; ++i){
x[i] = 10 - i;
}

for (int i = 0; i <= 9; ++i) {
System.out.println(i + " : " + x[i]);
}
}

}


47 : ◆WtRerEDlHI :05/03/08 10:35:05
というわけで、超基本編はおしまい。

ここからは、eclipseというソフトを使っておこないます。


48 :デフォルトの名無しさん:05/03/08 10:47:35
本体
ttp://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.0.1-200409161125/eclipse-SDK-3.0.1-win32.zip
日本語化
http://download.eclipse.org/eclipse/downloads/drops/L-3.0.1_Translations-200409161125/NLpack-eclipse-SDK-3.0.x-win32.zip

上記をダウンロードして
c:\eclipse
にインストールします。


49 :デフォルトの名無しさん:05/03/08 10:51:00
以降は、

プロジェクト名
test
パッケージ名
testJava
クラス名
MainJava

という感じでクラスを作って行います。
前回までは、helloWorld.javaを使っていましたが、名前が変だったので
MainJavaにします。
クラスの最初の文字は大文字です。(helloWorldが間違っていた)




50 : ◆WtRerEDlHI :05/03/08 10:52:22
コテハン記憶チェックつけるの忘れてました。
すみません。

で、ここまでできたら、さっきのプログラムを移植して
動くかどうかテストしてみてください。
eclipseの使い方については省略します。

51 : ◆WtRerEDlHI :05/03/08 11:52:51
Eclipseだけインストールしてもだめみたい
javaにバグがあるそうなので、下記を見てインストールを

http://www.eclipsewiki.net/eclipse/?%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB

52 : ◆WtRerEDlHI :05/03/08 13:45:02
IBMのJREをインストールすれば、eclipseきちんと動くようです。
>>51のページに書いてあります。

今日は、昨日の復習・・・かなりつまづいているので
復習だけで終わりそう?

53 : ◆WtRerEDlHI :05/03/08 14:13:19
こんどは、新しいクラスを作ってみる
掛け算と足し算のメソッドが入ったクラスSubJavaを作る

package testJava;
public class SubJava {
public static int kakezan(
int argHidari,
int argMigi
){
int kotae = argHidari * argMigi;
return kotae;
}
public static int tasizan(
int argHidari,
int argMigi
){
int kotae = argHidari + argMigi;
return kotae;
}
}


54 : ◆WtRerEDlHI :05/03/08 14:13:53
これをmainで使う場合は、以下のとおり

package testJava;
import testJava.SubJava;
public class MainJava {
public static void main(String[] args) {
int kotae;
kotae = SubJava.kakezan(1, 5);
System.out.println(kotae);
kotae = SubJava.tasizan(1, 5);
System.out.println(kotae);
}
}



55 : ◆WtRerEDlHI :05/03/08 14:16:01
まず、SubJavaがMainJavaから使えるようにする。
>import testJava.SubJava;

あとは、使いたい場所でクラス名.メソッド名と書けばOK
>kotae = SubJava.kakezan(1, 5);
>kotae = SubJava.tasizan(1, 5);


56 : ◆WtRerEDlHI :05/03/08 14:17:45
つぎに、tashizanのstaticをはずしてみる。

public int tasizan(
int argHidari,
int argMigi
){
int kotae = argHidari + argMigi;
return kotae;
}


57 : ◆WtRerEDlHI :05/03/08 14:18:52
そうすると、MainJavaでtashizanが使えなくなるので、
以下のように変える

public static void main(String[] args) {
int kotae;

kotae = SubJava.kakezan(1, 5);
System.out.println(kotae);

SubJava subJava = new SubJava();
kotae = subJava.tasizan(1, 5);
System.out.println(kotae);

}


58 : ◆WtRerEDlHI :05/03/08 14:31:23
javaでは、コンパイルしたら、設計図みたいなのが出来るだけで、
本体は出来ない。そこで、本体を作ってあげる必要がある。

>SubJava subJava = new SubJava();
ここで、subjavaをSubJava型で新しく作る。
(xという箱をint型で作るのと同じ感じ)
>kotae = subJava.tasizan(1, 5);
subjavaの中のtashizanを使う

じゃあなんで、staticは使えたのか?
staticの場合は、設計図みたいなとこに本体があって
みんなで使う感じになってる。
なんで、本体を作らなくても使える。
逆に、本体を作っても、staticだけは、新しく作られずに
設計図のが使われる。

59 : ◆WtRerEDlHI :05/03/08 14:32:02
わかりやすくするために、変数でやってみる。

package testJava;

public class SubJava {
public static int x = 0;
public int y = 0;
public static int kakezan(
int argHidari,
int argMigi
){
int kotae = argHidari * argMigi;
return kotae;
}
public int tasizan(
int argHidari,
int argMigi
){
int kotae = argHidari + argMigi;
return kotae;
}
}


60 : ◆WtRerEDlHI :05/03/08 14:33:03
これを使うMainJavaはこんな感じ

package testJava;
import testJava.SubJava;
public class MainJava {
public static void main(String[] args) {

SubJava.x = SubJava.x + 1;
System.out.println(SubJava.x);

SubJava subJava = new SubJava();
subJava.x = subJava.x + 1;
System.out.println(subJava.x);

subJava.y = subJava.y + 1;
System.out.println(subJava.y);
}
}

61 : ◆WtRerEDlHI :05/03/08 14:35:19
xはstaticなので、そのまま本体を作らなくても使える。
>SubJava.x = SubJava.x + 1;

でも、yは本体を作る必要がある
ついでに、本体のxにも1を足してみる
>SubJava subJava = new SubJava();
>subJava.x = subJava.x + 1;
>subJava.y = subJava.y + 1;

実行結果は
1
2
1
になる。
>subJava.x = subJava.x + 1;
の結果が2になることを理解してほしい。
xはstaticなので、本体を作っても設計図のほうに+1される。


62 : ◆WtRerEDlHI :05/03/08 14:36:17
本体を2個作ることも出来る
package testJava;
import testJava.SubJava;
public class MainJava {
public static void main(String[] args) {

SubJava subJava = new SubJava();
subJava.x = subJava.x + 1;
System.out.println(subJava.x);
subJava.y = subJava.y + 1;
System.out.println(subJava.y);

SubJava subJava2 = new SubJava();
subJava2.x = subJava2.x + 1;
System.out.println(subJava2.x);
subJava2.y = subJava2.y + 1;
System.out.println(subJava2.y);
}
}

63 : ◆WtRerEDlHI :05/03/08 14:41:50
実行結果は
1<-x
1<-y
2<-x
1<-y
になる。(<-yとかはわかりやすくするためにつけた、表示されない)
xはstaticなので2になる。
subJavaでもsubJava2でも同じのを使っているため。

yは本体の中に組み込まれているので、
別々の値になる。なので1になる。

64 : ◆WtRerEDlHI :05/03/08 14:44:55
staticあり、なしの区別と
本体を作るということが理解できただろうか?

応用問題
合計を求めるメソッドを作れ。
goukei(1) -> 1
goukei(5) -> 6
goukei(16) -> 22
というような感じで、どんどん足していって答えを返すメソッド。
メインでは、以下のように呼び出す。

package testJava;
import testJava.SubJava;
public class MainJava {
public static void main(String[] args) {
SubJava subJava = new SubJava();
subJava.goukei = subJava.goukei + subJava.kazu;
System.out.println(subJava.goukei(1));
System.out.println(subJava.goukei(5));
System.out.println(subJava.goukei(16));
}
}

65 : ◆WtRerEDlHI :05/03/08 14:45:38
まちがえた、メインは以下のとおり

package testJava;
import testJava.SubJava;
public class MainJava {
public static void main(String[] args) {
SubJava subJava = new SubJava();
System.out.println(subJava.goukei(1));
System.out.println(subJava.goukei(5));
System.out.println(subJava.goukei(16));
}
}

66 : ◆WtRerEDlHI :05/03/08 14:46:08
合計の値をどうやって保持するか?
というのが難しい?

67 : ◆WtRerEDlHI :05/03/08 15:00:26
答えはこんな感じ
(goukeiをstaticにしないのは、本体を何個も作っても個別に合計を計算できるように。)

package testJava;
public class SubJava {
public int goukei = 0;
public int goukei(
int argKazu
){
goukei = goukei + argKazu;
return goukei;
}
}


68 : ◆WtRerEDlHI :05/03/08 15:12:52
さて、一応正解なのですが、たとえば、mainで
subJava.goukei = 100;
などとされると、合計の値がおかしくなってしまいます。

そこで、
public int goukei = 0;

private int goukei = 0;
に変えます。
privateは、定義されている{}の外から見えなくなるという意味です。
定義されている{}の中やさらにその中の{}の中では見れます。

なんで、mainJavaからは、goukei という変数はみれませんが、
SubJavaのなかでは、普通に使えるというわけです。

予断ですが、変数とメソッドに同じ名前をつけています。
わかりづらいですね。やめたほうがいいです。

69 : ◆WtRerEDlHI :05/03/08 15:44:11
応用問題
本体を複数作られたとしても、大丈夫な、総合計を求めるメソッドを作りなさい。
メインはこんな感じ

package testJava;
import testJava.SubJava;
public class MainJava {

public static void main(String[] args) {

SubJava subJava1 = new SubJava();
System.out.println(subJava1.goukei(1));
System.out.println(subJava1.goukei(5));
System.out.println(subJava1.goukei(16));

SubJava subJava2 = new SubJava();
System.out.println(subJava2.goukei(1));
System.out.println(subJava2.goukei(5));
System.out.println(subJava2.goukei(16));

System.out.println(SubJava.soGoukei());
}

}



70 : ◆WtRerEDlHI :05/03/08 15:50:54
答えはこんな感じ。staticを使うというのに気づけば楽勝

package testJava;
public class SubJava {
private int goukei = 0;
private static int soGoukei = 0;
public int goukei(
int argKazu
){
goukei = goukei + argKazu;
soGoukei = soGoukei + argKazu;
return goukei;
}
public static int soGoukei(){
return soGoukei;
}
}

71 : ◆WtRerEDlHI :05/03/08 15:51:45
ちなみに、クラスも配列に出来る。

package testJava;
import testJava.SubJava;
public class MainJava {
public static void main(String[] args) {
SubJava[] subJava = new SubJava[2];
subJava[0] = new SubJava();
System.out.println(subJava[0].goukei(1));
System.out.println(subJava[0].goukei(5));
System.out.println(subJava[0].goukei(16));
subJava[1] = new SubJava();
System.out.println(subJava[1].goukei(1));
System.out.println(subJava[1].goukei(5));
System.out.println(subJava[1].goukei(16));

System.out.println(SubJava.soGoukei());
}
}

72 : ◆WtRerEDlHI :05/03/08 15:53:08
ポイントは、
>SubJava[] subJava = new SubJava[2];
ここでは、配列の数を決めただけで、初期化はされていないので、
>subJava[0] = new SubJava();
各添え字ごとに、初期化をする必要があるということ。

あとは、intとかの配列と一緒だと思ってかまわないです。



73 : ◆WtRerEDlHI :05/03/08 16:07:53
次はセッター、ゲッターの考え方を覚えましょう
まずは、SubJava

package testJava;

public class SubJava {
private int no = 0;
private int jikyu = 0;

public int getJikyu() {
return jikyu;
}
public void setJikyu(int argJikyu) {
jikyu = argJikyu;
}
public int getNo() {
return no;
}
public void setNo(int argNo) {
no = argNo;
}
}


74 : ◆WtRerEDlHI :05/03/08 16:11:18
>private int no = 0;
>private int jikyu = 0;
で変数を定義していますが、privateなのでMainJavaからはみえません
そこで、

>public int getNo() {
>return no;
>}
>public void setNo(int argNo) {
>no = argNo;
>}
をつくってアクセスできるようにします。


75 : ◆WtRerEDlHI :05/03/08 16:12:45
MainJavaはこんな感じになります。

package testJava;
import testJava.SubJava;
public class MainJava {
public static void main(String[] args) {

SubJava tonosama = new SubJava();
tonosama.setNo(1);
tonosama.setJikyu(3000);
System.out.println("no:" + tonosama.getNo());
System.out.println("jikyu:" + tonosama.getJikyu());

SubJava puzzle = new SubJava();
puzzle.setNo(2);
puzzle.setJikyu(2700);
System.out.println("no:" + puzzle.getNo());
System.out.println("jikyu:" + puzzle.getJikyu());
}
}

76 : ◆WtRerEDlHI :05/03/08 16:15:23
tonosamaとpuzzleの二人について、社員番号と時給を設定している感じです。
このように、classは、ゲッターセッターを使うことによって
おっきな変数の塊のようなかんじで使うことが出来ます。

社員情報をSubJavaというクラスにまとめているわけです。

例では、tonosamaの社員情報を作成して、社員番号と時給を設定
そのあとに、puzzleの社員情報を作成して、社員番号と時給を設定しています


77 : ◆WtRerEDlHI :05/03/08 16:15:55
それでは問題。
時給2000円以上の場合は、2000円にするという処理をいれたいけど
どうすればいいでしょう?

78 : ◆WtRerEDlHI :05/03/08 16:31:14
生徒がだした回答が以下のとおり
うーん、確かにあってるんだけど・・・・。

package testJava;

public class SubJava {
private int no = 0;
private int jikyu = 0;
public int getJikyu() {
if (jikyu >= 2000){
return 2000;
} else {
return jikyu;
}
}
public void setJikyu(int argJikyu) {
jikyu = argJikyu;
}

public int getNo() {
return no;
}

public void setNo(int argNo) {
no = argNo;
}

}

79 : ◆WtRerEDlHI :05/03/08 16:34:39
とりあえず、正解ということにしておいて次の問題
引数に勤務時間を入れると給料が取得できるメソッドを作りなさい。
計算式は
給料=勤務時間×時給

MainJavaはこんな感じ

package testJava;
import testJava.SubJava;

public class MainJava {
public static void main(String[] args) {
SubJava tonosama = new SubJava();
tonosama.setNo(1);
tonosama.setJikyu(3000);
System.out.println("no:" + tonosama.getNo());
System.out.println("jikyu:" + tonosama.getJikyu());
System.out.println("kyuryo:" + tonosama.getKyuryo(8));

SubJava puzzle = new SubJava();
puzzle.setNo(2);
puzzle.setJikyu(2700);
System.out.println("no:" + puzzle.getNo());
System.out.println("jikyu:" + puzzle.getJikyu());
System.out.println("kyuryo:" + puzzle.getKyuryo(8));
}
}


80 : ◆WtRerEDlHI :05/03/08 17:01:00
答えはこんな感じです・・・と、おもったら

public int getKyuryo(int argJikan) {
return jikyu * argJikan;
}


81 : ◆WtRerEDlHI :05/03/08 17:03:00
うまくいかないですね。なぜでしょう?
それは、getJikyuで2000以上かどうか見てるからです。

と、いうわけで、セットするときに2000以上だったら2000でセットするように改造しましょう。

package testJava;
public class SubJava {
private int no = 0;
private int jikyu = 0;
public int getJikyu() {
return jikyu;
}
public int getKyuryo(int argJikan) {
return jikyu * argJikan;
}
public void setJikyu(int argJikyu) {
if (argJikyu >= 2000){
jikyu = 2000;
} else {
jikyu = argJikyu;
}
}
public int getNo() {
return no;
}
public void setNo(int argNo) {
no = argNo;
}
}

82 : ◆WtRerEDlHI :05/03/08 17:04:37
こんな感じです。

逆に、内部で2000ではなく、2000以上の値で処理したい場合には、
return jikyu * argJikan;
ではなく
return getJikyu() * argJikan;
にすればよかったです。

これは、どっちがいいかというと、どっちともいえませんが、
セットするときに値を調整したほうが、分かりやすいと思います。

83 : ◆WtRerEDlHI :05/03/08 17:05:40
と、いうわけで、今日はこんな感じでおしまい。

よく、復習しておいてください。

何か質問あったら遠慮なくどうぞ。

84 :デフォルトの名無しさん:05/03/09 09:13:31
おはようございます。
今日もがんばりましょう。

85 :sage:05/03/09 21:16:27
先生!今更ごめんなさい!
どうしてJavaのインストール先がデフォルトのままじゃいけないんですか?

86 : ◆WtRerEDlHI :05/03/10 02:23:21
先生です。きょうは、1日復習で終わってしまった・・・。
生徒が文法や単語を覚え切れてないので、明日は自習になりました。

>>85
ディフォルトのインストール先はProgram Filesなので、
フォルダ名に空白が入るからです。
コマンドプロンプトや環境変数の設定などで
空白がはいってると不便だし誤動作するといやなので
別のフォルダに入れました。

あと、外人の作ったアプリは、日本語名の入ったフォルダに
対応していないことが多いのでこれも注意しよう!

87 :デフォルトの名無しさん:05/03/10 22:10:30
◆WtRerEDlHI先生頑張ってくれ!
ずっとこのスレ続けていってほしいYO

88 : ◆WtRerEDlHI :05/03/11 02:20:47
>>87
応援ありがとう!先生うれしいよ。
あしたもがんばるぜ!

みんなも質問あったら遠慮なくどうぞ。
先生、初心者が疑問に思う点とか分からないから
質問してもらえると勉強になるデス。



89 :デフォルトの名無しさん:05/03/11 03:28:07
超良スレ。がんがれ。

先生しつもーん。
オブジェクト指向がなかなか身につかない気がするの。
何が分からないのか分からない状態だから、
こんなこと聞くと困るかもしれないけど、何が原因だと思う?

一応、一通りは勉強しました。
読んだ本は「10日でおぼえるオブジェクト指向入門」。

90 : ◆WtRerEDlHI :05/03/11 04:58:44
先生さあ、なんか昼間10時間くらい寝たからねむくないんだよねー
明日起きれるのだろうか・・・
それはさておき、質問にこたえますです。

>オブジェクト指向がなかなか身につかない気がするの。
うーん、難しいなあ。オブジェクト指向以前の言語は知っていますか?
オブジェクト指向の言語が出てきたときに、「あ、俺が求めていた言語だ」って喜んだ人と、
「なにこれ、意味分からない」って思った人と2種類いると思うんだよね。
ちなみに、先生は前者でした。

前者なら、あとは、いろいろ実践を積む・・・なんか作ってみたりして、それを
人に見せる機会を設ける。
後者なら、各機能について、どうして、既存の言語と違ってこうなってるんだろう?
っていうのを考えてみるといいと思う。

最初から、オブジェクト指向を覚えた人は・・・、どうなんだろうなあ。





91 : ◆WtRerEDlHI :05/03/11 05:07:13
オブジェクト指向にしても、ほかの事についてもそうなんだけど
たとえば、昔はGOTOしかなかったわけだ。それが、GOSUB〜RETURNが
できて、関数ができて・・・という風に、どんどん
拡張されてきた。

で、GOSUBしかなかった時代に「関数があったらいいな」って思っていたの人なら
関数を始めて目にしたときに、その意味、利点が分かっていると思うんだよね。
そういう人は、あとはもう、関数の文法だけ覚えれば使いこなせるはず。

そうじゃなくて、GOSUBで満足していた人にとっては、「関数って何だ?」って
ことになるわけだ。そういう人にとって関数を覚えるのはただ複雑な機能にしか
過ぎないんだよね。文法を覚えても、いまいち使いこなせない。
そもそも、GOSUBでも同じことができるわけだし。
そういう人は、「どうして関数という機能が追加されたか」ってことを考えれば
いいと思う。そうすれば、意味や利点が分かってくる。

そうやって、自分の物にしてけばいいと思うよ。


92 : ◆WtRerEDlHI :05/03/11 05:18:17
ちなみに、オブジェクト指向のなにがいまいち分からない?
・クラスとかそのへん
・デザインパターン
・UML

クラスとかそのへんは、ある程度しっかり理解しておいたほうがいいと思う。
実際すべての機能を使うかどうかは別として。
英語の文法みたいなものだから、覚えないと話せないからね。

デザインパターンは、いうなれば、過去のプログラムのよくある形をまとめただけ
だから、知らなくても何とかなるし、実践で使う機会にならなければ「ふーん」ってな
もんだと思う。デザインパターンが生み出される前から同じ形のプログラムを作ってた人も
多いと思うし。ただ、しっていて損することはないよね。
基本設計をするときに、「これは、あのパターンでやろう」とかいえたらすごいと思う。
数学の公式みたいなものだから。知らなくても自分で考えれば何とかなる。
けど、自分で考えるより公式知ってれば早いし正確だし無駄がない。

UMLもデザインパターンと同じ位置づけだよね。
ただ、仕事でやるんなら、コミニュケーションの手段として必要かもしれない。
そうなったらきちんと覚えないと。でも、それまでは気にしなくていいと思う。

93 : ◆WtRerEDlHI :05/03/11 05:22:21
なんか、読み返してみると分かりづらいですが、
参考になったでしょうか?
そいでは。また明日もがんばりましょう。

ていうか、今日だ。

94 : ◆WtRerEDlHI :05/03/11 09:04:54
おはようございます。

今日は2次元配列から

int[][] x = new x[3][3];
int[][] x = { {0,1,2}, {3,4,5}, {6,7,8} };

こんな感じで配列の配列をつくれます。

95 : ◆WtRerEDlHI :05/03/11 09:47:46
サンプルはこんな感じ
yは使ってないけど、こんなふうにできるってことで。

package testJava;

public class MainJava {

public static void main(String[] args) {

int[][] x = {
{ 0, 1, 2},
{ 3, 4, 5},
{ 6, 7, 8}
};
int[][] y = new int[3][3];

for (int i = 0; i <= 2; ++i) {
for (int j = 0; j <= 2; ++j) {
System.out.println(x[i][j]);
}
}
}
}

96 : ◆WtRerEDlHI :05/03/11 09:48:43
それでは問題

1:九九の答えを配列に入れる
2:答えの配列の中身を表示

こんな感じのプログラムを作れ
ただし、1と2のループは分ける事

97 : ◆WtRerEDlHI :05/03/11 10:36:58
答えはこんな感じ
最初のループは0から始めてもいい(その場合は計算式が変わる)

package testJava;

public class MainJava {

public static void main(String[] args) {

int[][] x = new int[9][9];

for (int i = 1; i <= 9; ++i) {
for (int j= 1; j <= 9; ++j) {
x[i - 1][j - 1] = i * j;
}
}

for (int i = 0; i <= 8; ++i) {
for (int j = 0; j <= 8; ++j) {
System.out.println(x[i][j]);
}
}
}
}


98 : ◆WtRerEDlHI :05/03/11 10:50:23
boolean型をおぼえます

package testJava;
public class MainJava {
public static void main(String[] args) {
boolean isX;
isX = true;
if (isX) {
System.out.println("True");
} else {
System.out.println("False");
}
isX = false;
if (isX) {
System.out.println("True");
} else {
System.out.println("False");
}
if (1 == 1) {
System.out.println("True");
} else {
System.out.println("False");
}
isX = (1 == 1);
if (isX) {
System.out.println("True");
} else {
System.out.println("False");
}
}
}

99 : ◆WtRerEDlHI :05/03/11 10:53:34
boolean型には、trueかfalseがはいります。
trueは真、falseは偽という意味です。

if文は if ( 条件式 ) という感じで条件の中身によって分岐しますが
じつは、これは条件式の結果がtrueかどうかを判断しています。

なので、
>isX = true;
>if (isX) {
とすれば、trueになります。

逆に言うとbolean型には条件式の判断結果を入れることが出来ます。
>isX = (1 == 1);
とすれば、isXにはtrueがはいります。

100 : ◆WtRerEDlHI :05/03/11 10:55:03
boolean型は名前をつけるときにisXXXXという感じでつけます。
たとえば、えらーかどうかならisErrorです。
OKかどうかならisOK。

isCheckとかはだめです。チェックの結果がどういうときにtrueか分からないからです。

isOKなら、OKだったらtrueというのが、名前を見ただけでわかります。


101 : ◆WtRerEDlHI :05/03/11 10:55:38
次に、Stringを覚えます。

package testJava;

public class MainJava {

public static void main(String[] args) {
String s = new String("あいうえお");
String t = "かきくけこ";

s = s + t;

System.out.println(s);
}
}

102 : ◆WtRerEDlHI :05/03/11 10:57:59
Stringは文字列の入る型です。正確には文字列の入るクラスのようなものです。
>String s = new String("あいうえお");
このようにして、文字列を入れることが出来ます。

>String t = "かきくけこ";
newの部分は省略可能です。

文字列は足し算のみできます。
>s = s + t;
文字が連結されます。

103 : ◆WtRerEDlHI :05/03/11 10:59:52
文字列の比較は、==ではなく、equarlsというメソッドを使ってやります。
Stringはクラスなので、メソッドを持っています。
そのなかに、引数と自分の中身が同じ文字ならtrueを返すという
equarlsメソッドがあるので、これを使うわけです。


package testJava;
public class MainJava {

public static void main(String[] args) {
String s = new String("あいうえお");
String t = "かきくけこ";

if (s.equals(t)) {
System.out.println("True");
} else {
System.out.println("False");
}

}
}


104 : ◆WtRerEDlHI :05/03/11 11:01:12
と、いうわけで練習問題

引数の中身が”あ”かどうか調べて、”あ”だったらtrueを返却する
isAというメソッドを作りなさい。


105 : ◆WtRerEDlHI :05/03/11 12:40:43
こんな感じかな

package testJava;
public class MainJava {
public static void main(String[] args) {
String s = new String("あ");
String t = "か";
if (isA(s)) {
System.out.println("True");
} else {
System.out.println("False");
}
if (isA(t)) {
System.out.println("True");
} else {
System.out.println("False");
}
}
public static boolean isA(
String argS
) {
boolean isA;
if ("あ".equals(argS)) {
isA = true;
} else {
isA = false;
}
return isA;
}
}


106 : ◆WtRerEDlHI :05/03/11 12:41:41
ちなみに、
>if (isA(s)) {
>System.out.println("True");
>} else {
>System.out.println("False");
>}
この部分は
System.out.println(isA(s));
でOKです。



107 :デフォルトの名無しさん:05/03/11 13:24:27
先生質問!
>>105
if ("あ".equals(argS)) {

if (argS.equals("あ")) {
と等価と思えますが正しいですか?


108 : ◆WtRerEDlHI :05/03/11 13:44:34
否定
booleanに!をつけると逆の意味になります。

package testJava;

public class MainJava {
public static void main(String[] args) {
boolean isX;
isX = (1 == 1);
System.out.println(isX);
isX = (1 == 1);
System.out.println(!isX);
isX = !(1 == 1);
System.out.println(isX);
isX = !(1 == 1);
System.out.println(!isX);
}
}

109 : ◆WtRerEDlHI :05/03/11 13:49:11
>>105
結果は同じですが、意味は違います。

>if ("あ".equals(argS)) {
"あ"のメソッドequarlsを使って、比較をしています

>if (argS.equals("あ")) {
argSのメソッドequarlsを使って、比較をしています

結局一緒じゃん?って思うかもしれませんが、実は深い意味があります。
まだおしえていませんが、argSにnullが入った場合に変わってきます。

とりあえず、ここでは、
「文字列と変数を比べる場合は、文字列を左に書く」
と単純に覚えてそういう癖をつけてください。

他の言語だと
変数 == 文字列
なので違和感あるかもしれませんが、癖をつけておいてください。


110 : ◆WtRerEDlHI :05/03/11 14:25:24
上のレス>>107の間違いでした。

111 : ◆WtRerEDlHI :05/03/11 14:54:52
パラメータ
public static void main(String[] args) {
のString[] argsのところには、クラスを実行したときのパラメータが入る

たとえば、
javac MainJava ああああ いいいい
としたばあい、
args[0] = ああああ
args[1] = いいいい
になる。

Eclipseのばあい、実行のところで、プログラム引数を設定すればいい


112 : ◆WtRerEDlHI :05/03/11 15:04:21
配列の数

package testJava;

public class MainJava {

public static void main(String[] args) {
int i = args.length;
System.out.println(i);

int[] x = new int[100];
i = x.length;
System.out.println(i);

}
}

113 : ◆WtRerEDlHI :05/03/11 15:08:21
配列の数(要素数)を取得できます。
配列名.length;
>int i = args.length;

と、いうわけで応用問題
引数の内容を全部表示するプログラムを作れ


java MainJava あ い う


java MainJava あ い う




114 : ◆WtRerEDlHI :05/03/11 15:35:27
答えはこんな感じ、配列の数の分だけループするということに
気がつけば簡単?

package testJava;
public class MainJava {
public static void main(String[] args) {
int i = args.length;
System.out.println(i);
int[] x = new int[100];
i = x.length;
System.out.println(i);
}
}

115 : ◆WtRerEDlHI :05/03/11 16:28:06
つぎのもんだい
引数の1こめと2こめをくらべて、結果を出すプログラムを作れ
ただし、引数の数が2こじゃないばあいは、めっせーじをひょうじすること

答えは、こんな感じ
public class MainJava {
public static void main(String[] args) {
int len = args.length;
if (len < 2) {
System.out.println("少ない");
} else {
if (len > 2) {
System.out.println("多い");
} else {
if (args[0].eqauls(args[1])) {
System.out.println("OK牧場");
} else {
System.out.println("OK農場");
}
}
}
}
}



116 : ◆WtRerEDlHI :05/03/11 16:29:25
String にも、長さを調べるメソッドがある

String s = "あああ";
System.out.println(s.length());

こんな感じ。
では、
引数の1こめと2こめをくらべて、どっちが長いかを出すプログラムを作れ
ただし、引数の数が2こじゃないばあいは、めっせーじをひょうじすること


117 : ◆WtRerEDlHI :05/03/11 17:46:36
こんな感じ

public class MainJava {

public static void main(String[] args) {
if (args.length == 2) {
if (args[0].length() == args[1].length()) {
System.out.println("同じだよ");
} else {
if (args[0].length() < args[1].length()) {
System.out.println("後の方が長いよ");
} else {
System.out.println("前の方が長いよ");
}
}
} else {
System.out.println("適していません");
}
}
}


118 :デフォルトの名無しさん:05/03/11 21:06:55
先生 >114 が正しく動きません

119 :デフォルトの名無しさん:05/03/11 23:59:15
先生、話がとんで申し訳ないんですが、例外のthrowsについて全く理解出来ません。
try,catchの処理とどう違うのでしょうか?


120 : ◆WtRerEDlHI :05/03/12 01:19:24
>>118
本当だ・・・>>114ぜんぜん違うソースですね。申し訳ありません。
環境が手元にないので動かしていませんが、下記のようになると思います。

package testJava;
public class MainJava {
public static void main(String[] args) {
int len = args.length;
for (int i = 0; i < len; ++i) {
System.out.println(args[i]);
}
}
}



121 : ◆WtRerEDlHI :05/03/12 01:50:40
>>119
質問の意味がわからないので、例外について軽く解説します。

メソッド内で、異常が起きた場合、javaは例外を発生します。
例外が発生した場合、2種類の処理のうちどちらかをしなくてはいけません。
catchして、例外を処理するか、throwして、呼び出し元に例外処理を任せるかの
どちらかです。

例外を処理するというのは、たとえばエラーメッセージをだすとか、
そういうことです。このへんは、プログラムの用件や例外の内容によって
処理が変わってくると思います。

たとえば、mainからメソッド1を呼んで、その中からメソッド2を呼ぶような
プログラムがあるとします。
例:main -> メソッド1 → メソッド2

メソッド2で例が発生した場合は、
1:メソッド2で例外をcatchしてエラーメッセージを表示
2:メソッド2で例外をthrowしてメソッド1でcatchしてエラーメッセージを表示
3:メソッド2で例外をthrowしてメソッド1でthrowhしてmainでcatchしてエラーメッセージを表示
4:メソッド2で例外をthrowしてメソッド1でthrowhしてmainでthrowして例外で終了
この4パターンのどれかの処理をする必要があります。

122 : ◆WtRerEDlHI :05/03/12 01:55:21
それでは、1〜4まで、どれがいいのか?それは用件によります。
たとえば、「例外の処理はmainで全部行う」というルールの下に、
3を選択すれば、エラーメッセージを表示する処理をmainにまとめることができます。
逆に、「例外の処理は発生したメソッド内で行う」というルールの下に
1を選択すれば、mainやメソッド1は、例外を気にすることなく下位のメソッドを
呼ぶことができます。

この辺は、例外の内容やプログラムの構成によって変わってくるので
どれがいいとはいえません。ただ、プログラムの設計段階で方針を決めてから
作るといいと思います。



123 : ◆WtRerEDlHI :05/03/12 02:02:48
さて、例外には2種類あります。ExceptionとRuntimeExceptionです。

Exceptionは、プログラムのどこかで、必ず処理しなくてはいけない例外です。
RuntimeExceptionは、プログラム上で処理しなくてもいい例外です。

ここでいう処理というのはcatchかthrowのどちらかをしなくてはいけないということです。
まあ、例外が起きたら処理をしなくてはいけないというのは理解できると思います。
では、なぜRuntimeExceptionは処理しなくていいのか?
RuntimeExceptionは、おもにプログラムにバグがあったときにでる例外だからです。
たとえば、ヌルポインターとかは、プログラムにバグがなければ発生しないですよね?

RuntimeExceptionは、自動的に上にthrowされます。
メソッド2でおきたとしたら、どんどん上にthrowされていって、最後には
mainでthrowされて、例外でプログラムが終了します。

とはいえ、catchしていけないということではなく、必要に応じて
catchしてもいいことになっています。

124 : ◆WtRerEDlHI :05/03/12 02:08:41
以上が、例外についての簡単な説明です。

メソッド2のxxxという部分で例外が発生するとして、
メソッド2で例外処理したいならcatchすればいいし

private void method2() {
try {
xxx ← ここで例外発生するかも
} catch (xxxException ex) {
例外処理
}
}

メソッド2を呼んだとこで処理したければthrowすればいいです。

private void method2() throws xxxException {
xxx ← ここで例外発生するかも
}

125 : ◆WtRerEDlHI :05/03/12 02:09:25
わかりましたか?

月曜からまた授業を始めますが、それまでに復習しといてくださいね。
質問とかあったら、遠慮なくどうぞ。

126 :89:05/03/12 02:45:12
>91
ありがと。オブジェクト指向以前の言語を知らないと、
オブジェクト指向のありがたみが分かりづらいって言うのは聞いたことある。
ちょっと悔しいな……Javaが初めて触れるプログラミング言語なんだ。

全般的に理解がボンヤリしてるんだけど、一番不可解なのは
抽象クラスとインターフェイスの違いかな?
あと、要求をクラス化する(UML?)作業に自信がない。

先生の話聞いてると、なんかスッキリします。ほんとにどうもありがとう。

127 :デフォルトの名無しさん:05/03/13 01:52:30
>>119ですが、なんとなくは分かりました。
>catchして、例外を処理するか、throwして、呼び出し元に例外処理を任せるかの
どちらかです。
のところが分からなかったのです。

まだ理解してない点
メインメソッドでthrowした場合はどうなるんですか?
エラー表示はされないという事?
main -> メソッド1 
のメソッド1で例外をthrowした時に
メインでキャッチ文を書いてない場合はどうなるのでしょうか?


128 : ◆WtRerEDlHI :05/03/13 06:06:23
先生麻雀帰りです。
>>126
Javaが初めての言語なのかあ。だとしたら、何でもいいのでアセンブラを軽く
覚えるといいと思う。おぼえるっていうか、入門書をただ一冊読むだけで
コンピュータがメモリをどういう風に使ってるかわかるので
いろいろ役に立つと思うよ。細かい文法とか命令とかは覚える必要ないけど
概念だけでも知ってると役に立つので、読んでみたらいいんじゃないかな。
抽象クラスとインターフェイスについては、明日こたえます。(先生眠い)
クラスが先にあって、その後に抽象クラスが発明されて、その後に
インタフェイスが発明された・・・という仮定のもと考えてみると
いいかも。

>>127
>メインメソッドでthrowした場合はどうなるんですか?
ためしてみればいいじゃーん。
例外が発生してプログラムが終わります。
>メソッド1で例外をthrowした時に
>メインでキャッチ文を書いてない場合はどうなるのでしょうか?
その例外がExceptionなら、コンパイルエラーが出ます。
(かならず処理しなくてはいけない例外なので、処理しないとコンパイルできない)
RuntimeExceptionなら、自動的にmainから上にthrowされて、
例外が発生してプログラムが終了します。



129 : ◆WtRerEDlHI :05/03/14 09:10:17
おはようございます。

まずは、質問の答えから
抽象クラスというのは、実際に中身が実装されていないメソッドを含む
クラスのことをいいます。
これは、どういうときに使うかというと、クラスの雛形を作るときにつかいます。

たとえば、時間割を作るとき、枠線と月〜土、それに時間目をあらわす1〜6の
数字が入った雛形を作っておいて、それをコピーして
科目を書き入れるという作業をすると思います。

javaになおしてみると
例:枠線抽象クラス→1年生1学期時間割クラス
みたいな感じになります。どうように、
例:枠線抽象クラス→2年生1学期時間割クラス
なんかも、簡単に作れるわけです。




130 : ◆WtRerEDlHI :05/03/14 09:21:13
もうすこし、別の例でやってみましょう。

たとえば、犬と猫のお面を作るとします。
そのばあい、目、鼻、口があることは決まっていますが、
その中身はきまっていません。
逆に、お面の基本部分である、材質、紐の長さなどは
決まっています。

そこで、材質、紐の長さなどは普通のメソッドとしてつくり、
目、鼻、口のメソッドは中身を作れないけど必要なことは決まっているので
抽象クラスで作ります。

131 : ◆WtRerEDlHI :05/03/14 09:26:12
えーでも、普通のクラスでも同じこと出来るのでは?
と、おもうかもしれません。まったくそのとおりです。

では、もし、目、鼻、口を抽象クラスで作らなかったらどうなるでしょう?
普通のクラスで作った場合、オーバライドされないかもしれません。
その場合、空の目、鼻、口が出来てしまいます(いみわからないけど)
また、何も作らなかった場合、目、鼻、口を作るのを忘れてしまうかも
しれません。それでは、お面が作れません。

そこで、目、鼻、口を抽象クラスで定義することによって、
その存在を明確にして、分かりやすくするというわけです。


132 : ◆WtRerEDlHI :05/03/14 09:38:55
なんか、説明微妙におかしいですね。
抽象メソッドをつくると書くべくところを抽象クラスってかいてる・・・orz

ってわけでもっかい説明


133 : ◆WtRerEDlHI :05/03/14 09:39:14
もうすこし、別の例でやってみましょう。

たとえば、犬と猫のお面を作るとします。
そのばあい、目、鼻、口があることは決まっていますが、
その中身はきまっていません。
逆に、お面の基本部分である、材質、紐の長さなどは
決まっています。

そこで、材質、紐の長さなどは普通のメソッドとしてつくり、
目、鼻、口のメソッドは中身を作れないけど必要なことは決まっているので
抽象メソッドで作ります。


134 : ◆WtRerEDlHI :05/03/14 09:40:18
えーでも、普通のメソッドでも同じこと出来るのでは?
と、おもうかもしれません。まったくそのとおりです。

では、もし、目、鼻、口を抽象メソッドで作らなかったらどうなるでしょう?
普通のメソッドで作った場合、オーバライドされないかもしれません。
その場合、空の目、鼻、口が出来てしまいます(いみわからないけど)
また、何も作らなかった場合、目、鼻、口を作るのを忘れてしまうかも
しれません。それでは、お面が作れません。

そこで、目、鼻、口を抽象メソッドで定義することによって、
その存在を明確にして、分かりやすくするというわけです。


135 : ◆WtRerEDlHI :05/03/14 09:42:57
抽象メソッドを含むクラスは、必然的に抽象クラスになります。
それにより、目、鼻、口をl作らなくてはいけないことが、さらに
分かりやすくなるというわけです。

補足ですが、
>また、何も作らなかった場合、目、鼻、口を作るのを忘れてしまうかも
>しれません。それでは、お面が作れません。
とありますが、抽象メソッドを絶対にオーバライド
しなくてはいけないということではありません。


136 : ◆WtRerEDlHI :05/03/14 09:51:14
次にインタフェイスですが、これは、空のメソッドのみでつくられたクラス
のようなものです。

抽象クラスとの大きな違いは、普通のメソッドが含まれていないことです。
また、複数指定できるということです。

たとえば、お面に値段をつけたいとします。
そのばあい、お面クラスに値段の情報を入れてもいいのですが、
他の商品(ヨーヨーとかわたあめとか)にも値段はつけます。

そこで、値段インタフェイスをつくります。
で、犬のお面を作るときは

class 犬のお面 extends お面抽象クラス implements 値段インタフェイス

みたいにするわけです。







137 : ◆WtRerEDlHI :05/03/14 09:53:02
インタフェイスは複数指定できます。
たとえば、対象年齢インタフェイスとかもつけたかったら

class 犬のお面 extends お面抽象クラス
implements 値段インタフェイス 、対象年齢インタフェイス

というような感じです。



138 : ◆WtRerEDlHI :05/03/14 09:56:26
まとめると

抽象クラス
・普通のメソッドも含めることが出来る

インタフェイス
・普通のメソッドを含めない
・たくさん指定できる

ということになります。抽象クラスは、普通のクラスでも
代用できる感じですが、インターフェイスは代用できないですね。
また、インターフェイスだけでは、足りない部分もあると思います。

そのへんの個性を理解して、使い分けていくといいのではないでしょうか。


139 : ◆WtRerEDlHI :05/03/14 09:57:02
で、今日の問題

引数をもらって、その段の九九を表示するプログラムをつくりなさい。

140 : ◆WtRerEDlHI :05/03/14 10:49:38
こんなかんじ

package testJava;
public class MainJava {
public static void main(String[] args) {
if (args.length != 0) {
int n = 0;
if ("1".equals(args[0])) {
n = 1;
}
if ("2".equals(args[0])) {
n = 2;
}
・・・中略・・・
if ("8".equals(args[0])) {
n = 8;
}
if ("9".equals(args[0])) {
n = 9;
}
System.out.println("args[0]" + "の段");
for (int i = 1; i <= 9; ++i) {
System.out.println(n + "*" + i + "=" + (n * i));
}
} else {
System.out.println("適していません");
}
}
}


141 : ◆WtRerEDlHI :05/03/14 10:50:50
なんか、すっきりしないですね。
そこで、Stringをintにする方法を教えます。

IntegerというクラスのparseIntというメソッドを使います。
>Integer.parseInt(args[0]);

package testJava;

public class MainJava {

public static void main(String[] args) {

if (args.length != 0) {
int n = 0;
n = Integer.parseInt(args[0]);

System.out.println(n + "の段");
for (int i = 1; i <= 9; ++i) {
System.out.println(n + "*" + i + "=" + (n * i));
}
} else {
System.out.println("適していません");
}
}
}


142 : ◆WtRerEDlHI :05/03/14 10:54:31
さて、いままで使ってきたintですが、これはプリミティブ型といいます
ようは、javaに用意されている命令ということです。
それにたいして、Stringは、型として使っていますがclassで出来ています。
(なので、本来はStringクラスと呼ぶのがただしい)

それをふまえて、今度はobjectです。
javaのクラスは、objectをもとに、出来ています。
なので、objectには全てのclassを入れることが出来ます。

package testJava;
public class MainJava {
public static void main(String[] args) {
//オブジェクト
Object o;
String x = "あああ";
o = x;
//キャスト
x = (String) o;
}
}

143 : ◆WtRerEDlHI :05/03/14 10:58:05
>Object o;
でobjectを定義して、
>o = x;
で、Stringをいれています。

逆にx=oというのはできるのでしょうか?
そのまま書くとエラーになります。
なぜかというと、oはobjectで、中にどんな型のものが入っているか分からないからです。
そこで、
>//キャスト
>x = (String) o;
というように、oの型をおしえてあげます。
これをキャストといいます。

キャストは、どんな型でも出来ます。
たとえば
例:x = (Integer) o;
ただし、上記の例では実行時にエラーになります。
なぜなら、xにはStringがはいっているからです。
StringをIntegerに変換することは出来ないので、エラーになるわけです。

144 : ◆WtRerEDlHI :05/03/14 11:00:32
どんどんいきます
double型です。これはプリミティブ型です。
小数をあらわすことができます。
また、intでキャストすることが出来ます。
その場合、切り捨てです。

>d = 1.1 + 2.2;
の結果がおかしいことを確認してください。
3.3になりません。
これは、計算を2進数で行っているため、誤差が発生するのです。
(なので、doubleはお金の計算などには実は向いていません。)

package testJava;
public class MainJava {
public static void main(String[] args) {
double d;
d = 0.5;
System.out.println(d);
System.out.println((int) d);
d = 1.99;
System.out.println(d);
System.out.println((int) d);
d = 1.1 + 2.2;
System.out.println(d);
System.out.println((int) d);
}
}


145 :デフォルトの名無しさん:05/03/14 15:21:13
判り易い説明ですね。
いつも見てるので頑張って下さい。


146 :デフォルトの名無しさん:05/03/14 15:28:08
あっ一つ質問よろしいでしょうか。
今、サーブレットとJSPについて勉強してるんですがいまいちweb.xmlの中身とその使い方が理解できません。
ネットで見たりするんですが、ぼやーとしか判りません。


147 : ◆WtRerEDlHI :05/03/14 16:50:59
次は乱数です。ランダムな数を発生するメソッドです。
Math.random()
値はdouble型で、
0.0 <= Math.random() < 1.0
の範囲の数字が帰ってきます。

これに任意の数をかけ、intにすることで
0〜任意の数までを取得できます。
nを任意の数とすると
(int) (Math.random() * n)
になります。
1〜任意の数の場合は
(int) ((Math.random() * n)+1)
です。


148 : ◆WtRerEDlHI :05/03/14 16:52:28
練習問題

サイコロを1000回振って、
統計を出しなさい

出力例
1:200
2:200
3:200
4:200
5:100
6:100


149 : ◆WtRerEDlHI :05/03/14 16:53:01
ヒント:
サイコロを振るところは
int d = (int) ((Math.random() * 6) + 1);
です。

150 : ◆WtRerEDlHI :05/03/14 17:02:11
>>145
ありがとうございます。

>>146
web.xmlは設定ファイルだから、説明は難しいなあ。
システムの構成によっても違うし。

ゲームでいったらオプション画面みたいなものだよ。
そこで、難易度とか、何機設定だとか、言語だとか、コンティニューが
可能かとかを設定するわけだ。

で、web.xmlの場合は、ディレクトリ構成や、ログの場所、エンコード指定なんかを
設定するわけだ。

なんで、設定できる項目については、システムによって違うので
その説明書を見てもらうしかないです。
設定内容についても、自分が設定したいようにしてくれとしか
説明の仕様がないなあ。

たとえば、Shift_JISでエンコードしたいときに、
「Shift_JISでエンコード」っていう情報をweb.xmlに書けば、
Shift_JISでエンコードされるようになるだけなので、
実際やってみるしかないと思います。



151 : ◆WtRerEDlHI :05/03/14 17:10:33
答えはこんな感じ
箱に入れるときと表示するときで配列の添え字の扱いが違うので
あわせると分かりやすくなると思います。

package testJava;
public class MainJava {
public static void main(String[] args) {
int[] x = new int[6];
for (int i = 0; i < 1000; ++i) {
int d = (int) ((Math.random() * 6) + 1);
x[d - 1] = x[d - 1] + 1;
}
for (int i = 0; i < 6; ++i) {
System.out.println((i + 1) + ":" + x[i]);
}
}
}

152 : ◆WtRerEDlHI :05/03/15 10:12:46
おはようございます

メソッドの戻り値が配列だった場合どうなるか?
サイコロを2個振るメソッドです。

package testJava;
public class MainJava {
public static void main(String[] args) {
int[] d;
d = xai();
System.out.println(d[0]);
System.out.println(d[1]);
}
public static int[] xai() {
int[] d = new int[2];
d[0] = (int) ((Math.random() * 6) + 1);
d[1] = (int) ((Math.random() * 6) + 1);
return d;
}
}


153 : ◆WtRerEDlHI :05/03/15 10:13:37
次は、ANDとORです。
ANDは&&ORは||で表せます。

package testJava;
public class MainJava {
public static void main(String[] args) {
int a = 1;
int b = 2;

if (a == 1 && b == 2) {
System.out.println("OK");
}

if (a == 1 || b != 2) {
System.out.println("OK");
}
}
}

154 : ◆WtRerEDlHI :05/03/15 10:14:18
問題
サイコロを振って奇数偶数を判断するプログラムを作りなさい。


155 : ◆WtRerEDlHI :05/03/15 10:15:00
こたえはこんな感じです。
> if (d == 1 || d == 3 || d == 5) {
ここで、1または3または5の時という条件で判断しています。

package testJava;
public class MainJava {
public static void main(String[] args) {
int d = (int) ((Math.random() * 6) + 1);
if (d == 1 || d == 3 || d == 5) {
System.out.println(d + ":" + "奇数です");
} else {
System.out.println(d + ":" + "偶数です");
}
}
}

156 : ◆WtRerEDlHI :05/03/15 10:16:03
応用問題。サイコロを2個振って
片方が1でもう片方が1,3,5の場合に
あたりとなるプログラムを作りなさい。

157 : ◆WtRerEDlHI :05/03/15 10:16:25
答えはこんな感じ

package testJava;
public class MainJava {
public static void main(String[] args) {
int[] d;
d = xai();
d[0] = 6;
d[1] = 1;
if ((d[0] == 1 && (d[1] == 1 || d[1] == 3 || d[1] == 5)) || (d[1] == 1 && (d[0] == 1 || d[0] == 3 || d[0] == 5))) {
System.out.println(d[0] + ":" + d[1] + ":" + "大当たり!");
} else {
System.out.println(d[0] + ":" + d[1] + ":" + "残念でした。");
}
}
public static int[] xai() {
int[] d = new int[2];
d[0] = (int) ((Math.random() * 6) + 1);
d[1] = (int) ((Math.random() * 6) + 1);
return d;
}
}

158 : ◆WtRerEDlHI :05/03/15 10:19:52
次はnullです。nullとは、何も設定されていないというような意味です。
""(ブランク)とは違うので注意してください。

package testJava;
public class MainJava {
public static void main(String[] args) {
String x = null;
if (x == null) {
System.out.println("null");
}

}
}


159 : ◆WtRerEDlHI :05/03/15 10:21:40
>String x = null;
xを定義していますが、中身はnullです。
>if (x == null) {
xがnullかどうかは、==で判断できます。
x.equarls(null) や、 null.equarls(x) では判断できません
なぜなら、nullにはequarlsというメソッドが無いからです。



160 : ◆WtRerEDlHI :05/03/15 10:22:38
下記の例では、xx.length()をする場所で実行時にエラーになります。
xxがnullなので、nullの中にはlengthというメソッドが無いからです。

package testJava;
public class MainJava {
public static void main(String[] args) {
String x = new String("A");
System.out.println(x.length());
String xx = null;
System.out.println(xx.length());
}
}

161 : ◆WtRerEDlHI :05/03/15 10:29:05
ANDやORは、左から判定して、条件が確定したら右の式は
みません。

String xx = null;
if (xx.length() == 0 || xx == null) {
上記はエラーになりますが、

String xx = null;
if (xx == null || xx.length() == 0) {
上記はエラーになりません


162 : ◆WtRerEDlHI :05/03/15 15:52:52
次はelse if を覚えましょう

if (条件) {
} else if (条件2) {
}

こんな感じで、elseの後にifをまたかけます。
そうすると、条件1以外の場合に条件2を判定します。

いっぱいつなげて書くとこんなかんじ

if (条件) {
} else if (条件2) {
} else if (条件3) {
} else {
}



163 : ◆WtRerEDlHI :05/03/15 15:54:10
それでは、ここまでのまとめ問題

トランプを作りましょう。
まずはcardをあらわすclassを考えましょう。

このクラスはトランプのカードの1枚の情報を入れる
クラスです。

ちょっと考えてみてください。

164 : ◆WtRerEDlHI :05/03/15 15:54:34
ヒント
・マーク
・数
があればいいかな?

165 : ◆WtRerEDlHI :05/03/15 15:57:32
マークは文字で表すことにしましょう
スペードなら"S"みたいな感じで。

あと、ゲッター、セッターつかってくださいね。


166 : ◆WtRerEDlHI :05/03/15 16:19:15
と、いうわけで出来たのがこちら
まあ、そのまんまですね。

package testJava;

public class Card {
private int no = 0;
private String mark;
public int getNo() {
return no;
}
public void setNo(int argNo) {
no = argNo;
}
public String getMark() {
return mark;
}
public void setMark(String argMark) {
mark = argMark;
}
}

167 : ◆WtRerEDlHI :05/03/15 16:39:35
じゃあ、こんどはこのクラスを作って
トランプのデッキを作りましょう。

作ったら中身を表示するプログラムを作ってください。

デッキは配列で[52]です。


168 : ◆WtRerEDlHI :05/03/15 16:55:30
ちなみにまとめへんの最終目標は
チェンジなしのポーカーを作ることです
[S1][S2][D1][K5][H8] ワンペア
こんな感じの

たぶん、完成までには今週いっぱいかかるので
やる気のある人は先行して作ってみてください。
できたら、そーすみせてね。参考にしたいです。

ルールとしては、「ならってないことは使わない」←重要
そんなもんかな。




169 :デフォルトの名無しさん:05/03/15 22:18:56
>>150
回答ありがとうございます

170 :デフォルトの名無しさん:05/03/15 22:47:53
UMLについて分かり易く教えていただければ幸いです。


171 : ◆WtRerEDlHI :05/03/17 09:30:20
>>170
UMLというのは、プログラムの流れ、構造などを
図であらわしたものです。

図の描き方などは、ここではちょっと説明できないです。
(図だし)

もうすこし、具体的に分からないところとかあれば
また質問してください。




172 : ◆WtRerEDlHI :05/03/17 10:35:12
ひとつだけ、新しいの
System.out.print("あああ");
printlnと違って改行しない。


173 :デフォルトの名無しさん:05/03/17 10:44:27
public class BbsException extends Exception {
/**
* コンストラクタ
* @param message エラーメッセージ
*/
public BbsException(String message){
super(message);
}

superの意味がいまいちわかりません。
あとthisとか。

もう一つ。
private,protectなどの修飾子の意味は分かりますが
使い所がいまいち分かりません。。
お手数かけてすみません。

174 : ◆WtRerEDlHI :05/03/17 11:11:46
>>173
thisが自分のクラス、superが親クラスを指します。
>public class BbsException extends Exception
なので、
this が BbsException
super が Exception
になります。

>super(message);
は、親クラスのコンストラクタを実行するということです。


175 : ◆WtRerEDlHI :05/03/17 11:23:24
>private,protectなどの修飾子の意味は分かりますが
>使い所がいまいち分かりません。。

とりあえず、まとめると
public:全てのクラス
protected:定義したクラス、そのサブクラス、同じパッケージに含まれる全てのクラス
無指定:定義したクラス、同じパッケージに含まれる全てのクラス
private:定義したクラス
こんな感じでしょうか

全部publicでいいじゃん!という感じがしますが、それだと誰がどこで
内容を変えているか分からない・・・ので、
必要に応じてprivateにしたりとか、
そういう感じで、見える範囲を絞っていくことで、プログラムをみたときに
分かりやすくなるように定義すればいいと思います。

たとえば、privateの変数があったとします。
このばあい、そのクラスの中を全部見れば、変数の使われ方が分かりますが
publicだったばあいは、他のクラスで変更されているかもしれないので、
それこそプロジェクトのソース全部をみないといけません。

こんな感じでわかりましたか?

176 :デフォルトの名無しさん:2005/03/21(月) 12:02:48
>>174>>175
私も全部publicでいいじゃんと思ってましたが、分かりました


78 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)