11 はじめてのCUIプログラム

11.1 学習目標

11.2 はじめてのCUIプログラム

11.2.1 CUIとは

【Character User Interface】

ユーザに対する情報の表示を文字によって行ない、すべての操作をキーボードを用いて行なうユーザインターフェースのこと。

ユーザから入力を受け取ることもできる。(IT用語辞典より)

11.2.2 タートルプログラムとの違い

今までは、プログラミング初心者のために用意された 「タートルライブラリ」 (2) というライブラリを使ってプログラミングをしてきました。

ライブラリとは、特定の機能を持ったプログラムを1つのファイルにまとめたものです。 ライブラリは単体で実行することはできず、他のプログラムの1部として動作します。

fd(100)やinput()やprint()などの命令は、「タートルライブラリ」というプログラムがなければ使えません。 (論プロエディタには、「タートルライブラリ」があらかじめ入っています)

これから学習するCUIプログラムでは、Java標準ライブラリという、Javaにはじめから入っている、 プロでも使っているライブラリを使ってプログラミングをします。

  1. 論プロエディタで使用しているタートルライブラリは、萩野先生が98年に作ったものをもとに、大岩研究室で機能追加を行ったものです。

11.2.3 情報の表示とユーザ入力の受け取り

次のプログラムはユーザから文字列の入力を受け取り、おうむ返しするプログラムです。

リスト 11.2.3.1 InputAndPrint.java
  1: import java.util.*;
  2: 
  3: /**
  4: * プログラム名: おうむ返しのプログラム
  5: * 作成者: Yoshiaki Matsuzawa
  6: * 作成日: 2007/09/22
  7: */
  8: public class InputAndPrint{
  9: 	
 10: 	//起動処理
 11: 	public static void main(String[] args) {
 12: 		InputAndPrint main = new InputAndPrint();
 13: 		main.run();
 14: 	}
 15: 	
 16: 	//おうむ返しをする
 17: 	public void run() {
 18: 		//前処理
 19: 		Scanner scanner = new Scanner(System.in);//入力を受け取るためのスキャナ
 20: 		
 21: 		//入力を受けとる
 22: 		System.out.print("好きな文字を入力>>");
 23: 		String text = scanner.nextLine();
 24: 		
 25: 		//出力を行う
 26: 		String reply = "あなたの入力したのは" + text + "ですね";
 27: 		System.out.println(reply);
 28: 	}
 29: 	
 30: }

ここ をクリックすると、プログラムをダウンロードできます。

下のボタンを押すと、InputAndPrintプログラムが実行できます。

11.2.4 Java標準ライブラリ

11.2.4.1 インポート

importとは、名前空間を取り込む命令です。 import文を書くと、別パッケージの中にあるクラス名をフルネームで指定しなくてすむようなります。 Java標準ライブラリの機能である「java.util.Scanner」をパッケージ名(java.util)なしで使うために、 このプログラムでは1行目でライブラリをインポートしています。

System.outは、Java標準ライブラリ(rt.jar)の中の「java.lang」というパッケージに入っていますが、 これはJavaの仕様により自動でインポートされるので、import文を書かなくても使えます。

