Ex12

From Prog0

Jump to: navigation, search

演習第12回

Contents

演習問題

主な内容

  • 関数を使った応用問題

以下の問題を解いて期限内に解答を提出してください。
口頭採点は、A-3 とします。

出席確認

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

ハンドアウトの例題

ハンドアウトにある例題 lec12-1a.c などが今回の参考プログラムとなるので適宜、使用してください。以下のようにコピーして使用できます。

% cd ~/Prog0/Ex12
% cp /home/course/prog0/public_html/2026/lec/source/lec12-1a.c .

A問題

A-1 逐次平均

ファイル名: ex12a1.c

キーボードから浮動小数点数を入力するたびに、最初の入力からそれまでの入力の平均値を逐次計算して表示するプログラムを作成しなさい。
プログラムは 0 が入力されたら(0.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

A-2 数値の桁数

ファイル名: ex12a2.c

以下の実行例のように、入力した正の整数の桁数を表示するプログラムを作成せよ。その際、整数の桁数を計算して返す関数 int digits(int) を作成して使用すること。
入力値のエラーチェックは省略してよい。

[実行例]

% ./a.out
正の整数を入力してください:12345
12345 の桁数は 5 です
%

A-3 (口頭採点) 10進数から2進数への変換

ファイル名: ex12a3.c

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

[実行例]

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


B問題

B-1 ニュートン法

ファイル名: ex12b1.c

f(x) = ex - 4x = 0 の解をニュートン法を用いて求めるプログラムを作成しなさい。
収束条件の精度は 10-6とせよ。
なお、指数関数exの計算にはライブラリ関数 exp を使用すること(exp関数は引数で与えられた値の指数関数値を返す関数である。exp関数を使うにはmath.hをインクルードし、コンパイル時に-lmオプションをつける)。

File:Ex14B_P03_1.png

図の黒線が f(x) = ex - 4x で、赤線は 0 をあらわす。
黒線と赤線が交わったところが解で、解は2つある。

プログラム中の初期値を0として実行すると、[実行例1]のように、小さいほうの解を求めることができる。
初期値を3に変えて実行すると、[実行例2]のように、大きいほうの解を求めることができる。
(提出する ex12b1.c 中の初期値は3でけっこうです)

実行例の各列の数値の意味は、ハンドアウトLec-12-9の説明、また例題 lec12-1{a, b, c}.c と同様である。

[実行例1]

% ./a.out
x(k-1)		fx		dfx		x(k)		f(x)
0.000000	1.000000	-3.000000	0.333333	0.062279
0.333333	0.062279	-2.604388	0.357246	0.000402
0.357246	0.000402	-2.570612	0.357403	0.000000
x = 0.357403
%

[実行例2]

% ./a.out
x(k-1)          fx              dfx             x(k)            f(x)
3.000000        8.085537        16.085537       2.497341        2.160781
2.497341        2.160781        8.150146        2.232219        0.391652
2.232219        0.391652        5.320529        2.158608        0.024644
2.158608        0.024644        4.659076        2.153319        0.000121
2.153319        0.000121        4.613395        2.153292        0.000000
x = 2.153292
%

B-2 四捨五入

ファイル名: ex12b2.c

キーボードから入力した正の実数を、小数点以下の指定した桁数までとなるように四捨五入して表示するプログラムを作成せよ。その際、実数を指定した桁数で四捨五入する関数 double round_to(double, int) を作成して使用すること。
入力値のエラーチェックは省略してよい。

[実行例]

%./a.out
正の実数を入力してください:3.14159265
小数点以下の桁数を入力してください:2
3.140000
% ./a.out
正の実数を入力してください:3.14159265
小数点以下の桁数を入力してください:4
3.141600
%

B-3 各桁の数値の和

ファイル名: ex12b3.c

ハンドアウト Lec12-11 〜 Lec12-16 にある関数を利用して、キーボードから入力した正の整数の各桁の数値の和を計算して表示するプログラムを作成せよ。
ただし、負の値が入力された場合は「不正な値が入力されました」というメッセージを標準エラー出力で出力して強制終了すること。
またその際、シェル変数「$?」へは「8」を渡すこと(ハンドアウトLec12-23参照)。

[実行例]

% ./a.out
正の整数を入力してください:12345
12345 の各桁の数値の和は 15 です
% echo $?
0
% ./a.out
正の整数を入力してください:-1
不正な値が入力されました
% echo $?
8
%

Extra問題

E-1 素数判定

ファイル名: ex12e1.c

素数かどうかを判定する関数「isprime」を作成し、2から1000までの素数を10列の表として表示するプログラムを作成しなさい。isprime関数は判定する数字を引数に取り、素数の場合は "1" を、そうでない場合は "0" を返す関数とする。なお、実行例のように列を揃えて(10個単位で改行させて)表示させること(ブラウザによっては、ずれて見える可能性がある)。

[実行例]

% ./a.out 
    2     3     5     7    11    13    17    19    23    29
   31    37    41    43    47    53    59    61    67    71
   73    79    83    89    97   101   103   107   109   113
  127   131   137   139   149   151   157   163   167   173
  179   181   191   193   197   199   211   223   227   229
  233   239   241   251   257   263   269   271   277   281
  283   293   307   311   313   317   331   337   347   349
  353   359   367   373   379   383   389   397   401   409
  419   421   431   433   439   443   449   457   461   463
  467   479   487   491   499   503   509   521   523   541
  547   557   563   569   571   577   587   593   599   601
  607   613   617   619   631   641   643   647   653   659
  661   673   677   683   691   701   709   719   727   733
  739   743   751   757   761   769   773   787   797   809
  811   821   823   827   829   839   853   857   859   863
  877   881   883   887   907   911   919   929   937   941
  947   953   967   971   977   983   991   997
%

課題提出上の注意事項

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

% ~prog0/bin/menu

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

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

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

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

Personal tools