Download : sample-001.c
/*
* 2021/07/02 sample-001.c
*
* [コンパイル]
* cc -I ~/include -c sample-001.c
* [リンク]
* cc -o sample-001.exe sample-001.o
* [実行]
* ./sample-001.exe
*/
/*
* 入力を一度だけ処理
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* main 関数
*/
int main ( int argc, char *argv[] ) {
s_print_string ( "整数値を一つ入力してください、一つ増やした値を出力します:" );
s_print_int ( s_input_int() + 1 ); /* 整数値を入力し、1 を増やし、出力 */
s_print_newline();
return 0;
}
123
$ ./sample-001.exe < sample-001.in 整数値を一つ入力してください、一つ増やした値を出力します:123 124 $
Download : sample-002.c
/*
* 2021/07/02 sample-002.c
*
* [コンパイル]
* cc -I ~/include -c sample-002.c
* [リンク]
* cc -o sample-002.exe sample-002.o
* [実行]
* ./sample-002.exe
*/
/*
* 入力を複数回処理
* 入力関数(s_input_int())が呼び出される度に、入力が行われる
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* main 関数
*/
int main ( int argc, char *argv[] ) {
/*
* 一回目
*/
s_print_string ( "一回目:整数値を一つ入力してください、一つ増やした値を出力します:" );
s_print_int ( s_input_int() + 1 );
s_print_newline();
/*
* ニ回目
*/
s_print_string ( "ニ回目:整数値を一つ入力してください、一つ増やした値を出力します:" );
s_print_int ( s_input_int() + 1 );
s_print_newline();
/*
*
*/
return 0;
}
123 456
$ ./sample-002.exe < sample-002.in 一回目:整数値を一つ入力してください、一つ増やした値を出力します:123 124 ニ回目:整数値を一つ入力してください、一つ増やした値を出力します:456 457 $
Download : sample-003.c
/*
* 2021/07/02 sample-003.c
*
* [コンパイル]
* cc -I ~/include -c sample-003.c
* [リンク]
* cc -o sample-003.exe sample-003.o
* [実行]
* ./sample-003.exe
*/
/*
* 一つの入力を複数回処理
* 入力関数の呼出し(入力)は一回だが、値(入力値)は複数利用したい
* 関数(変数)を利用するしかない
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* 引数で与えらえた値を複数回利用する(関数/引数変数の特権 !!)
*/
void print_add_one_result ( int value ) {
s_print_string ( "整数値 " );
s_print_int ( value ); /* 一度目の利用 */
s_print_string ( " に 1 を加えた値は " );
s_print_int ( value + 1 ); /* 二度目の利用 */
s_print_string ( "これを 2 倍した値は " );
s_print_int ( value * 2 ); /* 三度目の利用 */
s_print_string ( " になります。\n" );
}
/*
* main 関数
*/
int main ( int argc, char *argv[] ) {
/*
* 一回目
*/
print_add_one_result ( s_input_int() ); /* 「入力(機能)」は「ここ」で一回 */
/* 「入力値」は、関数内で、何度も利用可能 */
/*
* ニ回目
*/
print_add_one_result ( s_input_int() ); /* 二度目の入力 */
/*
*
*/
return 0;
}
123 456
$ ./sample-003.exe < sample-003.in 123 整数値 123 に 1 を加えた値は 124これを 2 倍した値は 246 になります。 456 整数値 456 に 1 を加えた値は 457これを 2 倍した値は 912 になります。 $
Download : sample-004.c
/*
* 2021/07/02 sample-004.c
*
* [コンパイル]
* cc -I ~/include -c sample-004.c
* [リンク]
* cc -o sample-004.exe sample-004.o
* [実行]
* ./sample-004.exe
*/
/*
* インプットループ
* 入力を繰り返す関数
*/
#include <stdio.h>
/*
* 改行 ('\n') が入力されるまで、文字を入力し、それを二度ずつ出力する
*/
void print_twice_char ( char ch ) {
putchar ( ch ); /* とりあえず二度出力 */
putchar ( ch );
if ( ch == '\n' ) { /* 改行だった / もうこれ以上処理しない */
/* 何もしない */
} else { /* まだ処理する必要がある */
print_twice_char ( getchar() ); /* 入力をして、再帰 */
}
}
/*
* main 関数
*/
int main ( int argc, char *argv[] ) {
/*
* 最初の呼出しは main で..
*/
print_twice_char ( getchar() );
/*
*
*/
return 0;
}
abc$
$ ./sample-004.exe < sample-004.in abc$ aabbcc$$ $
Download : sample-005.c
/*
* 2021/07/02 sample-005.c
*
* [コンパイル]
* cc -I ~/include -c sample-005.c
* [リンク]
* cc -o sample-005.exe sample-005.o
* [実行]
* ./sample-005.exe
*/
/*
* 乱数
*/
#include <stdio.h>
#include "s_print.h"
#include "s_random.h" /* s_random を利用するので.. */
/*
s_init_random() --- 乱数系列を現在の時刻を利用して決定
s_random() --- 整数値を持つ(疑似)一様乱数を返す
*/
/*
* main 関数
*/
int main ( int argc, char *argv[] ) {
/*
*
*/
s_init_random(); /* 乱数系列の初期化 */
/*
*
*/
s_print_string ( "乱数を出力します : " );
s_print_int ( s_random() );
s_print_newline();
/*
*
*/
return 0;
}
$ ./sample-005.exe 乱数を出力します : 725633840 $
/*
* 課題 CNAME-01
*
* CDATE FILENAME
*
* キーボードから一文字入力し、その文字によって異る国の挨拶をする
*/
#include <stdio.h>
/*
* hello ( char contry )
* char contry : 国を表す一文字
* j : 日本
* e : 英語
* c : 中国
* f : フランス語
* g : ドイツ語
*/
void hello ( char cmd ) {
/* if 構文版を参考してほしい */
switch ( cmd ) {
case 'j': /* 'j' の時は、日本語にする */
printf ( "こんにちは\n" );
break;
case 'e': /* 'e' の時は、英語にする */
printf ( "Good Afternoon\n" );
break;
case 'c': /* 'c' の時は、中国語にする */
printf ( "ニイハオ\n" );
break;
case 'f': /* 'f' の時は、フランス語にする */
printf ( "Bonjour\n" );
break;
case 'g': /* 'g' の時は、ドイツ語にする */
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;
}
#include <stdio.h>
/*
関数
f(x) = x^2
*/
#include "s_print.h"
#include "s_input.h"
/*
与えれた整数値を二乗した値を返す関数
*/
int f (int x) {
/* x^2 = x * x */
return x * x; /* return 命令によって、関数が返す値を指定することができる */
/* return 命令の後ろに、
返したい値を計算する式を書くと、
その式の値が計算され、関数の返り値になる
この命令を実行すると、
関数はその時点で終了になる
!! 値を返さない ( void 関数 ) の場合であっても
!! return 命令の後ろに式を書かず、return; 命令を実行することができる
!! => その時点で、関数を終了させ、関数の呼び出し元に戻る
!! return 命令は、「制御命令」である
!! 制御命令 : 命令の実行順序を変更する命令
!! if 構文
*/
}
int main(void) {
s_print_string ( "整数値を入力してください : " );
s_print_int ( f( s_input_int() ) );
s_print_newline();
return 0;
}
#include <stdio.h>
int f(int x) {
printf ( "関数 f が呼び出されました\n" );
return x * x;
}
int g(int x) {
printf ( "関数 g が呼び出されました\n" );
return x + 2;
}
int h(int x) {
printf ( "関数 h が呼び出されました\n" );
return 3 * x;
}
int main(void) {
printf ( "Main Start\n" );
f(g(h(1))); /* 計算は行われるが結果は捨てられる */
printf ( "Main End\n" );
return 0;
}
#include <stdio.h>
int f(int x, int y) {
printf ( "関数 f が呼び出されました\n" );
return x * y;
}
int g(int x) {
printf ( "関数 g が呼び出されました\n" );
return x + 2;
}
int h(int x) {
printf ( "関数 h が呼び出されました\n" );
return 3 * x;
}
int main(void) {
printf ( "Main Start\n" );
f(g(2),h(3)); /* 計算は行われるが結果は捨てられる */
printf ( "Main End\n" );
return 0;
}
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
トランプの数から、その札のマークを出力
1 => A
2-10 => そのまま数字
11 => J
12 => Q
13 => K
その他の場合 => ?
if 構文を利用した版
*/
void trump ( int n ) {
if ( n == 1 ) {
printf ( "A\n" );
} else if ( n == 11 ) {
printf ( "J\n" );
} else if ( n == 12 ) {
printf ( "Q\n" );
} else if ( n == 13 ) {
printf ( "K\n" );
} else {
if ( 2 <= n ) {
if ( n <= 10 ) {
s_print_int ( n );
s_print_newline();
} else {
s_print_string ( "?\n" );
}
} else {
s_print_string ( "?\n" );
}
}
}
int main(void) {
printf ( "整数値を入力し、それに対応するトランプのマークを出力します : " );
trump ( s_input_int() );
return 0;
}
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
トランプの数から、その札のマークを出力
1 => A
2-10 => そのまま数字
11 => J
12 => Q
13 => K
その他の場合 => ?
switch 構文を利用した場合
*/
void trump ( int n ) {
switch ( n ) { /* 一つの共通な式「n」に対して.. */
case 1: /* その値が 1 の時 */
/*
if ( n == 1 ) {
printf ( "A\n" );
}
*/
printf ( "A\n" );
break; /* case 1 ( n == 1 ) の命令は、ここで終了 */
case 11: /* その値が 11 の時 */
/*
if ( n == 11 ) {
printf ( "J\n" );
}
*/
printf ( "J\n" );
break;
case 12: /* その値が 12 の時 */
/*
if ( n == 12 ) {
printf ( "Q\n" );
}
*/
printf ( "Q\n" );
break;
case 13: /* その値が 13 の時 */
/*
if ( n == 13 ) {
printf ( "Q\n" );
}
*/
printf ( "K\n" );
break;
default: /* 上記のどれにも当てはまらない場合 */
/*
else 節
*/
if ( 2 <= n ) {
if ( n <= 10 ) {
s_print_int ( n );
s_print_newline();
} else {
s_print_string ( "?\n" );
}
} else {
s_print_string ( "?\n" );
}
break;
}
}
int main(void) {
printf ( "整数値を入力し、それに対応するトランプのマークを出力します : " );
trump ( s_input_int() );
return 0;
}
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
トランプの数から、その札のマークを出力
1 => A
2-10 => そのまま数字
11 => J
12 => Q
13 => K
その他の場合 => ?
switch 構文で、break を上手に利用する場合
*/
void trump ( int n ) {
switch ( n ) { /* 一つの共通な式「n」に対して.. */
case 1: /* その値が 1 の時 */
/*
if ( n == 1 ) {
printf ( "A\n" );
}
*/
printf ( "A\n" );
break; /* case 1 ( n == 1 ) の命令は、ここで終了 */
case 11: /* その値が 11 の時 */
/*
if ( n == 11 ) {
printf ( "J\n" );
}
*/
printf ( "J\n" );
break;
case 12: /* その値が 12 の時 */
/*
if ( n == 12 ) {
printf ( "Q\n" );
}
*/
printf ( "Q\n" );
break;
case 13: /* その値が 13 の時 */
/*
if ( n == 13 ) {
printf ( "Q\n" );
}
*/
printf ( "K\n" );
break;
default: /* 上記のどれにも当てはまらない場合 */
/*
else 節
*/
if ( 2 <= n ) {
if ( n <= 10 ) {
/* 2 <= n <= 10 */
s_print_int ( n );
s_print_newline();
break; /* この時に break するので、ここで switch 構文が終了 */
/* この命令の後ろの命令は実行されない */
} /* else {} */
} /* else {} */
s_print_stirng ( "?\n" ); /* この命令は break が実行されない時に実行される */
break;
}
}
int main(void) {
printf ( "整数値を入力し、それに対応するトランプのマークを出力します : " );
trump ( s_input_int() );
return 0;
}
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
トランプの数から、その札のマークを出力
1 => A
2-10 => そのまま数字
11 => J
12 => Q
13 => K
その他の場合 => ?
switch 構文で、break を上手に利用する場合
*/
void trump ( int n ) {
switch ( n ) { /* 一つの共通な式「n」に対して.. */
case 1: /* その値が 1 の時 */
/*
if ( n == 1 ) {
printf ( "A\n" );
}
*/
printf ( "A\n" );
break; /* case 1 ( n == 1 ) の命令は、ここで終了 */
case 11: /* その値が 11 の時 */
/*
if ( n == 11 ) {
printf ( "J\n" );
}
*/
printf ( "J\n" );
break;
case 12: /* その値が 12 の時 */
/*
if ( n == 12 ) {
printf ( "Q\n" );
}
*/
printf ( "Q\n" );
break;
case 13: /* その値が 13 の時 */
/*
if ( n == 13 ) {
printf ( "Q\n" );
}
*/
s_print_int ( n );
s_print_newline();
break;
case 2:
s_print_int ( n );
s_print_newline();
break;
case 3:
s_print_int ( n );
s_print_newline();
break;
case 4:
s_print_int ( n );
s_print_newline();
break;
case 5:
s_print_int ( n );
s_print_newline();
break;
case 6:
s_print_int ( n );
s_print_newline();
break;
case 7:
s_print_int ( n );
s_print_newline();
break;
case 8:
s_print_int ( n );
s_print_newline();
break;
case 9:
s_print_int ( n );
s_print_newline();
break;
case 10:
s_print_int ( n );
s_print_newline();
break;
default: /* 上記のどれにも当てはまらない場合 */
s_print_stirng ( "?\n" ); /* この命令は break が実行されない時に実行される */
break;
}
}
int main(void) {
printf ( "整数値を入力し、それに対応するトランプのマークを出力します : " );
trump ( s_input_int() );
return 0;
}
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
トランプの数から、その札のマークを出力
1 => A
2-10 => そのまま数字
11 => J
12 => Q
13 => K
その他の場合 => ?
switch 構文で、break を上手に利用する場合
*/
void trump ( int n ) {
switch ( n ) { /* 一つの共通な式「n」に対して.. */
case 1: /* その値が 1 の時 */
/*
if ( n == 1 ) {
printf ( "A\n" );
}
*/
printf ( "A\n" );
break; /* case 1 ( n == 1 ) の命令は、ここで終了 */
case 2:
/* break; */ /* break 命令がないので case 2 => case 3 にゆく */
case 3:
/* break; */
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10: /* case 2-9 の場合 break がないので、case 10 のところに雪崩こむ */
s_print_int ( n );
s_print_newline();
break;
case 11: /* その値が 11 の時 */
/*
if ( n == 11 ) {
printf ( "J\n" );
}
*/
printf ( "J\n" );
break;
case 12: /* その値が 12 の時 */
/*
if ( n == 12 ) {
printf ( "Q\n" );
}
*/
printf ( "Q\n" );
break;
case 13: /* その値が 13 の時 */
/*
if ( n == 13 ) {
printf ( "Q\n" );
}
*/
printf ( "K\n" );
break;
default: /* 上記のどれにも当てはまらない場合 */
s_print_stirng ( "?\n" ); /* この命令は break が実行されない時に実行される */
break;
}
}
int main(void) {
printf ( "整数値を入力し、それに対応するトランプのマークを出力します : " );
trump ( s_input_int() );
return 0;
}
#include <stdio.h>
#include "s_print.h"
#include "s_input.h"
/*
階和 sumn(n) = 1 + 2 + .. + (n-1) + n
=> n * ( n + 1 ) / 2
条件 : n >= 0
関数を次のように、再帰的に定義する
数学的帰納法風の表現
1) n=0 の時
sumn(n) = sumn(0) = 0
2) n=k+1 の時
sumn(n) = sumn(k+1) = (k+1)+sumn(k)
とする
0 (n=0 の時)
sumn(n) = {
n + sumn(n-1) (その他 [n>0 の時])
*/
int sumn( int n ) {
if ( n <= 0 ) { /* n = 0 ( n >= 0 という仮定なので..) */
/* n<0 の場合も考えるのは「予防的プログラミング」 */
/* 予防的プログラミング(保険)
悪いことが起きそうな場合に、前もって、
その悪い場合に備えて、プログラムを考える */
/* 「マーフィの法則」=「悪いことが起きる可能性があれば関らず起きる」 */
return 0;
} else { /* その他 */
return n + sumn(n-1); /* 再帰呼び出し */
}
}
int main(void) {
s_print_string ( "非負の整数値を入力して、その階和を計算する : " );
s_print_int ( sumn( s_input_int() ) );
s_print_newline();
return 0;
}
#include <stdio.h>
/*
単純な繰り返し
helloN(n) 引数で指定した整数回だけ "Hello, World" を出力
*/
void helloN( int n ) {
if ( n <= 0 ) { /* n == 0, n < 0 を考えたのは、予防的な発想 */
/* n == 0 なので、0 回出力する => 何もしない */
} else {
printf ( "Hello, World\n" ); /* 繰り返したい命令 */
helloN( n - 1 ); /* 再帰呼び出し */
}
}
int main(void) {
helloN ( 10 );
return 0;
}
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
先頭の n 個数の奇数の和を求める
n = 3
1 + 3 + 5 = 9 = 3^2
蓄積型
関数の値を蓄積してゆく
総和の帰納的定義
n n-1
Σ a_i = Σ a_i + a_n
i=1 i=1
0
Σ a_i = 0
i=1
an = 2n-1 の時
n n-1
Σ (2i-1) = ( Σ (2i-1) ) + (2n-1)
i=1 i=1
考え方
n
Σ a_i = a1 + a2 + .. + an
i=1
= (a1 + a2 + .. ) + an
n-1
= Σ a_i + an
i=1
*/
int squre( int n ) {
if ( n <= 0 ) { /* n == 0, n < 0 を考えたのは、予防的な発想 */
return 0;/* n == 0 なので、0 個の奇数 */
} else {
return squre( n - 1 ) + ( 2 * n - 1 );
/* 一つ下の関数の値を計算して、それに、積み上げる */
}
}
int main(void) {
s_print_string ( "整数 n に対して、その二乗を出力する : " );
s_print_int ( squre ( s_input_int() ) );
s_print_newline();
return 0;
}
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
先頭の n 個数の奇数の和を求める
n = 3
1 + 3 + 5 = 9 = 3^2
蓄積型
関数の値を蓄積してゆく
総和の帰納的定義
n n-1
Σ a_i = Σ a_i + a_n
i=1 i=1
0
Σ a_i = 0
i=1
an = 2n-1 の時
n n-1
Σ (2i-1) = ( Σ (2i-1) ) + (2n-1)
i=1 i=1
考え方
n
Σ a_i = a1 + a2 + .. + an
i=1
= a1 + ( a2 + .. + an )
n-1
= Σ a_i + an
i=1
squre_sub ( n, 0 )
squre_sub ( n-1, 0+an )
qure_sub ( n-2, 0 + a_n + a_{n-1} )
...
qure_sub ( 0, 0 + a1 + a2 + .. + a_n + a_{n-1} )
=> return 0 + a1 + a2 + .. + a_n + a_{n-1};
=> return Σ an
*/
int squre_sub ( int n, int sum ) {
if ( n <= 0 ) { /* n == 0, n < 0 を考えたのは、予防的な発想 */
return sum; /* n == 0 なので、0 個の奇数 */
/* 計算が終了しているの引数に答えがたまってる */
} else {
return squre_sub( n - 1, sum + ( 2 * n - 1 ) );
/* 関数の値を引数に蓄積してゆく */
}
}
int squre( int n ) {
return squre_sub ( n, 0 );
}
int main(void) {
s_print_string ( "整数 n に対して、その二乗を出力する : " );
s_print_int ( squre ( s_input_int() ) );
s_print_newline();
return 0;
}
#include <stdio.h>
#include <string.h>
#include "s_print.h"
#include "s_input.h"
/*
指定された文字列の中に、指定した文字があるかどうか調べる
あれば、その文字のところから出力する
search ( "abc", 'b' ) => "bc"
みつからない場合は、空文字列
もし、文字列の先頭が、指定した文字ならば、そのまま返す
そうでなければ、
先頭の文字を削って、さらに探す
*/
char *search( char *string, char ch ) {
if ( !strcmp ( string, "" ) ) { /* string が空文字列 */
return string; /* 発見できなかった */
} else if ( *string == ch ) {
return string; /* 発見できた */
} else {
return search ( string + 1, ch ); /* さらに探す */
}
}
int main(void) {
s_print_string ( "文字列を入力してください。その中の 'x' を探します : " );
s_print_string ( search ( s_input_string(), 'x' ) );
s_print_newline();
return 0;
}
?O??(2021/06/25)????e
?u?`???e
??l(??????)???????
?????^
C ?????u?????l?v??\??????u?^?v
?u?^?v= <?l??W??,???Z??W???>
?????^ = <{ 0, 1, -1, 2, -2, ..., +- 20 ?? },{ +, -, *, /, %, .. }>
cf.
?????^ = < ASCII ????, { +, -, *, /, %, getchar(), putchar()} >
????????f?[?^???A???^??????A
?^??????A????U??????????
?? ?ux + 1?v??????\??
??? x ??????????f?[?^??^??????????????
?????? => ??????Z?????
???? => ??????? (ASCII Code ?\??]??)
?????^ => 1 ??????????
!! ?u????v:????????????? ( <= ?????`???????A?????^???w???????? )
!! => ???????A????????????A?u?????яo???v?????邱????????
!! ?? : f(x)+1
!! => ??????`???????A????????l??^???w????????
?????l????o??
s_print_int ?o??
s_input_int ????
???????
???w?????????????
f(g(h(x)))
????????v?Z?????
????? y=h(x) ???v?Z????A????l y ?? g ?????A
????A x=g(y) ???v?Z????A????l z ?? f ?????A
???? w=f(z) ???v?Z????A????l???A???uf(g(h(x)))?v??l????
??:
f(x) = x * x f(4) = 4 * 4 = 16
g(x) = x + 2 g(3) = 3 + 2 = 5
f(g(5))
g(5) = 5 + 2 = 7
f(7) = 7 * 7 = 49
!! ?O??????v?Z???? ( ????W?J )
!! f(g(5)) = g(5)*g(5)
!! = (5+2)*(5+2)
!! = (7)*(7) <<== 5+2 ????v?Z
!! = 49
!! !! ?O????v?Z??????????p?^?[??
!! !! ????????????????????
!! !! ????????v?Z??????????A??????????????A??????v?Z??????
!! !! ??:
!! !! f(g(x+1))
!! !! ???? : g(x+1) = (x+1)+2 = x+3 <= ?v?Z???~???
!! !! ?O?? : ??????v?Z?????????????A?????v?????
C ??????A????v?Z??A????????s??
f(g(h(x))) => h, g, f ?????v?Z???s??
?????????????????????A???????????v?Z??????
f(g(x),h(y))
=>
h, g, f ???????s(?v?Z)?????
??????????A???????l?A???????s??????????????(????\??)
???s???????A?\?L???(?ォ???A??????E)????v????????
???????? (if ?\??)
???@
if ( ???? ) {
?????????????????????
} else {
???????s???????????? ( otherwise : ??????? )
}
???
????A?u?????v???A??????????????????A
?u?????????????????????v?????s
??????????????
?u???????s????????????v?????s
????B
=> if ?\????A?u????v?????u????\???v?????B
??????????A?V????????????
?????????????s?????
???????????????
1. else ?????? ( ???????s???????????? ) ?????????
?? : if ( ???? ) { ???? } else {}
=> else ?????????????????
?? : if ( ???? ) { ???? }
<= then ?????? ( ?????????????????? ) ??????????????????A
then ???????????
?? : if ( ???? ) {} else { ???? }
=> ?uif ( ???? ) else { ???? }?v????????
2. else ??????? if ?\???????
?? : if ( ???? ) { ???? } else { if (????2) {????a} else {????b} }
=> else ??? {, } ??????????
?? : if ( ???? ) { ???? } else if (????2) {????a} else {????b}
if ( ???? ) {
????
} else {
if (????2) {
????a
} else {
????b
}
}
=> else ??? {, } ??????????
if ( ???? ) {
????
} else if (????2) {
????a
} else {
????b
}
2a. then ??????(?????????????????????)???
else ??????(???????s????????????)????A
???????????? {, } ???????\
!! <?^??>
!! ???????Athen ?? / else ???A
!! {, } ?????????A???????????????????{????\??
!! ????????? 0 ??? 2 ???????? {} ???K?v
!! <= ????? 1 ????????A{} ???????K?????????
2021/07/02
switch ?\??
if ?\???????A?????????????????s???\??
switch - case ?\??
?@?\
??????\??
if ?\???? 2 ????? switch ?\???? n ????
!! if ?\???????q????邱?????A
!! ???????\
!! ?\???????G???錙????????
?\??
<switch ??> ::= switch ( <??> ) { <case ????> }
<case ????> ::= <case> ??J???
<case> ::= <label> : ??????
<label> := case <??> | default
switch - case ??p?????
???????l?????A??????l???v???????????f????A
????l??????A??X?????(????????)???s????????
??1 ???? <switch ??>?????A???? <label> ?????鎖???????
??2 ????????? break ????????A???????s??????Aswitch ????I??????
break
??????????????? switch ?\?????I????????
!! if ?\???????????
break ??????????? ( cf. return )
???
?????A?u???v??l???u???v???????????A
??????x?????????????s????
??????????A
?????Adefualt ???????A??????x?????????????s????
?????????????????A?????????
???????? break ????????s??????Aswitch ?S????I??????
break ??????????A?????A???x?????????A??????????????s?????
??A??o??
????????{???A?????????g???o????????
?u????????w??x?x???o???v??
?u?????????o?????v???w???x?x????яo??????\??????????
???? : ?????u??A??o???v???L?q?????A?u???????[?v?v????
?u??A??o?????w?I???x??????v?d?g???u??}?I??????v????K?v??????
?u????????v???K?{ ( ??A??яo????????????????? )
??A?? :
P ??A??~?????A
A ??J????????A
X' ?? X ????v?Z????A?w???????x P(X)??????????
?L?q?`?? :
f(X) {
if ( P(X) ) { /* P(X) ??A??? f(X) ????A??яo??????????? */
/* ??A??яo???????????A??????I?????邱???????? */
} else {
A(X); /* ?J???????? */
f(X'); /* ??A??яo?? : X -> X' */
/* ??? f ??A???? X ??^?????
X -> X' -> (X')' -> .. -> X''..' => P(X'..') ?????????? */
X ?????R??????A
-1 ???????A??????? 0 ?????? P(X) ?? X==0 ?????
X ???????????A
+1 ?????A??????? "" ?????? P(X) ?? !strcmp(X,"") ?????
*/
}
}
??? :
f(X) ??????AP(X''..')???????????? A(X) ???J????
?|?C???g :
?uA(X) ???J?????v?????uf() ????A???`?v????
??A???
??A??o?????s???`???`???????
?J??? :
????????(?L?q)?????x????яo???d?g
??A??o????p???鎖????A?u?J????v???????????
??A?????A?u??????J????v?????????????
??A??o???A???J???g
??A??o?? : ?u?J????v???\??(?w?\???x????l??d?g??)
?w???x???w?????x??w?J?????x?? ?
?P????J??? ( N ???J??? )
???????e??J??? / N ????????J???
?~??^??J???
?v?Z?????~????? (???a)
????l????p / ???????~??
?????^??J???
?J?????r???????????f????? (??I???B?????????J???)
?J??????\?z???????? (????????????????\????????)
????p(???o???)??~??
??????v?Z??~???????A????p(???o??)??~????I?????
???????A
??A??o?????????s????
?P????u?J????v??????? / ?v?Z????c??????\????????
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20210702-01.c
/*
* 20210702-01-QQQQ.c
*
* 数当てを行う
*
* コンパイル :
* cc -I ~/c/include -c 20210702-01-QQQQ.c
* cc -o 20210702-01-QQQQ.exe 20210702-01-QQQQ.o
* 実行 :
* ./20210702-01-QQQQ.exe
*
*/
#include <stdio.h>
#include "s_print.h" /* s_print_int を利用するので.. */
#include "s_input.h" /* s_input_int を利用するので.. */
#include "s_random.h" /* s_random を利用するので.. */
/*
* prompt
* メッセージを出力し、キーボードから整数値を読み込んで、
* その値を返す関数
*/
int prompt(void) {
s_print_string ( "私が選んだ数を予想して入力してください : " );
return s_input_int();
}
/*
*/
void game ( int input, int answer ) {
if ( input == answer ) { /* 入力と答えが一致した */
s_print_string ( "お見事です。あたりました。\n" );
} else {
if ( input > answer ) { /* 入力が、答えより大きい */
/*
** この部分を完成させなさい
*/
} else { /* 入力が、答えより小さい */
s_print_string ( "その数は小さすぎます。\n" );
}
/* 未だ、答えが、当っていないので、ゲームを続ける.. */
/*
** この部分を完成させなさい
*/
}
}
/*
* main
*/
int main( void )
{
s_init_random(); /* 乱数系列の初期化 */
s_print_string ( "私が考えた 1 〜 100 数を予想して当ててみてください。\n" );
game ( prompt(), (s_random()%100) + 1 );
return 0;
}
50 75 83 90 85 84
$ ./20180928-01-QQQQ.exe 私が考えた 1 〜 100 の数を予想して当ててみてください。 私が選んだ数を予想して入力してください : 5 5 その数は小さすぎます。 私が選んだ数を予想して入力してください : 60 60 その数は大きすぎます。 私が選んだ数を予想して入力してください : 30 30 お見事です。あたりました。 $
Download : 20210702-02.c
/*
* CDATE FILENAME
*
* 与えられた自然数の素因数を出力する
*
* 12 は..
*
* [コンパイル]
* cc -I ~/include -c FILENAME
* [リンク]
* cc -o BASENAME.exe BASENAME.o
* [実行]
* ./BASENAME.exe
*
*/
#include <stdio.h>
#include "s_print.h" /* s_print_int を利用するので.. */
/*
* void print_prime_factor_sequence ( int n, int p )
* 機能 : p 以上の n の素因数を小さい順に並べで表示する
* 条件 : n には p 未満の素因数を含まれていないものとする
* int n : p 未満の素因数を含まれていない自然数
* 返り値 : なし
*/
void print_prime_factor_sequence ( int n, int p ) {
if ( p > n ) { /* もう n には p 以上の素因数を含まない */
/* 何もしなくてよい */
/* 本来、ここにくるのは n = 1 の時だが、念の為 */
} else if ( n % p == 0 ) { /* n が p を素因数として含む */
s_print_char ( ' ' ); /* 隙間を空け */
s_print_int ( p ); /* 素因数を表示し */
/* もう一度 p の要素があるかもしれないので、そこから試す [再帰] */
/*
** この部分を完成させなさい
*/
} else { /* n が p を素因数として含まない */
/* 本来は p の次の素数を試すべきだが.. */
/* その代りに p + 1 を試す (のは無駄だが、正く動く) [再帰] */
/*
** この部分を完成させなさい
*/
}
}
/*
* void print_prime_factor_of ( int n )
* 機能 : n の素因数を出力する
* int n : 素因数を表示したい自然数
* 返り値 : なし
*/
void print_prime_factor_of ( int n ) {
if ( n < 1 ) { /* 与えらた数が自然数ではない */
s_print_int ( n );
s_print_string ( "は、自然数ではありません\n" );
} else if ( n == 1 ) { /* 与えられた数が 1 の場合 */
s_print_int ( n );
s_print_string ( "の素因数はありません\n" );
} else {
s_print_int ( n );
s_print_string ( "の素因数分解は" );
/*
** この部分を完成させなさい
*/
s_print_string ( " となります。\n" );
}
}
/*
* main
*/
int main( void )
{
print_prime_factor_of ( 12 );
return 0;
}
$ ./20210702-02-QQQQ.exe 12の素因数分解は 2 2 3 となります。 $
Download : 20210702-03.c
/*
* 20210702-03-QQQQ.c
* フィボナッチ数列の第 n 項を返す関数
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* int fibonacci ( int n )
* 引数で指定された n 番目 ( n = 0 〜 ) のフィボナッチ数を値として返す関数
* ただし、n 番目のフィボナッチ数 fib(n) は次のように再帰的に定義
* 0 (n = 0 の時)
* fib(n) = { 1 (n = 1 の時)
* fib(n-1) + fib(n-2) (n > 1 の時)
*
* 注意 : 引数に負の数を指定された場合の値は「未定義」
*/
int fibonacci ( int n ) {
if ( n < 2 ) {
/* 本来は n = 0, n = 1 の時の処理 */
/* fib(0) = 0, fib(1) = 1 なので 0 <= n <= 1 の時 fib(n) = n */
return n;
/* n < 0 (負の数) の時は、『未定義』なので、勝手に n を返している */
/* 本来は『未定義』の場合を含めるべきでない */
} else {
/* 再帰を利用して計算 */
/*
** この部分を完成させなさい
*/
}
}
/*
*
*/
void print_fibonacci ( int n ) {
s_print_int ( n );
s_print_string ( " 番目のフィボナッチ数は " );
s_print_int ( fibonacci ( n ) );
s_print_string ( " です。\n" );
}
/*
* main
*/
int main ( void ) {
s_print_string ( "整数値 n を入力してください : " );
print_fibonacci ( s_input_int() );
s_print_string ( "整数値 n を入力してください : " );
print_fibonacci ( s_input_int() );
return 0;
}
4 10
$ ./20210702-03-QQQQ.exe 整数値 n を入力してください : 4 4 番目のフィボナッチ数は 3 です。 整数値 n を入力してください : 10 10 番目のフィボナッチ数は 55 です。 $