(ちなみに,今までのタートルプログラムは,デフォルトパッケージ(パッケージ名がないパッケージ)に インポート文を書かなくても使えていました.

import java.util.*;

11.2.4.2 入力を受け付ける命令

Java標準ライブラリの「Scanner」を使って、ユーザからの入力を受け付けることができます。 タートルプログラムでは、input()命令を使っていました。

19:	Scanner scanner = new Scanner(System.in);//入力を受け取るためのスキャナを作る
23:	String text = scanner.nextLine();//スキャナを使って文字を読み込む
					

スキャナーは、文字以外にも、整数や浮動小数点数などを読み込むことができます。 これらについては、あとで説明します。

int number = scanner.nextInt();//スキャナを使って整数を読み込む
double number = scanner.nextDouble();//スキャナを使って浮動小数点数を読み込む
					

11.2.4.3 コンソールに出力する命令

Java標準ライブラリの「System.out」を使って、コンソールに文字を出力することができます。 タートルプログラムでは、print()命令を使っていました。

22:	System.out.print("好きな文字を入力>>");//改行なしで""内の文字を出力する
27:	System.out.println(reply);//改行ありで()内の文字(文字列型の変数の中身)を出力する
					

11.2.5 変数の型-文字列型

変数には、今までタートルプログラムでも使ってきたint(整数)型のほかに、 String(文字列)型や、double(浮動小数点数)型があります。

おうむ返しプログラムでは、ユーザから入力された文字を保存しておくために、 String(文字列)型の変数を用意しています。

また、「あなたの入力したのは」と、「text(入力された文字列)」と、 「ですね」を+記号で連結し、 まとめて「reply」という文字列型の変数に入れて、出力しています。

11.3 入力、処理、出力

11.3.1 西暦和暦変換プログラム

次のプログラムは、西暦を入力すると、変換処理を行い、和暦を出力するプログラムです。

リスト 11.3.1.1 ConvertYearApplication1.java
  1: import java.util.*;
  2: 
  3: /**
  4:  * 西暦和暦変換プログラム(メソッドなし)
  5:  * 
  6:  * @author オブプロ例題
  7:  * @version 1.0
  8:  */
  9: public class ConvertYearApplication1{
 10: 	
 11: 	public static void main(String[] args) {
 12: 		ConvertYearApplication1 main = new ConvertYearApplication1();
 13: 		main.run();
 14: 	}
 15: 
 16: 	Scanner scanner = new Scanner(System.in);
 17: 	
 18: 	// 西暦を和暦に変換する
 19: 	public void run() {
 20: 		// アプリケーションの開始を知らせる
 21: 		System.out.println("西暦和暦変換プログラムを開始します");
 22: 
 23: 		{// 西暦を和暦に変換する
 24: 			int year;
 25: 			String japaneseYear;
 26: 
 27: 			// 西暦を入力する
 28: 			System.out.println("西暦を入力してください");
 29: 			year = scanner.nextInt();
 30: 
 31: 			// 西暦を和暦に変換する
 32: 			if (year >= 1989) {
 33: 				japaneseYear = "平成" + (year - 1988);
 34: 			} else if (year >= 1926) {
 35: 				japaneseYear = "昭和" + (year - 1925);
 36: 			} else {
 37: 				japaneseYear = "不明";
 38: 			}
 39: 
 40: 			// 変換結果を出力する
 41: 			System.out.println(year + "年は" + japaneseYear + "年です.");
 42: 		}
 43: 
 44: 		// アプリケーションの終了を知らせる
 45: 		System.out.println("西暦和暦変換プログラムを終了します");
 46: 	}
 47: }

ここ をクリックすると、プログラムをダウンロードできます。

下のボタンを押すと、ConvertYearApplication1プログラムが実行できます。

11.3.2 変数の型-整数型

このプログラムでは、西暦(整数型)を読み込んで、 西暦和暦変換処理を行い、和暦(文字列型)にして出力しています。 整数を読み込む命令は以下のとおりです。

16:	Scanner scanner = new Scanner(System.in);//入力を受け取るためのスキャナを作る
29:	year = scanner.nextInt();//スキャナを使って整数を読み込む
				

整数は文字列と連結し、文字列として保存することができます。 このプログラムでは、西暦を和暦に変換するときに、 年号(文字列型)と、年(整数型)を連結し、文字列型として出力しています。

35:	japaneseYear = "昭和" + (year - 1925);

11.4 変数の型とキャスト

11.4.1 平均得点計算プログラム

次のプログラムは3教科の平均を計算し、小数点1位を四捨五入して平均点を出力するプログラムです。

リスト 11.4.1.1 ScoreAverage.java
  1: import java.util.*;
  2: 
  3: /**
  4: * プログラム名:成績平均計算プログラム
  5: * 作成者: Megumi Araki
  6: * 作成日: Sat Oct 20 15:11:37 JST 2007
  7: */
  8: public class ScoreAverage{
  9: 	
 10: 	//起動処理
 11: 	public static void main(String[] args) {
 12: 		ScoreAverage main = new ScoreAverage();
 13: 		main.run();
 14: 	}
 15: 	
 16: 	//メイン処理
 17: 	public void run() {
 18: 		
 19: 		//各教科の点数を設定する
 20: 		int japanese = 49; //国語
 21: 		int mathematics = 72; //数学
 22: 		int english = 25; //英語
 23: 		
 24: 		//3教科の合計点を求める
 25: 		double total = japanese + mathematics  + english;
 26: 		//3教科の平均を求める
 27: 		double average = total / 3.0; //平均を計算する
 28: 		
 29: 		//平均を四捨五入する
 30: 		average = average * 10;
 31: 		if ((average % 10) >= 5) { //1の位が5以上なら
 32: 			average = average + 10; //繰り上げる
 33: 		}
 34: 		int result = (int) (average / 10);//double型のaverageをint型に型変換して、resultに代入する
 35: 		
 36: 		//四捨五入した平均を表示する
 37: 		System.out.println(result);
 38: 		
 39: 	}
 40: 	
 41: }

ここ をクリックすると、プログラムをダウンロードできます。

下のボタンを押すと、ScoreAverageプログラムが実行できます。

11.4.2 変数の型-浮動小数点数型

このプログラムでは、浮動小数点数(double)を扱っています。

浮動小数点数には誤差があります。 これは、コンピュータは2進法で計算をしており、 普段わたしたちが使っている10進法とは違うためです。

11.4.3 キャスト(型変換)

通常、整数型に浮動小数点数型を代入するなど、値を型の違う変数を代入することはできません (浮動小数点数型の変数に整数を代入するなど、Javaで認められているものは、特別な処理をしなくても自動で型変換が行われ、代入ができる)。

このような場合、プログラマが明示的に「キャスト(型変換)」を行う必要があります。キャストの命令は、次のように書きます。

(変換したい型)変換元の変数;

今回のプログラムでは、以下のようにしてdouble型の変数をint型にキャストして、int型の変数に代入しています。

34:	int result = (int) (average / 10);

Javaでは、double型をint型にキャストすると、小数点以下は切り捨てられます。 この仕様を利用して、四捨五入のプログラムは以下のように書くこともできます。

//平均を四捨五入する
average = average+0.5;
int result = (int) (average);
				

11.5 CUIプログラムの作り方

11.5.1 クラス(ファイル)の作り方

論プロエディタのクラス(ファイル)作成画面のテンプレートの中から「CUI」を選んでください。 このテンプレートにはあらかじめimport文と、起動処理が書かれています。

11.5.2 新しい命令-変数の型と変数宣言

変数には整数型(int)、文字列型(String)、浮動小数点型(double)などがあります。

文字列や浮動小数点数を変数に保存したい場合は、以下のように書きます。

それぞれの型の変数宣言と代入文の例
int x=0;
整数型の変数xを作り、0を代入しています。
double y=0.01;
浮動小数点数方の変数yを作り、0.01を代入しています。
String text="hello";
文字列型の変数textを作り、「hello」という文字列を代入しています。

11.5.3 Java標準ライブラリを使った命令

11.5.3.1 標準出力に文字を出力する命令

System.out.println("hello")
"(ダブルクォーテーション)で囲まれた文字(例ではhello)を、標準出力(コンソール)に出力します。(改行します)
System.out.print("hello")
"(ダブルクォーテーション)で囲まれた文字(例ではhello)を、標準出力(コンソール)に出力します。(改行しません)

11.5.3.2 ユーザから入力を受け取る命令

Scanner scanner = new Scanner(System.in);
文字を受け取るための「スキャナー」を生成します(下の3つの命令を使うためには、必ず、下の3つの命令の前にこの命令を書いておく必要がある)
int x = scanner.nextInt()
整数の入力を受け取り、その値をxという変数に保存します。
double y = scanner.nextDouble()
浮動小数点数の入力を受け取り、その値をyという変数に保存します。
String text = scanner.nextLine()
文字列の入力を受け取り、その値をtextという変数に保存します。

11.5.3.3 乱数を求める命令(その1)

double number = Math.random();
乱数を発生させ,numberという変数に保存します. この命令では、0.0 ≦ x < 1.0 の範囲double型実数を生成します. (タートルライブラリのrandom([数])命令とは、生成する値の範囲が異なるので注意)

11.5.3.4 乱数を求める命令(その2)

Random random = new Random();
乱数生成器をを生成します.(randomクラスの命令を使うためには、この命令を書いておく必要があります)
Random random = new Random([数値]);
乱数生成器をを生成します.(randomクラスの命令を使うためには、この命令を書いておく必要があります) ([数値]によって,ランダムシードを指定します.)
int x = random.nextInt([数値])
0 ≦ x < [数値]の範囲のint型の乱数を生成し,その値をxという変数に保存します.
double y = random.nextDouble()
0.0 ≦ y < 1.0の範囲のdouble型の乱数を生成し,その値をyという変数に保存します.

11.6 練習問題

11.6.1 0.1を10回加算するプログラム

0.1を10回加算し、その結果を出力するプログラムを作りましょう。

ファイル名は「DoubleChecker1.java」とすること

11.6.2 0.125を8回加算するプログラム

0.125を8回加算し、その結果を出力するプログラムを作りましょう。

ファイル名は「DoubleChecker2.java」とすること

11.6.3 乱数生成プログラム

乱数を使って10から20の整数をランダムに出力するプログラムを作りましょう。

実行する度に異なる整数が出力されるようにすること。

(利用する命令は「Java標準ライブラリを使った命令」の項で説明してあります)

ファイル名は「RandomGenerator.java」とすること

11.6.4 四捨五入プログラム

小数点第二位を四捨五入するプログラムを作りましょう。(例: 18.54 → 18.5 , 20.18 → 20.2)

ユーザーが入力した実数を受け取り、その実数の小数点第二位を四捨五入し、その結果を出力すること。

(利用する命令は「Java標準ライブラリを使った命令」、四捨五入のヒントは「キャスト」の項で説明してあります)

ファイル名は「Round.java」とすること

11.6.5 割り勘計算機

合計金額を人数で割った数を表示する「割り勘計算機」を作りましょう。

まず「合計金額を入力してください>>」と表示し、合計金額の入力を受け取り、

次に「飲み会参加人数を入力してください>>」と表示し、人数の入力を受け取り、

最後に「ひとりあたりの金額は●●円です」と表示しましょう。

結果は、整数(小数点以下切捨て)で出すようにしてください。

(すべての変数を整数型にして実装すると、Javaの仕様により、計算結果の小数点以下は切り捨てられます。「キャスト」の項で説明してあります)

ファイル名は「BillSplit.java」とすること

11.6.6 体型評価プログラム

11.6.6.1 概要

このプログラムは、身長と体重の入力を実数で受け付ける。 その入力をもとにBMI指数と、その値から評価されたコメントを出力する。

11.6.6.2 機能

  1. プログラムの起動時および終了時に、その旨をユーザに伝えるメッセージを出力する。
  2. 身長と体重の入力を受け取り、BMI指数と、その値から評価されたコメントを出力する。

11.6.6.3 エラー処理

文字など処理不可能な値が入力されたときの処理は、行わなくてよい。

11.6.6.4 プログラム設計条件

  1. 入出力は起動したコンソールから行う(CUIプログラムである)。
  2. 身長と体重の入力にはscanner.nextDouble()を使用すること。
  3. 身長と体重の入力にはscanner.nextDouble()を使用すること。

ファイル名は「BMI.java」とすること.

11.6.7 恋愛占いプログラム

11.6.7.1 概要

このプログラムは、男女の名前を入力すると、 その恋愛成就確率を百分率で判定し、コメント付で出力する。

11.6.7.2 機能

  1. プログラムの起動時および終了時に、その旨をユーザに伝えるメッセージを出力する。
  2. 男女の名前の入力を受け取り、恋愛成就確率をコメント付で出力する。

11.6.7.3 エラー処理

処理不可能な値が入力されたときの処理は、行わなくてよい。

11.6.7.4 プログラム設計条件

  1. 入出力は起動したコンソールから行う(CUIプログラムである)。
  2. 男女の名前の入力にはscanner.nextLine()を使用すること。
文字列からハッシュコード(整数)を求める命令

入力された文字列からハッシュコード (3) を求めるには、hashCode()命令を使います。

以下のプログラムを参考にしてください。

//文字の入力を受けとる
System.out.print("文字を入力>>");
String text = scanner.nextLine();

//入力された文字をハッシュコード(整数)に変換し、その値をnumberという変数に保存する
int number = text.hashCode();

//ハッシュコードの出力を行う
System.out.println("あなたの入力した文字のハッシュコードは" + number + "ですね");
					
実装のヒント

ハッシュコードは正負の非常に大きな値を取ります。これを100までの整数にして、 百分率表示に使うためには、「負の数だったら(-1)をかけて、正の数にする」 「数が100より大きい間、数を10で割り続ける」といった方法が使えます。

ファイル名は「LoveChecker.java」とすること.

  1. ハッシュコードとは、ハッシュ関数という、特定のデータを固定長のデータに変換する関数によって求められた値のことです。同じデータからは同じハッシュコードが生成されます。ハッシュコードは、情報セキュリティを高めるための技術として、パスワードの保管やデータの改ざんの検出などに使われています。今回、このプログラムでは相性判断のために、文字列を数値に変換するための手段としてハッシュコードを使いましたが、これはハッシュコードの本来の使い方ではありません。

11.6.8 単位取得状況評価プログラム

11.6.8.1 概要

このプログラムは、あなたの単位取得状況の入力を受け取り、 それを評価し、卒業するためのコメントを出力する。

11.6.8.2 機能

  1. プログラムの起動時および終了時に、その旨をユーザに伝えるメッセージを出力する。
  2. 経過した学期数と現在取得した単位数の入力を受け取り、その値から評価されたコメントを出力する。

11.6.8.3 エラー処理

文字など処理不可能な値が入力されたときの処理は、行わなくてよい。

11.6.8.4 プログラム設計条件

  1. 入出力は起動したコンソールから行う(CUIプログラムである)。
  2. 単位数の入力にはscanner.nextInt()を使用すること。

ファイル名は「CreditChecker.java」とすること.

11.7 発展問題

11.7.1 脳トレ 論プロ風

11.7.1.1 概要

ユーザが計算問題を解くことで脳を鍛えるソフトウエアである。 このプログラムは、足し算の計算問題を自動生成して、何問か出題し、そのつど答えあわせをする。

11.7.1.2 機能

  1. プログラムの起動時、および終了時にその旨をユーザに知らせるメッセージを出力する。
  2. 足し算の計算問題を生成する。

    各数字の桁数は一桁の整数である(答えは任意の桁数の整数とする)

  3. 出題し、答えあわせをする。
  4. 2)、3)を連続で10回行い、最後に正答率を出力する。

