当日のOHP資料です。
Download : sample-001.c ( SJIS 版 )
/*
* 2013/07/05 sample-001.c
*/
/*
* 二分法
*
* 一つ浮動小数点数値をキーボードから入力し、その平方根を出力する
* 手段としては、「二分法」を使う
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o sample-001.exe sample-001.c
* 実行
* sample-001
*/
#include <stdio.h>
#include <stdlib.h> /* exit を利用するので必要 */
#include "s_input.h"
#include "s_print.h"
/*
*
*/
#define EPSILON 0.00000001 /* 誤差幅 */
/*
* double regula_falsi_square_root ( double a, double min, double mid, \
double max )
* double a 平方根の元になる数(正を仮定している)
* double min, max 根の入る区間の範囲
* double mid min と mid の中点
* return a 平方根
* 二分法により、a の平方根を求める
* 0 < min < a の平方根 < max
*/
double regula_falsi_square_root ( double a, double min, double mid, double \
max ) {
if ( max - min < EPSILON ) { /* 十分に精度が上った */
return mid; /* 中点の値を答として返す */
} else { /* まだ、狭める必要がある */
/* min が解のどちら側にあるかを調べ.. それに併せて区間を調整 */
/* f(x)=x^2-a */
if ( mid * mid - a < 0.0 ) { /* f(mid) の符号を確認 */
/* 解の左にあった */
return regula_falsi_square_root ( a, mid, (mid+max)/2.0, max );
} else { /* 解の右にあった */
return regula_falsi_square_root ( a, min, (min+mid)/2.0, mid );
}
}
}
/*
* double square_root ( double a )
* double a 平方根の元になる数
* return a 平方根
* a の平方根を求めて結果として返すが、
* 計算の基本は、regula_falsi_square_root にまかせる
* ここでは、計算の正規化を行う
*/
double square_root ( double a ) {
if ( a < 0.0 ) { /* a が負の数ならば.. */
s_print_string ( "負の平方根は計算できません\n" );
/* エラーメッセージを出力し.. */
exit ( -1 ); /* Error Code (-1) でプログラム終了 */
} else if ( a < 1.0 ) { /* a が 1.0 以下なら */
return regula_falsi_square_root ( a, a, (a+1.0)/2.0, 1.0 );
/* 平方根は a と 1.0 の間にある */
} else { /* そうでなければ.. */
return regula_falsi_square_root ( a, 1.0, (1.0+a)/2.0, a );
/* 平方根は 1.0 と a の間にある */
}
}
/*
* void print_square_root ( double a )
* double a 平方根を計算する数
* 元の数と、平方根を出力する
*/
void print_square_root ( double a ) {
s_print_double ( a );
s_print_string ( " の平方根は " );
s_print_double ( square_root ( a ) );
s_print_string ( " です。\n" );
}
/*
* main
*/
int main( double argc, char *argv[] )
{
s_print_string ( "実数値を一つ入力してください : " );
print_square_root ( s_input_double() );
return 0;
}
2.0
C:\usr\c>sample-001< sample-001.in 実数値を一つ入力してください : 2.000000 2.000000 の平方根は 1.414214 です。 C:\usr\c>
Download : sample-002.c ( SJIS 版 )
/*
* 2013/07/05 sample-002.c
*/
/*
* 関数と引数変数
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o sample-002.exe sample-002.c
* 実行
* sample-002
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* 「金糸雀(かなりや)」
* (c) 西條八十作詞・成田為三作曲
* http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html
*/
/*
* main
*/
int main ( int argc, char *argv[] ) {
/* 一番 */
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( "後の山に 棄てましょか\n" );
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
/* ニ番 */
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( "背戸の小薮に 埋けましょか\n" );
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
return 0;
}
C:\usr\c>sample-002 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ C:\usr\c>
Download : sample-003.c ( SJIS 版 )
/*
* 2013/07/05 sample-003.c
*/
/*
* 関数と引数変数
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o sample-003.exe sample-003.c
* 実行
* sample-003
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* 「金糸雀(かなりや)」
* (c) 西條八十作詞・成田為三作曲
* http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html
*/
void kyoku_1(void) {
/* 一番 */
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( "後の山に 棄てましょか\n" );
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
}
void kyoku_2(void) {
/* ニ番 */
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( "背戸の小薮に 埋けましょか\n" );
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
}
/*
* main
*/
int main ( int argc, char *argv[] ) {
kyoku_1();
kyoku_2();
return 0;
}
C:\usr\c>sample-003 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ C:\usr\c>
Download : sample-004.c ( SJIS 版 )
/*
* 2013/07/05 sample-004.c
*/
/*
* 関数と引数変数 (「置き換え」による理解 )
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o sample-004.exe sample-004.c
* 実行
* sample-004
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* 「金糸雀(かなりや)」
* (c) 西條八十作詞・成田為三作曲
* http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html
*/
void kyoku_n ( char *string ) {
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( string );
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
}
void kyoku_1(void) {
/* 一番 */
kyoku_n ( "後の山に 棄てましょか\n" );
}
void kyoku_2(void) {
/* ニ番 */
kyoku_n ( "背戸の小薮に 埋けましょか\n" );
}
/*
* main
*/
int main ( int argc, char *argv[] ) {
kyoku_1();
/*
kyoku_1();
↓
kyoku_n ( "後の山に 棄てましょか\n" );
↓
string ← "後の山に 棄てましょか\n"
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( string );
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
↓
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( "後の山に 棄てましょか\n" );
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
*/
kyoku_2();
return 0;
}
C:\usr\c>sample-004 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ C:\usr\c>
Download : sample-005.c ( SJIS 版 )
/*
* 2013/07/05 sample-005.c
*/
/*
* 関数と引数変数 (「代入」による理解 )
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o sample-005.exe sample-005.c
* 実行
* sample-005
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* 「金糸雀(かなりや)」
* (c) 西條八十作詞・成田為三作曲
* http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html
*/
void kyoku_n ( char *string ) {
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( string );
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
}
void kyoku_1(void) {
/* 一番 */
kyoku_n ( "後の山に 棄てましょか\n" );
}
void kyoku_2(void) {
/* ニ番 */
kyoku_n ( "背戸の小薮に 埋けましょか\n" );
}
/*
* main
*/
int main ( int argc, char *argv[] ) {
/*
kyoku_1();
*/
{
char *string = "後の山に 棄てましょか\n"; /* 変数宣言と代入 */
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( string ); /* 代入された値が使われる */
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
}
kyoku_2();
return 0;
}
C:\usr\c>sample-005 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ C:\usr\c>
Download : sample-006.c ( SJIS 版 )
/*
* 2013/07/05 sample-006.c
*/
/*
* 変数宣言と代入
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o sample-006.exe sample-006.c
* 実行
* sample-006
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* 「金糸雀(かなりや)」
* (c) 西條八十作詞・成田為三作曲
* http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html
*/
/*
* main
*/
int main ( int argc, char *argv[] ) {
{
char *string = "後の山に 棄てましょか\n"; /* 変数宣言と代入 */
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( string ); /* 代入された値が使われる */
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
}
/* ブロック内の宣言は、ブロックの外では無効 */
{
char *string = "背戸の小薮に 埋けましょか\n"; /* 再宣言 */
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( string ); /* 代入された値が使われる */
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
}
return 0;
}
C:\usr\c>sample-006 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ C:\usr\c>
Download : sample-007.c ( SJIS 版 )
/*
* 2013/07/05 sample-007.c
*/
/*
* 変数宣言と代入
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o sample-007.exe sample-007.c
* 実行
* sample-007
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* 「金糸雀(かなりや)」
* (c) 西條八十作詞・成田為三作曲
* http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html
*/
/*
* main
*/
int main ( int argc, char *argv[] ) {
char *string; /* 変数宣言 (変数宣言はブロックの先頭で行う) */
/* 一番 */
string = "後の山に 棄てましょか\n"; /* 代入 */
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( string ); /* 代入された値が使われる */
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
/* ニ番 */
string = "背戸の小薮に 埋けましょか\n"; /* (再)代入 */
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( string ); /* 最後に代入された値が使われる */
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
return 0;
}
C:\usr\c>sample-007 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ C:\usr\c>
Download : sample-008.c ( SJIS 版 )
/*
* 2013/07/05 sample-008.c
*/
/*
* 代入を使わざず、二つの整数の和を計算する
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o sample-008.exe sample-008.c
* 実行
* sample-008
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* print_sum
*/
void print_sum ( int a, int b ) {
s_print_int ( a );
s_print_string ( "と" );
s_print_int ( b );
s_print_string ( "の和は" );
s_print_int ( a+b );
s_print_string ( "です。\n" );
}
/*
* print_sum_one_and_input
*/
void print_sum_one_and_input ( int a ) {
print_sum ( a, s_input_int() );
}
/*
* main
*/
int main ( int argc, char *argv[] ) {
s_print_string ( "二つの数を入力してください\n" );
print_sum_one_and_input ( s_input_int() );
return 0;
}
12 56
C:\usr\c>sample-008< sample-008.in 二つの数を入力してください 12 56 12と56の和は68です。 C:\usr\c>
Download : sample-009.c ( SJIS 版 )
/*
* 2013/07/05 sample-009.c
*/
/*
* 代入を利用して、二つの整数の和を計算する
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o sample-009.exe sample-009.c
* 実行
* sample-009
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* main
*/
int main ( int argc, char *argv[] ) {
int a; /* 変数の宣言 (ブロックの先頭でしかできない) */
int b; /* 変数の宣言 */
s_print_string ( "二つの数を入力してください\n" );
a = s_input_int(); /* 変数 a への代入 */
b = s_input_int(); /* 変数 b への代入 */
/* 命令の並びの順と、キーボードから入力される順が一致 */
s_print_int ( a );
s_print_string ( "と" );
s_print_int ( b );
s_print_string ( "の和は" );
s_print_int ( a+b );
s_print_string ( "です。\n" );
return 0;
}
12 56
C:\usr\c>sample-009< sample-009.in 二つの数を入力してください 12 56 12と56の和は68です。 C:\usr\c>
Download : sample-010.c ( SJIS 版 )
/*
* 2013/07/05 sample-010.c
*/
/*
* 1 〜 5 までを出力
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o sample-010.exe sample-010.c
* 実行
* sample-010
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* main
*/
int main ( int argc, char *argv[] ) {
/*
*/
s_print_int ( 1 );
s_print_newline();
s_print_int ( 2 );
s_print_newline();
s_print_int ( 3 );
s_print_newline();
s_print_int ( 4 );
s_print_newline();
s_print_int ( 5 );
s_print_newline();
return 0;
}
C:\usr\c>sample-010 1 2 3 4 5 C:\usr\c>
Download : sample-011.c ( SJIS 版 )
/*
* 2013/07/05 sample-011.c
*/
/*
* 1 〜 5 までを出力 (変数を導入してみる)
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o sample-011.exe sample-011.c
* 実行
* sample-011
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* main
*/
int main ( int argc, char *argv[] ) {
int i = 1;
/*
*/
s_print_int ( i );
s_print_newline();
i = i + 1; /* 新しい i の値は、古い i の値で計算される */
/* i ← 1 + 1 = 2 */
s_print_int ( i );
s_print_newline();
i = i + 1; /* i ← 2 + 1 = 3 */
s_print_int ( i );
s_print_newline();
i = i + 1; /* i ← 3 + 1 = 4 */
s_print_int ( i );
s_print_newline();
i = i + 1; /* i ← 4 + 1 = 5 */
s_print_int ( i );
s_print_newline();
i = i + 1; /* これは不要だが、規則性を尊んで.. */
return 0;
}
C:\usr\c>sample-011 1 2 3 4 5 C:\usr\c>
Download : sample-020.c ( SJIS 版 )
/*
* 2013/07/05 sample-020.c
*/
/*
* 再帰呼出しと代入
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o sample-020.exe sample-020.c
* 実行
* sample-020
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* factrial
*/
int factrial ( int n ) {
if ( n < 2 ) {
return 1;
} else {
return factrial ( n - 1 ) * n;
}
}
/*
* main
*/
int main ( int argc, char *argv[] ) {
int n;
int fac;
s_print_string ( "一つの数を入力してください\n" );
n = s_input_int();
fac = factrial ( n );
s_print_int ( n );
s_print_string ( "の階乗は" );
s_print_int ( fac );
s_print_string ( "です。\n" );
return 0;
}
4
C:\usr\c>sample-020< sample-020.in 一つの数を入力してください 4 4の階乗は24です。 C:\usr\c>
Download : sample-021.c ( SJIS 版 )
/*
* 2013/07/05 sample-021.c
*/
/*
* 再帰呼出しと代入
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o sample-021.exe sample-021.c
* 実行
* sample-021
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* factrial
*/
int factrial ( int n ) {
int retV;
if ( n < 2 ) {
retV = 1;
} else {
int n1 = n - 1;
int fac1 = factrial ( n1 );
retV = fac1 * n;
}
return retV;
}
/*
* main
*/
int main ( int argc, char *argv[] ) {
int number;
int fac;
s_print_string ( "一つの数を入力してください\n" );
number = s_input_int();
fac = factrial ( number );
s_print_int ( nunber );
s_print_string ( "の階乗は" );
s_print_int ( fac );
s_print_string ( "です。\n" );
return 0;
}
4
C:\usr\c>sample-021< sample-021.in 一つの数を入力してください 4 4の階乗は24です。 C:\usr\c>
Download : sample-022.c ( SJIS 版 )
/*
* 2013/07/05 sample-022.c
*/
/*
* 再帰呼出しと代入
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o sample-022.exe sample-022.c
* 実行
* sample-022
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* factrial
*/
int factrial ( int n ) {
int retV;
if ( n < 2 ) {
retV = 1;
} else {
int n1 = n - 1;
int fac1;
fac1 = factial ( n1 );
の展開 */
retV = fac1 * n;
}
return retV;
}
/*
* main
*/
int main ( int argc, char *argv[] ) {
int number;
int fac;
s_print_string ( "一つの数を入力してください\n" );
number = s_input_int();
/* fac = factrial ( number ); の展開 */
{
int n = number; /* n (引数) に number の値を入れる */
int retV;
if ( n < 2 ) {
retV = 1;
} else {
int n1 = n - 1;
int fac1;
fac1 = factrial ( n1 );
retV = fac1 * n;
}
fac = retV; /* return で値を返す代りに、変数に代入 */
}
s_print_int ( n );
s_print_string ( "の階乗は" );
s_print_int ( fac );
s_print_string ( "です。\n" );
return 0;
}
4
C:\usr\c>sample-022< sample-022.in 一つの数を入力してください 4 4の階乗は24です。 C:\usr\c>
Download : sample-023.c ( SJIS 版 )
/*
* 2013/07/05 sample-023.c
*/
/*
* 再帰呼出しと代入
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o sample-023.exe sample-023.c
* 実行
* sample-023
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* factrial
*/
int factrial ( int n ) {
int retV;
if ( n < 2 ) {
retV = 1;
} else {
int n1 = n - 1;
int fac1;
/* fac1 = factial ( n1 ); の展開 */
{
int n = n1; /* 新しい n (引数) に n1 の値を入れる */
int retV;
if ( n < 2 ) {
retV = 1;
} else {
int n1 = n - 1;
int fac1;
fac1 = factrial ( n1 );
}
fac1 = retV; /* 値を返す代りに、変数に代入 */
}
retV = fac1 * n;
}
return fac;
}
/*
* main
*/
int main ( int argc, char *argv[] ) {
int n;
int fac;
s_print_string ( "一つの数を入力してください\n" );
n = s_input_int();
fac = factrial ( n );
s_print_int ( n );
s_print_string ( "の階乗は" );
s_print_int ( fac );
s_print_string ( "です。\n" );
return 0;
}
4
C:\usr\c>sample-023< sample-023.in 一つの数を入力してください 4 4の階乗は24です。 C:\usr\c>
/*
* 2013/07/05 sample-001.c
*/
/*
* 二分法
*
* 一つ浮動小数点数値をキーボードから入力し、その平方根を出力する
* 手段としては、「二分法」を使う
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o sample-001.exe sample-001.c
* 実行
* sample-001
*/
#include <stdio.h>
#include <stdlib.h> /* exit を利用するので必要 */
#include "s_input.h"
#include "s_print.h"
/*
*
*/
#define EPSILON 0.00000001 /* 誤差幅 */
/*
* double regula_falsi_square_root ( double a, double min, double mid, \
double max )
* double a 平方根の元になる数(正を仮定している)
* double min, max 根の入る区間の範囲
* double mid min と mix の中点
* return a 平方根
* 二分法により、a の平方根を求める
* 0 < min < a の平方根 < max
*/
double regula_falsi_square_root ( double a, double min, double mid, double \
max ) {
if ( max - min < EPSILON ) { /* 十分に精度が上った */
return mid; /* 中点の値を答として返す */
} else { /* まだ、狭める必要がある */
/* min が解のどちら側にあるかを調べ.. それに併せて区間を調整 */
/* f(x)=x^2-a */
if ( mid * mid - a < 0.0 ) { /* f(mid) の符号を確認 */
/* 解の左にあった */
return regula_falsi_square_root ( a, mid, (mid+max)/2.0, max );
} else { /* 解の右にあった */
return regula_falsi_square_root ( a, min, (min+mid)/2.0, mid );
}
}
}
/*
* double square_root ( double a )
* double a 平方根の元になる数
* return a 平方根
* a の平方根を求めて結果として返すが、
* 計算の基本は、regula_falsi_square_root にまかせる
* ここでは、計算の正規化を行う
*/
double square_root ( double a ) {
/*
* f(x) = x^2 - a を使う ( a>0 を想定 )
* f(x) が連続 ( 明らかなので、何も考えず使う
* f(i) < 0 < f(a) となる i, a が必要
* これは、与えられていないので、ここで考える
*/
if ( a < 0.0 ) { /* a が負の数ならば.. */
s_print_string ( "負の平方根は計算できません\n" );
/* エラーメッセージを出力し.. */
exit ( -1 ); /* Error Code (-1) でプログラム終了 */
} else if ( a < 1.0 ) { /* a が 1.0 以下なら */
/* a が 1 より小さい場合と大きい場合に場合分け */
/*
* 0 < a < 1
* ---> \sqrt{0} < \sqrt{a} < \sqrt{1}
* ---> 0 < \sqrt{a} < 1
* ---> \sqrt{a}*\sqrt{a} < 1*\sqrt{a}
* ---> a < \sqrt{a}
* ---> 解は [a,1] にある
*/
return regula_falsi_square_root ( a, a, (a+1.0)/2.0, 1.0 );
/* 平方根は a と 1.0 の間にある */
} else { /* そうでなければ.. */
/*
* 1 < a
* ---> \sqrt{1} < \sqrt{a}
* ---> 1 < \sqrt{a}
* ---> 1*\sqrt{a} < \sqrt{a}*\sqrt{a}
* ---> \sqrt{a} < a
* ---> 解は [1,a] にある
*/
return regula_falsi_square_root ( a, 1.0, (1.0+a)/2.0, a );
/* 平方根は 1.0 と a の間にある */
}
}
/*
* void print_square_root ( double a )
* double a 平方根を計算する数
* 元の数と、平方根を出力する
*/
void print_square_root ( double a ) {
/* 結果を出力するだけ */
s_print_double ( a );
s_print_string ( " の平方根は " );
/* 平方根の計算は、squre_root にお任せ */
s_print_double ( square_root ( a ) );
s_print_string ( " です。\n" );
}
/*
* main
*/
int main( double argc, char *argv[] )
{
s_print_string ( "実数値を一つ入力してください : " );
/* \sqrt{a} を求めたい a をキーボードから入力 */
/* その a を引数にして、関数 print_square_root を呼ぶ */
print_square_root ( s_input_double() );
return 0;
}
/*
* 2013/07/05 sample-001.c
*/
/*
* 二分法
*
* 一つ浮動小数点数値をキーボードから入力し、その立方根を出力する
* 手段としては、「二分法」を使う
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o sample-001.exe sample-001.c
* 実行
* sample-001
*/
#include <stdio.h>
#include <stdlib.h> /* exit を利用するので必要 */
#include "s_input.h"
#include "s_print.h"
/*
*
*/
#define EPSILON 0.00000001 /* 誤差幅 */
/*
* double regula_falsi_square_root ( double a, double min, double mid, \
double max )
* double a 立方根の元になる数(正を仮定している)
* double min, max 根の入る区間の範囲
* double mid min と mix の中点
* return a 立方根
* 二分法により、a の立方根を求める
* 0 < min < a の立方根 < max
*/
double regula_falsi_square_root ( double a, double min, double mid, double \
max ) {
if ( max - min < EPSILON ) { /* 十分に精度が上った */
return mid; /* 中点の値を答として返す */
} else { /* まだ、狭める必要がある */
/* min が解のどちら側にあるかを調べ.. それに併せて区間を調整 */
/* f(x)=x^3-a */
if ( mid * mid * mid - a < 0.0 ) { /* f(mid) の符号を確認 */
/* 解の左にあった */
return regula_falsi_square_root ( a, mid, (mid+max)/2.0, max );
} else { /* 解の右にあった */
return regula_falsi_square_root ( a, min, (min+mid)/2.0, mid );
}
}
}
/*
* double square_root ( double a )
* double a 立方根の元になる数
* return a 立方根
* a の立方根を求めて結果として返すが、
* 計算の基本は、regula_falsi_square_root にまかせる
* ここでは、計算の正規化を行う
*/
double square_root ( double a ) {
/*
* f(x) = x^2 - a を使う ( a>0 を想定 )
* f(x) が連続 ( 明らかなので、何も考えず使う
* f(i) < 0 < f(a) となる i, a が必要
* これは、与えられていないので、ここで考える
*/
if ( a < 0.0 ) { /* a が負の数ならば.. */
return - square_root ( -a );
/*
\sqrt[3]{a} が欲いのだが、a<0 の時には、
\sqrt[3]{a} = - \sqrt[3]{-a}
で、-a > 0 なので、square_root の引数が
正の場合しか計算できなくても、
問題をさける事ができる。
*/
} else if ( a < 1.0 ) { /* a が 1.0 以下なら */
/* a が 1 より小さい場合と大きい場合に場合分け */
/*
* 0 < a < 1
* ---> \sqrt{0} < \sqrt{a} < \sqrt{1}
* ---> 0 < \sqrt{a} < 1
* ---> \sqrt{a}*\sqrt{a} < 1*\sqrt{a}
* ---> a < \sqrt{a}
* ---> 解は [a,1] にある
*/
return regula_falsi_square_root ( a, a, (a+1.0)/2.0, 1.0 );
/* 立方根は a と 1.0 の間にある */
} else { /* そうでなければ.. */
/*
* 1 < a
* ---> \sqrt{1} < \sqrt{a}
* ---> 1 < \sqrt{a}
* ---> 1*\sqrt{a} < \sqrt{a}*\sqrt{a}
* ---> \sqrt{a} < a
* ---> 解は [1,a] にある
*/
return regula_falsi_square_root ( a, 1.0, (1.0+a)/2.0, a );
/* 立方根は 1.0 と a の間にある */
}
}
/*
* void print_square_root ( double a )
* double a 立方根を計算する数
* 元の数と、立方根を出力する
*/
void print_square_root ( double a ) {
/* 結果を出力するだけ */
s_print_double ( a );
s_print_string ( " の立方根は " );
/* 立方根の計算は、squre_root にお任せ */
s_print_double ( square_root ( a ) );
s_print_string ( " です。\n" );
}
/*
* main
*/
int main( double argc, char *argv[] )
{
s_print_string ( "実数値を一つ入力してください : " );
/* \sqrt{a} を求めたい a をキーボードから入力 */
/* その a を引数にして、関数 print_square_root を呼ぶ */
print_square_root ( s_input_double() );
return 0;
}
/*
* CDATE FILENAME
*/
/*
* 関数と引数変数
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o BASENAME.exe FILENAME
* 実行
* BASENAME
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* 「金糸雀(かなりや)」
* (c) 西條八十作詞・成田為三作曲
* http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html
*/
/*
* main
*/
void kashi_n(char *X) {
/*
X は、仮引数で、「変数」である
変数 : 値が変化するもの
値は、関数を呼出した時の実引数の値が入る
*/
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( X );
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
}
void kashi_1(void) {
/* 一番 */
kashi_n ( "後の山に 棄てましょか\n" );
/*
ここでは、実引数として、「"後の山に 棄てましょか\n"」
が指定されているので、X に、"後の山に 棄てましょか\n"
が入る
*/
}
void kashi_2 (void) {
/* ニ番 */
kashi_n ( "背戸の小薮に 埋けましょか\n" );
/*
ここでは、実引数として、「"背戸の小薮に 埋けましょか\n"」
が指定されているので、X に、"背戸の小薮に 埋けましょか\n"
が入る
*/
}
int main ( int argc, char *argv[] ) {
kashi_1();
kashi_2();
return 0;
}
/*
* CDATE FILENAME
*/
/*
* 関数と引数変数
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o BASENAME.exe FILENAME
* 実行
* BASENAME
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* 「金糸雀(かなりや)」
* (c) 西條八十作詞・成田為三作曲
* http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html
*/
/*
* main
*/
void kashi_n(char *X) {
/*
X は、仮引数で、「変数」である
変数 : 値が変化するもの
値は、関数を呼出した時の実引数の値が入る
*/
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( X );
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
}
void kashi_1(void) {
/* 一番 */
kashi_n ( "後の山に 棄てましょか\n" );
/*
ここでは、実引数として、「"後の山に 棄てましょか\n"」
が指定されているので、X に、"後の山に 棄てましょか\n"
が入る
*/
}
void kashi_2 (void) {
/* ニ番 */
kashi_n ( "背戸の小薮に 埋けましょか\n" );
/*
ここでは、実引数として、「"背戸の小薮に 埋けましょか\n"」
が指定されているので、X に、"背戸の小薮に 埋けましょか\n"
が入る
*/
}
int main ( int argc, char *argv[] ) {
kashi_1();
/*
kashi_1();
↓
kashi_n ( "後の山に 棄てましょか\n" );
↓
X ← "後の山に 棄てましょか\n"
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( X );
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
↓
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( "後の山に 棄てましょか\n" );
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
*/
kashi_2();
return 0;
}
/*
* CDATE FILENAME
*/
/*
* 関数と引数変数
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o BASENAME.exe FILENAME
* 実行
* BASENAME
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* 「金糸雀(かなりや)」
* (c) 西條八十作詞・成田為三作曲
* http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html
*/
/*
* main
*/
void kashi_n(char *X) {
/*
X は、仮引数で、「変数」である
変数 : 値が変化するもの
値は、関数を呼出した時の実引数の値が入る
*/
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( X );
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
}
void kashi_1(void) {
/* 一番 */
kashi_n ( "後の山に 棄てましょか\n" );
/*
ここでは、実引数として、「"後の山に 棄てましょか\n"」
が指定されているので、X に、"後の山に 棄てましょか\n"
が入る
*/
}
void kashi_2 (void) {
/* ニ番 */
kashi_n ( "背戸の小薮に 埋けましょか\n" );
/*
ここでは、実引数として、「"背戸の小薮に 埋けましょか\n"」
が指定されているので、X に、"背戸の小薮に 埋けましょか\n"
が入る
*/
}
int main ( int argc, char *argv[] ) {
{
char *X = "後の山に 棄てましょか\n";
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( X );
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
}
kashi_2();
return 0;
}
/*
* CDATE FILENAME
*/
/*
* 関数と引数変数
*
* 利用方法
* コンパイル
* cc -Ic:\usr\c\include -o BASENAME.exe FILENAME
* 実行
* BASENAME
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* 「金糸雀(かなりや)」
* (c) 西條八十作詞・成田為三作曲
* http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html
*/
/*
* main
*/
void kashi_n(char *X) {
/*
X は、仮引数で、「変数」である
変数 : 値が変化するもの
値は、関数を呼出した時の実引数の値が入る
*/
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( X );
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
}
void kashi_1(void) {
/* 一番 */
kashi_n ( "後の山に 棄てましょか\n" );
/*
ここでは、実引数として、「"後の山に 棄てましょか\n"」
が指定されているので、X に、"後の山に 棄てましょか\n"
が入る
*/
}
void kashi_2 (void) {
/* ニ番 */
kashi_n ( "背戸の小薮に 埋けましょか\n" );
/*
ここでは、実引数として、「"背戸の小薮に 埋けましょか\n"」
が指定されているので、X に、"背戸の小薮に 埋けましょか\n"
が入る
*/
}
int main ( int argc, char *argv[] ) {
/*
kashi_1();
*/
/* kashi_n ( char *X ) { .. }
の関数本体「{..}」をそのまま */
{
/* プラスα : X ← "後の山に 棄てましょか\n" */
char *X = "後の山に 棄てましょか\n";
/*
変数宣言 : char *X;
代入 : X = "後の山に 棄てましょか\n";
*/
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( X );
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
}
/*
kashi_1();
↓
kashi_n ( "後の山に 棄てましょか\n" );
↓
X ← "後の山に 棄てましょか\n"
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( X );
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
↓
s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" );
s_print_string ( "後の山に 棄てましょか\n" );
s_print_string ( "いえ いえ それはなりませぬ\n" );
s_print_newline();
*/
kashi_2();
return 0;
}
#include <stdio.h>
#include "s_print.h"
void print_number ( int n ) {
s_print_int ( n ); /* ここでは実引数の値 */
s_print_newline();
n = 9999; /* n は変数なので、代入ができる */
s_print_int ( n ); /* 上書きされた 9999 */
s_print_newline();
n = 777; /* n は変数なので、代入ができる */
s_print_int ( n ); /* 上書きされた 9999 */
s_print_newline();
}
/*
* main
*/
int main ( int argc, char *argv[] ) {
print_number ( 1 );
/*
n ← 1
ここでは、n が 1 になっているのに..
n = 9999; n は変数なので、代入ができる
その n の値が書き換えられて 9999 になってしまう
元の n の値 (1,10,100) は捨てられてしまう
s_print_int ( n );
ここでは、常に 9999 が表示される
s_print_newline();
*/
print_number ( 10 );
print_number ( 100 );
return 0;
}
/*
* 二つの数を入力して、小さい順に出すプログラム
* 変数を使って、代入を利用して作る
*/
#include <stdio.h>
#include "s_print.h"
#include "s_input.h"
/*
* main
*/
int main(int argc, char *argv[] ) {
int i1; /* 入力をした値を保持する変数を宣言 */
int i2; /* i1 が一つ目, i2 が二つ目 */
int o1; /* 出力する値を保持する変数を宣言 */
int o2; /* o1 が小さい方、o2 が大きい方 */
/* を保持するようにする */
/* [INPUT] */
/* i1, i2 に、それぞれ整数値をキーボードから入力する */
s_print_string ( "一つ目の数を入力してください : " );
i1 = s_input_int();
s_print_string ( "二つ目の数を入力してください : " );
i2 = s_input_int();
/* [PROCESS] */
/* i1, i2 の値の小さい方を o1 に、
大きい方の値を o2 に入れる */
if ( i1 < i2 ) { /* i2 がおおきくて i1 が小さいので.. */
o1 = i1;
o2 = i2;
} else { /* 逆だった.. */
o1 = i2;
o2 = i1;
}
/* [OUTPUT] */
/* o1, o2 を出力する */
s_print_int ( o1 ); /* 小さい方が出力される */
s_print_char ( ',' );
s_print_int ( o2 ); /* 大きい方が出力される */
s_print_newline();
return 0;
}
/*
* 課題 20130628-01
*
* 2013/06/28 20130628-01-QQQQ.c
*
* キーボードから三つの整数を入力し、小さい順に出力する
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* main
*/
int main( int argc, char *argv[] )
{
int i1; /* 三つの入力された整数を保存する変数 */
/*
** この部分を完成させなさい (int i2;)
*/
int i3;
int o1; /* 小さい順に値を入れる */
int o2; /* 小さい順に値を入れる */
/*
** この部分を完成させなさい (int o3;)
*/
s_print_string ( "一つ目の整数を入力してください : " );
i1 = s_input_int();
s_print_string ( "二つ目の整数を入力してください : " );
i2 = s_input_int();
s_print_string ( "三つ目の整数を入力してください : " );
/*
** この部分を完成させなさい ( i3 = s_input_int(); )
*/
/*
* 数を比較して、一番小さい物をみつける
*/
if ( i1 < i2 ) { /* i2 は i1 より大きい */
if ( i2 < i3 ) { /* 更に、i3 は i2 より大きい */
/* i1 < i2 < i3 となっている */
/*
** この部分を完成させなさい ( o1 = i1; o2 = i2.. )
*/
/* i3 < i2, i1 < i2 : i1 と i3 の関係が不明 */
} else if ( i1 < i3 ) { /* i1 < i3 が分った.. */
/* i1 < i3 < i2 */
o1 = i1;
o2 = i3;
o3 = i2;
} else {
o1 = i3;
o2 = i1;
o3 = i2;
}
} else { /* i2 < i1 なので.. */
if ( i1 < i3 ) {
o1 = i2;
o2 = i1;
o3 = i3;
} else if ( i2 < i3 ) {
/*
** この部分を完成させなさい
*/
} else {
o1 = i3;
o2 = i2;
o3 = i1;
}
}
/*
* 出力
*/
/*
** この部分を完成させなさい
*/
s_print_char ( ',' );
s_print_int ( o2 );
s_print_char ( ',' );
s_print_int ( o3 );
s_print_newline();
return 0;
}
#include <stdio.h>
#include "s_print.h"
int main(int argc, char *argv[] ) {
int lv; /* 局所変数の定義 */
/* int 型で名前は lv */
double lv2; /* double 型の変数の宣言 */
lv2 = 1.0; /* 変数は代入して使う */
s_print_double ( lv2 ); /* 1.0 が出力される */
s_print_newline();
{
double lv3; /* このブロックの先頭で宣言されたので
* このブロック内のみ有効 */
lv3 = lv2 * 2.0; /* ブロックの外で宣言された変数は
ブロックの中でも利用できる */
s_print_double ( lv3 ); /* 2.0 が出力される */
s_print_newline();
}
/* ブロックの外で、lv3 を利用しようとすると.. */
/* エラーになるので削除
s_print_double ( lv3 );
s_print_newline();
*/
{
double lv2; /* もし、ブロックの中で同じ名前をつかったら... */
/* 外のブロックの変数が遮蔽され
みえなくなり、新しい変数の
lv2 が作られる。
以下は、この新しい lv2 が
使われる(代入も参照も..)
lv2 = 3.0; /* lv2 に 3.0 を代入したので.. */
s_print_double ( lv2 ); /* 3.0 表示される */
s_print_newline();
}
/* ブロックが終了し、ブロック内の lv2 がなくなると
元の lv2 がみえる */
s_print_double ( lv2 ); /* この lv2 はブロックの前の lv2 なので、1.0 が表示される */
s_print_newline();
{
double lv2 = lv2 * 10.0; /* lv2 の値の初期化 */
/* 初期化の名前は、宣言の
前の名前と見做す
このブロック内の lv2
には、外のブロックの lv2
の値の 10 倍が入る
*/
s_print_double ( lv2 ); /* 10.0 が表示される */
}
return 0;
}
Download : 20130705-01.c ( SJIS 版 )
/*
* 課題 20130628-01
*
* 2013/06/28 20130628-01-QQQQ.c
*
* キーボードから三つの整数を入力し、小さい順に出力する
*/
#include <stdio.h>
#include "s_input.h"
#include "s_print.h"
/*
* main
*/
int main( int argc, char *argv[] )
{
int i1; /* 三つの入力された整数を保存する変数 */
/*
** この部分を完成させなさい
*/
int i3;
int o1; /* 小さい順に値を入れる */
int o2; /* 小さい順に値を入れる */
/*
** この部分を完成させなさい
*/
s_print_string ( "一つ目の整数を入力してください : " );
i1 = s_input_int();
s_print_string ( "二つ目の整数を入力してください : " );
i2 = s_input_int();
s_print_string ( "三つ目の整数を入力してください : " );
/*
** この部分を完成させなさい
*/
/*
* 数を比較して、一番小さい物をみつける
*/
if ( i1 < i2 ) {
if ( i2 < i3 ) {
/*
** この部分を完成させなさい
*/
} else if ( i1 < i3 ) {
o1 = i1;
o2 = i3;
o3 = i2;
} else {
o1 = i3;
o2 = i1;
o3 = i2;
}
} else {
if ( i1 < i3 ) {
o1 = i2;
o2 = i1;
o3 = i3;
} else if ( i2 < i3 ) {
/*
** この部分を完成させなさい
*/
} else {
o1 = i3;
o2 = i2;
o3 = i1;
}
}
/*
* 出力
*/
/*
** この部分を完成させなさい
*/
s_print_char ( ',' );
s_print_int ( o2 );
s_print_char ( ',' );
s_print_int ( o3 );
s_print_newline();
return 0;
}
4 1 3
C:\usr\c\> 20130705-01-QQQQ 一つ目の整数を入力してください : 二つ目の整数を入力してください : 三つ目の整数を入力してください : 1,3,4 C:\usr\c\>