第 4 章 Java の文法Ⅰ
条件式 1 と条件式 2 がともに偽の場合に実行される文
[問題 2]
3 つの実数(a,b,c)を読み込み,それらを係数とする 2 次方程式(ax2bxc0) の根を計算して表示する Java applet を作成せよ。
4.4.3 多重選択 else/if 構造
if(条件式 1) {
条件式 1 が真の場合に実行される文 }
else if(条件式 2) {
条件式 2 が真の場合に実行される文 }
else {
条件式 1 と条件式 2 がともに偽の場合に実行される文 }
[多重選択 else/if 構造による GPA の計算]
//ConsoleWindow 上で複数科目の成績(S,A,B,C,F)を入力する。
//S→4 点,A→3 点,B→2 点,C→1 点,F→0 点とする。
//入力した成績の GPA を求める。
//途中で入力を中止する場合は文字「z」を入力する。
import java.io.* ; public class gpa1 {
public static void main(String[ ] args) throws IOException { int i, counter, grade ;
float sum=0, gpa ;
for(i=0; i<100; i++) { //①
System.out.print("成績を入力(終了の場合は z を入力)せよ : ") ; grade=System.in.read( ) ; //②
[89]
//z が入力されたら作業を中止する。
if(grade == 'z') break ; //③
//成績が入力されたら所定の作業を行う。
if(grade == 'S' || grade=='s') sum+=4 ; //④ else if(grade == 'A' || grade=='a') sum+=3 ; //⑤ else if(grade == 'B' || grade=='b') sum+=2 ; //⑥ else if(grade == 'C' || grade=='c') sum+=1 ; //⑦ else sum+=0 ; //⑧
System.in.skip(2) ; //⑨ } //The end of for( )
counter=i ;
gpa=sum/counter ;
System.out.println(counter+"科目の平均:" +gpa) ; } //The end of main( )
} //The end of gpa1.java
① for(i=0; i<100; i++) {
for 繰返し構造を用いて,「i の値を 0 から 99 まで,i の値を 1 ずつ増やしな がら,for ブロックの中の文を繰り返し実行する。」
② grade=System.in.read( ) ;
Java の組み込みメソッド「read」を用いて ConsoleWindow 上から文字を読み 込む。
③ if(grade == 'z') break ;
変数「grade」の値が文字「z」と一致したら,繰り返し(処理)を中止する。
④ if(grade == 'S' || grade=='s' ) sum+=4 ;
⑤ else if(grade == 'A' || grade=='a') sum+=3 ;
⑥ else if(grade == 'B' || grade=='b') sum+=2 ;
⑦ else if(grade == 'C' || grade=='c') sum+=1 ;
⑧ else sum+=0 ;
変数「grade」の値が文字「S/s」,「A/a」,「B/b」,「C/c」と一致したら,変数「sum」
の値にそれぞれ「4」,「3」,「2」,「1」を加える。変数「grade」の値がそれ以 外だったら,変数「sum」の値に「0」を加える。
[90]
⑨ System.in.skip(2) ;
改行文字分(半角 2 文字分)をスキップする。
4.4.4 多重選択 switch/case 構造
・式の値に基づいて指定された処理が行われる。
switch(式) {
case 値 1 : 文 1 ; break ; case 値 2 : 文 2 ; break ; ・・・・・・・・・・・・
default : 文 n ; break ; } //The end of switch-case block
* 式の値が値 1 と等しい場合には文 1 が実行され,式の値が値 2 と等しい 場合には文 2 が実行され,………,それ以外の場合には文 n が実行される。
文を実行した後は break 文により switch-case ブロックを抜ける。
* 式として指定できるのは,暗黙の型変換で int 型に変換できる型(char, byte, short, int)に限られる。
* break 文は,switch-case ブロックから抜け出すための命令文である。
break 文を指定しないと,1 つの文が実行された後,すぐ下の行の文が実行 されるようになる。
switch(shoe_size) {
case 22 : price=8800 ; break ; case 23 : price=9200 ; break ; default : price=9000 ; break ;
}
[91]
[多重選択 switch/case 構造による GPA の計算]
import java.io.* ; public class gpa2 {
public static void main(String[ ] args) throws IOException { int i, k=0, counter, grade ;
double sum=0, gpa ; for(i=0; i<100; i++) {
System.out.print("成績を入力(終了の場合は z を入力)せよ : ") ; grade=System.in.read( ) ;
if(grade == 'z') break ; switch(grade){
case 'S' : case 's' : sum+=4 ; break ; case 'A' : case 'a' : sum+=3 ; break ; case 'B' : case 'b' : sum+=2 ; break ; case 'C' : case 'c' : sum+=1 ; break ; case 'F' : case 'f' : sum+=0; break ; default : System.out.println( ) ;
System.out.println("★成績を正しく入力せよ★") ; System.out.println( ) ;
k++ ; break ; } //The end of switch( ) System.in.skip(2) ; } //The end of for( ) counter=i-k ;
gpa=sum/counter ;
System.out.println(counter+"科目の GPA:"+gpa) ; } //The end of main( )
} //The end of gpa2.java
[92]
[問題 3]
上記のプログラム(gpa2.java)を拡張することによって,「S, A, B, C」の場合は
「合格」,F の場合は「不合格」とし,合格の科目数と不合格の科目数を調べて追
加表示するプログラムを作成せよ。
[問題 4]
3 つのサイコロを投げるときの出目の合計値が「7 以下,8~12,13 以上」と なる回数を求めて次のように表示する Java applet を作成せよ。
Throw Dice Reset
出 目 結 果 サイコロ1: 2 7 以下 : 1 回 サイコロ 2 : 3 8〜12 : 0 回 サイコロ 3 : 2 13 以上 : 0 回
合 計 : 7 計 : 1 回
[問題 5]
4 つの整数(a,b,c,x)を読み込み,次の関数 f(x)を求めて表示する Java applet を作成せよ。ただし,「acb」,「axb」でなければならない。
b x c c for
b a b
x b
c x a for
b
c x a a for
c a b
a x
x f
) )(
(
) ( 2
) (
2
) )(
(
) ( 2
) (
[93]
4.5 繰返し構造
4.5.1 for 文による繰返し
for(式 1; 式 2; 式 3) { 式 1 で指定される制御変数の初期値から 実行文 式 2 で指定される制御変数の最終値まで
・・・ 実行文を繰返し実行する。
} そのときの制御変数の増分は式 3 で指定する。
[for 文による繰返し]
import java.awt.* ; import java.awt.event.* ; import java.applet.* ;
//<applet code=loop1.class width=700 height=500></applet>
public class loop1 extends Applet {
Font font=new Font("TimesNewRoman", Font.PLAIN, 24);
public void paint(Graphics g) { g.setFont(font);
int i, num2, num3, yPos=100 ; g.drawString("基 数", 50, 50) ; g.drawString("2 乗値", 150, 50) ; g.drawString("3 乗値", 250, 50) ; for(i=1; i <10; i++) { //① num2=i*i ; //②
num3=i*i*i ; //③
g.drawString(" "+i , 60, yPos) ; //④ g.drawString(" "+num2, 160, yPos) ; g.drawString(" "+num3, 260, yPos) ; yPos+=30 ;
[94]
} //The end of for( ) } //The end of paint( ) } //The end of loop1.java
① for(i=1; i<=10; i++) {
for 繰返し構造を用いて,「i の値を 1 から 10 まで,i の値を 1 ずつ増やしな がら,for ブロックの中の文を繰り返し実行する。」
② num2=i*i ;
変数「i」の値を 2 乗し,その 2 乗値を変数「num2」に代入する。
③ num3=i*i*i ;
変数「i」の値を 3 乗し,その 3 乗値を変数「num3」に代入する。
④ g.drawString(""+i, 60, yPos) ;
変数「i」の値を所定の位置(60, yPos)に表示する。
[for 文による繰返しと繰返しからの抜け出し]
import java.awt.* ; import java.awt.event.* ; import java.applet.* ;
//<applet code=loop2.class width=700 height=500></applet>
public class loop2 extends Applet {
Font font=new Font("TimesNewRoman", Font.PLAIN, 24);
public void paint(Graphics g) { g.setFont(font) ;
int count, xPos=30 ;
for(count=1; count<20; count++) { if(count == 10) break ; //① g.drawString(" "+count, xPos, 50) ; xPos+=20 ;
} //The end of for( )
[95]
g.drawString("繰返しを抜けたときの count="+count, 30, 100) ; } //The end of paint( )
} //The end of loop2.java
① if(count == 10) break ;
変数「count」の値が 10 と等しかったら,繰返しから抜け出す。
4.5.2 while 文による繰返し
while(条件) {
実行文 条件が真である限り実行文を繰返し実行する。
・・・
}
[while 文による繰返し]
import java.awt.* ; import java.awt.event.* ; import java.applet.* ;
//<applet code=loop3.class width=700 height=500></applet>
public class loop3 extends Applet {
Font font=new Font("TimesNewRoman", Font.PLAIN, 24);
public void paint(Graphics g) { g.setFont(font) ;
g.setColor(Color.blue) ; int x, y=10 ;
while(y <= 250) { //① x=10 ;
while(x <= 250) { //②
[96]
g.fillRect(x, y, 20, 20) ; x+=40 ;
} //The end of inner while( ) y+=40 ;
} //The end of outer while( ) } //The end of paint( )
} //The End of loop3.java
① while(y <= 250) {
変数「y」の値が 250 以下である限り,外の while ブロックの中の文を繰り返 し実行する。
② while(x <= 250) {
変数「x」の値が 250 以下である限り,中の while ブロックの中の文を繰り返 し実行する。
[問題 6]
ブラウザに次のように表示する Java applet を作成せよ。
1
55555
999999999
[問題 7]
正数 n と実数 x を読み込み
n x x
x x
x 2 3 4 n 1 n
) 1 4 (
3 2 1
の値を求めて表
示する Java applet を作成せよ。
[97]
4.6 配列
4.6.1 1 次元配列
・基本データ型(整数型,実数型,文字型,真偽型)の変数は宣言するだけでメモリ の中に変数に対応する記憶領域が自動的に生成されるが,参照型変数(配列とオ
ブジェクト)は宣言に加え,new 演算子を用いて明示的に記憶領域を生成しなけ ればならない。
・配列の宣言・生成の書式
* 宣 言: 型名 配列名[ ] ; int seisu[ ] ; (宣言だけでは配列は生成されない。)
* 生 成: 配列名=new 型名[要素数] ; seisu=new int[3] ;
(明示的な生成によりメモリの中に配列領域が作られる。)
* 宣言+生成: 型名 配列名[ ]=new 型名[要素数] ; int seisu[ ]=new int[3] ;
* 配列のイメージ
配列名[要素番号] 内 容 seisu[0] 0 seisu[1] 0 seisu[2] 0
[98]
[アンケート調査分析プログラム]
import java.awt.* ; import java.awt.event.* ; import java.applet.* ;
//<applet code=array1.class width=700 height=500></applet>
public class array1 extends Applet{
Font font ;
int resp[ ]={2,3,6,8,2,7,9,1,5,7,3,4,5,6,10,9,4,3,9,3} ; int i, j, n, freq[ ] ;
public void init( ){
font=new Font("TimesNewRoman", Font.PLAIN, 24) ; setFont(font) ;
freq=new int[11] ; n=resp.length ;
for(i=0; i<n; i++) ++freq[resp[i]] ; }//The end of init( )
public void paint(Graphics g) { int yPos=25 ;
g.drawString("ランク", 25, yPos) ; g.drawString("集計結果", 100, yPos) ; for(j=1; j<freq.length; j++) {
yPos+=25 ;
g.drawString(" "+j, 40 , yPos) ; g.drawString(" "+freq[j], 130, yPos) ; } //The end of for( )
} //The end of paint( ) }//The end of array1.java
[99]
[問題 8]
100 までの整数のなかの素数(どの数の倍数でもない数)を判別して表示する Java applet を作成せよ。
(注)素数とは,1以外の自然数のなかで,「正の約数が 1 と自分自身のみである自然
数」である。言い換えると,素数とは「正の約数の個数が 2 である自然数」である。
4.6.2 2 次元配列
・配列の宣言・生成の書式
* 宣 言: 型名 配列名[ ][ ] ; int seisu[ ][ ] ;
* 生 成: 配列名=new 型名[行数][列数] ; seisu=new int[3][3] ;
* 宣言+生成: 型名 配列名[ ][ ]=new 型名[行数][列数] ; int seisu[ ][ ]=new int[3][3] ;
* 配列のイメージ
配列名[行][列] 内 容 配列名[行][列] 内 容 配列名[行][列] 内 容 seisu[0][0] 0 seisu[0][1] 0 seisu[0][2] 0 seisu[1][0] 0 seisu[1][1] 0 seisu[1][2] 0 seisu[2][0] 0 seisu[2][1] 0 seisu[2][2] 0
[100]
* 各行ごとに列の数が異なる配列の宣言と生成
型名 配列名[ ][ ]=new 型名[行数][ ] ; 配列名[行番号]=new 型名[列数] ; ・・・・・・・・・・・・・
int seisu[ ][ ]=new int[3][ ] ; seisu[0]=new int[1] ; //0 行の列数は 1 seisu[1]=new int[2] ; //1 行の列数は 2 seisu[2]=new int[3] ; //2 行の列数は 3
4.6.3 配列の初期化
・1 次元配列の初期化 : 型名 配列名[ ]={ 要素の値 } ; int seisu[ ]={10, 20, 30 } ;
seisu[0]=10, seisu[1]=20, seisu[2]=30
・2 次元配列の初期化 : 型名 配列名[ ][ ]={ {要素の値}, {要素の値}, … } ; int seisu[ ][ ]={ { 10, 20, 30 } ,
{ 40, 50, 60 } , { 70, 80, 90 } } ;
seisu[0][0]=10, seisu[0][1]=20, seisu[0][2]=30 seisu[1][0]=40, seisu[1][1]=50, seisu[1][2]=60 seisu[2][0]=70, seisu[2][1]=80, seisu[2][2]=90
[101]
・配列生成時の初期値
型 名 初 期 値
char(文字型) ‘\u0000’
boolean(真偽値型) false
int, long(整数型) 0
float, double(実数型) 0.0
String(文字列型) null
object(参照型) null
[問題 9]
2 つの配列の和を求めて表示するプログラムを作成せよ。
1 2 3 10 20 30 11 22 33 + =
4 5 6 40 50 60 44 55 66
[102]