石田修二 > コンピュータメモ > Java >    (サイト内検索

データの入出力

Scanner クラス

Scannerクラスは,簡素な入力機能を提供します。

例1

import java.util.Scanner;
class Input{
	public static void main(String[] args){
		int i; String s;
		Scanner scan = new Scanner(System.in);

		System.out.println("名前とスコアを入力して下さい。");
		s = scan.next(); i = scan.nextInt();
		System.out.println(s + "さんのスコアは " + i + "点です。");
	}
}

まず最初に,Scannerを使う時は,import java.util.Scanner;という行を記述しておく必要があります。初心者は「Scannerを使うために必要な宣言」と覚えてもらって構いません。

その後,Scanner scan = new Scanner(System.in) で実際の Scanner を生成し,scan という変数に代入します。

Scannerはクラスですが,それを使う時は,Scanner を1つ生成し,それをScanner を入れておくための変数に代入することが必要になります。

このように Scanner を1つ生成すると,あとはそれを利用して,キーボードからの入力を取り出すことができます。

s = scan.next(); の部分を見て下さい。ここでは,next() というメソッドを使って,文字列を取り出し,s という文字列型(String)の変数に代入しています。生成した Scanner のメソッドを利用する時は,生成した Scanner が scan という名前の変数に代入されているので,scan.next() のように変数名とメソッド名をピリオドでつなげて書きます。

同じように,i = scan.nextInt() では Scanner を使って整数の値を1つ取り出しています。整数の値を取り出すので,nextInt() を使い,整数型の変数である i に代入しています。

最後に,System.out.println(s + "さんのスコアは " + i + "点です。") の部分で,読み取った値を画面に表示しています。

実行

文字列と整数を,空白(半角でも全角でもOk)で区切って,キーボードから入力します。すると,Scanner がそれを自動で分割し,それぞれ順番に取り出してくれます。

文字列と整数を空白ではなく,改行で区切っても,Scanner が自動で2つを取り出してくれるので,プログラムの中で何も対処しなくても,正しい値が代入されます。

例2

もう1つサンプルプログラムを紹介します。『Javaの絵本』p.117ページからのものです。

import java.util.Scanner;
public class ScannerSample {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		System.out.print("駅名を入れて下さい:");
		String ekimei = sc.next();
		System.out.print("ホーム番号を入力して下さい:");
		int bansen = sc.nextInt();

		sc.close();

		System.out.println(ekimei + "駅の" + bansen + "番ホームで待っています");
	}
}

コンパイルして,実行すると次のように結果が出力されます。

駅名を入れて下さい:四日市
ホーム番号を入力して下さい:3
四日市駅の3番ホームで待っています

Scannerクラスの主なメソッドを紹介します。

next()
入力値を取り出す
nextInt()
入力値をint型として取り出す

フォーマット指定による表示

変数の値を様々なフォーマットで出力したい場合,それを指定した形での出力をすることができます。

先ほどのプログラムで説明すると,

System.out.println(s + "さんのスコアは " + i + "点です。") を,

System.out.printf("%sさんのスコアは%d点です。",s, i) にします。

printf() というコマンドに対して,文字列型の変数の値を表示する箇所には %s,整数型の変数の値を表示するところには %d といった記号を書いておき,対応する変数を後ろに並べて書く,という形式になります。

BufferedReader クラス

キーボードから入力された値を読み取るクラスには Scanner 以外にも BufferedReader というクラスもあります。

では,プログラムを紹介しましょう。

import java.io.*;
public class InputTest {
	public static void main(String[] args) throws IOException {
		BufferedReader bufRd = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("キーボードから何か入力して下さい");
		String str = bufRd.readLine();
		System.out.println(str + "と入力されました。");
	}
}

数学ライブラリ

数値演算でよく用いられるライブラリについて説明します。

算数レベルの計算であれば,演算子で十分なのですが,指数や平方根,絶対値といった数学レベルの計算には Math クラスを使います。

