Java講習会 in SpringVacation!!!

一日目 2009/03/04

おまけ (written by jigsaw)

毎日KPTまとめていくといいと思うので、自主的にやります。

  • keep
    • 先生教え方よかった
    • 場所
  • problem
    • 目的(何を教えて何を省くのか、みたいな)
  • try
    • 教材とかはプリントしておく

まとめ。(written by いつき)

  • 日時 09,03,04. 13:00~16:00
  • 講習内容
    • Hello,world
    • クラスの使い方
    • 配列について

Hello,world

 
public class Hello_world {
 
    public static void main (String args[]) {
		System.out.println("Hello World!");
	}
}
 

見たまんま。Hello,worldクラス作って、System.out.println();で出力。

配列

動的配列を制作し、その数だけ数を入力させてソートする。array.java

 
public class Array {
 
    public static void main (String args[]) {
		int[] array;
		int value;
		int tmp;
 
		Scanner scan = new Scanner(System.in);
		value = scan.nextInt(); //※1
 
		array = new int[value]; // ※2
 
		for(int i = 0; i < value;i++){ //※3
			array[i] = scan.nextInt();
		}
 
		for(int i = 0; i < value;i++){ //※4
			System.out.print(array[i]+" ");
		}
 
		System.out.println("\n");
 
		for(int x = 0; x < value; x++){ //※5
			for(int y = x + 1; y < value; y++){
				if(array[x] < array[y]){
					tmp = array[x];
					array[x] = array[y];
					array[y] = tmp;
				}
			}
		}
 
		for(int i = 0; i < value;i++){ //※6
			System.out.print(array[i]+" ");
		}
    }
}
 

※1で変数valueに入れる値を標準入力させる。
※2で動的配列の作成。中身が[value]となっているので、*1で入力させた数だけ、要素が作られる。
※3で作られた要素の分だけ、値を入力させて初期化する。
※4で出力。
※5でソート。
※6でソートの結果を出力。

  • 大事なことのまとめ。

int[] array ・・・配列変数 配列を参照するための変数。
new演算子を作ることで、要素の値を動的に配列を確保=プログラムが実行されてから確保。

array.length ・・・配列の要素が何個あるかというのを勝手に判断してくれる。
ソートするときの限界値(x < )の部分などfor文の中で、このプログラムはvalueを使ってるが、array.lengthとすることもできる。
たぶん、そうしたほうがいい。そうしなきゃだめ?(家帰って、見直したら、これvalueでいいんじゃねwwとかなって、勝手に変えたので・・
教えて、偉い人><)

なので、array = new int[n] nを変えても勝手にfor文の限界、 i < array.length が変わる。

二日目 2009/03/05

構造化プログラミングとオブジェクト指向プログラミング

  • 構造化プログラミング
    • 関数を部品として扱う
  • オブジェクト指向
    • クラスを主体として扱う

銀行口座【第1版】

 
 
class Account {
	String name;
	String no;
	long balance;
}
 
class AccountTester {
	public static void main(String[] args) {
		Account window = new Account();
		Account apple = new Account();
 
		window.name = "まど・じろう";
		window.no = "1234";
		window.balance = 10000000;
 
		apple.name = "りんご・たろう";
		apple.no = "5678";
		apple.balance = 100;
 
		window.balance += 100000;
		apple.balance -= 100;
 
		System.out.println("まどそふとのこうざ");
		System.out.println("講座名義" + window.name);
		System.out.println("口座番号" + window.no);
		System.out.println("預金残高" + window.balance);
 
		System.out.println("りんごっしゅのこうざ");
		System.out.println("講座名義" + apple.name);
		System.out.println("口座番号" + apple.no);
		System.out.println("預金残高" + apple.balance);
	}
}
 
  • クラスとは
    • 現実世界のもの(object)をプログラムに投影したもの
  • フィールド(field)
    • クラスを構成するデータ(変数)
  • インスタンス
    • クラスの実体のこと

上の【第1版】では

Account window; //←クラス型変数
window = new Account(); //クラスを実体化⇒インスタンス化

銀行口座【第2版】

 
class Account {
	private String name;
	private String no;
	private long balance;
 
	Account(String n, String num, long z) {
		name = n;
		no = num;
		balance = z;
	}
 
	String getName() {
		return name;
	}
 
	String getNo() {
		return no;
	}
 
	long getBalance() {
		return balance;
	}
 
	void deposit(long k) {
		balance += k;
	}
 
