Download : sample-001.c ( SJIS 版 )
/*
* 2015/11/20 sample-001.c
* 10 進数を 2 進数表示する
*/
#include <stdio.h>
/*
* 利用方法
* コンパイル
* cc -o sample-001.exe sample-001.c
* 実行
* ./sample-001.exe
*/
#include <stdio.h>
/*
* 2 進数一桁正の 10 進数の int 型の数値を 2 進数で出力する
*/
void print_bin_one ( int value ) {
/* 表示は 0 か 1 だが、数値を文字に変換して出力する必要がある */
putchar ( '0' + value );
}
/*
* 零以上の 10 進数の int 型の数値を 2 進数で出力する
*/
void print_positive_bin ( int value ) {
if ( value > 0 ) { /* 値が正ということは、零でないってこと */
/* まず上位部分を表示 */
print_positive_bin ( value / 2 );
/* その後で、末尾の一桁の部分を表示 */
print_bin_one ( value % 2 );
} /* そうでない時は、零だが.. */
/* 零の時は何もしなくてよい */
}
/*
* 10 進数の int 型の数値を 2 進数で出力する
*/
void print_bin ( int value ) {
if ( value == 0 ) { /* 0 の時は */
putchar ( '0' );
} else if ( value < 0 ) { /* 負の時は .. */
putchar ( '-' ); /* 負符号を表示し.. */
/* 正の場合の処理ができるようにして.. */
print_bin ( - value );
} else { /* 正の場合 */
/* 正の場合の処理を行う */
print_positive_bin ( value );
}
}
/*
*
*/
int main ( void ) {
printf ( "100 の 2 進数表現は " );
print_bin ( 100 );
printf ( "となります。\n" );
return 0;
}
/*
*
*/
$ ./sample-001.exe 100 の 2 進数表現は 1100100となります。 $
Download : sample-002.c ( SJIS 版 )
/*
* 2015/11/20 sample-002.c
* 1/n の総和を計算する
*/
#include <stdio.h>
/*
* 大きい順に和を求める
*/
double sum ( int n ) {
double s = 0.0;
int i;
for ( i = 1; i <= n; i++ ) {
s += 1.0/i;
}
return s;
}
/*
*
*/
int main ( void ) {
int n;
for ( n = 10; n <= 1000000; n *= 10 ) {
printf ( "1 〜 %i までの総和 = %16.13f\n", n, sum( n ) );
}
return 0;
}
/*
*
*/
$ ./sample-002.exe 1 〜 10 までの総和 = 2.9289682539683 1 〜 100 までの総和 = 5.1873775176396 1 〜 1000 までの総和 = 7.4854708605503 1 〜 10000 までの総和 = 9.7876060360443 1 〜 100000 までの総和 = 12.0901461298633 1 〜 1000000 までの総和 = 14.3927267228648 $
Download : sample-003.c ( SJIS 版 )
/*
* 2015/11/20 sample-003.c
* 1/n の総和を計算する
*/
#include <stdio.h>
/*
* 小さい順に和を求める
*/
double sum ( int n ) {
double s = 0.0;
int i;
for ( i = n; i > 0; i-- ) {
s += 1.0/i;
}
return s;
}
/*
*
*/
int main ( void ) {
int n;
for ( n = 10; n <= 1000000; n *= 10 ) {
printf ( "1 〜 %i までの総和 = %16.13f\n", n, sum( n ) );
}
return 0;
}
/*
*
*/
$ ./sample-003.exe 1 〜 10 までの総和 = 2.9289682539683 1 〜 100 までの総和 = 5.1873775176396 1 〜 1000 までの総和 = 7.4854708605503 1 〜 10000 までの総和 = 9.7876060360444 1 〜 100000 までの総和 = 12.0901461298634 1 〜 1000000 までの総和 = 14.3927267228658 $
Download : sample-004.c ( SJIS 版 )
/*
* 2015/11/20 sample-004.c
* 実解を持つ二次方程式の解を公式で計算する
*/
#include <stdio.h>
#include <math.h> /* 平方根を求めるために sqrt を利用するので */
/*
* 利用方法
* コンパイル
* cc -o sample-004.exe sample-004.c -lm
* 実行
* ./sample-004.exe
*
*/
void print_result ( double a, double b, double c ) {
double d; /* 判別式の値を保持する */
double x1; /* 一つ目の解 */
double x2; /* 二つ目の解 */
/* 判別式の値を計算 */
d = b * b - 4.0 * a * c;
if ( d < 0 ) {
printf ( "この版では、虚解は対応しません。\n" );
} else {
/* 公式で計算 */
x1 = (-b + sqrt ( d ))/(2.0*a);
x2 = (-b - sqrt ( d ))/(2.0*a);
printf ( "答え : %16.13f (誤差:%16.13f), %16.13f (誤差:%16.13f)\n",
x1, a * x1 * x1 + b * x1 + c,
x2, a * x2 * x2 + b * x2 + c
);
}
}
/*
* 方程式と結果を出力
*/
void print_qa ( double b, double c ) {
printf ( "方程式 x^2 + %f x + %f = 0 の解は\n", b, c );
print_result ( 1.0, b, c );
printf ( "\n" );
}
/*
*
*/
int main ( void ) {
print_qa ( 2.0, 1.0 );
print_qa ( -3.0, 2.0 );
print_qa ( 10000000000.0, 1.0 );
return 0;
}
/*
*
*/
$ ./sample-004.exe
方程式 x^2 + 2.000000 x + 1.000000 = 0 の解は
答え : -1.0000000000000 (誤差: 0.0000000000000), -1.0000000000000 \
(誤差: 0.0000000000000)
方程式 x^2 + -3.000000 x + 2.000000 = 0 の解は
答え : 2.0000000000000 (誤差: 0.0000000000000), 1.0000000000000 (誤差: \
0.0000000000000)
方程式 x^2 + 10000000000.000000 x + 1.000000 = 0 の解は
答え : 0.0000000000000 (誤差: 1.0000000000000), \
-10000000000.0000000000000 (誤差: 1.0000000000000)
$
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20151127-01.c ( SJIS 版 )
/*
* 20151127-01-QQQQ.c
* 10 進数整数値を 16 進で出力する
*/
#include <stdio.h>
/*
* 16 進数一桁正の 10 進数の int 型の数値を 16 進数で出力する
*/
void print_hex_one ( int value ) {
if ( value < 10 ) { /* 10 未満であれば .. */
/* 普通の数字を出力 */
putchar ( value + '0' );
} else { /* 10 以上の場合は... */
/* アルファベットを「数字」として利用する */
/*
** この部分を完成させなさい
*/
}
}
/*
* 零以上の 10 進数の int 型の数値を 16 進数で出力する
*/
void print_positive_hex ( int value ) {
if ( value > 0 ) { /* 値が正ということは、零でないってこと */
/* まず上位部分を表示 */
/*
** この部分を完成させなさい
*/
/* その後で、末尾の一桁の部分を表示 */
print_hex_one ( value % 16 );
} /* そうでない時は、零だが.. */
/* 零の時は何もしなくてよい */
}
/*
* 10 進数の int 型の数値を 16 進数で出力する
*/
void print_hex ( int value ) {
if ( value == 0 ) { /* 0 の時は */
putchar ( '0' );
} else if ( value < 0 ) { /* 負の時は .. */
putchar ( '-' ); /* 負符号を表示し.. */
/* 正の場合の処理ができるようにして.. */
/*
** この部分を完成させなさい
*/
} else { /* 正の場合 */
/* 正の場合の処理を行う */
print_positive_hex ( value );
}
}
/*
*
*/
int main ( void ) {
printf ( "100 の 16 進数表現は " );
print_hex ( 100 );
printf ( " となります。\n" );
return 0;
}
/*
*
*/
2.3 9.1 5.9 2.7 3.2
$ ./20151127-01-QQQQ.exe 100 の 16 進数表現は 64 となります。 $
Download : 20151127-02.c ( SJIS 版 )
/*
* 20151120-02-QQQQ.c
* 二次方程式の根を桁落しないように求める
*/
#include <stdio.h>
#include <math.h> /* 平方根を求めるために sqrt を利用するので */
/*
* 利用方法
* コンパイル
* cc -o 20151120-02-QQQQ.exe 20151120-02-QQQQ.c -lm
* 実行
* ./20151120-02-QQQQ.exe
*
*/
void print_result ( double a, double b, double c ) {
double d; /* 判別式の値を保持する */
double bu; /* 一つ目の解の分子 */
double x1; /* 一つ目の解 */
double x2; /* 二つ目の解 */
/* 判別式の値を計算 */
/*
** この部分を完成させなさい
*/
if ( d < 0 ) {
printf ( "この版では、虚解は対応しません。\n" );
} else {
if ( b < 0 ) { /* b の符号を見て、桁落の起きないように分子を計算 */
bu = - b + sqrt ( d );
} else {
/*
** この部分を完成させなさい
*/
}
x1 = bu / ( 2.0 * a ); /* 一つ目の解 */
/* 二つ目の解は、根と係数の関係を利用 */
/*
** この部分を完成させなさい
*/
printf ( "答え : %16.13f (誤差:%16.13f), %16.13f (誤差:%16.13f)\n",
x1, a * x1 * x1 + b * x1 + c,
x2, a * x2 * x2 + b * x2 + c
);
}
}
/*
* 方程式と結果を出力
*/
void print_qa ( double b, double c ) {
printf ( "方程式 x^2 + %f x + %f = 0 の解は\n", b, c );
print_result ( 1.0, b, c );
printf ( "\n" );
}
/*
*
*/
int main ( void ) {
print_qa ( 2.0, 1.0 );
print_qa ( -3.0, 2.0 );
print_qa ( 10000000000.0, 1.0 );
return 0;
}
/*
*
*/
123 987 456
$ ./20151127-02-QQQQ.exe
方程式 x^2 + 2.000000 x + 1.000000 = 0 の解は
答え : -1.0000000000000 (誤差: 0.0000000000000), -1.0000000000000 \
(誤差: 0.0000000000000)
方程式 x^2 + -3.000000 x + 2.000000 = 0 の解は
答え : 2.0000000000000 (誤差: 0.0000000000000), 1.0000000000000 (誤差: \
0.0000000000000)
方程式 x^2 + 10000000000.000000 x + 1.000000 = 0 の解は
答え : -10000000000.0000000000000 (誤差: 1.0000000000000), \
-0.0000000001000 (誤差:-0.0000000000000)
$