Download : sample-001.c
/*
* CDATE sample-001.c
*/
/*
* 複数条件の分岐
*
* 利用方法
* コンパイル
* cc -I ~/c/include -o sample-001.exe sample-001.c
* 実行
* sample-001
*/
#include <stdio.h>
/*
* trump
* トランプの番号から、その名前を表示する
*/
void trump ( int number ) {
printf ( "数値 %d の表すカードは、", number );
if ( number == 1 ) { /* 番号が 1 なら エース (A) */
printf ( "エース" );
} else if ( number == 11 ) { /* 番号が 11 なら ジャック (J) */
printf ( "ジャック" );
} else if ( number == 12 ) { /* 番号が 12 なら クイーン (Q) */
printf ( "クイーン" );
} else if ( number == 13 ) { /* 番号が 13 なら キング (K) */
printf ( "キング" );
} else if ( number == 0 ) { /* 番号が 0 の場合は例外的に ジョーカー ($) */
printf ( "ジョーカー" );
} else { /* それ以外 */
if ( number < 0 ) { /* 番号が負の場合は.. */
printf ( "範囲外" );
} else if ( 13 < number ) { /* 番号が 13 より大きい場合は.. */
printf ( "範囲外" );
} else { /* それ以外は.. */
printf ( "%d の数カード", number );
}
}
printf ( "です。\n" );
}
/*
* main
*
*/
int main( int argc, char *argv[] )
{
trump ( -1 );
trump ( 0 );
trump ( 1 );
trump ( 7 );
trump ( 10 );
trump ( 13 );
trump ( 20 );
return 0;
}
$ ./sample-001.exe 数値 -1 の表すカードは、範囲外です。 数値 0 の表すカードは、ジョーカーです。 数値 1 の表すカードは、エースです。 数値 7 の表すカードは、7 の数カードです。 数値 10 の表すカードは、10 の数カードです。 数値 13 の表すカードは、キングです。 数値 20 の表すカードは、範囲外です。 $
Download : sample-002.c
/*
* 2019/09/27 sample-002.c
*/
/*
* 複数条件の分岐(case 文を利用した場合)
*
* 利用方法
* コンパイル
* cc -I ~/c/include -o sample-002.exe sample-002.c
* 実行
* sample-002
*/
#include <stdio.h>
/*
* trump
* トランプの番号から、その名前を表示する
*/
void trump ( int number ) {
printf ( "数値 %d の表すカードは、", number );
switch ( number ) { /* 一つの式の値で分岐 */
case 1: /* 番号が 1 なら エース (A) { (開きブロック) */
printf ( "エース" );
break; /* ここで 1 の場合がおわる } (閉じブロック) */
case 11: /* 番号が 11 なら ジャック (J) */
printf ( "ジャック" );
break;
case 12: /* 番号が 12 なら クイーン (Q) */
printf ( "クイーン" );
break;
case 13: /* 番号が 13 なら キング (K) */
printf ( "キング" );
break;
case 0: /* 番号が 0 の場合は例外的に ジョーカー ($) */
printf ( "ジョーカー" );
break;
case 2: /* 範囲は指定できないので、全て列挙 */
/* 2 の場合は 3 の場合と同じなので break しない */
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
printf ( "%d の数カード", number );
break; /* 2 〜 10 の場合はここで、終了 */
default: /* それ以外は.. */
printf ( "範囲外" );
break; /* これは不要だが、つける習慣を (マナー) */
}
printf ( "です。\n" );
}
/*
* main
*
*/
int main( int argc, char *argv[] )
{
trump ( -1 );
trump ( 0 );
trump ( 1 );
trump ( 7 );
trump ( 10 );
trump ( 13 );
trump ( 20 );
return 0;
}
$ ./sample-002.exe 数値 -1 の表すカードは、範囲外です。 数値 0 の表すカードは、ジョーカーです。 数値 1 の表すカードは、エースです。 数値 7 の表すカードは、7 の数カードです。 数値 10 の表すカードは、10 の数カードです。 数値 13 の表すカードは、キングです。 数値 20 の表すカードは、範囲外です。 $
Download : sample-003.c
/*
* 2019/09/27 sample-003.c
*/
#include <stdio.h>
/*
* for 文を利用して、0 から 9 の数値を表示する
*
* 利用方法
* コンパイル
* cc -I ~/c/include -o sample-003.exe sample-003.c
* 実行
* sample-003
*/
int main(int ac, char *av[] ) {
int i; /* for 文の制御変数 */
for ( i = 0; i < 10; i = i + 1 ) {/* i を 0 〜 9 迄変化 */
printf ( "%d\n", i ); /* i を出力 */
}
return 0;
}
$ ./sample-003.exe 0 1 2 3 4 5 6 7 8 9 $
Download : sample-004.c
/*
* 2019/09/27 sample-004.c
*/
#include <stdio.h>
/*
* for 文を利用して、1 から 10 の数値を表示する
*
* 利用方法
* コンパイル
* cc -I ~/c/include -o sample-004.exe sample-004.c
* 実行
* sample-004
*/
int main(int ac, char *av[] ) {
int i; /* for 文の制御変数 */
for ( i = 1; i <= 10; i = i + 1 ) {/* i を 1 〜 10迄変化 */
printf ( "%d\n", i ); /* i を出力 */
}
return 0;
}
$ ./sample-004.exe 1 2 3 4 5 6 7 8 9 10 $
Download : sample-005.c
/*
* 2019/09/27 sample-005.c
*/
#include <stdio.h>
/*
* for 文を利用して、0 から 9 の数値を表示する
*
* 利用方法
* コンパイル
* cc -I ~/c/include -o sample-005.exe sample-005.c
* 実行
* sample-005
*/
int main(int ac, char *av[] ) {
int i; /* for 文の制御変数 */
for ( i = 0; i < 10; i++ ) { /* i を 0 〜 9 迄変化 */
/* i++ は i = i + 1 と同じ */
printf ( "%d\n", i ); /* i を出力 */
}
return 0;
}
$ ./sample-005.exe 0 1 2 3 4 5 6 7 8 9 $
Download : sample-006.c
/*
* 2019/09/27 sample-006.c
*/
#include <stdio.h>
/*
* for 文を利用して、0 から 9 迄の 10 個の数値を和を表示する
* sum = \sum_{i=0}^{9} i
*
* 利用方法
* コンパイル
* cc -I ~/c/include -o sample-006.exe sample-006.c
* 実行
* sample-006
*/
int main(int ac, char *av[] ) {
int i; /* for 文の制御変数 */
int sum = 0;
for ( i = 0; i < 10; i++ ) { /* i を 0 〜 9 迄変化 */
/* i++ は i = i + 1 と同じ */
sum = sum + i; /* sum に i の値を加える */
printf ( "%d %d\n", i, sum ); /* i と sum を出力 */
}
printf ( "最終的には sum = %d\n", sum );
return 0;
}
$ ./sample-006.exe 0 0 1 1 2 3 3 6 4 10 5 15 6 21 7 28 8 36 9 45 最終的には sum = 45 $
Download : sample-007.c
/*
* 2019/09/27 sample-007.c
*/
#include <stdio.h>
/*
* for 文を利用して、0 から 9 の数値を表示する
* プログラムを while に書き直す
*
* 利用方法
* コンパイル
* cc -I ~/c/include -o sample-007.exe sample-007.c
* 実行
* sample-007
*/
int main(int ac, char *av[] ) {
int i; /* for 文の制御変数 */
/* 元々のプログラム
for ( i = 0; i < 10; i++ ) {
printf ( "%d\n", i );
}
step-1
<初期化式> を前にもってくる
i = 0;
for ( i < 10; i++ ) {
printf ( "%d\n", i );
}
step-2
<再初期化式> を、繰返し文の後にもって行く
i = 0;
for ( i < 10 ) {
printf ( "%d\n", i );
i++; <= { 〜 } の一番最後
}
step-3
for を while に書き換える
i = 0;
while ( i < 10 ) {
printf ( "%d\n", i );
i++;
}
*/
/* 元々のプログラム
for ( i = 0; i < 10; i++ ) {
printf ( "%d\n", i );
}
*/
i = 0;
while ( i < 10 ) {
printf ( "%d\n", i );
i++;
}
return 0;
}
$ ./sample-007.exe 0 1 2 3 4 5 6 7 8 9 $
Download : sample-008.c
/*
* 2019/09/27 sample-008.c
*/
#include <stdio.h>
/*
* for 文では、条件式がサボれる
*
* 利用方法
* コンパイル
* cc -I ~/c/include -o sample-008.exe sample-008.c
* 実行
* sample-008
*/
int main(int ac, char *av[] ) {
for ( ;; ) {
/* while では条件を省略できないが for 文ではできる .. */
/* 条件が省略されると、「常に真」になるので無限ループ */
/* プログラムを停止させるには
* Ctrl-C ([Ctrl] キーを押しながら [C] キーを押す)
* を押す。
*/
printf ( "動いています...\n" );
}
return 0;
}
動いています... 動いています... 動いています... 動いています... .... 動いています... 動いています... 動いています... 動いています... 動いてい^C
Download : sample-009.c
/*
* 2019/09/27 sample-009.c
*/
#include <stdio.h>
/*
* for 文を利用して、0 から 99 の偶数の数値
* アプローチ
* (その一) i を 0 〜 99 として、但し偶数だけを出す
*
* 利用方法
* コンパイル
* cc -I ~/c/include -o sample-009.exe sample-009.c
* 実行
* sample-009
*/
int main(int ac, char *av[] ) {
int i; /* for 文の制御変数 */
for ( i = 0; i < 100; i++ ) { /* i を 0 〜 99 迄変化 */
/* 但し、i が偶数の時だけ → if 文を利用する */
if ( i % 2 == 0 ) { /* i を 2 で割った余り(i%2)が 0 */
/* 即ち i が偶数の時.. */
printf ( "%d\n", i ); /* i を出力 */
}
}
return 0;
}
$ ./sample-009.exe 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 $
/*
* 課題 CNAME-05
*
* CDATE FILENAME
*
* while 文
*/
#include <stdio.h>
/* #include "s_print.h" */ /* printf にしたので、不要 */
/*
* main
*/
/*
25 = 5^2 = \sum_{i=1}^5 (2*i-1)
= 1 + 3 + 5 + 7 + 9 = 25
= 0 + 1 + 3 + 5 + 7 + 9 = 25
*/
int main( int argc, char *argv[] )
{
/* 整数型変数 odd の宣言とその初期化 ( 初期値は 1 を指定 ) */
int odd = 1; /* 1, 3, 5, .. 2 づつ増えてゆく */
/* 整数型変数 sum の宣言とその初期化 ( 初期値は 0 を指定 ) */
int sum = 0; /* 総和の計算する : 最初は 0 */
/*
sum = 1 + 3 + .. + 9 = 25 = 5^2
*/
/* odd の値が 9 以下の間は繰り返す */
while ( odd <= 9 ) { /* odd = 1 .. 9 は実行する 11 になったらやめる */
/* sum に odd の値を「追加」する */
sum = sum + odd; /* 蓄積に相当する : 総和計算の時のパターン */
/* odd の値を次の奇数にする */
odd = odd + 2; /* 奇数列をつくるために +2 している */
/* 繰り返しの条件は odd に値を利用しているので、odd の更新が不可欠 (そうでないと無限ループになる) */
}
/* 整数型変数 sum の値を画面に出力 */
/* printf に書き換える */
/*
s_print_string ( "1 から 9 までの奇数の和は " );
s_print_int ( sum );
s_print_string ( " です。\n" );
*/
printf ( "1 から 9 までの奇数の和は %d です。\n", sum );
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
int var; /* 変数宣言 : var という名前の変数を整数型として宣言 */
/* 1. 以下(ブロック内)では、var という名前の変数が利用できる */
/* 2. var には、整数値を保持する事ができる */
var = 1 + 2 + 3; /* 変数 var に対して、式「1+2+3」の値(整数型)を代入する */
/* 結果的に、これ以降は、var には、「6」が保持される */
printf ( "var = %d\n", var );
/* 書式(format)付の出力 */
/* 基本、書式(printf の最初の文字列型の引数) の内容がそのまま出力される */
/* ただし、 */
/* 書式内に書式指定(%から始まる数文字)があると、そこには、*/
/* (多くは)そのあとに指定されている引数の値を、そこに埋め込んで(その値を文字列に変換して)出力する */
/* 書式指定: いろいろ => ググって自分で調べる */
/* %d => 整数値 */
/* %c => 文字 */
/* %s => 文字列 */
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
int var; /* 変数は、宣言(定義)した直後は不定 */
/* 代入前に、var の値を参照する(初期化忘れ)の不適切 */
/* 初級者の誤りの多くが、初期忘れ */
/* 関数の「仮引数変数」も「変数」だが
これは関数呼び出しの時に、必ず実引数値で初期化されるので、この心配がない */
/* 代入前 : var になにが入っているか不明 */
var = 1 + 2 + 3; /* 変数に代入 */
/* 代入後 : var には、代入によって割り当てられた値(6) が入っている事が保証される */
/* 「代入(代入文の実行)」によって、変数の値が変わる */
printf ( "var = %d\n", var ); /* printf の引数にあられた変数 (var) は評価されて
その変数に保持されている値(6)が printf に渡される */
/* printf ( "var = %d\n", 6 ); */
printf ( "var = %d\n", var ); /* 変数の内容(変数に割り当てられている値) は、何度参照しても変わらない */
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
int var;
var = 1 + 2 + 3;
printf ( "var = %d\n", var );
printf ( "var = %d\n", var ); /* 一つ上と同じ結果 */
var = 9; /* var に 9 が代入される */
/* すでに値が入っている(初期化済)変数に対して、代入を行うことができる */
/* => 再代入 */
/* => 結果として (代入なので..) それ以後の変数の値は、代入によって割り当てられたものになる */
/* 1. この代入文を実行した「後」から */
/* 2. この代入以前に変数が保持していた値は、その変数を利用して、参照できなくなる */
printf ( "var = %d\n", var ); /* 同じ命令だが、変数の内容が異なるので結果が変化 */
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
int var;
var = 1;
printf ( "var = %d\n", var );
var = var + 1; /* var = 2 と同じ */
/* 元の値を 1 増やす */
printf ( "var = %d\n", var );
var = var + 1; /* 元の var の値(2)を利用して、新しい値を計算する事ができる */
/* 1. var の現在(元) の値が取り出される => 2 */
/* 2. その値を使って、式「var + 1」=>「2 + 1」の値(3)が計算される */
/* 3. 計算された値が、変数(var)に(再)代入され、その値(3)がその変数(var)に割り当てられる */
/* (4. 元の変数の値(2) は、これ以後、この変数(var)を利用しては参照できなくなる) */
/* => 元の値を利用して新しい値を定める=>「情報の蓄積」に相当する */
printf ( "var = %d\n", var );
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
int sum = 0; /* 変数は宣言と同時に代入が可能(初期代入) */
/* この文は、実質
int sum;
smu = 0;
の二つの表現とほぼ同様 */
int n = 1;
/*
変数名 | 値
--------+-------
sum | 0
n | 1
*/
printf ( "n = %d : sum = %d\n", n, sum );
sum = sum + n;
n = n + 1;
/*
変数名 | 値
--------+-------
sum | 1
n | 2
*/
printf ( "n = %d : sum = %d\n", n, sum );
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
int sum = 0;
int n = 1;
printf ( "n = %d : sum = %d\n", n, sum );
sum = sum + n;
n = n + 1;
printf ( "n = %d : sum = %d\n", n, sum );
sum = sum + n;
n = n + 1;
printf ( "n = %d : sum = %d\n", n, sum );
sum = sum + n;
n = n + 1;
printf ( "n = %d : sum = %d\n", n, sum );
sum = sum + n;
n = n + 1;
printf ( "n = %d : sum = %d\n", n, sum );
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
int sum = 0;
int n = 1;
printf ( "n = %d : sum = %d\n", n, sum );
sum = sum + n;
n = n + 2;
printf ( "n = %d : sum = %d\n", n, sum );
sum = sum + n;
n = n + 2;
printf ( "n = %d : sum = %d\n", n, sum );
sum = sum + n;
n = n + 2;
printf ( "n = %d : sum = %d\n", n, sum );
sum = sum + n;
n = n + 2;
printf ( "n = %d : sum = %d\n", n, sum );
return 0;
}
/*
四角数 : ものを四角く並べた時に、その個数
*
* 1 1
o* 4 3
**
oo* 9 5
oo*
***
*/
#include <stdio.h>
/*
同じ命令を繰り返す
概論 A => 再帰を利用する
<= 今回、新しく、while を利用する事にする
while 構文を利用した、繰り返し
0. 繰り返したい部分を抜き出す
1. その部分をブロック化する
2. ブロックの先頭に while() 挿入
=> 0 の部分が繰り返される
3. while の後ろの () の中に、繰り返すために必要な条件(式)をかく
*/
int main(int argc, char *argv[]) {
int sum = 0; /* 初期化 */
int n = 1;
printf ( "n = %d : sum = %d\n", n, sum ); /* 初期状態の確認 */
while ( 1 == 1 ) { /* 1 == 1 これは常に真なのいつでも成立 */
/* 繰り返しの部分 => ここから*/ /* 同じ事を繰り返す */
sum = sum + n;
n = n + 2;
printf ( "n = %d : sum = %d\n", n, sum );
/* 繰り返しの部分 <= ここまで*/
}
return 0;
}
/*
このプログラムは、while の条件が常に真なので、無限回繰り返す(無限ループ)
表示を一時的に止めるには、Ctrl-S ( [Ctrl] + [s] )
表示を再開するには、 Ctrl-Q とする
プログラムを(強制的に..)終了させるには、Ctrl-C お押す
*/
#include <stdio.h>
/*
while 構文の挙動
0. 条件式をチェックする
もし、成立していなければ、何もせず、while 構文の次の命令に行く
1. ブロック内の繰り返しの命令を行う
2. 0. に戻る
もし、最初から条件が不成立の場合は、一度も繰り返さない
=> なにかをする前に、してもよいかどうかを判定する仕組み
while 構文の良い性質
# do - while という構文もある(多分説明しない..)
# => while と違って、命令を実行してから、チェックを行う
*/
int main(int argc, char *argv[]) {
int sum = 0; /* 初期化 */
int n = 1;
printf ( "n = %d : sum = %d\n", n, sum ); /* 初期状態の確認 */
while ( n < 10 ) { /* n < 10 の時だけ実行する */
/* この条件判断には、繰り返す命令の中にある代入文の左辺に現れる変数を利用する(必要がある) */
sum = sum + n;
n = n + 2;
printf ( "n = %d : sum = %d\n", n, sum );
}
/* while 構文の繰り返しの部分には、「代入文」が不可欠 */
return 0;
}
/*
このプログラムは、while の条件が常に真なので、無限回繰り返す(無限ループ)
表示を一時的に止めるには、Ctrl-S ( [Ctrl] + [s] )
表示を再開するには、 Ctrl-Q とする
プログラムを(強制的に..)終了させるには、Ctrl-C お押す
*/
#include <stdio.h>
/*
while 構文を利用して、 1 から 10 の値を出力する
0. やりたいことを、具体的記述する ( .. を利用してよい )
=> 違う表現を並べたものになる可能性がある
1. 変数の更新を利用して、違う表現によって実現されている異なる命令を、
同じ表現によって、異なる命令を実行する形に書き換える
# 命令の違いを変数の値の違いで、置き換えている
=> 同じ表現の繰りかえしになる
2. 繰り返し現れる、命令を while 構文でくくって、
あとは、繰り返しの条件を追加する
cf. 繰り返しを使わない場合(順接で実現する場合)は、命令の終わりが、実行終わりになる
=> 終わりの条件を明示的に記述する必要はない
*/
int main(int argc, char *argv[]) {
int i = 1; /* while 構文の制御変数(while 構文の条件式の中に出現して、while 構文の振る舞いを制御する) */
/*
printf ( "i=%d\n", i );
i = 2;
..
printf ( "i=%d\n", i );
i = 11;
+/
/*
printf ( "i=%d\n", i );
i = i + 1;
..
printf ( "i=%d\n", i );
i = i + 1;
*/
while ( i <= 10 ) { /* i が 10 以下であれば繰り返す */
printf ( "i=%d\n", i );
i = i + 1;
}
return 0;
}
#include <stdio.h>
/*
while 構文は、機械的に、再帰呼び出しに書き換える事が可能
実は、逆の書き換え( 再帰を while 構文に)は、原理的には可能だが、
機械的に書き換えるのは、簡単ではない
=> 再帰の方が、複雑で、表現能力が高い
*/
void print1to10( int i ) {
if ( i <= 10 ) {
printf ( "i=%d\n", i );
print1to10 ( i + 1 );/* i = i + 1; */
} else {
/* do nothing */
}
}
int main(int argc, char *argv[]) {
/*
int i = 1;
while ( i <= 10 ) {
printf ( "i=%d\n", i );
i = i + 1;
}
*/
print1to10 ( 1 ); /* i = 1 */
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
int var; /* 入力した値を保存する変数 */
printf ( "キーボードから、整数値を一つ入力してください : " );
/* プロンプト(入力促進表示) : 「入力してくださいね」表示 */
scanf ( "%d", &var ); /* 変数 var には、キーボードから入力された
(整数値表現する文字列を対応する整数値に変換した)値
が代入される */
/* scanf は(printf と同じように..) 最初の引数は書式指定を含む文字列 */
/* この書式指定は、キーボードから入力された「文字列」から、
その書式にしたがった、データに変換して、その値を、
後に続く、変数のポインター値(<=未定義用語)の指す変数に保存する */
/* &は、変数の前につけて、変数のポインター値を求める演算(今回は説明しない) */
printf ( "キーボードから整数値 (%d) が入力されました\n", var );
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
int var; /* 入力した値を保存する変数 */
printf ( "キーボードから、整数値を一つ入力してください : " );
scanf ( "%d", &var );
/*
%d 整数値
%c 文字
(%s : 文字列)
!!! scanf を使う時には(なぜだか説明はしないが..) 代入する変数の前に & を付ける
!!! => つけ忘れると、何が起きるかは、不明(入力はおもったようにゆかない)
!!! scanf の書式には、書式指定以外のものを(いれてもよくて、それには、それなりの重要な意味があるが、)
!!! いれないことを強く推奨する。
*/
printf ( "キーボードから整数値 (%d) が入力されました\n", var + 1 );
return 0;
}
2019/09/27
[前回]
ガイダンス
A と同じ
A の内容は既知とする
コンピュータの技術は、ならった事は、次の時にそのまま利用しする
=> 全部習得していないと、次に進めない
私語厳禁
新しい内容
変数への「代入」
構文 : 変数名 = 式
式の計算した結果の値が、(その代入文を実行した後は)その変数の値となる
代入の性質
0. 変数は、宣言しただけでは、値が定まらない
=> 必ず、利用するまえに、代入をして値を定める(初期化)必要がある
1. 代入によって、変数の値が変化する
=> (間接的に、その変数を利用している命令の結果が変化する)
2. 代入には、前後関係があって
代入前 (元の値)と、代入後(新しい値)
という「時間」の概念が導入される
3. 代入が行われると、元の値は、(その変数を経由して)参照する事ができなくなる
値の破壊
4. 代入文の式(右辺)に、これから代入する変数(左辺)を参照する事ができる
=> 変数の以前の値を利用して、変数の新しい値を計算する事になる
=> 計算の蓄積(計算結果の蓄積)になる
例 : それを繰り返せば、「総和(Σ)」の計算を行う
(変数の)値の更新と、繰り返しが組み合わされたものが、総和
printf の書式機能の利用
[今回]
変数の更新(代入文の右辺の式の中に、左辺に変数を含める形の代入文)
それを繰り返す事によって、すこしずつ、答えに近づけて、最終的に、
その答えを求めるとというアプローチ(考え方)に対応した表現
動的なアプローチ
!! 数学では、「無限回」が許されるが、計算機では、「有限」である必要である必要があるので
!! => (連続量ではなく..)離散量を利用して、「有限回」で終わらせるか
!!あるいは
!! => 有限回数で終わらせる代わりに、「誤差(答えとの少しの違い)」を許容する立場をとる必要がある
while 構文
命令を繰り返すための(もう一つの:再帰でない)方法
繰り返す部分を {} でかこみ、その前に while(条件)を追加
条件には、繰り返し部分で値が変化する変数を利用する
while 構文と再帰の関係
ともに、繰り返しを行うための仕組み
while 構文を利用するには、代入文が必要
再帰を利用するには、引数付き関数の定義が必要
while 構文で記述された部分は、機械的に、再帰関数に書き換える事ができる
# 逆も可能だが、簡単とは限らない
scanf
scan with format => いろいろなデータの入力に利用できる
通常は printf と対にして覚える
!!! printf は、まちがっても、せいぜい、変な表示になるだけ
!!! scanf は、間違えると、プログラムが異常停止するような不可解な振る舞いにつながる
!!! => why : 今は説明しない
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20190927-01.c
/*
* 課題 CNAME-01
*
* CDATE FILENAME
*
* キーボードから一文字入力し、その文字によって異る国の挨拶をする
*/
#include <stdio.h>
/*
* hello ( char contry )
* char contry : 国を表す一文字
* j : 日本
* e : 英語
* c : 中国
* f : フランス語
* g : ドイツ語
*/
void hello ( char cmd ) {
switch ( cmd ) {
case 'j': /* 'j' の時は、日本語にする */
printf ( "こんにちは\n" );
break;
case 'e': /* 'e' の時は、英語にする */
/*
** この部分を完成させなさい
*/
break;
case 'c': /* 'c' の時は、中国語にする */
printf ( "ニイハオ\n" );
/*
** この部分を完成させなさい
*/
case 'f': /* 'f' の時は、フランス語にする */
printf ( "Bonjour\n" );
break;
/*
** この部分を完成させなさい
*/
printf ( "Guten tag\n" );
break;
default: /* どれでもなければ.. */
printf ( "???\n" );
break;
}
}
/*
* main
*/
int main( void )
{
printf ( "国を表す文字を入力してください\n" );
printf ( "\tj\t日本\n" );
printf ( "\te\t英語\n" );
printf ( "\tc\t中国\n" );
printf ( "\tf\tフランス\n" );
printf ( "\tg\tドイツ\n" );
hello ( getchar() ); /* getchar() で文字を入力し、それに対応する結果を出す */
return 0;
}
f
$ ./20190927-01-QQQQ.exe 国を表す文字を入力してください j 日本 e 英語 c 中国 f フランス g ドイツ Bonjour $
Download : 20190927-02.c
/*
* 課題 CNAME-02
*
* 20190927 20190927-02-QQQQ.c
*
* 0 〜 99 の偶数を出力する
*
*/
#include <stdio.h>
/*
* for 文を利用して、0 から 99 の偶数の数値
(そのニ) i が 0 〜 99 の間の偶数だけを動くようにし、毎回 i を出す
*/
int main(int ac, char *av[] ) {
int i; /* for 文の制御変数 */
for ( i = 0; i < 100; /* p:ここ */ ) {
/* i++ だと i = 0, 1, 2, .. */
/* ○○とすれば i = 0, 2, 4, .. */
printf ( "%d\n", i ); /* i を出力 */
}
return 0;
}
$ ./20190927-02-QQQQ.exe 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 $