	void withdraw(long k) {
		balance -= k;
	}
 
}
 
class AccountTester {
	public static void main(String[] args) {
		Account window = new Account("まど・じろう", "1234", 100000);
		Account apple = new Account("りんご・たろう", "5678", 100);
 
		window.deposit(10000);
		apple.withdraw(100);
 
		System.out.println("まどそふとのこうざ");
		System.out.println("講座名義" + window.getName());
		System.out.println("口座番号" + window.getNo());
		System.out.println("預金残高" + window.getBalance());
 
		System.out.println("りんごっしゅのこうざ");
		System.out.println("講座名義" + apple.getName());
		System.out.println("口座番号" + apple.getNo());
		System.out.println("預金残高" + apple.getBalance());
	}
}
 

フィールドの初期化とコンストラクタ

 
	Account(String n, String num, long z) {
		name = n;
		no = num;
		balance = z;
	}
 
  • コンストラクタ
    • クラスのインスタンスが生成されたとき呼び出されるメソッド

データ隠蔽

 
private String name;
 

privateにすると、クラスの外部からアクセスできなくなる。

メソッド

 
	void deposit(long k) {
		balance += k;
	}
 

メソッドとは、クラスのインスタンスの振舞いを決めたもの。メソッドを用いてアクセスすることをカプセル化という

自動車クラス【第1版】

 
class Car {
	private String name;
	private int width;
	private int height;
	private int length;
	private double x;
	private double y;
	private double fuel;
 
	Car(String name, int width, int height, int length, double fuel) {
		this.name = name;
		this.width = width;
		this.height = height;
		this.length = length;
		this.fuel = fuel;
		x = y = 0.0;
	}
 
	double getX() {
		return x;
	}
 
	double getY() {
		return y;
	}
 
	double getFuel() {
		return fuel;
	}
 
	void putSpec() {
		System.out.println("名前" + name);
		System.out.println("車幅" + width + "mm");
		System.out.println("車高" + height + "mm");
		System.out.println("車長" + length + "mm");
	}
 
	boolean move(double dx, double dy) {
		double dist =Math.sqrt(dx * dx + dy * dy);
		if(dist > fuel) return false;
		else {
			fuel -= dist;
			x += dx;
			y += dy;
			return true;
		}
	}
}
 

自動車クラス利用例

 
class CarTester {
	public static void main(String[] args) {
		Scanner stdIn = new Scanner(System.in);
 
		System.out.println("Enter the data:");
		System.out.print("Name:");
		String name = stdIn.next();
		System.out.print("Width:");
		int width = stdIn.nextInt();
		System.out.print("Height:");
		int height = stdIn.nextInt();
		System.out.print("Length");
		int length = stdIn.nextInt();
		System.out.print("Value of Fuel:");
		double fuel =stdIn.nextDouble();
 
		Car myCar = new Car(name, width, height, length, fuel);
 
		while(true) {
			System.out.println("現在地(" + myCar.getX() + "," + myCar.getY() + ")/残燃料" + myCar.getFuel());
			System.out.println("Wanna move?(1:Y/0:N)");
			if(stdIn.nextInt() == 0) break;
			System.out.print("Dintance of X:");
			double dx = stdIn.nextDouble();
			System.out.print("Distance of Y");
			double dy = stdIn.nextDouble();
			if(!myCar.move(dx, dy)) System.out.println("Don't have enough fuel!");
		}
	}
}
 

this参照

コンストラクタCarで、

 
this.***
 

とすると、そのクラスのメンバにアクセスする。

三日目 2009/03/06

宿題

次のクラスを作れ。Mainクラスのmainメソッドはこちらで指定する。
それを用いこちらが指定した通りの出力を行うクラスを作成せよ。

 
//Recordクラス
	//フィールド 
		int japanese;
		int math;
		int english;
 
	//コンストラクタ
		Record() //ALL0で初期化
		Record(int japanese,int math,int english)
		Record(Record record)
 
	//メソッド
		int getJapanese()
		int getMath()
		int getEnglish()
		void setJapanese(int japanese)
		void setMath(int math)
		void setEnglish(int english)
		String toString() //3教科とその合計値をStringで返却
		boolean isRepeatAYear//留年するか判定 50以下が一つでもあるもしくは59以下が3教科でtrue
 
 
 
 
 
