情報学部 菅沼ホーム 全体目次 演習解答例 付録 索引

第Ⅱ部

第3章 簡単なプログラム

  1. 3.1 プログラムの書き方
    1. 3.1.1 基本原則
    2. 3.1.2 わかりやすいプログラム
  2. 3.2 データ型
    1. 3.2.1 定数
    2. 3.2.2 変数
    3. 3.2.3 列挙型変数
  3. 3.3 算術演算子と代入演算子
    1. 3.3.1 算術演算子
    2. 3.3.2 代入演算子
    3. 3.3.3 インクリメント,デクリメント演算子
    4. 3.3.4 型変換( cast 演算子)
  4. 3.4 簡単なプログラム
    1. (プログラム例 3.1 ) 2 つのデータの和と差
    2. (プログラム例 3.2 ) 2 つのデータの和と差( Console クラスの利用)
    3. (プログラム例 3.3 ) 2 つのデータの和と差( 1 行に 2 つ以上のデータ,StringTokenizer )
    4. (プログラム例 3.4 ) 2 つのデータの和と差( 1 行に 2 つ以上のデータ,split )
    5. (プログラム例 3.5 ) 2 つのデータの和と差( 1 行に 2 つ以上のデータ,Scanner )
  5. 3.5 その他
    1. 3.5.1 キーワード
    2. 3.5.2 アスキーコード
    3. 3.5.3 エスケープシーケンス
  6. 演習問題3

3.1 プログラムの書き方

3.1.1 基本原則

  Java は,フリーフォーマットで書くことができる言語です.つまり,日本語などの言語のように,一つの文をどこから書き始めても,どこで終わっても構いません.また,日本語の場合,一つの文章が「.」や「。」で終わるように,Java においてはセミコロン(;)で一つの文章が終了します.

  文章内及び文書間には,単語を分割するような位置でなければ,適当な位置に,また,適当な数だけ区切り記号(半角スペース,タブ,復改,コメント)を入れても構いません.

  コメント(説明,注釈comment)は,
// から行末まで		
または,
/*
  ・・・・・・・・
*/		
のような形で記述されます.例えば,
x = 10.0;   // 変数 x に 10.0 を代入		
のように書く方法です./* と */ を使用した方法で書けば
/*
	変数 x に 10.0 を代入
*/
x = 10.0;		
または
x = 10.0;   /* 変数 x に 10.0 を代入 */		
のように記述されます.なお,コメントを入れ子(ネスト)にすることは許されません.

3.1.2 わかりやすいプログラム

  プログラムも一種の文章です.従って,よほど特殊な事情がない限り,「読みやすく,理解しやすい」ことが,プログラムにとって最も重要な要素となります.もちろん,誤りさえなければ,読みやすい,読みにくいに関わらず,プログラムは正しく実行されます.しかし,プログラムを実行するのはコンピュータであっても,プログラムを書いたり,誤りを修正したりするのは人間です.読みやすいプログラムを書くことにより,その内容を他人に説明することが容易になると共に,まず,自分自身が誤りを犯しにくくなります.

  次に示すのは二次方程式を解くためのプログラムです.

import java.io.*;public class Test {public static void main(String args[]) throws IOException{BufferedReader in = new BufferedReader(new InputStreamReader(System.in));System.out.print("係数 a は? ");double a = Double.parseDouble(in.readLine());System.out.print("係数 b は? ");double b = Double.parseDouble(in.readLine());System.out.print("係数 c は? ");double c = Double.parseDouble(in.readLine());if (Math.abs(a) <= 1.0e-10) {if (Math.abs(b) <= 1.0e-10)System.out.println(" 解を求めることができません!");else {double x = -c / b;System.out.println(" x = " + x);}}else {double d = b * b - 4.0 * a * c;if (d >= 0.0) {d = Math.sqrt(d);double x1 = 0.5 * (-b - d) / a;double x2 = 0.5 * (-b + d) / a;System.out.println(" x = " + x1 + ", " + x2);}else {d = Math.sqrt(-d);double x1 = -0.5 * b / a;double x2 = 0.5 * d / a;System.out.println(" x = " + x1 + " ± i" + x2);}}}}

  上のプログラムを見て読みやすいと感じるでしょうか.もちろん,プログラム言語に関する説明がまだですので,内容自身を的確に把握することは困難かと思います.しかし,同じプログラムを下のように書いたらどうでしょうか.内容自身についてもある程度想像が付くのではないでしょうか.ただし,各行の最初の番号は,説明のために付加した行番号です.プログラムの内容とは関係ありません (以下のプログラムにおいても同様).

01	/*********************************/
02	/* 二次方程式を解く              */
03	/*     a * x * x + b * x + c = 0 */
04	/*          coded by Y.Suganuma  */
05	/*********************************/
06	import java.io.*;
07	
08	public class Test {
09		public static void main(String args[]) throws IOException
10		{
11		/*
12				係数の読み込み
13		*/
14			BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
15			System.out.print("係数 a は? ");
16			double a = Double.parseDouble(in.readLine());
17			System.out.print("係数 b は? ");
18			double b = Double.parseDouble(in.readLine());
19			System.out.print("係数 c は? ");
20			double c = Double.parseDouble(in.readLine());
21		/*
22				一次方程式
23		*/
24			if (Math.abs(a) <= 1.0e-10) {
25				if (Math.abs(b) <= 1.0e-10)
26					System.out.println("   解を求めることができません!");
27				else {
28					double x = -c / b;
29					System.out.println("   x = " + x);
30				}
31			}
32		/*
33				二次方程式
34		*/
35			else {
36				double d = b * b - 4.0 * a * c;
37						// 2実根
38				if (d >= 0.0) {
39					d = Math.sqrt(d);
40					double x1 = 0.5 * (-b - d) / a;
41					double x2 = 0.5 * (-b + d) / a;
42					System.out.println("   x = " + x1 + ", " + x2);
43				}
44						// 虚数
45				else {
46					d = Math.sqrt(-d);
47					double x1 = -0.5 * b / a;
48					double x2 = 0.5 * d / a;
49					System.out.println("   x = " + x1 + " ± i" + x2);
50				}
51			}
52		}
53	}
		
  プログラムをどのように書けば読みやすいかということに対する明確な定義があるわけではありません.しかし,経験的に,以下に示すような規則を守って書くと良いと思います(ただし,以下に示す 1 番目及び 2 番目のルールは必ず守ること).もちろん,個人的な好みの問題もありますので,自分自身でも適当に工夫してみて下さい.
  1. 機能ブロック毎に字下げ(上のプログラムでは,tab を使用して下げている)を行う.字下げを行うことにより,その機能ブロックの範囲が一目でわかるようになる.例えば,14~51 行目は,9,10 行目及び 52 行目に対して,字下げしてある(プログラムの内容であることを示している).また,39~42 行目は,38 行目及び 43 行目に対して字下げしてあるので,条件 「 d >= 0 」 が満たされたときの処理であることが一目でわかる.

  2. プログラム全体,主要な変数・引数の説明( 1~5 行目)や,プログラムの各部分に対する説明( 11~13 行目等)を必ず入れる.

  3. 一つの行に複数の文を書かない(場合によっては,複数の文を書いた方が見やすい場合もある).

  4. 読み易さを考えて適当にスペースを入れる.特に,演算子の前後には必ずスペースを入れ,また,代入文が続いたときは等号を揃える( 40~41 行目等).ただし,等号を揃えるとかえって見にくくなるような場合は,あえて揃える必要は無い.

  5. 一つのプログラム(メソッド)は,せいぜい,50~100 行程度以内にする.

  6. 記述しやすい,プログラムが短くなる,などといった安易な理由で,他の言語を知っている人さえ理解しにくい,または,プログラムの他の部分を参照しないと理解できないような表現を使用しない.

