#author("2019-10-17T05:03:38+00:00","ocha","ocha") #author("2019-10-17T06:05:18+00:00","ocha","ocha") [[Lecture]] *Java プログラミング入門 [#s6899a39] このページは、学部2年生向け授業である、「マルチメディアプログラミング実習」 のために用意しました。 (Wikiの仕様で大文字小文字が混在した英単語に疑問符?が追加されるところがありますが、無視してください。) **第3章「変数」 [#xc22f04b] ***Javaにおける基本データ型 [#n3c4e251] -整数型 --byte (1バイト。-128から127) --short (2バイト。-32,768から32767) --int (4バイト。-2,147,483,648から2,147,483,647) --long (8バイト。明確に数値で指定する場合は、x = 20L; のように表記。-9,223,372,036,854,775,808から9,223,372,036,854,775,807) --char (1文字を表す。メモリー上のサイズは色々。''でくくる。x = 'A'など。) -浮動小数点型 --float (4バイトで表す浮動小数点。重力加速度なら9.80665のように表記。) --double (8バイトで表す高精度な浮動小数点。光速なら2.99792458e+8dのように表記。) -論理型 --boolean (trueかfalseのどちらかの値をとる。 x = true; など。) C言語と違い、整数型のサイズが明確に決められました。char型は、C言語では1バイトでしたが、Javaでは1文字を表します。なので、コードによって1バイトだったり、多バイトだったりします。C言語では論理型がないので、charやintで代用していました。0とか1を代入してました。Javaでは専用のboolean型が用意されました。 -演習1 先に作ったHello.javaを参考にVartest.javaというプログラムを作りましょう。 以下では、byte型変数を定義して、それを表示しています。 変数名は変えても良いです。 printlnの中では、文字列を連結しています。Javaでは文字列を+で連結できます。 class Vartest { public static void main (String args[]) { byte x = 42; System.out.println("byte value x =" + x); } } これをもとに、short, int, long, char, float, double booleanの変数を全て追加して表示をしてください。intとcharを追加するなら、以下のようにします。変数名と代入する値は好きなものを使ってください。char型は漢字も試してください。ただしchar型は、1文字だけです。 class Vartest { public static void main (String args[]) { byte x= 42; int x1= 123456; char name = '椎'; System.out.println("byte value x =" + x); System.out.println("int value x1 =" + x1); System.out.println("char value name =" + name); } } 解答例: class Vartest { public static void main (String args[]) { byte x_byte = 42; int x_int = 12345; short x_short = 123; long x_long = 12345678; char x_char = '椎'; float x_float = 123.4f; double x_double = 3.14d; boolean x_boolean = true; System.out.println("byte value x_byte = " + x_byte); System.out.println("short value x_short = " + x_short); System.out.println("int value x_int = " + x_int); System.out.println("long value x_long = " + x_long); System.out.println("char value x_char = " + x_char); System.out.println("float value x_float = " + x_float); System.out.println("double value x_double = " + x_double); System.out.println("boolean value x_boolean = " + x_boolean); } } -演習2 以下のように、整数型の変数に文字を代入して値を表示すると、文字コードが表示できます。 あなたのイニシャルを表す英文字の文字コードを表示するプログラムを作成してください。また、あなたの氏名の最初の文字(漢字やひらがな)についても調べてください。 int myInitialCode1 = 'S', myInitialCode2 = '椎'; System.out.println(myInitialCode1); System.out.println(myInitialCode2); 英文字はASCIIコードになります。漢字はunicodeになります。 ***配列 [#e846fded] C言語では小規模な配列を使う場合、静的に確保した配列をよく使っていたと思います。 Javaでは、システムからメモリー確保して動的に確保した配列を使うのが一般的です。 C言語でもmalloc()関数でメモリーを確保したことがあると思います。 例えばint型の変数3個分のメモリを確保して、それをint型を示すポインターに入れて、配列として使いました。 //C言語での例です: int *p; *p = (int *)malloc(sizeof(int)*3); Javaでも同じことをやります。 システムにお願いして、必要な量の配列を格納するメモリー領域を確保してもらいます。そのコマンドがnewです。 まずは配列の変数を定義して、次にnewコマンドで必要なメモリー領域を確保して、それが返すメモリーアドレス(に相当する値)を配列の変数に入れます。メモリーアドレスに相当する数値は、C言語ではポインターと言いましたが、Javaでは参照と言います。 int[] x; (配列を参照する変数を定義する) x = new int[3]; (int3個ぶんのメモリー領域をnewコマンドで取得して参照をxに代入する) こうすると、プログラムの中からx[0]=1;とかx[2]=x[0];などと操作してこの配列を利用できます。 1行でまとめて書くこともあります。 int[] x = new int[3]; -演習3 要素が100個のintの配列x[0]からx[99]を作って、それに1,2,3,4....,100という数字を入れて、さらにそれらをprintlnで表示するプログラムを作りましょう。先ほどのVartest.javaを改造して作ってください。for文で値を入れて、for文で表示してください。for文の使い方はC言語と同一です。 ヒント: class Vartest { public static void main (String args[]) { //配列を定義します。 //(略) //for文で値を入れます for(int i=0; i<100; i++) { //(略) } //for文で表示します for(int i=0; i<100; i++) { //(略) } } 解答例: class Vartest { public static void main (String args[]) { int[] a = new int[100]; for(int i=0;i<100;i++){ a[i]=i+1; } for(int i=0;i<100;i++){ System.out.println(a[i]); } } } -演習4 配列の長さは、.length変数で知ることができます。上の例でもし配列をaと定義したら、a.lengthで長さがわかります。for文の長さ指定に使うとエラーの可能性がなくなって良いです。for文をlengthで書き換えてみましょう。 解答例: class Vartest { public static void main (String args[]) { int[] x = new int[100]; for(int i=0;i<x.length;i++){ x[i]=i+1; } for(int i=0;i<x.length;i++){ System.out.println(x[i]); } } } -演習5 Javaではfor-each文というのが使えます。配列の各要素に対するアクセスを簡単に表記できます。配列の代入には使えません。配列の読み出しに使えます。使ってみましょう。 class Vartest { public static void main (String args[]) { int[] x = new int[100]; for(int i=0;i<x.length;i++){ x[i]=i+1; } for(int a: x){ System.out.println(a); } } } ***文字列 [#t32f75c4] C言語では文字列はただのバイト変数の配列でした。最後の値が0であることで、長さを知ることができる程度です(番兵方式)。 Javaでは文字列は、Stringクラスのインスタンスです。 なんのことかは後の授業で説明しますが、処理をする関数を内包している「構造体Structure」のようなものです。 なので、いろいろな操作が可能です。 文字列は""で括ります。 "Hello Java World!" printlnできます。 System.out.println("Hello Java World!"); 足し算もできます。 System.out.println("This is " + "a test."); 変数にも代入できます。変数の種類はStringです。オブジェクト指向の用語で説明すると、Stringクラスのインスタンスとしてworldを定義したということです。クラスは設計図、雛形、金型のようなもので、インスタンスはそれから作成された実体のようなものです。 String world = "Hello Java World!"; -演習6 最初に作ったHello.javaプログラムを、String変数 worldという変数に代入してから表示するプログラムに書き換えてみましょう。 解答例: class Hello { public static void main (String args[]) { String world = "hello java world!"; System.out.println(world); } } -演習7 --コマンドの引数はargs[0], args[1] ... などにString型の配列としてプログラムに引き渡されます。 --二つの引数を与えたときに、それが+でつないで表示されるプログラムを作りましょう。 http://gyazo.com/8159f78165e17781a7110de3763c833c.png ヒント --以下は引数一つを表示するだけのサンプルです。これをもとに考えてください。 --args[0]とargs[1]をprintlnの中で+でつないで表示すれば良いです。 class ArgsTest { public static void main (String args[]) { System.out.println(args[0]); } } できてしまった人は以下をお願いします。 このプログラムで、引数が2個未満の場合はエラーになります。 2個未満の場合には、2個引数を描いてくださいというメッセージを出すよう変更しましょう。 .length変数でargsの長さを知ることができます。 if文はC言語と同じです。 if(args.length < 2) { } else { } というように書けます。 解答 //--後で公開します class ArgsTest { public static void main (String args[]) { System.out.println(args[0] + " + " + args[1]); } } **第4章「演算子」 [#p4a8e735] //--演習4.2をやってみよう 演算子はほとんどC言語と同じです。復習しましょう。 変数には算術演算子が使えます。算術演算子はC言語と同じです。 +-*/% です。%は剰余です。 5 % 2 は1です。 代入演算子は=です。 算術演算子と代入演算子を組み合わせることもできます。 a += 1; は a = a + 1; と同じ意味です。 インクレメント、デクレメント演算子もCと同様です。 a = 1; b = a++; は、bが1、aが2になります。 a = 1; b = ++a; は、a, bどちらも2になります。 関係演算子もC言語と同じです。 <, >, <=, >=, ==, != 論理演算子もC言語と同じです。 &&, ||, ! Javaではbooleanにしか論理演算できないので、&, | だけでもokです。 ビット演算し、シフト演算子もC言語と同じです。 &, |, ^, ~, <<, >>, >>> 1 << 2 は4になります。 キャストもあります。C言語と同じです。 long b=1234; int a = (int)b; **第5章「制御構造」 [#p54c6568] 制御構造も大半はC言語と同じです。 ***if文、else文、else-if文 [#s3bd1b3d] if文もC言語と同じです。 - if文 if (a==0) b=100; if (a==0) { b=100; } - if-else文 if (a==0) { b=100; }else{ b=10; } - else-if文 if (a>100) { }else if (a>10){ }else{ } -演習1 100点満点のテストの得点から、ABCDの成績を表示するプログラムを作ります。 その準備のために、 0から100までの乱数を10個表示するプログラムを作ります。 public class Score { public static void main (String argv[]) { int i,a; for(i=0;i<10;i++) { a=(int)(Math.random() * 100); System.out.println(a); } } } Math.random()は、Mathクラスのクラスメソッドであるrandom()を呼び出しているという意味です。 System.out.println()などと同じく、大文字で始まる単語はクラスを表します。 次にこの乱数を100点満点の点数とみなして、成績ABCDを表示するプログラムを書きましょう。 成績の基準は、80点以上がA, 60点以上80点未満がB, 40点以上60点未満がC, 40点未満がDです。 動作例を以下に示します。 http://gyazo.com/829b04a7fc82cdfe9dd0dfa650af873e.png 解答例1: public class Score { public static void main(String args[]) { int i,a; char score; for(i=0;i<10;i++){ a= (int)(Math.random() * 100); if(a>=80) score='A'; else if(a>=60) score='B'; else if(a>=40) score='C'; else score='D'; System.out.println(a + " " + score); } } } 解答例2: public class Score { public static void main (String argv[]) { int i,a; for(i=0;i<10;i++) { a=(int)(Math.random() * 100); System.out.print(a + " "); if(a<40) System.out.println("D"); else if(a<60) System.out.println("C"); else if(a<80) System.out.println("B"); else System.out.println("A"); } } } //ここまで完成by siio ***for文 [#ac566ee5] for文もC言語と同じです。 for(初期設定; 条件; 再設定) {} -演習2-1 10万円を今の1年もの定期預金の年利で複利で運用した時、元利合計が20万円を超えるのは何年後でしょうか? for文で、2項目目に20万円を超える条件を書いて、年数と金額を表示するプログラムを作って調べてみましょう。 http://gyazo.com/1733defca0c709c41c69ea729320ab61.png for( year = 1; <ここに条件>; year++) { 解答例: class Kinri { public static void main (String args[]) { double okane=100000; int year; for(year=1; okane < 200000; year++) { okane = okane * 1.002; System.out.println("year = " + year + " okane= " + okane); year++; } } } -演習2-2 break文で直近のループを抜け出せます。上の問題を無限ループにして、break文で書き直してみましょう。 ***while文 [#odd3e1de] while文もC言語と同じです。 while(条件) {} -演習2-3 上の問題をwhile文で書き直してみましょう。 解答例: class Kinri { public static void main (String args[]) { double okane=100000; int year; year=1; while(okane < 200000) { okane = okane * 1.002; System.out.println("year = " + year + " okane= " + okane); year++; } } } //現在の普通預金の金利0.04%だと倍になるのに何年かかるだろうか。確かめてみよう。 //http://gyazo.com/95cd94db39b407e7961355b20da8fc67.png //-演習5.6をやってみよう // //while文をfor文に変えてみる // //解答例: // // class Kinri { // public static void main (String args[]) { // double okane=100000; // int year; // for(year=1;okane < 200000; year++) { // okane = okane * 1.05; // System.out.println("year = " + year + " okane= " + okane); // } // } // } ***モンテカルロ法で円周率を計算してみる(ループの練習) [#s7c57350] --1x1の正方形のエリアにランダムに矢を当てた場合、1/4円の中に当たる矢の数は、 面積に比例すると考えられます。あたりの矢の割合を調べれば円周率がわかります。 http://gyazo.com/e4f68c7ed1045c10801ec201ed00b5e6.png -- MonteCarlo.java というファイルを作ります。 --まずは100個乱数を表示するプログラムを作ってみましょう。 class MonteCarlo { public static void main (String args[]) { int i; for(i=0;i<100;i++) System.out.println(Math.random()); } } 矢の落下点x,yをランダムな位置にするには、乱数で指定します。 これがあたりかどうかは、原点からの距離で調べます x = Math.random(); y = Math.random(); if(x*x + y*y < 1) hit++; --100個の矢、1000個の矢などいろいろためしてで円周率を計算してみてください -- 解答例です class MonteCarlo { public static void main (String args[]) { int i; double hit = 0; double x, y; for(i=0;i<1000;i++) { x = Math.random(); y = Math.random(); if(x*x + y*y < 1) { hit++; } } System.out.println(4 * hit / 1000); } } ***for-each文 [#cd4a2794] for-each文は、Cにはなかったです。練習しましょう。 for(型 変数名: 式) {} int型の4個の配列は、以下のように宣言できます。 int[] array; array = new int[4] これを1行で表現して、さらに初期値をいれてしまうこともできます。 int[] array = new int[]{1,2,3,4}; - 演習3 int[] array = new int[]{1,2,3,4}; で宣言した配列の中身を、for-each文で順番に表示せよ。ヒントは、 for(int x: array) {} です。 解答例: class ArrayTest { public static void main (String args[]) { int[] array = new int[]{1,2,3,4}; for (int x: array) { System.out.println(x); } } } -演習4-1 mainの引数argsは、Stringの配列で、コマンドラインで起動したとき、 コマンドの後に続けた書いた文字が入っています。 args[0], args[1], args[2] .... をすべてfor-each文で 表示するプログラムを書いてみましょう。 http://gyazo.com/8d8effac163e0dc939e74f237d8507b1.png ヒント:for(String s: args)を使います -解答例 class ArgsTest2 { public static void main (String args[]) { for(String s: args) System.out.println(s); } } -演習4-2 1行につなげて、最後に改行を入れてみましょう。こんな感じ。 javac ArgsTest2 cat dog cow fox catdogcowfox printlnは最後に改行が入りますが、printだけだと改行なしになります。lnは多分ラインフィードの略です。 -演習4-3 args[]の文字をすべてfor-each文で+つけて表示してみましょう。 javac ArgsTest2 cat dog cow fox cat + dog + cow + fox 解答例: public class ArgsTest2 { public static void main(String args[]) { boolean isFirstWord = true; for(String s: args) { if(false == isFirstWord) { System.out.print(" + "); } isFirstWord = false; System.out.print(s); } System.out.println(); } } //arg[0]とarg[1]をつないで表示する //演習5.5 10万円が20万円になる年 //arg[]の文字をすべてfor-each文で表示する //--演習4.2をarg[0]に対してやってみよう