1.Javaプログラムの入り口
Copyright(C) 27Aug2013 coskx
Javaプログラムの入門編である。Cプログラム入門編から書き直している
ここで修得して欲しい内容は以下のとおり。
1.Javaプログラムの標準スタイルが書ける。
2.printfで簡単な出力ができる。
3.printfで\nの意味がわかる。
4.printfの%d,%f,%10dなどの書式がわかる。
5.printfで,変数の値を表示できる。
6.プログラムは上から1行ずつ実行されていることがわかる。
7.実行部での変数と「=」の意味がわかる。
8.キーボードから変数に数値を入力できる。
9.三角形の面積を求めるなど,簡単なプログラムが作成できる。
10.整数の割り算で,小数点以下が切り捨てられることを知っている。
11.整数の剰余演算「%」が使える。
このページの内容は以下を含んでいる。
1.1 println, print, printfと改行(コンソール画面への出力)
1.2 printfと変数(コンソール画面への出力)
1.3 変数
1.4 「=」の意味と四則演算(加減乗除)
1.5 定型キーボード入力
1.6 Javaプログラムの概観
1.1 println, printのある最初のプログラム |
---|
〇 printlnは画面への文字出力
最初のプログラムでは,多くの規則が,説明されているが,重要だと指摘されているところのみ,プログラムと 実行結果の対応を理解すればよい。「おまじない」だと説明されているところは,理解しようとしてはいけない。Java言語の習得では,最初に 「おまじない」の部分をすなおに「おまじない」として受け入れることが大切である。
List 1.1.1 printlnのあるプログラム Hello.java
このプログラムのファイル名はHello.javaであり,プログラム中にはファイル名と同じ「Hello」が使われている。
ファイル名と同じ「Hello」が使われなければならない箇所があることに留意しよう。
右側に示した青字の部分が重要なところであり,
青文字以外は「おまじない」なので今のところ理解しようとしてはいけない。/*Hello.java by Kosaka*/
public class Hello {
public static void main(String[] args) {
Hello mainprg = new Hello();
}
Hello() {
System.out.println("Hello. How are you?");
System.out.println("I'm good. How about you?");
System.out.println("I'm feeling great.");
}
}
/* Hello.java by Kosaka*/
public class Hello {
public static void main(String[] args) {
Hello mainprg = new Hello();
}
Hello() {
System.out.println("Hello. How are you?");
System.out.println("I'm good. How about you?");
System.out.println("I'm feeling great.");
}
}
実行結果例 実行結果 (コンソール画面へのプログラムの出力部分) Hello. How are you?
I'm good. How about you?
I'm feeling great.補足説明
青字の部分が右側は重要なところであり,
グレーの文字のところは「おまじない」なので理解しようとしてはいけない。
(おまじないの部分は,後で「8.6 Javaのひな型プログラム」のところで理解できる。)
(1)「/*」と「*/」で囲 まれた部分はコメント(注釈)でプログラムの実行とは関係ない。
(2)ファイルの名前がHello.javaの時,プログラム本体にはHelloが4回現れる。
ファイル名が○○.javaの時,プログラム本体には○○が4回現れる。
どうして4回出てくるか,どうしておまじないの行が多いのかは,「クラス」のところで説明される。
(3)「Hello() {」は実行するプログラムの本体の始まりを表す。(ということにしておく)
(4)「Hello() {」の中の文は上から下に向かって1行ずつ実行される。
(5)コンソール画面に文字を表示する時にはSystem.out.printlnを使う。
(6)System.out.printlnでは「"(ダブルコーテイション)」で囲まれた内容を表示する。
printlnは表示後に自動的に改行する。(ln:line feed)
ファイル名とclassの名前は同じにしなければならず,この名前はプログラム中に4回現れる。
プログラム本体(ここではHello()内)は,1行ずつ,上から下へと実行される。
「println("xxxxxxxx")」はコンソール画面への出力を行なう。
〇 printの使用
println命令でなくprint命令では自動改行しないので「\n」を書いて強制的に改行する。「\n」が書いてなければ改行しない。
次のプログラムで確認しよう。
List 1.1.2 printのあるプログラム Morning.java /*.......................
Morning.java by Kosaka
.........................*/
public class Morning {
public static void main(String[] args) {
Morning mainprg = new Morning();
}
Morning() {
System.out.print("Good morning.\n");
System.out.print("Good morning. ");
System.out.print("Did you sleep well?\n");
System.out.print("Not really. ");
System.out.print("I woke up several times because it was so hot.\n");
}
}
実行結果(コンソール画面への出力) Good morning.
Good morning. Did you sleep well?
Not really. I woke up several times because it was so hot.コメント(注釈,人間のためのメモでプログラムの実行とは無関係)は「/*」と「*/」に挟まれた領域であ り,
改行されていても構わない.このプログラムでは最初の3行がコメントである。
このプログラムでも,ファイル名のMorningがプログラム本体中に4回現れている。
実行結果では,System.out.print中の「\n」があるところだけで改行されている。
練習1.1 |
次のプログラムの実行結果を予想しなさい。
List 1.1.3 printのあるプログラム /*Hello11.java by Kosaka*/
public class Hello11 {
public static void main(String[] args) {
Hello11 mainprg = new Hello11();
}
Hello11() {
System.out.print("Hello. How are you?");
System.out.print("I'm good. How about you?");
System.out.print("I'm feeling great.\n");
}
}
実行結果 の予想1 実行結果 の予想2 実行結果 の予想3 Hello. How are you?
I'm good. How about you?
I'm feeling great.Hello.How are you?I'm good. How about you?I'm feeling great. Hello.
How are you?
I'm
good.
How about you?
I'm feeling great.
練習1.2 |
次のプログラムの実行結果を予想しなさい。
List 1.1.4 printのあるプログラム /*Hello12.java by Kosaka*/
public class Hello12 {
public static void main(String[] args) {
Hello12 mainprg = new Hello12();
}
Hello12() {
System.out.print("Hello.\nHow are you?\n");
System.out.print("I'm good.\nHow about you?\n");
System.out.print("I'm feeling great.\n");
}
}実行結果 の予想1 実行結果 の予想2 実行結果 の予想3 Hello. How are you?
I'm good. How about you?
I'm feeling great.Hello.
How are you?
I'm good.
How about you?
I'm feeling
great.Hello.
How are you?
I'm good.
How about you?
I'm feeling great.
練習1.3 |
次のプログラムの実行結果を予想しなさい。
List 1.1.5 printのあるプログラム /*Hello13.java by Kosaka*/
public class Hello13 {
public static void main(String[] args) {
Hello13 mainprg = new Hello13();
}
Hello13() {
System.out.print("Hello.\\nHow are you?\n");
System.out.print("I'm good.\\nHow about you?\n");
System.out.print("\nI'm feeling great.\n");
}
}
実行結果 の予想1 実行結果 の予想2 実行結果 の予想3 Hello.\nHow are you?
I'm good.\nHow about you?
So so.Hello.
How are you?
I'm good.
How about you?
I'm feeling great.Hello.\
How are you?
I'm good.\
How about you?
I'm feeling great.
「print("xxxxxxxx")」中で「\n」は改行を行い, 「\\」は「\」を1つ表示する。
〇 定数をprintfで表示
printfは書式を指定して表示するときに使います。(print with format)
次に,定数を表示します。
List 1.1.6 printfで定数表示 /*Printf1.java by Kosaka*/
public class Printf1 {
public static void main(String[] args) {
Printf1 mainprg = new Printf1();
}
Printf1() {
System.out.printf("%d times %d makes %d\n",2,3,6);
System.out.printf("%d times %d makes %d\n",2,3,2*3);
System.out.printf("%d times %d makes %d\n",3,4,3*4);
System.out.printf("%d times %d makes %d\n",13,37,13*37);
}
}実行結果(コンソール画面への出力) 2 times 3 makes 6
2 times 3 makes 6
3 times 4 makes 12
13 times 37 makes 481補足説明 『「%d times %d makes %d」を表示して改行する』という作業が4回行なわれるとしたら次のような表示になるはず。
%d times %d makes %d
%d times %d makes %d
%d times %d makes %d
%d times %d makes %dしかし,「%d」は数字と置き換わっている。どのような値と置き換 わったかというと,「,」で区切られて後ろに並んでいる数値である。
printfの書式中で「%」は特別な意味を持つ文 字である。「2*3」は「2×3」を意味し,6になる。
英文で「3 times 4 makes 12」は日本語で「3×4は12」の意味である。
〇 printfの書式について
桁をそろえて表示したい時には次のように表現する。
List 1.1.7 printfで定数表示(その2) /*Printf2.java by Kosaka*/
public class Printf2 {
public static void main(String[] args) {
Printf2 mainprg = new Printf2();
}
Printf2() {
System.out.printf("%3d times %3d makes %5d\n",2,3,6);
System.out.printf("%3d times %3d makes %5d\n",2,3,2*3);
System.out.printf("%3d times %3d makes %5d\n",3,4,3*4);
System.out.printf("%3d times %3d makes %5d\n",13,37,13*37);
}
}実行結果(コンソール画面への出力) 2 times 3 makes 6
2 times 3 makes 6
3 times 4 makes 12
13 times 37 makes 481補足説明 「%3d」は表示する「わく」を3文字分使って「%d」のように 与えられ数値を表示するという意味になる。
「%5d」は表示する「わく」を5文字分使うという意味になる。スペース文字はそのまま表示される。
3
文字
3
文字
5
文字__2
_times_
__3
_makes_
____6
__2
_times_
__3
_makes_
____6
__3
_times_
__4
_makes_
___12
_13
_times_
_37
_makes_
__481
このように,固定した文字数のわくを用いると,整列された表示にすることができる。
「printf("xxx %d xxxxx %d\n",a,b)」では最初の%dの位置にaの値,次の%dの位置にbの値を表示する。
プログラムの書き方ルール:中かっこ「{」があったら次の行から字下げし,「}」のところで戻る。
課題1その1 |
---|
(1)次の歌をprintlnで表示するプログラムを作りなさい。(p01ex01.java)
Happy birthday to you. Happy birthday to you. Happy birthday, dear 自分の名前 Happy birthday to you. |
(2)次のように計算して,2乗,3乗,4乗の表を作りなさい。
2*2, 2*2*2, 2*2*2*2
3*3, 3*3*3, 3*3*3*3
4*4, 4*4*4, 4*4*4*4
5*5, 5*5*5, 5*5*5*5
参考
printf("%3d %3d %3d\n",2+2,2+2+2,2+2+2+2);
画面への表示はつぎのようになるようにしなさい。(p01ex02.java)
4 8 16 |
1.2 printfと変数 |
---|
変数を使ったプログラムをまず見てみよう.プログラムは上の行から下に向かって実行される。
List 1.2.1 printfと変数のあるプログラム
(このプログラムは無意味だが,変数とprintfを用いたプログラム例になっている)/*Variable1.java by Kosaka*/
public class Variable1 {
public static void main(String[] args) {
Variable1 mainprg = new Variable1();
}
Variable1() {
int takao;
int hazama;
takao=555;
System.out.printf("takatakao= %d\n",takao);
hazama=888;
System.out.printf("hazahazama= %d\n",hazama);
}
}実行結果 takatakao= 555
hazahazama= 888説明
文
意味
int takao; 整数を記憶することのできる変数 takao の宣言
「int」とはinteger(整数)の意味int hazama; 整数を記憶することのできる変数 hazama の宣言
takao=555; 変数 takao に値555を記憶させる printf("takatakao= %d\n",takao); 「takatakao=」の文字列に続き,変数 takao に記憶されている値
を表示し,改行するhazama=888; 変数 hazama に値888を記憶する printf("hazahazama= %d\n",hazama); 「hazahazana=」の文字列に続き,変数 hazama に記憶されている値
を表示し,改行する
「int xxxx」は整数型変数xxxxを使うことを宣言している。
宣言は,その変数が使われる前に書かなければならない。変数が出てくると,とたんにプログラムが難しくなったような気がする。とりあえず,変数は次のように考えればよい。
(1)変数とは値を記憶するための容器と考えられる。(数学のように変化する値の一般的表現ではない)
(2)変数はアルファベット(複数のアルファベットでもよい)であらわされる。(1.3で詳しく説明する)
(3)変数を使うには,使う前に「使いますよ」という宣言が必要である。
(4)変数に値を記憶するには「=」を用いる。(数学のように両辺が等しいという意味ではない。)
「=」の左側(左辺)に変数を書き,「=」の右側(右辺)に記憶させたい値(あるいは 式)を書く。
(5)変数に保存されている値を表示するためにprintfを用いるjことができる。「変数」「=」は次のように数学とは意味が異なる。
数学
Java
変数 ある範囲の値を代表してx,yなど
の文字で表わしたもの例えば,y=ax+b は
yはxの一次関数である。
x:独立変数
独立して自由に値を取ること
ができる。
y:従属変数
xの値が決まれば,yの値も
決まってしまう。
xに従属している。
a:定数
y=ax+bをグラフに書くとき,
直線の傾きを表わす。
b:定数
y=ax+bをグラフに書くとき,
直線のy切片を表わす。値を記憶するための容器
例えば,
一度ある値を記憶したら,次に別の値を記憶
させるまでは前の値が記憶されている。
y=a*x+b;
において,x,y,a,bはすべて値を記憶するための変数である。
この行を実行するときの,x,a,bの変数に記憶している値で
a*x+bの値を求め,求められた値を変数yに記憶する。
という意味になる。
もしx,a,bの変数に意味のある値が記憶されたいなかったら,
この式を実行するとyには無意味な計算結果が記憶される。
「a*x+bを計算してyに代入する」とも表現される.
例えば次の一連のプログラムでは
a=3; /* aに3を記憶する(aに3を代入する) */
x=10; /* xに10を記憶する(xに10を代入する) */
b=5; /* bに5を記憶する(bに5を代入する) */
y=a*x+b;
yには35が記憶されている。
(代入されている,保存されているなどとも表現される) 「=」の
意味右辺と左辺の値が等しい。
例えば2+3=5
(a+b)(c+d)=ac+ad+bc+bd右辺の値を,左辺の変数に記憶する。(格納する)
あるいは
右辺を計算して得た値を,左辺の変数に記憶する。(格納する)
〇 変数名を変更しても得られる値は変わらないことを次の例で確認しよう次のプログラム「List 1.2.2」は前の「List 1.2.1」と同じ表示を行うが,変数名が異なっている。
(変数名は適当な名前を用いてもよいが,意味のあるプログラムでは,変数にふさわしい変数名がよい。)
List 1.2.1 printfと変数のあるプログラム
(再掲)List 1.2.2 printfと変数のあるプログラム
(変数名がList 1.2.1とは異なる)/*Variable1.java by Kosaka*/
public class Variable1 {
public static void main(String[] args) {
Variable1 mainprg = new Variable1();
}
Variable1() {
int takao;
int hazama;
takao=555;
System.out.printf("takatakao= %d\n",takao);
hazama=888;
System.out.printf("hazahazama= %d\n",hazama);
}
}
/*Variable2.java by Kosaka*/
public class Variable2 {
public static void main(String[] args) {
Variable2 mainprg = new Variable2();
}
Variable2() {
int keio;
int chuo;
keio=555;
System.out.printf("takatakao= %d\n",keio);
chuo=888;
System.out.printf("hazahazama= %d\n",chuo);
}
}
実行結果 実行結果 takatakao= 555
hazahazama= 888takakeio= 555
hazachuo= 888
〇 変数の宣言方法はさまざまである.次の例を見比べよう
次のプログラム「List 1.2.3」は,複数の変数の宣言を1行で行なっている例である。
次のプログラム「List 1.2.4」は,変数の宣言と同時に値を変数に保存している例である。
実行結果は同じになる。
List 1.2.3 printfと変数のあるプログラム
(複数の変数の宣言を1行で行う)List 1.2.4 printfと変数のあるプログラム
(変数の宣言と同時に値を変数に保存)/*Variable3.java by Kosaka*/
public class Variable3 {
public static void main(String[] args) {
Variable3 mainprg = new Variable3();
}
Variable3() {
int takao, hazama;
takao=555;
System.out.printf("takatakao= %d\n",takao);
hazama=888;
System.out.printf("hazahazama= %d\n",hazama);
}
}
/*Variable4.java by Kosaka*/
public class Variable4 {
public static void main(String[] args) {
Variable4 mainprg = new Variable4();
}
Variable4() {
int takao=555;
int hazama=888;
System.out.printf("takatakao= %d\n",takao);
System.out.printf("hazahazama= %d\n",hazama);
}
}
実行結果 実行結果 takatakao= 555
hazahazama= 888takatakao= 555
hazahazama= 888
変数は記憶している値が使われなくなったら,別の用途に再利用可能
次のプログラム「List 1.2.5」は,変数に記憶された値は記憶され続け,何回でも使うことができることを示し,さらに,もう一度別な値を記憶すると,新しい値が記憶され,前 の値は忘れ去られることを示している。
List 1.2.5 printfと変数のあるプログラム /*Variable5.java by Kosaka*/
public class Variable5 {
public static void main(String[] args) {
Variable5 mainprg = new Variable5();
}
Variable5() {
int takao, hazama;
takao=555;
hazama=888;
System.out.printf("takatakao= %d\n",takao);
System.out.printf("hazahazama= %d\n",hazama);
System.out.printf("takatakatakao= %d\n",takao);
System.out.printf("hazahazahazama= %d\n",hazama);
takao=55555;
hazama=88888;
System.out.printf("taka= %d\n",takao);
System.out.printf("haza= %d\n",hazama);
}
}実行結果 takatakao= 555
hazahazama= 888
takatakatakao= 555
hazahazahazama= 888
taka= 55555
haza= 88888
〇 printfの書式について
printfの書式のうち「%5d」あるいは,「%08d」のような表現は桁をそろえて表 示するときによく使われる。
(ここで5や8は表示に要する桁数を表す。「%08d」の0の意味を実行結果から推理しなさい。)
List 1.2.6 printfの書式「%5d」「%08d」で桁をそろえる例
/*Printf3.java by Kosaka*/
public class Printf3 {
public static void main(String[] args) {
Printf3 mainprg = new Printf3();
}
Printf3() {
int a1=1,b1=2,c1=3; /*int型変数 a1,b1,c1 を宣言し,それぞれに,1,2,3を代入*/
int a2=11,b2=12,c2=13; /*int型変数 a2,b2,c2 を宣言し,それぞれに,11,12,13を代入*/
int a3=101,b3=102,c3=103;
int a4=1001,b4=1002,c4=1003;
System.out.printf("ex1 %%d\n");
System.out.printf("%d %d %d\n",a1,b1,c1);
System.out.printf("%d %d %d\n",a2,b2,c2);
System.out.printf("%d %d %d\n",a3,b3,c3);
System.out.printf("%d %d %d\n",a4,b4,c4);
System.out.printf("ex2 %%5d\n");
System.out.printf("%5d %5d %5d\n",a1,b1,c1);
System.out.printf("%5d %5d %5d\n",a2,b2,c2);
System.out.printf("%5d %5d %5d\n",a3,b3,c3);
System.out.printf("%5d %5d %5d\n",a4,b4,c4);
System.out.printf("ex3 %%08d\n");
System.out.printf("%08d %08d %08d\n",a1,b1,c1);
System.out.printf("%08d %08d %08d\n",a2,b2,c2);
System.out.printf("%08d %08d %08d\n",a3,b3,c3);
System.out.printf("%08d %08d %08d\n",a4,b4,c4);
}
}実行結果 ex1 %d
1 2 3
11 12 13
101 102 103
1001 1002 1003
ex2 %5d
1 2 3
11 12 13
101 102 103
1001 1002 1003
ex3 %08d
00000001 00000002 00000003
00000011 00000012 00000013
00000101 00000102 00000103
00001001 00001002 00001003
printfでは「%d」と表示したいときは「%%d」と書く。(%を1つだけ表示したい場合は%%と書く)
次のプログラムは2つの変数が使われている。1行ずつ追跡し,実行結果が得られる様子を考えなさい。
List 1.2.7 printfのあるプログラム(このプログラムは無意味だが,変数とprintfの関係を示している) /*Printf4.java by Kosaka*/
public class Printf4 {
public static void main(String[] args) {
Printf4 mainprg = new Printf4();
}
Printf4() {
int x,y;
x=5;
y=6;
System.out.printf("I bought %d CDs and %d DVDs yesterday.\n",x,y);
System.out.printf("x=%d y=%d\n",x,y);
x=2;
y=10;
System.out.printf("I've got %d textbooks and %d dictionaries.\n",y,x);
System.out.printf("y=%d x=%d\n",y,x);
x=2;
y=4;
System.out.printf("An elephant has %d large ears, %d small eyes, and %d legs.\n",x,x,y);
}
}
実行結果 I bought 5 CDs and 6 DVDs yesterday.
x=5 y=6
I've got 10 textbooks and 2 dictionaries.
y=10 x=2
An elephant has 2 large ears, 2 small eyes, and 4 legs.表現上の補足
これまで「x=2;」は「変数xに値2を記憶させる」と表現してきた.一般に参考書な どでは,
「変数xに値2を保存する」,「変数xに値2を格納する」,「変数xに値2を代入する」
などと表現される。今後,「代入する」などの表現が使われるが,「記憶させる」と同じ
意味と考えてよい。
練習1.4 |
次のプログラムの実行結果を予想しなさい。
List 1.2.8 printfのあるプログラム /*Printf5.java by Kosaka*/
public class Printf5 {
public static void main(String[] args) {
Printf5 mainprg = new Printf5();
}
Printf5() {
int x,ya; /*整数型変数xとyaを使用する宣言*/
x=100;
ya=1000;
System.out.printf("x=%d ya=%d\n",x,ya);
System.out.printf("ya=%d x=%d\n",x,ya);
System.out.printf("x=%d ya=%d\n",ya,x);
System.out.printf("p=%d q=%d\n",x,ya);
}
}実行結果 の予想1 実行結果 の予想2 実行結果 の予想3 x=100 ya=1000
ya=1000 x=100
x=100 ya=1000
p=0 q=0x=100 ya=1000
ya=100 x=1000
x=1000 ya=100
p=100 q=1000x=100 ya=1000
ya=1000 x=100
x=100 ya=1000
p=100 q=1000
課題1その2 |
---|
(3)9個のint型変数 factorial1, factorial2,
factorial3, ... factorial9を宣言し,
factorial1=1;
factorial2=1*2;
factorial3=1*2*3;
factorial4=1*2*3*4;
:
のように値を代入し,これらの値を次のように画面に表示しなさい。(p01ex03.java)
factorial1
= 1 |
ヒント
たとえば printf("factorial1 = %6d\n",factorial1);
1.3 変数の名前 |
---|
Javaでは数学の変数名と違い,2文字以上の変数名を用いる場合が多い。文法上,変数の命名 では次の2つの制約を受ける。
(1)変数の名前として用いてよい文字は,アルファベットと「_(アンダーバー)」と「$」と数字であるが,名前の先頭の1文字に数字を用いてはいけない。
(2)Javaの文法上予約されている名前も用いてはいけない。
Javaの文法上,この2つの規則に違反しなければどのような名前を変数に付けてもかまわないが変数名を決めるときは,その変数が何を 表しているのか分かる名前が好ましい。
(変数の用途が決まらないままプログラムを作ろうとしても,作れなかったり,思い通りの動作をしないことが多い。「急がば回れ」の精 神でふさわしい変数名 を用いる努力をしよう。これは上達の秘訣かもしれない。短い変数名を使うとキーボード入力時間が節約できる。しかし,複雑なプログラムでは変数の役割が不明確になり正しいプログラムを作るために多くの労力を使うことになり,かえって時間がかか ることを先輩たちは 知っている。)Java文法上正しい変数名の例
例題によく使われる単純な変数名
変数の役割が名前を見てもよく分からないので,まねをしてはいけないx, y, a1, p1, p2, ax123 プログラムに使われる命名
変数の役割がよく分かる変数の名前
「_(アンダーバー)」で始まる変数名は文法的には正しいが,
システムでよく使われるため,使わないほうがよいlength(長さ), area(面積),
PointNumber(点番号), NumberOfPoints(点の数),
counter(何かを数える変数), pointer(現在位置を示す変数)
member1, member2, buffer00, buffer_toReadJava文法上誤った変数名と使用出来ない変数名の例
アルファベットと「_(アンダーバー)」と「$」と数字の使用が許されているが,それ以外の文字を用いているもの
myNumber-1, anc@tokyo, machine#12 数字で始まる変数 1stOder, 2point 予約語は変数名として使用してはならない。 abstract boolean break byte case
catch char class const continue
default do double else extends
final finally float for goto
if implements import instanceof int
interface long native new package
private protected public return short
static strictfp super switch synchronized
this throw throws transient try
void volatile while widefp
1.4 「=」の意味と四則演算(加減乗除) |
---|
Cプログラムでは「=」は「右辺を計算し て,その結果を左辺の変数に保存する」という意味である。例えば「z=10」は「zに10を保存する」という意味 であり,「y=x+10」は「x+10を計算して,その結果をyに保存する」という意味である。
「x+10=y」という表現はJavaでは誤りである。
左辺には1つの変数しか書くことが出来ない。
「=」の意味
数学 右辺と左辺の値が等しい Java 右辺の値を,左辺の変数に保存する(代入する)
あるいは
右辺を計算して得た値を,左辺の変数に保存する(代入する)
List 1.4.1 printfのあるプログラム /*Variable6.java by Kosaka*/
public class Variable6 {
public static void main(String[] args) {
Variable6 mainprg = new Variable6();
}
Variable6() {
int a,b,c; /*整数型変数a,b,cを使用する宣言*/
a=100;
b=1000;
c=a+b; /* aとbの和を作り,cにしまう。*/
System.out.printf("a=%d b=%d\n",a,b);
System.out.printf("c=%d\n",c);
c=a*b; /*aとbの積を作り,cにしまう。c=a×b*/
System.out.printf("c=%d\n",c);
c=a-b; /*aとbの差を作り,cにしまう。*/
System.out.printf("c=%d\n",c);
c=c+1; /*cと1の和を作り,cにしまう。(cの値を1増やす)*/
System.out.printf("c=%d\n",c);
}
}実行結果 a=100 b=1000
c=1100
c=100000
c=-900
c=-899注意事項 1 「=」は「右辺を計算して,その結果を左辺に代入する」という意味なの で
「a+b=c;」という文は誤りである。2 「=」は「右辺を計算して,その結果を左辺に代入する」という意味なの で
「a=a+1;」ではaの値が1増える。「a=a*2;」ではaの値が2倍になる
もし数学の世界だったらこの2つの式は絶対に成り立たない無意味な式である
〇 実数型変数と整数型変数の割り算での違い
整数型変数と言うのは「小数点以下の値を持たない整数」を格納する変数のことであった。
次の例では,小数点を含む数を格納する実数型変数を使用してみる。
実数型変数では小数点以下の桁を含む数を扱うことが出来る。
doubleは「Double precision floating point number(倍精度浮動小数点数)」に由来する。
List 1.4.2 printfのあるプログラム /*Variable7.java by Kosaka*/
public class Variable7 {
public static void main(String[] args) {
Variable7 mainprg = new Variable7();
}
Variable7() {
int a,b,c,d; /*整数型変数a,b,c,dを使用する宣言*/
double p,q,r; /*実数型変数p,q,rを使用する宣言*/
a=16;
b=3;
c=a/b; /*aをbで割った答えをcに保存。c=a÷b 。小数点以下は切り捨てられる*/
d=a%b; /*aをbで割ったあまりを求め,dに保存。*/
System.out.printf("a=%d b=%d\n",a,b);
System.out.printf("c=%d d=%d\n",c,d);
p=16.0;
q=3.0;
r=p/q;
System.out.printf("p=%f q=%f\n",p,q);
System.out.printf("r=%f\n",r);
r=a/b; /*a/bの演算をした時点で小数点以下は切り捨てられる。その整数値をrに保存。*/
System.out.printf("a=%d b=%d\n",a,b);
System.out.printf("r=%f\n",r);
}
}実行結果 a=16 b=3
c=5 d=1
p=16.000000 q=3.000000
r=5.333333
a=16 b=3
r=5.000000補足説明 1
整数同士の割り算で は,答えの小数点以下は切捨てとなる
int a,b,c;
a=15;
b=4;
のもとで
c=a/b;
では cには3が保存される。
また
c=15/4;
でも,cには3が保存される。2
数式の中に出てくる「%」は割り算をしたあまりを求める演算である
(printfの中に出てくる「%」とは違う使い方)3
整数同士の割り算の結果を実数型変数に保存しても,
すでに小数点以下は切捨てられている4
「12」と「12.0」ではコンピュータ内部での解釈が異なる。
「12」は整数の12であり,「12.0」は実数の12である。5
「printf("r=%f\n",r);」で%fは実数型変数 (double型)
を表示する時に用いる。
整数同士の割り算では,答えの小数点以下は切捨てとなる。
%は整数同士の割り算の余りを求める演算である。
〇 値→計算→結果の表示 という流れのプログラム
次に示すのは,オームの法則を用いた簡単な計算と表示のプログラムである。
このプログラムのように変数が特定の意味を持つ時にはふさわしい名前の変数を用いるべきである。
List 1.4.3 オームの法則 /*
| Ohm.java
| Ohm's law
| 560オームの抵抗に1.5Vの電圧をかけた時の電流を求める
| by Kosaka
*/
public class Ohm {
public static void main(String[] args) {
Ohm mainprg = new Ohm();
}
Ohm() {
/*変数の宣言*/
double resistance; /*抵抗[Ω]*/
double voltage; /*電圧[V]*/
double current; /*電流[A]*/
/*抵抗値と電圧の設定*/
resistance=560.0;
voltage=1.5;
/*電流の計算*/
current=voltage/resistance;
/*計算結果の表示*/
System.out.printf("resistance=%10.1f\n",resistance);
System.out.printf("voltage =%10.3f\n",voltage);
System.out.printf("current =%10.5f\n",current);
}
}実行結果 (resistance:抵抗 [Ω] voltage:電圧[V] current:電流[A]) resistance= 560.0
voltage = 1.500
current = 0.00268補足説明 1. printf("resistance=%10.1f\n",resistance);
で%10.1fは10文字分の場所に小数点以下1桁で実数型変数の値を表示するの意味2. printf("voltage =%10.3f\n",voltage);
で%10.3fは10文字分の場所に小数点以下3桁で実数型変数の値を表示するの意味次のプログラムは,温度をもとにした音速の計算である。
このプログラムのように変数が特定の意味を持つ時にはふさわしい名前の変数を用いるべきである。
List 1.4.4 温度をもとにした音速の計算 /*
| Sound.java
| 与えられた温度での音速の計算
| t[℃]の時の音速v[m/s]は次の式で与えられる
| v = 331.5 + 0.6t
| 25℃の時の音速を求める。
| by Kosaka
*/
public class Sound {
public static void main(String[] args) {
Sound mainprg = new Sound();
}
Sound() {
double temperature; /*温度をあらわす変数[℃]*/
double velocity; /*音速をあらわす変数[m/s]*/
temperature=25.0; /*温度を25℃と設定*/
velocity=331.5+0.6*temperature;
System.out.printf("temperature=%10.1f\n",temperature);
System.out.printf("velocity =%10.1f\n",velocity);
}
}実行結果 temperature= 25.0
velocity = 346.5
プログラム内で「=」は右辺を計算して左辺の変数に保存することを示し ている。
練習1.5 |
次のプログラムの実行結果を予想しなさい。
List 1.4.5 三角形の面積を求めるプログラム /*
| Triangle.java
| by Kosaka
*/
public class Triangle {
public static void main(String[] args) {
Triangle mainprg = new Triangle();
}
Triangle() {
/*三角形の面積を求める*/
double teihen,takasa,menseki;
teihen=20.0; /*底辺を表す変数[cm]*/
takasa=10.0; /*高さを表す変数[cm]*/
menseki=1/2*teihen*takasa;
System.out.printf("teihen=%f\n",teihen);
System.out.printf("takasa=%f\n",takasa);
System.out.printf("menseki=%f\n",menseki);
}
}実行結果 の予想1 実行結果 の予想2 実行結果 の予想3 teihen=20.000000
takasa=10.000000
menseki=10.000000teihen=20.000000
takasa=10.000000
menseki=100.000000teihen=20.000000
takasa=10.000000
menseki=0.000000ここまでの変数の型についてのまとめ
型
説明
printfの時の書式 printfの例
int
整数型整数を保存する変数
(割り算をすると小数点以下が切り捨てられる)%d
int test;
の時
System.out.printf("%d\n",test);double
実数型小数点を含む値を保存する変数
(割り算をしても,正しい近似値が得られる)%f
double test;
の時
System.out.printf("%f\n",test);
課題1その3 |
---|
(4)2つのint型変数x,yを宣言し,xに17528を,yに1482を代入し,積,商 (xをyで割る),和,差(xからyを引く),剰余(xをyで割った時のあまり)を計算して表示しなさい。ただし,画面表示は次のように なるようにしなさい。(p01ex04.java)
17528 * 1482 = 25976496 |
ヒント
たとえば printf("%d * %d = %8d\n",x,y,x*y);
1.5 キーボードからデータをもらう |
---|
プログラム実行時にキーボードから値をもらい,変数に代入するのは,問題が起きるケースがあるため,エラー処理と同時に行わなければならない。
この処理に関しては,難しいので今の時点では説明を省くが,このように書けばよいとだけ理解するようにしよう。
後で説明が出てくる「メソッド」も使っている。今の時点では「おまじない」ということにしてお く。
次のプログラムは三角形において,「底辺の長さ」と「高さ」をキーボードから入力し,面積を求めて,「底辺の長さ」と「高さ」と「面積」を表示する。
List 1.5.1 三角形の面積を求めるプログラム
薄ピンクのところはおまじないとしてそのまま受け入れてください
/*
| Triangle2.java
| キーボードから底辺長と高さを与え,三角形の面積を求める
*/
import java.util.*; // StringTokenizer
import java.io.*; // BufferedReader
public class Triangle2 {
public static void main(String[] args) {
Triangle2 mainprg = new Triangle2();
}
Triangle2() {
/*変数の宣言*/
double teihen,takasa,menseki;
/*底辺の長さの取得*/
teihen=getDouble("teihen[cm]="); /*画面に「teihen[cm]=」と表示して値を得る*/
/*高さの取得*/
takasa=getDouble("takasa[cm]="); /*画面に「takasa[cm]=」と表示して値を得る*/
/*面積の計算*/
menseki=0.5*teihen*takasa;
/*面積などの表示*/
System.out.printf("teihen=%f[cm]\n",teihen);
System.out.printf("takasa=%f[cm]\n",takasa);
System.out.printf("menseki=%f[cm2]\n",menseki);
}
private double getDouble(String prompt){
BufferedReader bffrd = new BufferedReader(new InputStreamReader(System.in));
double ret=0.0;
System.out.print(prompt);
try {
ret = Double.valueOf(bffrd.readLine()).doubleValue();
}
catch(IOException e) {
System.out.println("IO Error");
System.exit(1);
}
return ret;
}
}実行結果 青文字のところはキーボードからの 入力 teihen[cm]=20.0
takasa[cm]=10.0
teihen=20.000000[cm]
takasa=10.000000[cm]
menseki=100.000000[cm2]補足説明 1.プログラムが実行されると,teihen=getDouble("teihen[cm]=");のところで,
「teihen[cm]=」と表示してコンピュータはキーボード入力待ちになる。
上記「実行結果」ではその時に「20.0[enter]」 をキーボードから入力し,
takasa=getDouble("takasa[cm]=");のところでもコンピュータはキーボード
入力待ちになるので,「10.0[enter]」をキーボード入 力している。
2.「menseki=0.5*teihen*takasa;」は 「menseki=teihen*takasa/2.0;」でもよい
演算順序については「加減乗除の優先順位」に気を付けること
キーボードから浮動小数点変数に値を代入する時はgetDouble("○○");を使う。
次のプログラムは1つの整数をキーボードから入力し,その倍数を3つ表示する。
List 1.5.2 1つの整数をキーボードから入力し,その倍数を3つ表示する
薄ピンクのところはおまじないとしてそのまま受け入れてください
/*
| Multiple.java
| 1つの整数をキーボードから入力し,その倍数を3つ表示する
*/
import java.util.*; // StringTokenizer
import java.io.*; // BufferedReader
public class Multiple {
public static void main(String[] args) {
Multiple mainprg = new Multiple();
}
Multiple() {
/*変数宣言*/
int intNumber;/*入力値*/
int multiple2,multiple3;/*倍数*/
/*整数の取得*/
intNumber=getInt("整数を1つ入力してください: ");
/*2倍数,3倍数の計算*/
multiple2=2*intNumber;
multiple3=3*intNumber;
/*計算結果の表示*/
System.out.printf("小さいほうから3つの倍数は %d %d %d です\n",intNumber,multiple2,multiple3);
}
private int getInt(String prompt){
BufferedReader bffrd = new BufferedReader(new InputStreamReader(System.in));
int ret=0;
System.out.print(prompt);
try {
ret = Integer.valueOf(bffrd.readLine()).intValue();
}
catch(IOException e) {
System.out.println("IO Error");
System.exit(1);
}
return ret;
}
}
/*******************実行結果**********************
整数を入力してください >>21
小さいほうから3つの倍数は 21 42 63 です
*************************************************/
1.6 Javaプログラムの概観 |
---|
ここまで,なんとなくプログラムを示したが,プログラムの特徴を見る。プログラムは
(1)はじめのおまじない
(2)はじめのしるし
(3)変数宣言部 使用する変数はすべて宣言してから出ないと使えない
次の「実行部」の途中で変数宣言は出来ない
(4)実行部 内部には (a)入力部,(b)処理部,(c)出力部がある
(5)おわりのしるし
の5つの部分から出来ているのがわかる。
List 1.6.1 プログラムの概形(ANSI規格) (各種のおまじない)
はじめのおまじない
はじめのしるし
変数宣言部
実行部
おわりのしるし
(各種のおまじない)
おわりのしるし
/*
| Triangle2.java
| キーボードから底辺長と高さを与え,三角形の面積を求める
*/
import java.util.*; // StringTokenizer
import java.io.*; // BufferedReader
public class Triangle2 {
public static void main(String[] args) {
Triangle2 mainprg = new Triangle2();
}
Triangle2() {
/*変数の宣言*/
double teihen,takasa,menseki;
/*底辺の長さの取得*/
teihen=getDouble("teihen[cm]="); /*画面に「teihen[cm]=」と表示して値を得る*/
/*高さの取得*/
takasa=getDouble("takasa[cm]="); /*画面に「takasa[cm]=」と表示して値を得る*/
/*面積の計算*/
menseki=0.5*teihen*takasa;
/*面積などの表示*/
System.out.printf("teihen=%f[cm]\n",teihen);
System.out.printf("takasa=%f[cm]\n",takasa);
System.out.printf("menseki=%f[cm2]\n",menseki);
}
private double getDouble(String prompt){
BufferedReader bffrd = new BufferedReader(new InputStreamReader(System.in));
double ret=0.0;
System.out.print(prompt);
try {
ret = Double.valueOf(bffrd.readLine()).doubleValue();
}
catch(IOException e) {
System.out.println("IO Error");
System.exit(1);
}
return ret;
}
}
1.7 よく間違えること |
---|
コンパイルできないなどのエラーでよくあること
○行末に「;」(セミコロン)を忘れる
○「I」(アイの大文字)と「1」(いち)と「l」(エルの小文字)をタイプミス
○「o」(オウの小文字)と「0」(ぜろ)をタイプミス
○大文字,小文字を間違える
○scanfの変数に&を忘れる
○scanfの書式に \n を書いてしまうのはだめ
課題1 |
---|
(1)次の歌をprintlnで表示するプログラムを作りなさ
い。(p01ex01.java) (再掲)
Happy birthday to
you. Happy birthday to you. Happy birthday, dear 自分の名前 Happy birthday to you. |
(2)次のように計算して,2 乗,3乗,4乗の表を作りなさい。 (再掲)
2*2, 2*2*2, 2*2*2*2
3*3, 3*3*3, 3*3*3*3
4*4, 4*4*4, 4*4*4*4
5*5, 5*5*5, 5*5*5*5
参考
printf("%3d %3d %3d\n",2+2,2+2+2,2+2+2+2);
画面への表示はつぎのようにな るようにしなさい。 (p01ex02.java)
4 8 16 |
(3)9個のint型変数 factorial1,
factorial2, factorial3, ... factorial9を宣言し,
factorial1=1;
factorial2=1*2;
factorial3=1*2*3;
factorial4=1*2*3*4;
:
のように値を代入し,これらの値を次のように画面に表示しなさい。(p01ex03.java) (再掲)
factorial1
= 1 |
ヒント
たとえば printf("factorial1 = %6d\n",factorial1);
(4)2つのint型変数x,yを宣言し,xに17528 を,yに1482を代入し,積,商(xをyで割る),和,差(xからyを引く),剰余(xをyで割った時のあまり)を計算して表示しなさ い。ただし,画面表示は次のようになるようにしなさい。(p01ex04.java) (再掲)
17528 *
1482 = 25976496 |
ヒント
たとえば printf("%d * %d = %8d\n",x,y,x*y);
(5)温度を実行時にscanf命令を使ってキーボードから入力し,その時の音速を計算して表
示するプログラムを作り なさい。
ただしt[℃]の時の音速v[m/s]は次の式で与えられる。 v = 331.5 + 0.6t
次に示す値をすべて用いて,実行を繰り返し,答え合わせして,すべての結果をはりつけなさい。(p01ex05.java)
温度[℃] | 音速[m/s] |
15.0 |
340.5 |
20.0 |
343.5 |
25.0 |
346.5 |
30.0 |
349.5 |
ヒント List 1.4.4を参考にしよう。
%f,%.1f,%.3f を自分でテストしてみたらどうだろう。
(6)2つの整数を実行時にキー
ボードから入力し,整数型変数に読み込み,
和,差,積,商,剰余(割り算のあまり)を計算して,表示するプログラムを作りなさい。
ただし実行例が次のように表示されるようにしなさい。
次に示す2つの値を用いて,答え合わせして,結果を2つともはりつけなさい。(p01ex06.java)
<<実行例1>>
2数を入力--> 12 5
12+5=17
12-5=7
12*5=60
12/5=2
12%5=2<<実行例2>>
2数を入力--> 17 7
17+7=24
17-7=10
17*7=119
17/7=2
17%7=3
(7)2つの整数を実行時にキーボードから入力し,変 数に読み込み,
商,剰余(割り算のあまり)を計算して,表示するプログラムを作りなさい。
ただし実行例が次のように表示されるようにしなさい。
次に示す2つの値を用いて,
答え合わせして,結果を2つともはりつけなさい。(p01ex07.java)
<<実行例1>>
2数を入力--> 17 7
17÷7=2...3<<実行例2>>
2数を入力--> 23 7
23÷7=3...2
(8)台形の「上底」「下底」「高さ」を実行時にキー
ボードから入力し,変数に読み込
み,
台形の面積を求め表示するプロ グラムを作りなさい。
次に示す値をすべて用いて,実行を繰
り返し,答え合わせして,すべての結果をはりつけなさい。(p01ex08.java)
上底[cm]
下底[cm]
高さ[cm]
面積[cm2]
2.5
3.2
4.5
12.825
3.4
2.4
6.5
18.850
2.8
3.7
6.2
20.150
3.5
1.2
3.5
8.225
(9)「半径」を実行時にキーボードから入力
し,変数に読み込み,球の体
積,表面積を求め表示するプログラムを作りなさ い。
次に示す値をすべて用いて,実行を繰
り返し,答え合わせして,すべての結果をはりつけなさい。 (p01ex09.java)
ヒント 体積:V=4/3πr3, 表面積:S=4πr2
ただし,πの値は3.14159265358979を使いなさい。実行結果の桁数合わせをする必要はない。
r[cm]
V[cm3]
S[cm2]
0.1
0.004189
0.125664
0.3
0.113097
1.130973
1.0
4.18879
12.56637
3.0
113.0973
113.0973
10.0
4188.79
1256.637
(10)1つの整数値を実行時にキー
ボードから入力し,変数に読み込み,
100の位,10の位,1の位の数を抜き出して表示するプログラムを作りなさい。
次に示す3つの値を用いて,答え合わ
せして,すべての結果をはりつけなさい。(p01ex10.java)
例えば258を入力した場合は
100=>2
010=>5
001=>8
と表示され,5369を入力した場合は
100=>3
010=>6
001=>9
と表示され,7を入力した場合は
100=>0
010=>0
001=>7
と表示されるようにすること。
(ヒント)「456%10」を計算すると6になり,「456/10」は45になり,「(456/10)%10」は5になる。