3.2 データ型

  数式と同じように,Java においても,定数や変数を使用できます.その意味するところは,数学の場合とかなり似ています.しかし,直接対応するものが数学にはない「データ型」という概念が存在します.プログラムの中で使用した変数variable )や定数リテラルconstant )は,必ず,主記憶上のどこかに記憶されます.また,変数に記憶されている値や定数が整数なのか,浮動小数点数(実数)なのか,文字なのか,さらに,記憶するのに何バイト必要なのか等によって,記憶する領域の大きさや表現方法が異なります.これらのことを規定するのがデータ型です.

3.2.1 定数

  定数リテラル)には,整数定数浮動小数点定数文字定数文字列定数,及び,論理型定数の 5 種類があります.定数の場合,そのデータ型は,定数の記述方法によって一意的に決まります.

  整数定数は,以下のように,10 進数,16 進数,または,8 進数で記述します.

  例えば,1234 のように書けば,整数定数とみなされ,4 バイトの領域が確保され,基本的に,1.2.3.1 節で述べた整数の表現方法に従って記憶されます( int 型定数).値がその領域に入りきらないようなときは,例えば,123451234512345L のように,「l」または「L」を付加する必要があります( 8 バイト,long 型定数).

  1234.0 のように,小数点を使用して数値を記述すると,それは浮動小数点型定数となり,8 バイトの領域が確保され,基本的に,1.2.3.2 節で述べた浮動小数点数の表現方法に従って記憶されます( double 型定数).もし,多くの有効桁数を必要とせず,かつ,メモリを節約したい場合には,1234.0F のように,接尾子「f」または「F」を付けることにより,4 バイトの浮動小数点数で表現することも可能です( float 型定数).また,1234.0 を,1.234e+3 ( 1.234×10+3 の意味)のようにも表現可能です.

  文字定数は 'a',また,文字列定数は "abc" のように記述します.ここで注意すべきことは,'a' と "a" が同じでは無いという点です.前者は文字 a が入る 2 バイトの領域(文字は 16 ビットの Unicode で表現される)が確保されますが,後者は,int や double のような基本データ型ではなく,String クラスのインスタンス(オブジェクト)です.プログラム中に文字列定数を使用すると,その文字列を内容として持つ String オブジェクトが生成されます.なお,C/C++ とは異なり,
"abcd" "efgh"		
を一つの文字列 "abcdefgh" として処理することはできません.Java においては,+ 演算子によって文字列の結合が可能ですので,
"abcd" + "efgh"		
のように記述する必要があります.

  クラスについては,第Ⅲ部で詳細に説明しますが,ここで簡単な説明を行っておきます.クラスとはある「もの」に対し,その「もの」に共通する特徴等をもとにして,形式的な定義を与えたものです.もう少しプログラミング的な感覚でいえば,「もの」に共通するデータと,それらのデータを処理する方法を記述した手続きの集まりです.例えば,「車」というクラスを定義したとすれば,車の構造を記述するデータと車を動かしたりするのに必要な手続きからなっているはずです.また,クラスは「もの」に対する抽象的な定義ですが,そのインスタンス(オブジェクト)はクラスを具体化したものに相当します.例えば,「車」クラスの場合であれば,オブジェクトは,ある特定の人が所有する特定の車になります.

  したがって,String クラスには,データとして文字列そのものが定義されているだけでなく,文字列の操作方法(文字列内の文字の検索等)も定義されています.また,String クラスには,文字列をデータとして持つことだけが定義されていますが,String クラスのインスタンス(オブジェクト)では,文字列の具体的な内容が決まってきます.

  論理型定数( boolean 型定数)は truefalse だけの値を持ちます.boolean 型変数に代入できるのは,この 2 つの値だけです.C/C++ とは異なり,整数としての演算は不可能であることに注意してください.

3.2.2 変数

  変数は,数値や文字を記憶するメモリ内の特定の領域に着けられた名前です.定数とは異なり,あらかじめそこに記憶されるデータが常に決まっているわけではありません.しかし,データの型により,必要とする領域の大きさや表現方法が異なりますので,ある変数が示す領域に任意のデータを記憶するわけにはいきません.前もって,その領域に記憶すべきデータのtype )を指定してやる必要があります.これを,変数の型宣言と言います.

  変数の型宣言は,以下のような形式で行います.
データ型 変数名1[= 初期値], 変数名2[= 初期値], ・・・;		
  データ型(基本データ型)とは,char,int 等であり,例えば,変数 x の型を宣言するためには,基本的に,以下のいずれかの型を選択します.なお,C/C++ とは異なり符号なしの整数を扱うことはできません.
型名           バイト数  値の範囲
byte             1       -128 ~ 127
char             2       1 つの Unicode 文字
short            2       -32,768 ~ 32,767
int              4       -2,147,483,648 ~ 2,147,483,647
long             8       -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
float            4       3.4E±38(有効桁:約 7 桁)
double           8       1.7E±308(有効桁:約 15 桁)
boolean          1       true, false		
  変数が定義されただけでは,その変数が示す領域にどのようなデータが入っているかは未定です.もし,最初,その変数の領域に何らかの値を設定しておきたい場合は,初期値の項を記述してやることによって可能です(初期化初期設定).例えば,double 型変数 x の初期値を 10.5 としたい場合は,以下のように記述します(この段階で,変数 y の値は未定).
