Ex12

From Prog0

Jump to: navigation, search

演習第12回

Contents

演習問題

主な内容

  • 関数を使った応用問題

以下の問題を解いて期限内に解答を提出してください。

出席確認

演習時間中に出席確認をLMS上の「演習出欠」で行ってください。出席確認用のパスワードは演習時間のどこかのタイミングで提示されます。


A問題

A-1 一次関数

ファイル名: ex12a1.c

以下は一次関数の式 y = ax + b において、xの値を1から4まで1ずつ変化させたときのyの値を出力するプログラムである。係数aとbの値は入力によって実数で与えられ、yの値は「function」という名前の関数を使って計算、出力するものとする。下線部と空白部分を補い、実行例のような動作をするように完成させなさい。

#include <stdio.h>
______ function( ______, ______ );
    
int main()
{
  double a, b;
    
  printf("係数aとbの値を入力してください: ");
  scanf("%lf %lf", &a, &b);
  printf("関数の値は以下のとおりです。\n");
  function( ______, ______ );

  return 0;
}

______ function( ______, ______ )
{


  /* この中を埋める */
 

}

[実行例]

% ./a.out 
係数aとbの値を入力してください:0.5 2.0
関数の値は以下のとおりです。
x = 1 のとき y = 2.5
x = 2 のとき y = 3.0
x = 3 のとき y = 3.5
x = 4 のとき y = 4.0
%

A-2 大きな桁数の表示

ファイル名: ex12a2.c

講義中に説明した

「桁数を返す関数」(/home/course/prog0/public_html/2024/lec/source/lec12-3.c)

「指定された桁の数を返す関数」(/home/course/prog0/public_html/2024/lec/source/lec12-4.c)

を必ず利用して、実行例のように、入力した正の整数を3桁ごとにカンマをいれて表示するプログラムを作成せよ。

この問題では入力値のエラーチェック(負の値等)は省略してよい。

[実行例]

% ./a.out
正の整数を入力してください:12345
12345 の桁数は 5 です
12,345
% ./a.out
正の整数を入力してください:999999
999999の桁数は6です
999,999
% ./a.out
正の整数を入力してください:100
100の桁数は3です
100
%

A-3 ニュートン法

ファイル名: ex12a3.c

f(x) = x2 - 2 = 0 の解をニュートン法を用いて求めるプログラムを作成せよ。ただし、xの初期値は2.0とし、収束条件の精度は10-6とする。なお、実行例の各列の数値の意味はハンドアウトの例題(Lec12-9参照)と同じである。

[実行例]

% ./a.out
x(k-1)		fx		dfx		x(k)		f(x,2.000000)
2.000000	2.000000	4.000000	1.500000	0.2500000000
1.500000	0.250000	3.000000	1.416667	0.0069444444
1.416667	0.006944	2.833333	1.414216	0.0000060073
1.414216	0.000006	2.828431	1.414214	0.0000000000
sqrt(2.000000): 1.4142135624
%

B問題

B-1 10進数から2進数への変換

ファイル名: ex12b1.c

10進数の0から255までの数値を8ビットの符号なし2進数で表示するプログラムを作成せよ。その際、10進数を2進数へ変換して表示する関数 void d2b(int) を作成して使用すること。ただし、入力と表示は繰り返し行い、負の値が入力された場合に終了するものとする。

[実行例]

% ./a.out 
10進数を入力してください:15
00001111
10進数を入力してください:47
00101111
10進数を入力してください:256
256以上の値が入力されました
10進数を入力してください:-1
%

B-2 黄金数の計算

ファイル名: ex12b2.c

フィボナッチ数列 F(i) とは、以下の漸化式で定義される。

F(0) = 0
F(1) = 1
F(i+2) = F(i) + F(i+1) 

フィボナッチ数列の隣り合う項の比率 F(i+1)/F(i) は、黄金数と呼ばれる値の近似値となる。

フィボナッチ数列の項F(i)を計算する関数を作成し、それを使って黄金数を求めるプログラムを作成しなさい。

仕様:

  • フィボナッチ数列の項を計算する関数名はfibとする。引数は整数変数ひとつ、計算結果は倍精度変数とする。
  • main関数では、実行例に示すよう、まずi = 0から9までの項を表示する。
  • 次に隣り合う項F(i)とF(i+1)を求めて、その比を出力すること。
  • 実行例のように、隣り合う項は i = 10 から 30 まで計算し、それぞれの場合に誤差を表示すること。
  • 誤差は倍精度で計算した黄金数 1.618033988749895 との差を出力すること。

