直線型(逐次) | sequence | : 文(式 ;)の並び |
選択型(条件分岐) | branch | : if文、 switch文 |
反復型(ループ) | loop | : while文、do文、for文 |
プロシージャ | procedure | : 関数呼出し |
|
/* 関数定義 */ main() { 処理 } |
/* 関数定義 */ 型 関数名(引数定義) { 処理 } | |
/* Hello World と画面に表示する */
main()
{
printf("Hello World\n");
}
|
/* 2整数の和を返す */
int add( int x, int y )
{
return( x + y );
}
|
/* 処理は文 */ 文 |
/* 最も簡単な文 */ 式; /* 式の後ろにセミコロン */ | |
y = a * x + b;
|
/* 単純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文の入れ子 */ 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も偽のとき実行 */ // コンパクトで明確な表現になっている |
/* b*x + c = 0 を解く */
if( b != 0 )
x = -c / b;
else if( c != 0)
printf("解なし\n");
else /* b == 0 && c == 0 */
printf("不定\n");
|
/* ブロックif文の入れ子*/ if(条件1) {/* 処理ブロック1 */ 文11 文12 } else if(条件2) {/* 処理ブロック2 */ 文21 文22 } else {/* 処理ブロックF */ 文F1 文F2 } |
/* a*x*x + b*x + c = 0 を解く */
if( disc < 0 )
{
printf("実根なし\n");
}
else if( disc == 0)
{
printf("重根\n");
x = -b / (2*a);
}
else /* disc > 0 */
{
printf("2実根\n");
x1 = (-b + sqrt(disc))/(2*a);
x2 = (-b - sqrt(disc))/(2*a);
}
|
/* 単純if文の入れ子 */ if(条件1) if(条件2) 文12/* 条件1も条件2も真のとき実行 */ else 文1/* 条件1が真で条件2が偽のとき実行 */ else 文F/* 条件1が偽のとき実行 */ // インデントすると構造が手に取るように分かる! |
/* 単純if文の入れ子 */ if(条件1) if(条件2) 文12/* 条件1も条件2も真のとき実行 */ else 文1/* 条件1が真で条件2が偽のとき実行 */ // インデントすると構造が手に取るように分かる! |
/* 単純if文の入れ子 */ if(条件1) { if(条件2) 文12/* 条件1も条件2も真のとき実行 */ } else 文F/* 条件1が偽のとき実行 */ /* 中括弧 { } は必要である! elseは最も近いelse無しのifに関連付けられるので、 中括弧 { } が無いと、その3と同じになってしまう */ |
|
/* switch文 */ switch(式) { case 定数式1: 処理1 break; case 定数式2: 処理2 break; default: 処理F } // 各処理の部分はインデント /* break;が無いと、その下のcaseや defaultの処理も続けて行なう */ |
|
switch( x % 3 )
{
case 0:
printf("3で割り切れる\n");
break;
case 1:
printf("3で割ると1余る\n");
break;
default:/* 2 */
printf("3で割ると2余る\n");
}
/* break;の無い例 */
switch( i )
{
case 3:
printf("*");
case 2:
printf("*");
case 1:
printf("*");
default:
printf("\n");
}
|
/* while文 */ while(継続条件) 文R // 繰り返し処理をインデントして可読性を向上する
/* 99 まで表示する */
while( i < 100 )
printf("i = %d\n", i++ );
/* 文R中の break; でループの外に出る continue; で継続条件の評価へ飛んで繰り返す */ | |||
/* while文 */ while(継続条件) {/* 処理ブロックR */ 文R1 文R2 } |
/* 99 まで表示する */
while( i < 100 )
{
printf("i = %d\n", i );
i++;
}
| ||
|
|
/* do文 */ do 文R while(継続条件); |
/* do文 */ do {/* 処理ブロックR */ 文R1 文R2 } while(継続条件); | |
// 繰り返し処理をインデントして可読性を向上する /* 文R中の break; でループの外に出る continue; で継続条件の評価へ飛んで繰り返す */ | ||
/* 99 まで表示する */
do
printf("i = %d\n", i++ );
while( i < 100 );
|
/* 99 まで表示する */
do
{
printf("i = %d\n", i );
i++;
}
while( i < 100 );
|
|
/* for文 */
for(初期化; 継続条件; 後処理) 文R /* for文 */ for(初期化; 継続条件; 後処理) {/* 処理ブロックR */ 文R1 文R2 } // 繰り返し処理をインデントして可読性を向上する /* 文R中の break; でループの外に出る continue; で後処理へ飛んで繰り返す */ |
「初期化」と「後処理」の部分に、式を ,演算子 で区切って複数置くことができる。 | |
/* 0 から 99 まで表示する */
for( i = 0; i < 100; i++ )
printf("i = %d\n", i );
(この変数 i ようなものをループカウンタと呼ぶ) |
/* 0 から 99 まで表示する */
for( i = 0; i < 100; i++ )
{
printf("i = ");
printf("%d\n", i );
}
|
|
whileを使った無限ループは、例えば、
while(1)
{/* 無限に繰り返される処理 */
}
|
forを使った無限ループは、
for(;;)
{/* 無限に繰り返される処理 */
}
|
while(1)
{/* 無限に繰り返される処理 */
if( 抜け出す条件 )
break;
}
/* 関数呼び出し */ 関数名(引数並び); | |
s = add( i, j ); /* add という関数呼び出し */
printf("sum = %d\n", s ); /* 標準出力関数 */
|
goto 名札;
名札:
break;
continue;
while(...){
...
...
...
contin: ;
}
|
do{
...
...
...
contin: ;
}while(...);
|
for(...;...;...){
...
...
...
contin: ;
}
|