Download : sample-001.c
/*
* 2018/10/26 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
/*
* 2018/10/26 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
/*
* 2018/10/26 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
/*
* 2018/10/26 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
/*
* 2018/10/26 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
/*
* 2018/10/26 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
/*
* 2018/10/26 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
/*
* 2018/10/26 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
/*
* 2018/10/26 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-01
*
* 20181019 20181019-01-QQQQ.c
*
* printf の書式指定
*
*/
#include <stdio.h>
/*
* 課題の目的: printf を使ってみる(書式指定:浮動小数点数は %f を利用)
*/
/*
* main
*/
int main( int argc, char *argv[] )
{
int ia = 7;
int ib = 15;
double da = 3.14;
double db = 1.59;
printf ( "%d + %d = %d\n", ia, ib, ia + ib ); /* 整数型の和 */
/* => 「7 + 15 = 22」 */
printf ( "%f / %f = /* r:ここ */\n", /* s:ここ */, /* u:ここ */, /* s:ここ */ / /* u:ここ */ ); /* 浮動小数点数の商 */
/* => 「3.14 / 1.59 = ...」 */
return 0;
}
/*
* 課題 CNAME-02
*
* 20181019 20181019-02-QQQQ.c
*
* scanf の書式指定
* scanf の最初の引数は「書式指定」(のみ)を含んだ書式文字列
* 二つ目以後は、&を先行した変数名の並び
*/
#include <stdio.h>
/*
*
*/
/*
* main
*/
int main( int argc, char *argv[] )
{
int i; /* キーボードから入力された整数値を保持する整数型変数 */
double d; /* キーボードから入力された浮動小数点数値を保持する浮動小数点数型変数 */
printf ( "整数値をキーボードから入力します : " );
scanf ( "%d", &i );
printf ( "入力された整数値は %d でした。\n", i );
printf ( "浮動小数点数値をキーボードから入力します : " );
scanf ( "%lf", &d ); /* 浮動小数点数は、出力は %f だが、入力は %lf を使う */
printf ( "入力された浮動小数点数値は %f でした。\n", d );
/* 詳しくは、C 言語、printf、書式指定、でググる */
return 0;
}
/*
* 課題 CNAME-03
*
* CDATE FILENAME
*
* 代入文
* 整数型変数 ( a, b, c ) を三つ宣言する
* 整数型変数 a, b にそれぞれ、123, 4 を代入する
* 整数型変数 c に a と b の和を代入する
* 整数型変数 c の値を画面に出力する
*/
/*
代入文の使い方と変数宣言
ブロックの先頭で、適切な型で変数を宣言する事
代入文では、(宣言によって型が明確になった)変数が使われる
# cf. 変数宣言を忘れると、コンパイラが教えてくれる(Error になる)
*/
#include <stdio.h>
#include "s_print.h"
/*
* main
*/
int main( int argc, char *argv[] )
{
/* 整数型変数 a の宣言 */
int a;
/* 整数型変数 b の宣言 */
int b; /* 変数 b が宣言されたので、関数内で,
変数 b が利用できる */
/* 整数型変数 c の宣言 */
int c;
/* 整数型変数 a に 123 を代入 */
a = 123;
/* 整数型変数 b に 4 を代入 */
b = 4; /* この代入によって、はじめて、変数 b の
値は 4 になる */
/* それまでの変数 b の値は、「不定」である */
/* 整数型変数 c に、変数 a と 変数 b の和を代入 */
c = a + b;
/* 整数型変数 c の値を画面に出力 */
s_print_string ( "変数 c の値は " );
s_print_int ( c );
s_print_string ( " です。\n" );
return 0;
}
/*
* 課題 CNAME-04
*
* CDATE FILENAME
*
* while 文
*/
#include <stdio.h>
#include "s_print.h"
/*
* main
*/
int main( int argc, char *argv[] )
{
/* 整数型変数 odd の宣言とその初期化 ( 初期値は 1 を指定 ) */
int odd = 1;
/* 整数型変数 sum の宣言とその初期化 ( 初期値は 0 を指定 ) */
int sum = 0;
/*
sum = 1 + 3 + .. + 9 = 25 = 5^2
sum = 0 + 1 + 3 + .. + 9 = 25 = 5^2
sum = (...((0 + 1) + 3) )+ .. )+ 9 = 25
sum = sum + odd を繰り返す
*/
/* odd の値が 9 以下の間は繰り返す */
while ( odd <= 9 ) {
/* sum に odd の値を「追加」する */
sum = sum + odd; /* 再帰の時の「蓄積型」 */
/* odd の値を次の奇数にする */
odd = odd + 2;
}
/* 整数型変数 sum の値を画面に出力 */
s_print_string ( "1 から 9 までの奇数の和は " );
s_print_int ( sum );
s_print_string ( " です。\n" );
return 0;
}
#include <stdio.h>
#include "s_print.h"
void print_n ( int n ) {
/* 変数 n の値は 10 */
s_print_int ( n ); /* n に 10 が指定されているので .. */
s_print_newline(); /* 「10<改行>」を出力する */
n = 100; /* 代入を行う */
/* 変数 n の値が 100 に変わる */
/* もともともっていた値 10 は、
(変数 n を利用しては..) 参照できなくなる */
/* 代入によって、代入以前と以後では、同じ命令列でも
異なる結果になる */
/* 上の 8,9 行目の命令をコピーした... */
s_print_int ( n ); /* n に 100 が代入されているので .. */
s_print_newline(); /* 「100<改行>」を出力する */
}
int main(int argc, char *argv[] ) {
print_n ( 10 );
/*
print_n ( 10 )
=> print_n ( n ) / n = 10
=>
n = 10
s_print_int ( n );
s_print_newline();
=>
s_print_int ( 10 );
s_print_newline();
cf.
n = 10; 等式ではなく、代入
s_print_int ( n );
s_print_newline();
*/
return 0;
}
#include <stdio.h>
#include "s_print.h"
/*
?t?B?{?i?b?`????A?[?I??`
fib_0 = 0
fib_1 = 1
fib_{k} = fib_{k-1} + fib_{k-2} (k>1)
{fib_i} = 0, 1, 1, 2, 3, 5, 8, ...
*/
int fib(int k) {
if ( k == 0 ) {
return 0;
} else if ( k == 1 ) {
return 1;
} else {
return fib( k-1 ) + fib( k - 2 );
}
}
int main(int argc, char *argv[] ) {
s_print_int ( fib ( 5 ) );
/*
f5 = f4 + f3
= (f3+f2) + (f2+f1)
= ((f2+f1)+(f1+f0)) + ((f1+f0)+f1)
= (((f1+f0)+f1)+(f1+f0)) + ((f1+f0)+f1)
= (((1+0)+1)+(1+0)) + ((1+0)+1)
f5 = 5 ????? 5 ??v?Z??????????A???????? 1 ??
5???????K?v??????
???
f_n ??l??A2^n ???x?????????
?????Af_100 => 2^100 => 2^100 ??? 1 ????????
2^100 = (2^10)^10 = (10^3)^10 = 10^30
*/
s_print_newline();
return 0;
}
#include <stdio.h>
#include "s_print.h"
/*
f_5 ?????????v?Z??????
*/
int main(int argc, char *argv[]) {
int f0=0;
int f1=1;
int f2=f0+f1;
int f3=f2+f1;
int f4=f3+f2;
int f5=f4+f3;
/*
f5 ??v?Z?? 4 ???????Z
f_100 ??v?Z?? 99?@??????Z?????
*/
s_print_int ( f5 );
s_print_newline();
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[] ) {
int a = 100;
int b = 15;
int wa = a + b;
printf ( "%d と %d の和は %d です。\n", a, b, wa );
/* ^^ ^^ ^^ = = == */
/* 「<aの値> と <bの値> の和は <waの値> です。」と表示される */
/*
s_print_int ( a );
s_print_string ( " と " );
s_print_int ( b );
s_print_string ( " の和は " );
s_print_int ( wa );
s_print_string ( "です\n" );
*/
return 0;
}
#include <stdio.h>
void print_int ( int n ) {
printf ( "v = %d\n", n ); /* %d は整数値の出力書式 */
}
void print_double ( double d ) {
printf ( "v = %f\n", d ); /* %f は、浮動小数点数の出力書式 */
}
#include <stdio.h>
/* プロトタイプ宣言をして、引数の型に関する情報を提供する */
extern void print_int ( int );
extern void print_double ( double );
/*
普通に関数呼び出しを利用するとき
型の情報は重要
関数の引数の型宣言を利用して、制御する(事ができる)
*/
int main(int argc, char *argv[]) {
/*
print_int ( 100 );
print_double ( 3.14 );
*/
print_int ( 100.0 );
print_double ( 314 );
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
/*
printf ( "v = %d\n", 100 );
printf ( "v = %f\n", 3.14 );
*/
printf ( "v = %d\n", 100.0 );
printf ( "v = %f\n", 314 );
return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]) {
int a; /* 割られる整数値を保存する変数 */
int b; /* 割る整数値を保存する変数 */
printf ( "割られる数を入力してください : " );
scanf ( "%d", &a );
/* 書式指定で「%d」を指定しているので、整数値を読み込む */
/* その読み込んだ値は、その後ろの 「&」がついた変数名(a)の
変数に代入される */
/*
書式は、(基本)printf と共通
ただし、「ふつうは」書式指定しか入れない(%xx 以外はいれない)
そのあとの引数(代入する変数)には、& を付ける必要がある
*/
printf ( "割る数を入力してください : " );
scanf ( "%d", &b );
printf ( "%d を %d で割ると、%d になります。\n", a, b, a/b );
return 0;
}
#include <stdio.h>
/*
1 ???? 10 ????????o?????v???O????
print_to_n ( 10 )
1
2
3
..
9
10
=>
1
2
3
..
9
10
=>
print_to_n ( 9 )
printf ( "%d\n", n ); n=10
*/
void print_to_n ( int n ) {
if ( n <= 0 ) {
/* ????????? */
} else {
print_to_n ( n - 1 );
printf ( "%d\n", n );
}
}
int main(int argc, char *argv[]) {
print_to_n ( 10 );
return 0;
}
#include <stdio.h>
/*
1 ???? 10 ????????o?????v???O????
print_to_n ( 10 )
1
2
3
..
9
10
=>
1
2
3
..
9
10
=>
print_to_n ( 9 )
printf ( "%d\n", n ); n=10
*/
void print_to_n ( int n ) {
if ( n <= 0 ) {
/* ????????? */
} else {
print_to_n ( n - 1 );
printf ( "%d\n", n );
}
}
int main(int argc, char *argv[]) {
int n = 1; /* ??????????J???????A??????X???????
?ω??????????K?v : ??? n */
/* ????? n ?? 1 ????A?????? */
while ( n <= 10 ) { /* n ?? 10 ????????? */
printf ( "%d\n", n ); /* n = 1, 2, ..., 10 */
n = n + 1; /* ???? n ??l?? 1 ????????An ???????? */
/* C ?????u=?v??A?u????L???v?????A?u?????L???v????? */
/* C ?????u?????L???v??A?u==?v??p???? */
}
return 0;
}
/*
void fwhile ( int n ) {
if ( n <= 10 ) {
printf ( "%d\n", n );
fwhile ( n + 1 );
} else {
}
}
fwhle ( 1 ); n = 1;
*/
[前回]
構文
代入文
構文 : 変数名 = 式
意味 : 「式」の値を計算して、その結果を「変数名」が表す変数に「代入」する
代入 : 変数の値を変更する
以前にもっていた変数値は、「変数の値」でなくなる
代入後は、代入された値が、「変数の値」になる
cf. 変数:変数名で、変数の値を参照(取り出す)仕組み
=> 関数の仮引数変数:(これまでは)値が一度設定されると、それ以後は変化しなかった(パラメータ)
「代入」の機能は、関数の仮引数変数に対して、関数呼び出しをする時に働いていた
# 「代入文」インパクト
# 代入文の前と後では、「同じ表現の結果が変わる」
# 代入は基本的な機能 : 使い分けが難しい
# 自由に使うのではなく、制限して使うと協力かつ安全
# cf. 関数の仮引数変数への実引数値の代入は、制限された代入の例で、安全かつ強力
## C 言語の設計思想
## 危ないけど強力な機能を、シンプルに提供する(実行効率を高める)
## => 使いこなしは、プログラマの技量に任せる
変数宣言
構文 : 型名 変数名
意味 : その「型名」の表す型を持つ変数を用意し、「変数名」の名前を付ける
=> 新しい変数作られる
# cf. 関数の仮引数宣言 : 制限された変数宣言
# 関数の仮引数変数は、関数呼び出しの実引数の値で初期化されている
# 変数宣言は、ブロック 「{ ? } の間」の先頭でのみ、行われ
# その変数の有効(スコープ)は、そのブロック内のみである
# 例外: 関数の仮引数変数は、関数のヘッド部(引数の所)に
# 記載されるが、その有効範囲は、ボディ部({ ? } の間)になる
# => 関数の仮引数変数のスコープは、関数内全域になる
「変数」と「代入」を多用する理由
=> いったん計算した結果を、変数に代入して、使いまわす
=> 同じ計算を回避できるので、効率的になる
==
printf の正体
前回以前 : printf は引数に文字列を指定して、その文字列を画面に表示する
=> 文字列表示専用の関数
# cf 文字列以外の出力 s_print_aaaa を使え..
実は、printf は出力の万能選手で、いろいろな型の値を出力できる
構文 : printf ( 書式文字列, 必要に応じて追加の値 )
意味 : 基本は書式文字列を画面に出力するが、
その文字列の中の書式指定(%から始まる)があると、
その部分に、指定された型で、追加された値を、順に当てはめて出力をする
具体的な例
printf ( "x=%d\n", 1+2+3 );
x=6<改行> /* %d が 6 に置き換わる */
cf. C 言語には、文字列を出力する puts がある
=> Hello World では puts でもかまわなかった
にも拘わらず、printf を使っている
=> K&R は、printfを自慢したかった可能性がある
!! printf は非常に強力
printf はすごく変
引数の個数がかわったり、
引数の型がかわったりする
# 「printf の原理」=> 時間があれば、説明したい
1. printf という大変便利なものがあるので活用しよう
# cf. s_print.h よ、おさらば
2. 1. にも拘わらず、printf は注意深く利用する必要がある
[今日の話]
printf : 出力 <-> 入力 : scanf
scanf : さらに注意が必要
=> 詳しくは、また後回し
構文 : scanf ( 書式, &をつけた変数(名)を並べる )
意味 : 「書式」で指定した型の値をキーボードから入力し、
そのあとの引数で指定した変数に代入する
!!!! 実は、「嘘」だが、そのようにまず理解してお
while 構文
構文 : while ( 条件 ) { 命令 }
意味 : 「条件」が成立している限り「命令」を繰り返す
cf. 繰り返しを行う構文 (これまでは、再帰呼び出して実現)
=> 関数を作らずに「繰り返し」が実現できる
[ポイント] 「命令」を実行すると、「条件」が変化する可能性がある必要がある
ふつうは、条件に変数を入れて、命令の中でその変数の値を代入を利用して、変化させる
# cf. while 文は、いつでも、形式的に再帰関数に変換できる
# while ( 条件 ) { 命令; 変数の変更 }
# 例 : 条件 ( n <= 10 ) / 命令 : printf () / 変数の変更 n = n + 1
#
# while( 変数:代入文の左 ) {
# if ( 条件 ) {
# 命令
# fwhile ( 代入文の右 );
# } else {}
# }
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20181026-01.c
/*
* 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
$ ./20181026-01-QQQQ.exe 国を表す文字を入力してください j 日本 e 英語 c 中国 f フランス g ドイツ Bonjour $
Download : 20181026-02.c
/*
* 課題 CNAME-02
*
* 20181026 20181026-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;
}
$ ./20181026-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 $