//Studentクラス
	//フィールド
		Record record;
		String name;
		int no;
 
	//コンストラクタ
		Student(Student s)
		Student(Record record,String name,int no)
 
	//メソッド
		Record getRecord()
		String getName()
		int getNo()
		void setRecord(Record record)
		void setName(String name)
		void setNo(int no)
		String toString()//recordと名前と番号を出力
 
 
 
 

以下Mainクラス

 
import java.io.*;
import java.util.Scanner;
 
public class Main{
	public static void main(String[] args){
		Scanner stdIn=new Scanner(System.in);
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		Record record;
 
 
		System.out.println("何人の生徒のデータを作成しますか?:");
		int n=stdIn.nextInt();
		Student[] student=new Student[n];
 
		for(int i=0;i<student.length;i++){
			System.out.println((i+1) + "番目の生徒の成績を入力します");
			try{
				System.out.println("生徒の名前を入力してください");
				String name=br.readLine();
				System.out.println("生徒の出席番号を入力してください");
				int no=stdIn.nextInt();
				System.out.println("国語の成績を入力してください");
				int japanese=stdIn.nextInt();
				System.out.println("数学の成績を入力してください");
				int math=stdIn.nextInt();
				System.out.println("英語の成績を入力してください");
				int english=stdIn.nextInt();
				record=new Record(japanese,math,english);
				student[i]=new Student(record,name,no);
			}catch(Exception e){
				e.printStackTrace();
			}
 
 
		}
 
		//同一参照か調査
		Record tmp=new Record(1,1,1);
		student[0].setRecord(tmp);
		tmp.setJapanese(2);
		//同一参照であればstudent[0]のrecordのjapaneseが2になる
		//そうでなければstudent[0]のrecordは(1,1,1)
 
		Record tmp2=student[1].getRecord();
		tmp2.setJapanese(2);
		//同一参照であればstudent[1]のrecordのjapaneseが2になる
		//そうでなければユーザーが入力した任意の数
 
		for(int i=0;i<student.length;i++){
			System.out.println(student[i]);
			if(student[i].getRecord().isRepeatAYear()){
				System.out.println("留年です。");
			}
		}
 
		/* Group class を利用できる場合上のforをコメントアウトしてこちらで利用
 
		//groupをnew,参照チェック
		Group group=new Group(student,"電子情報工学科");
 
		Student tmp3=group.getStudent(1);
		tmp3.setRecord(tmp2);
		//同一参照であればgroupのstudent[1]が(2,1,1)
 
		for(int i=0;i<group.getStudent().length;i++){
			System.out.println(group.getStudent[i]);
			if(group.getStudent[i].getRecord().isRepeatAYear()){
				System.ou.println("留年です");
			}
		}
		/*
 
 
	}
}

出力例

何人の生徒のデータを作成しますか?:
5
1番目の生徒の成績を入力します
生徒の名前を入力してください
aaa
生徒の出席番号を入力してください
1
国語の成績を入力してください
70
数学の成績を入力してください
71
英語の成績を入力してください
72
2番目の生徒の成績を入力します
...(省略)
5番目の生徒の成績を入力します
生徒の名前を入力してください
eee
生徒の出席番号を入力してください
5
国語の成績を入力してください
82
数学の成績を入力してください
83
英語の成績を入力してください
84
名前:aaa 番号:1 成績(国語:1 数学:1 英語: 1 合計:3)
留年です。
名前:bbb 番号:2 成績(国語:73 数学:74 英語: 75 合計:222)
名前:ccc 番号:3 成績(国語:76 数学:77 英語: 78 合計:231)
名前:ddd 番号:4 成績(国語:79 数学:80 英語: 81 合計:240)
名前:eee 番号:5 成績(国語:82 数学:83 英語: 84 合計:249)
-- Press any key to exit (Input "c" to continue) --

余裕があったらこれ以下も実装する事。
(注:今の段階ではかなり難しいと思うので無理はしなくても良い)

 
//Groupクラス //学級。Classでもいいが後々面倒になる
	//フィールド
		Student[] student
		String subject //学科
 
	//コンストラクタ
		Group(Student[] student,String subject)
		Group(Group g)
 
	//メソッド
		Student getStudent(int n)//n番目の配列に入っているStudentを返却
         Student getStudent() //配列の全要素を返す。
		String getSubject()
		void setStudent(Student[] stu)
		void setStudent(Student stu,int n)
		void setSubject(String subject)
		String toString()//学科と配列に入っている全ての生徒を文字列で返却
 
 
 


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-10-24 (日) 17:14:24 (2581d)