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

7.1 学習目標

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

7.2.1 CUIとは

【Character User Interface】

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

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

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

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

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

リスト 7.2.2.1 オウム.dama
  1: ※プログラム名:おうむ返しのプログラム
  2: ※作成者:秋山 優
  3: ※作成日:2009.11.11
  4: 
  5: ※授業に必要なライブラリを取り込む。
  6: TurtleLibraryを参照する。
  7: 
  8: ※入力を受け取る
  9: コンソールに「好きな文字を入力>>」を出力する。
 10: 文字列型を新規作成して、テキストと名付ける。
 11: コンソールから入力を受け取って、それをテキストに入れる。
 12: 
 13: ※出力を行う。
 14: 文字列型を新規作成して、応答と名付ける。
 15: 応答に「あなたの入力したのは」+テキスト+「ですね。」を入れる。
 16: コンソールに応答を出力する。

7.2.2.1 入力を受け付ける命令

以下のように記述することによって、コンソールから文字列の入力を受け付けることができます。

文字列型を新規作成して、テキストと名付ける。
コンソールから入力を受け取って、それをテキストに入れる。

文字以外にも、整数や実数などを読み込むことができます。

コンソールから整数を受け取って、それをXに入れる。※整数を読み込んで、整数型の変数Xに代入する
コンソールから実数を受け取って、それをXに入れる。※実数を読み込んで、実数型の変数Xに代入する

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

以下のように記述することによって、ユーザにメッセージを出すことができます。

コンソールに「好きな文字を入力>>」を出力する。

出したいメッセージを「」で囲んでください。

文字列の他に、以下のように記述することで、改行や空白、変数、計算式の計算結果を出力することができます。

コンソールに改行を出力する。
改行を出力する。
コンソールに空白を出力する。
空白を出力する。
コンソールに<変数>を出力する。
変数の値を評価して表示する。
コンソールに<計算式>を出力する。
計算式を評価して計算結果を表示

7.2.3 変数の型-文字列型

変数には、今まで使ってきた整数型のほかに、 文字列型や、実数型があります。

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

7.3 入力、処理、出力

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

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

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

リスト 7.3.1.1 西暦和暦変換.dama
  1: ※プログラム名:西暦和暦変換プログラム(メソッドなし)
  2: ※作成者:秋山 優
  3: ※作成日:2009.11.11
  4: 
  5: ※授業に必要なライブラリを取り込む。
  6: TurtleLibraryを参照する。
  7: 
  8: ※アプリケーションの開始を知らせる
  9: コンソールに「西暦和暦変換プログラムを開始します。」を出力する。
 10: コンソールに改行を出力する。
 11: 
 12: ※西暦を和暦に変換する。
 13: 整数型を新規作成して、西暦と名付ける。
 14: 
 15: ※西暦を入力する
 16: コンソールに「西暦を入力して下さい。」を出力する。
 17: コンソールから整数を受け取って、それを西暦に入れる。
 18: 
 19: ※西暦を和暦に変換する。
 20: 西暦≧1989であるならば{
 21: 	コンソールに「西暦」+西暦+「年は平成」+(西暦-1988)+「年です。」を出力する。
 22: }をして、西暦≧1926であるならば...
 23: 	コンソールに「西暦」+西暦+「年は昭和」+(西暦-1925)+「年です。」を出力する。
 24: }をして、そうでないならば{
 25: 	コンソールに「不明です。」を出力する。
 26: }をする。
 27: 
 28: ※アプリケーションの終了を知らせる
 29: コンソールに改行を出力する。
 30: コンソールに「西暦和暦変換プログラムを終了します。」を出力する。

7.3.2 変数の型-整数型

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

整数型を新規作成して、西暦と名付ける。
コンソールから整数を受け取って、それを西暦に入れる。	

言霊では+記号を使って整数や変数を文字と連結することが出来ます。以下のように書きましょう。

コンソールに「西暦」+西暦+「年は平成」+(西暦-1988)+「年です。」を出力する。
やってみよう!

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

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

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

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

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

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

7.4 変数の型とキャスト

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

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

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

リスト 7.4.1.1 平均得点計算.dama
  1: ※プログラム名:成績平均計算プログラム
  2: ※作成者:秋山 優
  3: ※作成日:2009.11.11
  4: 
  5: ※授業に必要なライブラリを取り込む。
  6: TurtleLibraryを参照する。
  7: 
  8: ※各教科の点数を設定する。
  9: 整数型を新規作成して、国語と名付ける。
 10: 整数型を新規作成して、数学と名付ける。
 11: 整数型を新規作成して、英語と名付ける。
 12: 国語に49を入れる。
 13: 数学に72を入れる。
 14: 英語に25を入れる。
 15: 
 16: ※3教科の合計点を求める。
 17: 実数型を新規作成して、合計と名付ける。
 18: 合計に国語+数学+英語を入れる。
 19: 
 20: ※3教科の平均を求める。
 21: 実数型を新規作成して、平均と名付ける。
 22: 平均に合計÷3.0を入れる。※平均を計算する。
 23: 
 24: ※平均を四捨五入する
 25: 平均に平均×10を入れる。
 26: ※1の位が5以上なら繰り上げる。
 27: 平均%10≧5であるならば{ 
 28: 	平均に平均+10を入れる。
 29: }をする。
 30: 
 31: ※実数型の平均を整数型に変換して、整数型変数:結果に代入する
 32: 整数型を新規作成して、結果と名付ける。
 33: 変換機が平均÷10を整数に変換して、それを結果に入れる。
 34: 
 35: ※四捨五入した平均を表示する
 36: コンソールに「3教科の平均は」+結果+「点です。」を出力する。
 37: コンソールに改行を出力する。