double x = 10.5, y;		
  一般に,初期設定された変数であっても,同じ型の値であれば,プログラム内で任意の値を再設定することが可能です.しかし,
final int VAL = 10;   // C/C++ の場合は,const int VAL = 10;		
のように,final を使用することによって,変数 VAL の値を再設定することができなくなります.つまり,変数 VAL を定数のように使用することが可能になります.

  変数名としては,英字(大文字と小文字は異なる文字とみなされる)と数字を利用できます.ただし,第 1 文字は英字でなくてはなりません.また,下線 「 _ 」 は,英字に含まれ,例えば,english_test のように,長い変数名を読みやすくするために使用されます.

  基本的には,変数名としてどのような名前を付けても構いませんが,Java 言語の中で特別な意味を持っている if,else,int,float 等のキーワード( keyword,予約語)は予約済みであり,変数名として使用してはいけません.

  以上述べたことのまとめとして,型宣言文の例を挙げておきます.
int abc, _bef;   // 正.複数の変数をカンマで区切って並べることが可能
double abc, _bef = 3.5;   // 正.変数 _bef に対しては初期設定を行っている
int a, A;   // 正.変数 a と A は異なる
char a = 'A';   // 正.変数 a を A という文字(アスキーコードで 65 )で初期化
char a = 65;   // 正.変数 a を 65 で初期化(上と同等)
int a, abc, a;   // .同じ変数を 2 度定義してはいけない
int if;   // .キーワードは変数名として使用できない
int 10a;   // .変数名の最初は,英字または下線
int a+10;   // .変数名に使用できるのは,英数字と下線だけ
int a = 3.5;   // .int 型の変数の初期値として不適当
		
  Java や C/C++ で使用するすべての変数に対して,その変数が使用される前に,型宣言文を使用して,その型を定義してやる必要があります.宣言された変数を使用(参照,変更)できるのは,宣言された位置からその宣言が入っているブロック( { } で囲まれた部分等)の終わりまでです.また,ある変数の有効な範囲内で,同じ変数名を再定義することは許されません.C/C++ においては,有効範囲内であっても,その内側のブロックであれば,同じ名前の変数を再定義することが可能です.その場合は,再定義されたブロック内では,再定義された変数が有効になります.ただし,Java の場合は,メソッドの外側で定義された変数を除き,許されません.

  たとえば,以下に示す例において,01 行目で定義されている変数 n,x,及び,y は,01 行目以降有効になります.しかし,変数 k の有効範囲スコープ)は,for ループ( 03~07 行目,for 文に関しては後述)の中だけになり,08 行目における参照は,変数 k が定義されていないためエラーになります.また,04 行目と 09 行目は,01 行目で定義された同じ名前の変数が,その有効範囲内で再定義されているためエラーになります( C/C++ の場合は,04 行目の宣言も許される).以上の点は,if 文(後述)におけるブロックにおいても同様です.なお,03 行目の表現は,C++ では許されますが,C では許されません.
01	int n, x = 0, y = 1;
02	n = 10;
03	for (int k = 1; k <= 10; k++) {   // k の有効範囲は 07 行目まで
04		int n = 0;   // 再定義のためエラー(外側のブロックで既に定義)
		             // C/C++ の場合は OK,その有効範囲は 07 行目まで
05		x += k;
06		y *= k;
07	}
08	n = k;   // k が未定義のためエラー
09	double n;   // 再定義のためエラー		

3.2.3 列挙型変数 

  Java においては,java/lang/Enum クラスを継承した enum 型を使用することによって,C/C++ の列挙型変数に似た処理,及び,より高度な処理を行うことができます.その使用例は以下に示す通りですが,クラスやメソッドに関して学習してから再度参照して下さい.
import java.io.*;
public class Test {
			// enum 型の変数 coltype の定義
			// ローカル変数としては定義不可(一種のクラス)
	enum coltype1 {red, blue, black, white}

	enum coltype2 {red(100), blue(200), black(300), white(400);
		private int num;
		private coltype2(int num) {
			this.num = num;
		}
		int getNum() {
			return num;
		}
	}

	enum coltype3 {
		red {
			void message () {
				System.out.println("   赤");
			}
		},
		blue, black, 
		white {
			void message () {
				System.out.println("   白");
			}
		};
		void message () {
			System.out.println("   赤,白以外");
		}
	}

	public static void main(String args[]) throws IOException
	{
				// 基本
		coltype1 col1 = coltype1.blue;           // 変数 color に青を代入
		if (col1 == coltype1.red)       // もし,色が赤ならば
			System.out.println("色の判別結果: red");
		else if (col1 == coltype1.blue)       // もし,色が青ならば
			System.out.println("色の判別結果: blue");
		System.out.println("name():  " + coltype1.black.name());
		System.out.println("black の順番: " + coltype1.black.ordinal());
				// 順番を表す番号を変更
		System.out.println("black の順番(変更後): " + coltype2.black.getNum());
				// 特別の処理を行う
		System.out.println("処理結果:");
		coltype3.red.message();
		coltype3.blue.message();
		coltype3.black.message();
		coltype3.white.message();
	}
}
		
  上のプログラムを実行すると,以下に示すような出力が得られます.
色の判別結果: blue
name():  black
black の順番: 2
black の順番(変更後): 300
処理結果:
   赤
   赤,白以外
   赤,白以外
   白		

3.3 算術演算子と代入演算子

  Java において使用できる演算子operator )には,多くのものが存在しますが,この節では,その代表的なものについて説明します.

3.3.1 算術演算子

  プログラムを構成する最も基本的な処理は,定数と変数を使用し何らかの計算を行うことです.その際使用される算術演算子としては,以下のようなものがあります.
+ : 加算  // 文字列の結合にも使用可能
- : 減算
* : 乗算
/ : 除算(整数どうしの演算の場合,結果の小数点以下は切り捨て)
% : 余り(実数演算に対しても使用可能.例えば,7.3 / 2.3 の演算結果は,3 余り 0.4 となるので,7.3 % 2.3 は 0.4 )
  数学の場合と同様に,これらの算術演算子と括弧を使用して,様々な計算を行うことができます.なお,加算演算子は文字列に対しても使用でき,文字列の結合を行えます.例えば,"abc" + "xyz" という演算結果は,"abcxyz" という文字列になります.

  記述された計算式は,基本的に,左から順に計算されていきますが,「+」や「-」は,「*」や「/」や「%」より優先度が低いため,「*」等より後に計算されます.しかし,括弧があれば,その中が最も優先的に計算される点は,数学の場合と同じです.

  整数同士の演算には十分注意して下さい.例えば,

10.0 / 4.0 * 2.0