11.7.1.3 エラー処理

処理不可能な値が入力されたときの処理は、行わなくてよい。

11.7.1.4 プログラム設計条件

  1. 入出力は起動したコンソールから行う(CUIプログラムである)。
  2. 入力はscanner.nextInt()を利用すること。

ファイル名は「Training.java」とすること.

11.7.2 マイホーム大作戦

11.7.2.1 概要

マイホームローンの返済計算を行うプログラムである。ユーザは家を買うときに利用することを想定する。 家の値段とローン年数、利率、月々の返済金額を入力として受け取り、 返済が終わるまでにかかる期間、総返済金額を計算し、コメントとともに出力する。

11.7.2.2 機能

  1. プログラムの起動時および終了時に、その旨をユーザに伝えるメッセージを出力する。
  2. 家の値段とローン年数、利率、月々の返済金額を入力として受け取り、返済が終わるまでにかかる期間、総返済金額を計算し、コメントとともに出力する。

11.7.2.3 エラー処理

処理不可能な値が入力されたときの処理は、行わなくてよい。

11.7.2.4 プログラム設計条件

  1. 入出力は起動したコンソールから行う(CUIプログラムである)。
  2. 入力はscanner.nextInt()を利用すること。

ファイル名は「Loan.java」とすること.

11.7.3 ザ・バイナリサーチ

