![]() |
流れ図は、処理の流れを図を用いて視覚的に表現したもので、
フローチャート(flowchart)とも呼ばれる。 一つの「開始」端子に始まり、基本処理を長方形で、条件分岐をひし形で表し、 処理の流れを矢印で示し、一つの「終了」端子で終了する。 |
![]() |
処理(process)は一つの入力と出力を持ち、結合子
![]() (結合子に番号等を付けて、直接矢印で接続できない離れた処理と処理を繋ぐこともできる。) | ![]() |
構造化プログラミングでは、処理の部分を逐次(順序:Sequence)、条件分岐(選択:Selection)、ループ(反復:Iteration)の三種の構造で置き換える以外の構造を作らない。
逐次(順序:Sequence) | : | 文の並び |
条件分岐(選択:Selection) | : | if文、switch文 |
ループ(反復:Iteration) | : | while文、do文、for文 |
![]() | /* メソッド定義 */ 戻り値の型 メソッド名(引数リスト) { 処理 } // { } で囲まれたブロック内は // インデント(字下げ)する |
// hello world と画面に表示する
public static void main(String[] args)
{
System.out.println("hello world");
}
// インデントして可読性を向上する
|
![]() | /* 処理は文 */ 文 | /* 最も簡単な文は式の後ろにセミコロン */ 式; y = a * x + b;
|
![]() | /* メソッド呼び出し */ メソッド名(引数並び); |
// hello world と画面に表示する
System.out.println("hello world");
// 斜辺(hypotenuse)の長さを求める
z = Math.hypot(x, y);
|
呼び出されたメソッドの処理が終わったら戻ってきて続きを実行する (main以外のメソッドを定義して呼び出して使う例はこちら) |
「処理1」を行なってから、「処理2」を行なう。これもまたひとつの「処理」となる。
条件によって流れを変える。
「条件」が真(true)の時「処理T」を行ない、 「条件」が偽(false)の時は何もしない。
「条件」が真(true)の時「処理T」を行ない、 「条件」が偽(false)の時「処理F」を行なう。
![]() | /* 単純if文 */ if(条件) 文T// 条件が真のとき実行 else 文F// 条件が偽のとき実行 // 各処理文はインデントして可読性を向上する /* 最大値を求める */
if( a > b )
max = a;
else
max = b;
|
/* ブロックif文*/ if(条件) {// 処理ブロックT 文T1 文T2 } else {// 処理ブロックF 文F1 文F2 } |
/* 最大値と最小値を求める */
if( a > b )
{
max = a;
min = b;
}
else
{
max = b;
min = a;
}
|
if文の処理Fをif文で置き換えたもの。
![]() | /* 単純if文の入れ子 */ if(条件1) 文1// 条件1が真のとき実行 else if(条件2) 文2// 条件1が偽で条件2が真のとき実行 else 文F// 条件1も条件2も偽のとき実行 // インデントすると構造が手に取るように分かる! | |
|
/* 単純if文の入れ子 */ if(条件1) 文1// 条件1が真のとき実行 else if(条件2) 文2// 条件1が偽で条件2が真のとき実行 else 文F// 条件1も条件2も偽のとき実行 // コンパクトで明確な表現になっている |
/* 高々1次の方程式 b*x + c = 0 を解く */
if( b != 0 )
x = -c / b;
else if( c != 0)
System.out.println("解なし");
else // b == 0 && c == 0
System.out.println("不定");
|
/* ブロックif文の入れ子*/ if(条件1) {// 処理ブロック1 文11 文12 } else if(条件2) {// 処理ブロック2 文21 文22 } else {// 処理ブロックF 文F1 文F2 } | /* 2次方程式 a*x*x + b*x + c = 0 を解く */
if( disc < 0 )
{
System.out.println("虚根はあるが、");
System.out.println("実根なし");
}
else if( disc == 0)
{
System.out.println("重根");
x = -b / (2*a);
}
else // disc > 0
{
System.out.println("2実根");
x1 = (-b + Math.sqrt(disc))/(2*a);
x2 = (-b - Math.sqrt(disc))/(2*a);
}
|
if文の処理Tをif文で置き換えたもの。
![]() | /* 単純if文の入れ子 */ if(条件1) if(条件2) 文12/* 条件1も条件2も真のとき実行 */ else 文1/* 条件1が真で条件2が偽のとき実行 */ else 文F/* 条件1が偽のとき実行 */ // インデントすると構造が手に取るように分かる! |
else無しif文の処理Tをif文で置き換えたもの。
![]() | /* 単純if文の入れ子 */ if(条件1) if(条件2) 文12// 条件1も条件2も真のとき実行 else 文1// 条件1が真で条件2が偽のとき実行 // インデントすると構造が手に取るように分かる! |
if文の処理Tをelse無しif文で置き換えたもの。
![]() | /* 単純if文の入れ子 */ if(条件1) { if(条件2) 文12// 条件1も条件2も真のとき実行 } else 文F// 条件1が偽のとき実行 /* この中括弧 { } は必要である! elseは最も近いelse無しのifに関連付けられるので、 中括弧 { } が無いと、上の入れ子(その3)と同じになる */ |
「式」の整数値(byte、char、short、int、enum、(longはダメ))に応じて場合(case)分けを行い、それぞれの「処理」を行なう。
各場合の処理の先頭に、case 定数式: または default: という名札(ラベル)を置く。
名札(ラベル)の後ろには :(コロン)が付く。
「if〜else if〜else if〜...〜else」よりも簡単に実現できる。
通常、各caseの最後にbreak;文を置く。
![]() | /* switch文 */ switch(式) { case 定数式1: 処理1 break; case 定数式2: 処理2 break; default: 処理F } // 各処理の部分はインデント /* break; が無いと、その下の case や default の処理も 続けて行なう */右のswitch文を実行して確認する | /* 3の剰余を文章で表示する */
switch( x % 3 )
{
case 0:
System.out.println("3で割り切れる");
break;
case 1:
System.out.println("3で割ると1余る");
break;
default:/* 2 */
System.out.println("3で割ると2余る");
}
/* breakの無い例 */
switch( i )
{
case 3:
System.out.print("*");
case 2:
System.out.print("*");
case 1:
System.out.print("*");
default:
System.out.print("\n");
}
|
char ch = str.charAt(0);
//文字列strの0番目(最初)の文字を変数chに格納する
例: |
|
例: |
|
同じ処理を繰り返し行なう。
「条件」が真(true)の間、「処理R」を繰り返す。
![]() |
/* while文 */ while(継続条件) 文R // 繰り返し処理をインデントして可読性を向上する /* 99 まで表示する */
while( i < 100 )
System.out.println("i =" + i++ );
/* 文R中の break; でループの外に出、 continue; で継続条件の評価へ飛んで繰り返す */ |
![]() | |
|
/* 99 まで表示する */
while( i < 100 )
{
System.out.println("i =" + i );
i++;
}
|
||
| ![]() |
![]() |
|
「処理R」を行ない、「条件」が真(true)の間、「処理R」を繰り返す。
![]() | /* do文 */ do 文R while(継続条件); |
/* do文 */
do {// 処理ブロックR 文R1 文R2 } while(継続条件); |
// 繰り返し処理をインデントして可読性を向上する /* 文R中の break; でループの外に出、 continue; で継続条件の評価へ飛んで繰り返す */ |
/* 99 まで表示する */
do
System.out.println("i =" + i++ );
while( i < 100 );
|
/* 99 まで表示する */
do
{
System.out.println("i =" + i );
i++;
}
while( i < 100 );
|
![]() |
|
「初期化」を行ない、「条件」が真(true)の間、「処理R」と「後処理」を繰り返す。
![]() |
/* 0 から 99 まで表示する */
for( int i = 0; i < 100; i++ )
System.out.println("i =" + i );
(この変数 i ようなものをループカウンタと呼ぶ) |
/* 0 から 99 まで表示する */
for( int i = 0; i < 100; i++ )
{
System.out.print("i =");
System.out.println( i );
}
|
![]() |
|
配列やコレクションクラス(ArrayListなど)を指定し、その要素数分だけ繰り返し処理する。(J2SE1.5.0で追加された)
/* 拡張for文 */ for( 要素を代入する為の変数: 配列等 ) 要素に対する処理R // 繰り返し処理をインデントして可読性を向上する |
/* 拡張for文 */ for( 要素を代入する為の変数: 配列等 ) {// 処理ブロックR 要素に対する処理 } |
int[] a = new int[10]; ・・・ // 配列要素を表示する for( int ai: a ) System.out.println(ai); // 従来の方法で書くと... for( int i = 0; i < a.length; i++ ) System.out.println(a[i]); |
ArrayList<String> lines = new ArrayList<String>(); ・・・ // 配列要素を表示する for( String s: lines ) System.out.println(s); // 従来の方法で書くと... for( int i = 0; i < lines.size(); i++ ) System.out.println(lines.get(i)); |
ループの継続条件を恒真(常に真)にすると無限ループとなる。
|
|
while(true)
{// 無限に繰り返される処理
if( ループから抜け出す条件 )
break;
}
// インデントすると構造が明確になる
gotoはキーワードに残っているが、Javaには goto文 は無い!
最も内側の、switch文、while文、do文、for文のブロックの外に出る
break;
ループの次の繰り返しを開始させる。 while文、do文の場合は、継続条件の評価へ、 for文の場合は、後処理へジャンプする
while(...)
{
...
...
...
contin: ;
}
| do
{
...
...
...
contin: ;
}while(...);
| for(...;...;...)
{
...
...
...
contin: ;
}
|
ループ内の continue; は goto contin; と同じである | ||
![]() |
![]() |
![]() |
// 標準入力から読み込んで標準出力に書き出すプログラム
import java.io.*; // おまじない
class Pipe1
{
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str;
while( (str = br.readLine()) != null )
{ // ここで行毎に加工することもできる!
System.out.println(str);
}
}
}
// end of Pipe1.java
コマンドプロンプトで起動したプログラム(コマンド)を強制終了するには、Ctrl+Cキーを押す。 次の様な場合が該当する。
例: |
|
例: |
|
|
|
例: |
|
例: |
|
|
例: |
|
|
例: |
|
|
例: |
|
|
|
|
例: |
|