と記述すれば,各定数は浮動小数点数として解釈され,10.0 を 4.0 で割った結果 2.5 に 2.0 が掛けられ結果は 5.0 になります.しかし,人間が計算する場合は同じであっても,

10 / 4 * 2

と記述すると,各定数は整数として解釈され,10 を 4 で割った結果 2 (整数計算であるので,結果も整数になり,この段階で,小数点以下が切り捨てられる)に 2 が掛けられ,結果は 4 になります.これは,定数だけでなく変数を含む演算であっても同様です.

  同じような演算とその結果を以下に示します.なぜ,そのような結果になるかを十分理解してください.

演算 説明
7 / 3 * 3 7 / 3 * 3 = 2 * 2 = 6
7 / (3 * 3) 7 / (3 * 3) = 7 / 9 = 0
7 / 3 / 3 7 / 3 / 3 = 2 / 3 = 0

  ここで,演習問題をやってみます.各演算の結果について答えてください.

3.3.2 代入演算子

  プログラムによっては,演算した結果をどこかへ記憶しておき,その値を別の箇所で使用したいような場合がしばしば起こります.それを実現するのが代入演算子「=」です.代入演算子の左辺は必ず変数でなければなりません.例えば,前節の 2 つの演算結果を double 型変数 data 及び int 型変数 i_data に代入するためには,以下のように書きます.
data   = 10.0 / 4.0 * 2.0;
i_data = 10 / 4 * 2;		
  右辺で演算した結果と,代入する変数の型が異なる場合は,演算結果を代入する変数の型に変換した後,代入されます.例えば,
double y = 10 / 4;   // y = (double)(10 / 4);		
のような代入を行うと,計算結果の 2 が double 型に変換され,変数 y には 2.0 が代入されます. しかし,
int x = 10.0 / 4.0;   // x = (int)(10.0 / 4.0);		
のような代入を行うと,「精度が低下する可能性がある」という理由からコンパイルエラーになってしまいます.C/C++ の場合は警告が出力され,エラーにはなりません.また,宣言された変数が使用されなかった場合,C/C++ の場合は,警告メッセージが出力されますが,Java においては,何のメッセージもありません.C/C++ の仕様が妥当だと思いますが,いかがでしょうか.一般に,データ型が異なる変数に代入したいような場合は,コメントにあるように cast 演算子を使用してください.cast 演算子を使用すると,この例の場合,計算結果の小数点以下が切り捨てられ,変数 x に 2 が代入されます.

  代入演算子は,一見,等号のように見えますが,等号ではないことに注意して下さい.例えば,
k = 2;
k = k + 3;		
という 2 つの文が順に実行される場合を考えてみます.まず,最初の文の実行により変数 k に値 2 が代入されます.次に,2 番目の文により,現在の変数 k の値( = 2 )と 3 を加えた結果 5 が変数 k に代入されます.したがって,この時点で,変数 k の値は 5 になっています.明らかに,等号とは異なることが分かると思います.

  また,ある変数に関する演算と,結果のその変数への代入を同時に行う演算子が存在します.例えば,上の 2 番目の例は,
k += 3;		
のようにも書けます.この演算子は,「-」,「*」,「/」,及び,「%」に対しても存在します.

  さらに,同じ値を複数の変数に代入したいとき,
x = y = z = 20.4;		
のような記述が可能です.

  ここで,演習問題をやってみます.以下に示す順番で文が実行されたとき,4 行目の実行が終了した時点において,変数 x 及び y の値(変数 x 及び y に記憶されている値)について答えてください.
int x = 5, y;
x  = 3;
x *= 5;
y  = x + 2;
		

  この例からも明らかなように,各変数には,最後に代入または入力(後述)された値が記憶されています.ある変数に最後の代入または入力が行われた時点(例えば,3 行目)で,その変数( x )がそれ以前に記憶していた値(初期設定された 5 や 代入された 3 )はすべて失われます.

  先に述べたように,単に変数を定義した(型宣言した)だけでは,領域が確保されるだけであり,その変数に記憶されている値は未定です.例えば,上に示すプログラムの 1 行目において,変数 x の値は初期値によって確定しますが,y の値は未定です.変数の値が決まるのは,代入,又は,後に述べる入力文によってその変数に値が入力されたときです.上に示すプログラム例では,4 行目の実行が終了した後,変数 y の値が確定します.変数の値が確定する前に,その変数を参照するようなことは絶対に行ってはなりません.例えば,4 行目より前に,
x = y + 5;		
のように,y の値を参照するような演算を行うことはできません(コンパイルエラーになります).

3.3.3 インクリメント,デクリメント演算子

  1 だけ増やしたり減らしたりするのに,「++」(インクリメント演算子)や「--」(デクリメント演算子)といった演算子を使用できます.例えば,
k++;
n = 3 + m++;		
のような使い方をします.1 行目は,
k = k + 1;		
と同じ意味です.また,2 行目は,
n = 3 + m;
m = m + 1;		
と同じ意味です.上の例では,「++」を変数の後ろに付けましたが,これは,現在の値を演算に使用した後,「++」の付いた変数の値を 1 だけ増加させることを意味します.しかし,「++」を前に付けると,その変数の値を 1 だけ増加させた後,演算に使用されます.例えば,
n = 3 + ++m;		
は,
m = m + 1;
n = 3 + m;		
と同じ意味になります.しかし,誤りの原因となりやすいため,「 n = 3 + m++; 」,「 n = 3 + ++m; 」のように,式内に ++ 演算子を記述するようなことは避けた方が良いと思います.演算子「--」についても,1 だけ減少させる点を除き,「++」と同様です.

  ここで,演習問題をやってみます.以下に示す順番で文が実行されたとき,4 行目の実行が終了した時点において,変数 x 及び y の値(変数 x 及び y に記憶されている値)について答えてください.
int x = 5, y = 7;
x--;
x--;
y++;		

3.3.4 型変換(キャスト(cast)演算子)

  演算は同じ型同士で行われ,また,代入も同じ型の変数に代入されるのが普通です.しかし,場合によっては,異なる型同士で演算したり,異なる型の変数へ代入したい場合が起こります.

  コンピュータは,基本的に,異なる型同士の演算を行うことができません.従って,そのような演算式が現れるとデータをいずれかの型に変換した後演算が行われます.例えば,
10.0 / 4;		
のような計算は,整数定数 4 を浮動小数点数に変換した後,演算が行われ,結果は,浮動小数点数になります(この場合は,2.5 ).一般に,複数のデータ型が混在した場合,変換によって失われる情報が少なくなることを目的として,以下に示すように,より上位の型に変換されます.
char < int < long < float < double < ・・・		
  また,代入の際は,精度が低下しない(情報が失われない)と考えられる場合は,代入すべき変数の型に変換され代入が実行されますが,そうでない場合は,コンパイルエラーとなってしまいます( C/C++ の場合は警告).例えば,