11.7.3.1 概要

「数あてゲーム」である。システムはまず,1-1000までの整数をランダムに選ぶ(表示しない)。 ユーザはこの数をなるべく少ない回答で当てるのが目的である.ユーザは推測した数を入力し、 システムは数が当っていたら、あたったことをユーザに知らせて終了、 外れていたら、大きすぎるのか、小さすぎるのかをユーザに知らせて再入力を求める。

11.7.3.2 機能

  1. プログラムの起動時、および終了時にその旨をユーザに知らせるメッセージを出力する。
  2. 整数をランダムに選ぶ。
  3. 回答の入力を受けつけ、答えあわせをする。

11.7.3.3 エラー処理

処理不可能な値が入力されたときの処理は、行わなくてよい。

11.7.3.4 プログラム設計条件

  1. 入出力は起動したコンソールから行う(CUIプログラムである)。
  2. 入力はscanner.nextInt()を利用すること。

ファイル名は「Binary.java」とすること.

11.7.4 世界の○○

11.7.4.1 概要

芸人のマネをするソフトウェアである。 任意の自然数を受取り、その数だけ数を数える。

11.7.4.2 機能

  1. プログラムの起動時、および終了時にその旨をユーザに知らせるメッセージを出力する。
  2. 自然数の入力を受取り、その数まで数える。3の倍数の時にバカになり、5の倍数の時には犬っぽくなる。(数える毎に改行してください)
    1
    2
    3(;.゚Д゚.;)ノ
    4
    5^U)┬┬~
    6(;.゚Д゚.;)ノ
    7											
    							
    
  3. 3がつく数のときもバカになるとなおよい(がこれを作るのは結構難しい。)

11.7.4.3 エラー処理

処理不可能な値が入力されたときの処理は、行わなくてよい。

11.7.4.4 プログラム設計条件

  1. 入出力は起動したコンソールから行う(CUIプログラムである)。
  2. 入力はscanner.nextInt()を利用すること。

ファイル名は「FizzBuzz.java」とすること.