絶対値や平方根,sin() や cos() といった数学的な演算は,それを行ってくれる専用のクラスが用意されています。それを Methクラスと呼び,そこに準備されている各種メソッドを使うことで,数学的な演算を行うことができます。

例1

double f;
f = Math.abs(Math.sin(2 * Math.PI));

まず,Math.PI の部分で円周率の定数を利用します。このように,メソッドは何かを演算するだけでなく,定数の値を返すようなものも準備されています。

次に,Math.sin(2 * Math.PI) の部分で三角関数の演算,sin() の値を計算しています。

さらに,Math.abs(Math.sin(2 * Math.PI)) の部分で絶対値の計算を行っています。

数学ライブラリは様々な演算が準備されているので,参考書等でどのような演算があるか,調べてみましょう。

30度のサイン,コサイン,タンジェントを求めるプログラムは次の通りです。

public class Function {
	public static void main(String[] args) {
		// 実数型変数degとradを宣言。degは同時に代入
		double deg = 30, rad;
		rad = Math.toRadians(deg); // 度→ラジアン

		double s = Math.sin(rad); // サインを求めて,sに代入
		double c = Math.cos(rad); // コサインを求めて,cに代入
		double t = Math.tan(rad); // タンジェントを求めて,tに代入

		System.out.println("角度 " + deg + "度");
		System.out.println("sin " + (float)s);
		System.out.println("cos " + (float)c);
		System.out.println("tan " + (float)t);
	}
}

例2 乱数を作る(1)

プログラムで乱数を生成するには,double ran = Math.random(); のようにします。

double 型から float 型やint型には変換できません。double型ということで覚えてしまいましょう。

public class Rand {
	public static void main(String[] args) {
		double ran = Math.random();
		
		System.out.println(ran);
	}
}

例3 乱数を作る(2)

0から6の数字をランダムに表示させます。

public class RandSample {
	public static void main(String[] args) {
		int a = (int)(Math.random()*7);
		System.out.println(a);
	}
}

先に Math.random は double型と説明しました。このままでは int 型に出来ないので,Math.randomの前に int と記述しておきます。このようにすると, Math.random()*7 の計算結果が int 型に変換され,それが a に代入されます。

まず,人数と合計金額をキーボードから入力します。int i; int j;

(2)それを Scanner を使って読み取ります。

i = scan.nextInt(); j = scan.nextInt();

(3)一人あたりの支払い金額を表示させます。

t = j / i

基本的な考え方としては,100円単位に四捨五入した値を計算して,1人を除いた人たちの合計支払い金額を計算すると,合計金額からそれを引けば,最後の1人の支払金額がわかります。

import java.util.Scanner;
class Split {
    public static void main(String[] args){
	int num, total, round_bill, remain;
	double bill;
	Scanner scan = new Scanner(System.in);

	System.out.println("人数と合計金額を入力してください。");
	num = scan.nextInt(); total = scan.nextInt();
	bill = (double)total/num;
	System.out.println("一人あたりの金額は、" + bill + "円です。");

	round_bill = (int) Math.round(total/num/100.0) * 100;
	remain = total - round_bill * (num - 1);
	System.out.printf("100円単位では、一人あたり %d円、ひとりだけ %d円です。", round_bill, remain);
    }
}

(石田修二の解答)キャストを使ったりとかなり長くなってしまった。

import java.util.Scanner;
class Split{
	public static void main(String[] args){
		double n;
		double y;
		Scanner scan = new Scanner(System.in);

		System.out.println("人数と合計金額を入力して下さい。");
		n = scan.nextInt();
		y = scan.nextInt();
		double i;
		i = y / n;
		System.out.println("一人あたりの金額は" + i + "円です。");
        double f;
        f = Math.floor(i /100)*100;
        int g = (int)f;
        int y1 = (int)y;
        int n1 = (int)n;
        int h;
        h = y1 - (n1-1) * g;
        System.out.println("100円単位では,一人あたりは " + g + "円 ひとりだけ" + h + "円です。");
	}
}

リンクはご自由にどうぞ。

【石田修二トップページ】 【コンピュータメモ】 【Java】

Last modified: 2017-03-02 00:31:15