double db = 10 / 3;
int k = 10.0 / 4.0;		
のような代入を行うと,最初の文では,整数 10 を整数 3 で割った結果 3 が,浮動小数点数( double 型)に変換され,変数 db には 3.0 が代入されます.2 番目の文に対して,C/C++ の場合では,警告メッセージが出力されますが,演算の結果 2.5 が整数( int 型)に変換され,変数 k には小数点以下が切り捨てられた 2 が代入されます.しかし,Java の場合は,コンパイルエラーになってしまいます.

  このように,異なる型の処理は自動的な型変換により実行できる場合もありますが,場合によっては,思いもかけないことが起こります.また,自動的型変換により,自分自身の型宣言の誤りに気付かないまま実行されてしまう場合も,しばしば起こります.従って,できるだけ自動的な型変換は使用せず,明示的に型を変換した方が良いと思います.それを行うのが,キャスト演算子cast operator )です.キャスト演算子を変換したい定数または変数の前に付加して,希望の型に変換します.例えば,
double db1 = 10.4;
double db2 = (double)((int)db1 / 4)		
の 2 番目の文では,変数 db1 が int 型に変換された後,10 / 4 の整数演算が行われ,その結果が 2 となります.次に,整数 2 が double 型に変換され( 2.0 ),変数 db2 に代入されます.

  同じような演算とその結果を以下に示します.この例によって,キャスト演算子や自動的型変換について十分理解してください.

演算 説明
(double)(7 / 2) (double)(7 / 2) = (double)3 = 3.0
7 / (double)2 7 / (double)2 = 7 / 2.0 = 7.0 / 2.0 = 3.5
7 / 2.0 7 / 2.0 = 7.0 / 2.0 = 3.5
7 / 2 3

  ここで,演習問題をやってみます.以下の演算結果について,小数点以下第 1 位まで答えてください.

3.4 簡単なプログラム 

  以上の説明により,入出力に関する項を除いて,簡単なプログラムが書けるはずです.この節では,2 つのデータを入力し,その和と差を出力するプログラムについて検討します.プログラムは,特別な命令が存在しない限り,書かれた順序に従って実行されていきます.以下に示すプログラム例では,この原則通り,最初の行から順に(実行可能な文が)実行されていきます.

  Java のプログラムは,クラスとそれを構成するメソッド( C/C++ における関数に相当)の集まりです.プログラム例 3.1 に現れる Test,BufferedReader,InputStreamReader,System,Double,IOException はクラス,main,print,println,parseDouble,readLine はメソッド,System の後ろの out は PrintStream クラスのオブジェクト,System の後ろの in は InputStream クラスのオブジェクトです.現段階ではクラスやメソッドの説明をほとんどしていませんので,当分の間,クラスやメソッドを含む部分に関しては,それが実行された結果だけの説明に留めます.新しくプログラムを書く際は,必要な箇所をコピーして御利用下さい.

  以下に示すプログラム例は,行番号部分を除き,Test.java というファイル名で保存した後,コマンドプロンプトから,
javac -encoding utf-8 Test.java   // 文字コードが utf-8 の場合
javac Test.java   // 文字コードが Shift_JIS の場合		
のように入力すればコンパイルcompile )できます.エラーがなければ,Test.class というファイルが生成されます.その後,コマンドプロンプトから,
java Test		
と入力すれば実行可能です.

(プログラム例 3.1 ) 2 つのデータの和と差

01	/****************************/
02	/* 2つのデータの和と差     */
03	/*      coded by Y.Suganuma */
04	/****************************/
05	import java.io.*;
06
07	public class Test {
08		public static void main(String args[])
09		{
10			double sa, wa, x, y;
11
12			try {
13		/*
14				データの入力
15		*/
16				BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
17				System.out.print("1つ目のデータを入力してください ");
18				x = Double.parseDouble(in.readLine());
19				System.out.print("2つ目のデータを入力してください ");
20				y = Double.parseDouble(in.readLine());
21		/*
22					和と差の計算
23		*/
24				wa = x + y;
25				sa = x - y;
26		/*
27					結果の出力
28		*/
29				System.out.println("和は=" + wa + " 差は=" + sa);
30			}
31			catch (IOException ignored) {}
32		}
33	}
		
1 ~ 4 行目

  プログラムに対する注釈です.注釈は,人間がプログラムを読む際,理解しやすくするためのものであり,コンパイラ等によって特別な処理はされません.プログラムを実行するのはコンピュータですが,プログラムを書いたり修正したりするのは人間です.従って,プログラムを書く際に最も注意すべきことは,如何に読み易く,かつ,分かり易いプログラムを書くかという点です.できるだけ多くの注釈を入れておいて下さい.そのことにより,他の人がプログラムを理解しやすくなると共に,プログラム上のエラーも少なくなるはずです.13~15 行目,21~23 行目,及び,26~28 行目も注釈であり,プログラムの該当する部分における処理内容を説明しています.

5 行目

  入出力を行うクラスライブラリを利用することを宣言しています.入出力を行う場合は必ず必要です.

7 行目

  「Test」という名前のクラス定義の始まりであり,33 行目まで続きます.Java においては,すべての処理をクラス内で行わなければなりませんので,必ずクラスを定義する必要があります.クラスの名前は任意ですが,public 宣言されたクラス名はファイル名と一致させなければなりません.この例の場合,「Test.java」というファイル名で保存する必要があります.今後,7 行目,及び,33 行目は常に必要です.

  また,クラス定義の本体に当たる 8 行目から 32 行目までは,段落が下げて書かれていますが,これも,プログラムを読みやすくするための一つの手段であり,必ず,このように,段落を下げて書いて下さい(どの程度下げるかは任意ですが,タブを使用する方法が一般的です).

8 ~ 32 行目

  main メソッドの定義です.main メソッドは,1 つのプログラムに必ず 1 つだけ常に必要です.今後,8 行目,9 行目,及び,32 行目は必ず記述して下さい.main メソッドの本体に当たる 10 行目~ 31 行目も段落が下げて書かれていますし,try ブロックの内部に当たる 16 行目~ 29 行目も字下げが行われています.