[実行例]

% ./a.out
F(0)=0  F(1)=1  F(2)=1  F(3)=2  F(4)=3  F(5)=5  F(6)=8  F(7)=13  F(8)=21  F(9)=34

10   1.618181818182e+00   1.478294319233e-04
11   1.617977528090e+00  -5.646066000731e-05
12   1.618055555556e+00   2.156680566068e-05
13   1.618025751073e+00  -8.237676933476e-06
14   1.618037135279e+00   3.146528619657e-06
15   1.618032786885e+00  -1.201864648914e-06
16   1.618034447822e+00   4.590717870290e-07
17   1.618033813400e+00  -1.753497695933e-07
18   1.618034055728e+00   6.697765919661e-08
19   1.618033963167e+00  -2.558318845658e-08
20   1.618033998522e+00   9.771908393574e-09
21   1.618033985017e+00  -3.732536946188e-09
22   1.618033990176e+00   1.425702222946e-09
23   1.618033988205e+00  -5.445699446938e-10
24   1.618033988958e+00   2.080071670463e-10
25   1.618033988670e+00  -7.945177848967e-11
26   1.618033988780e+00   3.034772433352e-11
27   1.618033988738e+00  -1.159183860011e-11
28   1.618033988754e+00   4.427569422205e-12
29   1.618033988748e+00  -1.691313755714e-12
30   1.618033988751e+00   6.459277557269e-13
%

実行例の後半は、変数iの値、求めた比(12桁)、誤差(12桁)を各行に表示している。桁数などは厳密に一致しなくともよい。

参考ページ: 黄金比 https://ja.wikipedia.org/wiki/%E9%BB%84%E9%87%91%E6%AF%94

B-3 10進数を16進数で表示

ファイル名: ex12b3.c

以下の実行例のように、入力した10進数を16進数で表示するプログラムを以下の仕様に基づいて作成せよ。この問題では、printf関数の書式を"%x"を使わずに、 10進数の0から15を引数とし、16進数で1桁表示する関数"to_hex"を定義して使うこと。

仕様:

  • 入力された整数の16進数での桁数を求める。
  • 16進数での各桁を配列hに保存する。hの大きさは最大で8とする。
  • 配列hの値を上の桁からto_hex関数を使って表示する。
  • 負の値が入力された場合は、実行例のようにメッセージを表示して再度データ入力からやり直すこととする。

[実行例]

%./a.out
10進数を入力してください:10
10 の16進数は a です
% ./a.out
10進数を入力してください:-1
負の値が入力されました
10進数を入力してください:254
254 の16進数は fe です
%

Extra問題

E-1 逐次平均

ファイル名: ex12e1.c

キーボードから数値を入力するたびに、最初の入力からそれまでの入力の平均値を逐次計算して表示するプログラムを作成しなさい。
プログラムは0が入力されたら終了するものとする。
また、逐次平均の計算には「avg」という名前の関数を作成して使用すること。
avg関数は「入力回数n」、「n-1回目までの平均値」、「n回目の入力データ」の三つを引数に取り、「n回目までの平均値」を返す関数とする。

[実行例]

% ./a.out
データを入力してください
入力値1 = 3.0
平均値1 = 3.0
入力値2 = 22.0
平均値2 = 12.5
入力値3 = 14.0
平均値3 = 13.0
入力値4 = 41.0
平均値4 = 20.0
入力値5 = 0.0

課題提出上の注意事項

解答ファイルはmenuコマンドを使って提出してください。以下のようにmenuコマンドを実行し、表示されるメッセージに沿って操作すること。

% ~prog0/bin/menu

menuコマンドは、解答ファイルが ~/Prog0/Ex## のディレクトリに指定されたファイル名で置かれているものとして処理します。正常に提出された場合は ○ が、何らかのエラーが生じた場合は × が表示されます。

解答の提出期間は以下のとおりです。

問題提出受付開始提出〆切
A問題 演習日の6日前の午後9時演習終了時刻
B, Extra問題 演習日の6日前の午後9時演習日の6日後の午後9時

提出は〆切前であれば何度でもやり直すことができます。再提出すると、前に提出したファイルは新しい内容で上書きされます。

Personal tools