7.4.2 変数の型-実数型

このプログラムでは、実数を扱っています。

コンピュータでは、実数の近似値を表現する方法として浮動小数点数を用いています(実数型とは、正確には浮動小数点型です)。浮動小数点数には誤差があります。 これは、コンピュータは2進法で計算をしており、 普段わたしたちが使っている10進法とは違うためです。

やってみよう!

0.1を10回足すプログラムを作り、結果を表示しましょう。

やってみよう!

0.125を8回足すプログラムを作り、結果を表示しましょう。

考えてみよう

なぜ上記2つの結果が違うのか、考えてみましょう。

7.4.3 キャスト(型変換)

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

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

変換機が<実数>を整数に変換して、それをコンソールに出力する。
実数を整数に型変換してコンソールに出力する。
変換機が<実数>を整数に変換して、それを<整数型の変数>に入れる。
実数を整数に型変換して整数型の変数に代入する。
変換機が<整数>を実数に変換して、それをコンソールに出力する。
整数を実数に型変換してコンソールに出力する。
変換機が<整数>を実数に変換して、それを<整数型の変数>に入れる。
整数を実数に型変換して実数型の変数に代入

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

※実数型の平均を整数型に変換して、整数型変数:結果に代入する
整数型を新規作成して、結果と名付ける。
変換機が平均÷10を整数に変換して、それを結果に入れる。

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

※平均を四捨五入する
平均 に平均+0.5を入れる。
整数型を新規作成して、結果と名付ける。
変換機が平均を整数に変換して、それを結果に入れる。

7.5 CUIプログラムの作り方

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

論プロエディタのソースコードの初めに、「タートルライブラリを参照する。 」と一行記述して下さい。

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

変数には整数型、文字列型、実数型などがあります。

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

それぞれの型の変数宣言と代入文の例
整数型を新規作成して、xと名付ける。
xに0を入れる。
整数型の変数xを作り、0を代入しています。
実数型を新規作成して、yと名付ける。
yに0.01を入れる。
実数型の変数yを作り、0.01を代入しています。
文字列型を新規作成して、テキストと名付ける。
テキストに「こんにちは」を入れる。
文字列型の変数テキストを作り、「こんにちは」という文字列を代入しています。

7.6 練習問題

7.6.1 問題1:体型評価プログラムを作ろう

7.6.1.1 概要

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

7.6.1.2 機能

  1. プログラムの起動時および終了時に、その旨をユーザに伝えるメッセージを出力する。

7.6.1.3 エラー処理

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

7.6.1.4 プログラム設計条件

  1. 入出力は起動したコンソールから行う(CUIプログラムである)。

7.6.2 問題2:恋愛占いプログラムを作ろう

7.6.2.1 概要

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

7.6.2.2 機能

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

7.6.2.3 エラー処理

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

7.6.2.4 プログラム設計条件

  1. 入出力は起動したコンソールから行う(CUIプログラムである)。

7.6.3 問題3:単位取得状況評価プログラムを作ろう

7.6.3.1 概要

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

7.6.3.2 機能

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

7.6.3.3 エラー処理

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

7.6.3.4 プログラム設計条件

  1. 入出力は起動したコンソールから行う(CUIプログラムである)。

7.7 発展問題

7.7.1 問題1:脳トレ 論プロ風

7.7.1.1 概要

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

7.7.1.2 機能

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

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

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

7.7.1.3 エラー処理

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

7.7.1.4 プログラム設計条件

  1. 入出力は起動したコンソールから行う(CUIプログラムである)。

7.7.2 問題2:マイホーム大作戦

7.7.2.1 概要

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

7.7.2.2 機能

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

7.7.2.3 エラー処理

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

7.7.2.4 プログラム設計条件

  1. 入出力は起動したコンソールから行う(CUIプログラムである)。

7.7.3 問題3:ザ・バイナリサーチ

7.7.3.1 概要

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

7.7.3.2 機能

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

7.7.3.3 エラー処理

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

7.7.3.4 プログラム設計条件

  1. 入出力は起動したコンソールから行う(CUIプログラムである)。
乱数を求める命令

乱数値を(命令毎に毎回変わる値)に取得するには

計算機が<数>でランダム数を生成して、それを<変数名>に入れる。

命令を使います。

実行されるごとに異なる値が自動的に選択されます。

数-1が最大値になります。(例えば5でランダム数を生成したら、0,1,2,3,4のどれかが生成される)