10 行目

  プログラムで使用する変数の型を宣言している型宣言文です.変数 sa,wa,x,及び,y が double 型であることを宣言しています.初期値の指定を行っていませんので,この段階では 4 つの変数の値は未定となります.必ずしもこの場所ですべての変数に対する宣言を行う必要はありませんが,各変数が使用される前に必ず必要です.例えば,変数 x に対する宣言を 10 行目では行わず,18 行目において,
  double x = Double.parseDouble(in.readLine());			
のように記述することも可能です.変数 y,wa,sa に関しても,20,24,25 行目で行っても構いません.

12 行目,30 行目,31 行目

  入出力で発生する例外(例えば,ファイルから入力しようとしたが,指定されたファイルが存在しない等)を処理するための記述です.例外処理に対する詳細な説明は,クラスやメソッドに関して学習した後,「9.1 例外処理」で行います.なお,次に示すプログラム例のように記述すれば,これらの部分は必要ありません.

16 行目

  BufferedReader クラスのオブジェクトを生成し,変数 in に代入しています.この行によって,データをどこから入力するのかを記述しています.この行は,
    InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader in = new BufferedReader(isr);			
のように,2 行に分けて記述することもできます.「 System.in 」における in は,System クラスの変数であり,標準入力ストリームを表しています( InputStream クラスのオブジェクト).このように,クラスの変数またはメソッドを利用する際は,「クラス名(オブジェクト名).変数名(メソッド名)」のように,ピリオドによってクラス名またはオブジェクト名を指定する必要があります.BufferedReader のすぐ後の in は,BufferedReader クラスのオブジェクトであり,その名前は任意ですので,好きな名前を付けられます.もちろん,その場合は,以下の行における対応する箇所も変えてやる必要があります.

  これらの行は,型宣言の拡張だと考えるとわかりやすいと思います.例えば,上の 2 行目は,BufferedReader 型の変数を定義し,その変数を,新しく生成した BufferedReader クラスのオブジェクトで初期設定をしていることになります.また,BufferedReader クラスのオブジェクトを生成するためには,InputStreamReader クラスのオブジェクトに関する情報が必要なため,BufferedReader(new InputStreamReader(System.in)) という形で,括弧内に InputStreamReader クラスのオブジェクトを記述しています.

17,19 行目

  これらの文によって,ダブルクォーテーションマークで囲まれた内容(文字列)が出力されます.つまり,入力に対する促進メッセージです.なお,これらの文では,メッセージを出力した後に,改行が行われません.

18,20 行目

  in.readLine() によってキーボードから入力された 1 行分の文字列が読み込まれ,その文字列が Double.parseDouble() によって浮動小数点数( double 型)に変換され,変数 x 及び y に代入されます.これらの行を実行するためには,必ず 16 行目が必要です.16 行目の BufferedReader のすぐ後の変数 in,及び,18,20 行目の変数 in は,同じ変数です.変数名を変える場合は同時に行ってください.ただし,16 行目における System の後ろの in は,System クラスに定義されている static なフィールド(メンバー変数,10.1.1 節参照)の一つであり,名前を変更することはできません.なお,1 行に複数個のデータをスペースなどで区切って入力したい場合は,プログラム例 3.3 ~プログラム例 3.5 を参照して下さい.

  標準入出力装置(一般的には,キーボードとコンソール)に対して入出力を行う場合,対象とするものは文字列です.キーボードから入力する場合,たとえ数値であっても,2 進数を使用したコンピュータの内部表現ではなく,例えば「123.45」のように,我々が読むことができる文字列として入力します.しかし,数値データを,入力された文字列としてそのまま記憶した場合,演算等を行うことができません.そのため,入力された文字列をコンピュータ内部で使用する表現方法に変換して記憶してやる必要があります.例えば,「123.45」という文字列を数値として扱いたければ,浮動小数点表現に変換して記憶しておく必要があります.それを行うのが Double.parseDouble というメソッドです.なお,整数に変換したい場合は, Integer.parseInt というメソッドを使用します.もちろん,「123.45」を文字列として内部的に扱いたければ,文字列として記憶しておく必要があります.

24,25 行目

  変数 x 及び y に記憶されている数値の和及び差を計算し,変数 wa 及び sa に代入しています.

29 行目

  結果の出力です.17 行目や 19 行目で使用した「print」との違いは,最後に改行を行うか否かの違いです.「println」の場合は改行を行います.wa や sa は,文字列に変換され,それらが加算演算子によって他の文字列定数と結合された形で出力されます.コンソールに出力する場合も,この例のように,メモリ(変数)に記憶されているデータを文字列に変換して出力します.さもなければ,我々は,0 と 1 の並びとして出力される結果を自分自身で解釈しなければなりません.

  このプログラムを実行し,5 と 3 を入力すると,以下のような結果が得られます.
和は=8.000000 差は=2.000000			

  プログラム例 3.1 の例外処理を別の方法で書いた例です.8 行目の違いに注目して下さい.こちらで記述する方が簡単かと思います.なお,このプログラムでは,変数の宣言位置を,上の例で説明したような位置に変更しています(必ずしも,変更する必要はありません).

01	/****************************/
02	/* 2つのデータの和と差     */
03	/*      coded by Y.Suganuma */
04	/****************************/
05	import java.io.*;
06
07	public class Test {
08		public static void main(String args[]) throws IOException
09		{
10		/*
11			データの入力
12		*/
13			BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
14			System.out.print("1つ目のデータを入力してください ");
15			double x = Double.parseDouble(in.readLine());
16			System.out.print("2つ目のデータを入力してください ");
17			double y = Double.parseDouble(in.readLine());
18		/*
19					和と差の計算
20		*/
21			double wa = x + y;
22			double sa = x - y;
23		/*
24					結果の出力
25		*/
26			System.out.println("和は=" + wa + " 差は=" + sa);
27		}
28	}
		

(プログラム例 3.2 ) 2 つのデータの和と差( Console クラスの利用)

  コンソールから入出力を行う場合は,以下に示す例のように,Console クラスを使用した方が便利かと思います.ただし,このように記述すると,リダイレクトしてファイルから入力させるような操作ができなくなります.
01	/****************************/
02	/* 2つのデータの和と差     */
03	/*      coded by Y.Suganuma */
04	/****************************/
05	import java.io.*;
06
07	public class Test {
08		public static void main(String args[])
09		{
10						// データの入力
11			Console con = System.console();
12			double x = Double.parseDouble(con.readLine("1つ目のデータを入力してください "));
13			double y = Double.parseDouble(con.readLine("2つ目のデータを入力してください "));
14						// 和と差の計算
15			double wa = x + y;
16			double sa = x - y;
17						// 結果の出力
18			con.printf("和は=%f 差は=%f\n", wa, sa);
19	//		System.out.printf("和は=%f 差は=%f\n", wa, sa); でも可
20		}
21	}
		
