Ex12

From Prog0

Jump to: navigation, search

演習第12回

Contents

演習問題

主な内容

  • 関数を使った応用問題

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

出席確認

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


A問題

A-1 関数における変数の値

ファイル名: ex12a1.txt

以下のプログラムでは、関数print_value( m, n )を利用して、出力の番号mと変数nの値を出力させています。このプログラムを実行すると、以下の出力結果のような形式で表示されます。プログラムを実行せずに出力結果を考えなさい。提出ファイルの中には、出力結果そのものに加えて、nがどの関数で出力されたか、どう計算されたかも出力行ごとに記述しなさい。

File:Ex14A_P01_2.png

[出力結果] (最初の出力結果を参考に後を同じように埋めよ)


                 関数          計算
No.0,  n:3       main()         初期値
No.?, n:?
No.?, n:?
No.?, n:?
No.?, n:?
No.?, n:?
No.?, n:?

A-2 (口頭試問) 一次関数

ファイル名: ex12a2.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-3 総和

ファイル名: ex12a3.c

任意の自然数nを入力すると、1からnまでの整数の総和Sを出力するプログラムを作成しなさい。ただし、総和の計算にはnを引数とし、Sを戻り値とする関数 sum を作成して使用すること。 結果の表示は関数sumではなく、実行例を参考にmain関数で行うこと。

[実行例]

% ./a.out 
nの値を入力してください。
7
1から7までの総和は28です。
%

B問題

B-1 逐次平均

ファイル名: ex12b1.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

B-2 大きな桁数の表示

ファイル名: ex12b2.c

講義中に説明した

「桁数を返す関数」(ハンドアウト p65, Lec12-13 /home/course/prog0/public_html/2025/lec/source/lec12-3.c)

「指定された桁の数を返す関数」(ハンドアウト p65, Lec12-16 /home/course/prog0/public_html/2025/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
%

B-3 ISBN番号

ファイル名: ex12b3.c

最近の書籍には13桁からなるISBN番号が振られていて(以前は10桁だった)、この番号をもとに書籍を特定することができる。したがって、番号さえ知っていれば、その書籍の注文や検索も簡単に行なうことができる。
このISBN番号は次のような書式になっている。

978-4-274-06440-1

(ただし、区切り方は若干違う場合がある)

この番号の最後の桁(13桁目)の数字は、それまでの12桁の数字に誤りが無く、正しいISBN番号になっていることを示す符号(チェックディジットと呼ぶ)になっている。このチェックディジットは以下のように計算される。

まず、偶数桁の数字は3倍し、奇数桁の数字は1倍して、それらの合計値を求める。

{(1つめの数字×1)+(2つめの数字×3)+(3つめの数字×1)+(4つめの数字×3)+…}

この合計値の下1桁の数字を10から引いたものがチェックディジットとなる。例えば、合計が134であれば、チェックディジットは

10 - 4 = 6

で6となる。なお、合計値の下1桁が0の場合は、チェックディジットは0とする。もし、あるISBN番号について最初の12桁から求めた チェックディジットと、13桁目の数字が一致しない場合は、何らかの誤りを含んだ不正なISBN番号であるということになる。

この計算方法を利用して、入力されたISBN番号が正しいことを確かめるプログラムを作ってみよう。
作成するプログラムの仕様は以下のとおりである。

  • ISBN番号は「-」にかかわらず上位桁から4つずつ入力し、最後の13桁目の数字は1つだけ入力する。これらの入力部分も関数で作成する(4つ入力する関数と1つ入力する関数は別々でよい)。戻り値は入力された数字とする。
  • 入力された際、5桁以上の数字や、マイナスの数字が入力された場合には、「入力された数字が不正です」として、プログラムを終了する。このエラーチェックも上述の入力を行う関数の中で行う。
  • 4つごとの数字に0が含まれている場合は、"0012"のように入力する。
  • 4つごとに入力された数字について、上記の合計を計算する関数を作成する。この関数は引数として入力された数字をとり、戻り値として合計(1つめの数字×1+2つめの数字×3+…)を返す。}
  • 4つごとの数字3つのブロックで合計を計算し、最後にチェックディジットを計算する。
  • チェックディジットが合っていれば「正しいISBN番号です」、間違っていれば「不正なISBN番号です」と表示する。
  • 関数はこの他にも適宜付け加えてよい。
% ./a.out
ISBNの最初の4桁を入力してください: 9784
ISBNの2つめの4桁を入力してください: 4040
ISBNの3つめの4桁を入力してください: 4167
ISBNの最後の数字を入力してください: 8
正しいISBN番号です
% ./a.out
ISBNの最初の4桁を入力してください: 9784
ISBNの2つめの4桁を入力してください: 6203
ISBNの3つめの4桁を入力してください: 2025
ISBNの最後の数字を入力してください: 0 
正しいISBN番号です
% ./a.out
ISBNの最初の4桁を入力してください: 9780 
ISBNの2つめの4桁を入力してください: 0666
ISBNの3つめの4桁を入力してください: 2073
ISBNの最後の数字を入力してください: 2
正しいISBN番号です
% ./a.out
ISBNの最初の4桁を入力してください: 9784
ISBNの2つめの4桁を入力してください: 1234
ISBNの3つめの4桁を入力してください: 5678
ISBNの最後の数字を入力してください: 9 
不正なISBN番号です
% ./a.out
ISBNの最初の4桁を入力してください: 97841 
入力された数字が不正です

Extra問題

E-1 10進数を16進数で表示

ファイル名: ex12e1.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 です
%

課題提出上の注意事項

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

% ~prog0/bin/menu

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

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

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

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

Personal tools