12,13 行目

  コンソールにメッセージを出力し,キーボードから入力された数値(文字列)が浮動小数点数( double 型)に変換され,変数 x 及び y に代入されます.

18 行目

  System.out.println においては,内部データの文字列への変換を自動的に行ってくれますが,Console クラスの printf メソッドでは,C/C++ における printf 関数と同様に,変換方法を明示してやる必要があります.C/C++ の printf 関数に慣れている人は,出力する桁数等の制御も簡単ですし,このメソッドの方が利用しやすいかもしれません.なお,printf は,System.out.printf のように,上で述べた例の中でも使用できます.例えば,以下のようにして使用します.
  double d_data;
  int i_data;
  String c_data;
    ・・・・・
  Consoleオブジェクト名.printf("結果は %f %10.3f %d %5d %s\n", d_data, d_data, i_data, i_data, c_data);			

この結果,まず,「結果は 」という文字列が出力されます.printf においては,「%」で始まる文字列とエスケープシーケンス(後述)以外は,記述された内容がそのまま出力されます.次に,以下の順序で 5 つのデータが出力されます(各データ間には,1 つのスペースが入る).

  1. 「%f」は double 型のデータを固定小数点表現の文字列に変換します( 1.23x10-3 のような表現方法に対応する 1.23e-03 という方法-浮動小数点表現-も存在します).「%」と「f」の間に何も記述しなければ,全体の桁数や小数点以下の桁数がシステムの標準形式に従います.この場合,d_data の内容が,システムの標準形式に従って出力されます.

  2. 最初のデータと変換方法は同じですが,この場合は,出力形式を指定しています.d_data の内容が,小数点以下 3 桁,全体の桁数 10 桁で出力されます(例: △△△-12.345 ).桁数が 10 桁に満たない場合は,左側にスペースが挿入されます.全体の桁数を指定しない場合は,「10」の部分を省略しても構いません.

  3. 「%d」は int 型のデータを文字列に変換します.「%」と「d」の間に何も記述しなければ,システムの標準形式に従って出力されます.この場合,i_data の内容が,システムの標準形式に従って出力されます.

  4. 上の i_data と変換方法は同じですが,この場合は,出力形式を指定しています.i_data の内容が,全体の桁数 5 桁で出力されます(例: △△-12 ).桁数が 5 桁に満たない場合は,左側にスペースが挿入されます.

  5. c_data の内容が文字列として出力されます.なお,1 文字に対する入出力には,「%c」を使用します.

  以上の説明に従うと,18 行目では,wa と sa の値を出力します.18 行目の「"」の中の最後の記号「\n」も 1 文字を表し,そのまま出力されますが,「\」の付いた記号は,エスケープシーケンス(escape sequence)といって,特別な働きをします.例えば,「\n」が出力されると改行が行われます.

(プログラム例 3.3 ) 2 つのデータの和と差( 1 行に 2 つ以上のデータ,StringTokenizer )

  2 つ以上のデータをスペース等で区切り,1 行で入力したいような場合は,今までの方法のままでは正しく動作しません.readLine メソッドは,改行までの文字列を一つのデータとして取り込んでしまうため,その中に含まれる複数データを分離する必要があるからです.この例では,今までと同じ問題に対して,2 つのデータをスペースで区切り,同じ行内に入力した場合の処理を行っています.Console クラスを使用して入出力を行っていますが,プログラム例 3.1 と同じ方法でも構いません.

01	/****************************/
02	/* 2つのデータの和と差     */
03	/*      coded by Y.Suganuma */
04	/****************************/
05	import java.io.*;
06	import java.util.*;
07	
08	public class Test {
09		public static void main(String args[])
10		{
11						// データの入力
12			Console con = System.console();
13			String line = con.readLine("2つのデータをスペースで区切って入力してください ");
14			StringTokenizer str = new StringTokenizer(line, " ");
15			double x = Double.parseDouble(str.nextToken());
16			double y = Double.parseDouble(str.nextToken());
17						// 和と差の計算
18			double wa = x + y;
19			double sa = x - y;
20						// 結果の出力
21			con.printf("和は=%f 差は=%f\n", wa, sa);
22		}
23	}
		
6 行目

  StringTokenizer クラスを使用するため,この記述が必要です.なお,String クラスは,文字列を扱うクラスであり,C++ 標準ライブラリ内の string クラスに似ています.

13 行目

  スペースで区切られた 2 つのデータが文字列 line に入力されます.

14 行目~ 16 行目

  文字列 line から StringTokenizer クラスのオブジェクトを生成し( 14 行目),文字列 line に含まれる数値データを,StringTokenizer クラスのメソッド nextToken() を利用して,順番に取り出しています.

(プログラム例 3.4 ) 2 つのデータの和と差( 1 行に 2 つ以上のデータ,split )

  この例においては,String クラスのメソッド split を使用して,半角スペースで区切られた 1 行分のデータ(文字列)を分離し,その結果を配列 str に入れています( 12 行目).Console クラスを使用して入出力を行っていますが,プログラム例 3.1 と同じ方法でも構いません.

01	/****************************/
02	/* 2つのデータの和と差     */
03	/*      coded by Y.Suganuma */
04	/****************************/
05	import java.io.*;
06	
07	public class Test {
08		public static void main(String args[])
09		{
10						// データの入力
11			Console con  = System.console();
12			String str[] = con.readLine("2つのデータをスペースで区切って入力してください ").split(" ");
13			double x = Double.parseDouble(str[0]);
14			double y = Double.parseDouble(str[1]);
15						// 和と差の計算
16			double wa = x + y;
17			double sa = x - y;
18						// 結果の出力
19			con.printf("和は=%f 差は=%f\n", wa, sa);
20		}
21	}
		

(プログラム例 3.5 ) 2 つのデータの和と差( 1 行に 2 つ以上のデータ,Scanner )

  この例においては,Scanner クラスを利用して,複数データの入力を行っています.この場合は,scanf と同様,複数個のデータを半角スペースで区切って 1 行で入力しても,また,改行で区切り複数行にわたって入力しても構いません.

01	/****************************/
02	/* 2つのデータの和と差     */
03	/*      coded by Y.Suganuma */
04	/****************************/
05	import java.io.*;
06	import java.util.*;
07	
08	public class Test {
09		public static void main(String args[])
10		{
11						// データの入力
12			Scanner sc = new Scanner(System.in);
13			System.out.printf("2つのデータを入力してください ");
14			double x = sc.nextDouble();
15			double y = sc.nextDouble();
16						// 和と差の計算
17			double wa = x + y;
18			double sa = x - y;
19						// 結果の出力
20			System.out.printf("和は=%f 差は=%f\n", wa, sa);
21		}
22	}
		

  重要なことですので,再度述べておきます.上で述べたいずれの例においても同様ですが,ある変数に対して初期値を指定しない型宣言を行うと,その変数に対応した記憶場所は確保されますが,その値は未定です.変数の値を確定するためには,「型宣言文で初期値を指定する」,「代入演算子によってその変数に値を代入する」「入力文によって,その変数に値を入力する」などの処理が必要です.また,代入や入力処理が行われると,その変数にそれまで記憶されていた内容は失われます.

  以下に示す表では,入力データとして 5 を入力した場合,プログラムの各行が実行された後に変数 x 及び y の値がどのようになっているかを示しています(「-」は値が未定であることを示す).このように,書かれたプログラムを読み,そのプログラムがどのような順序で実行され,かつ,変数の値がどのように変化していくかを確認することは,プログラムを書く上で非に重要な作業になります.今後,プログラムを書く際は,必ず行ってください.
実行順序 プログラム x の値 y の値
1 int x, y = 10; - 10
2 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); - 10
3 System.out.print("y は? "); - 10
4 y = Integer.parseInt(in.readLine()); - 5
5 x = y + 3; 8 5
6 x *= 5; 40 5
7 System.out.println(x); 40 5

3.5 その他

3.5.1 キーワード

  Java のキーワードkeyword )は以下の通りです.
abstract boolean break byte byvalue case
cast catch char class const continue
default do double else extends false
final finally float for future generic
goto if inner implements import instanceof
int interface long native new null
operator outer package private protected public
rest return short static super switch
synchronized this throw throws transient true
try var void volatile while  

3.5.2 アスキーコード

  アスキーコードASCII code )表です
000 ^@ (nul) 016 ^P (dle) 032 (sp) 048 0 064 @ 080 P 096 ` 112 p
001 ^A (soh) 017 ^Q (dc1) 033 ! 049 1 065 A 081 Q 097 a 113 q
002 ^B (stx) 018 ^R (dc2) 034 " 050 2 066 B 082 R 098 b 114 r
003 ^C (etx) 019 ^S (dc3) 035 # 051 3 067 C 083 S 099 c 115 s
004 ^D (eot) 020 ^T (dc4) 036 $ 052 4 068 D 084 T 100 d 116 t
005 ^E (enq) 021 ^U (nak) 037 % 053 5 069 E 085 U 101 e 117 u
006 ^F (ack) 022 ^V (syn) 038 & 054 6 070 F 086 V 102 f 118 v
007 ^G (bel) 023 ^W (etb) 039 ' 055 7 071 G 087 W 103 g 119 w
008 ^H (bs) 024 ^X (can) 040 ( 056 8 072 H 088 X 104 h 120 x
009 ^I (tab) 025 ^Y (em) 041 ) 057 9 073 I 089 Y 105 i 121 y
010 ^J (lf) 026 ^Z (eof) 042 * 058 : 074 J 090 Z 106 j 122 z
011 ^K (vt) 027 ^[ (esc) 043 + 059 ; 075 K 091 [ 107 k 123 {
012 ^L (np) 028 ^\ (fs) 044 , 060 < 076 L 092 \ 108 l 124 |
013 ^M (cr) 029 ^] (gs) 045 - 061 = 077 M 093 ] 109 m 125 }
014 ^N (so) 030 ^^ (rs) 046 . 062 > 078 N 094 ^ 110 n 126 ~
015 ^O (si) 031 ^_ (us) 047 / 063 ? 079 O 095 _ 111 o 127 

3.5.3 エスケープシーケンス

  記号(\)とそれに続く文字または数字の組み合わせをエスケープシーケンスと呼びます.文字定数の一種であり,端末やプリンタ上でのキャリッジリターンやタブなどの動作を指定するために使います.また,ダブルコーテーションマーク(")など通常は特別な意味を持つ文字や,出力できない文字を表すときにも使用します.Java のエスケープシーケンスは,次のとおりです.
Seq. 説明 Seq. 説明
\udddd Unicode文字 \? リテラル クオーテーション
\b バック スペース \' シングル クォーテーション
\f 改ページ \" ダブル クォーテーション
\n 復改 \\ 円記号
\r 改行 \ddd 8進表記による ASCII 文字
\t 水平タブ \xdd 16進表記による ASCII 文字

演習問題3

[問1]以下の演算を Java のプログラム内で実行した結果を答えよ.
(1)4.0 / 5.0
(2)4 / 5
(3)(double)4 / 5
(4)(double)(4 / 5)
(5)(int)(4.0 / 5.0)
(6)(20 / 5) * (19 / 4)
(7)(20.0 / 5.0) * (19.0 / 4.0)
(8)20 / 5 * 19 / 4

[問2]台形の上底 t1,下底 t2,及び,高さ h の値を,それぞれ,3.5,1.0,及び,0.7 としたとき(これらの値は,各変数に代入または初期設定せよ),台形の面積を計算し,出力するプログラムを書け.

[問3]円の半径を読み込み,その円の円周と面積を出力するプログラムを書け.

[問4] x の値を読み込み,次の各関数の値( y )を出力するプログラムを書け.
(1)y = x3 + 3x2 + 2
(2)y = (x + 3)2 / 3 + 5

[問5] 2 つの整数データを読み込み,商と余りを出力するプログラムを書け.

[問6]千円札だけを使用でき,かつ,千円以下の切符を売る自動販売機がある.任意の料金( 10 円単位)の切符を買った(切符の料金を入力データとして読み込む)とき,その釣り銭を出力するプログラムを書け.ただし,釣り銭の総額だけでなく,必要な硬貨の枚数,例えば,500 円硬貨 1 枚,100 円硬貨 2 枚,50 円硬貨 1 枚,10 円硬貨 3 枚という結果も出力すること.
(ヒント)例えば,「 turi / 500 」という演算により,500 円硬貨の枚数が得られる

[問7]ある値段(入力)の商品を購入したとき,消費税( 3 %)を含めた実際の支払価格を以下の 3 つの場合について計算し,それぞれの値を出力するプログラムを書け.ただし,浮動小数点数を使用すると誤差が生じる可能性があるので,すべて整数を使用して計算せよ.
(1)1 円未満を切り捨てる
(2)1 円未満を切り上げる
(3)1 円未満を4捨5入する
(ヒント)例えば,切り捨ての演算は,「nedan * 103 / 100」という演算により可能

情報学部 菅沼ホーム 全体目次 演習解答例 付録 索引