第13回 プログラミング入門 演習

【演習の注意事項】を良く読んで解答してください


良いプログラミングのスタイル

【主な内容】

最後の演習です。動作するだけでなく、より見やすく効率の良いプログラムにするための技法を学びます。

演習課題

以下の例題と、3つのレベル (初級レベル, 中級レベル, 上級レベル) の全ての課題 に解答しなさい。各々の課題毎にファイルを作成しなさい。 今回の課題はテキスト(文書)ファイルで提出するものとC言語のプログラムファイルで提出するものがあります。 前者は".txt"、後者は".c" という拡張子をつけて下さい。 各課題にはファイル名が指定してあるので、その指示にしたがって下さい。

初級レベル

(A-1)
下記のプログラムはキーボードから入力された10個の整数を受け取って、平 均値を求めるものです。役割に適合する変数名(inData,avgData)を使用して 分かりやすいプログラムに書き直しなさい。

ファイル名: ex13a1.c
[実行例]
% ./a.out
1番目のデータを入力してください : 1
2番目のデータを入力してください : 2
3番目のデータを入力してください : 3
4番目のデータを入力してください : 4
5番目のデータを入力してください : 5
6番目のデータを入力してください : 6
7番目のデータを入力してください : 7
8番目のデータを入力してください : 8
9番目のデータを入力してください : 9
10番目のデータを入力してください : 10
平均値 = 5.500000 です!


(A-2)
「1から100までの偶数の和を計算する」という下記のプログラムについて、 バグを取り除き、if文をなくすなど効率の良いプログラムに書き直しなさい。

ファイル名: ex13a2.c
[実行例]
% ./a.out
結果は 2550 です。


(A-3)
下記のプログラムを理解し、バグを取り除き、空白になっている5カ所の/* */(機能〜日付のコメントも含む)にコメントを入れ、適当にスペース、空行を挿入し、インデント処理を行い、読みやすいプログラムに書き直しなさい。

ファイル名: ex13a3.c
[実行例]
% ./a.out
平均値を求めたいデータの個数を入力してください
100000
平均値=0.501546
% ./a.out
平均値を求めたいデータの個数を入力してください
1000000
平均値=0.500386



中級レベル

(B-1)
次のプログラムを動作するよう修正し、スタイルを整えなさい。また、プログラムの働きを理解した上で、/* */にコメントを追加しなさい。(分かりやすくなるようにその他のコメントを追加しても良い)

ファイル名: ex13b1.c
[実行例]
% ./a.out 
要素       頻度値         グラフ
   0         19          *******************
   1          3          ***
   2         15          ***************
   3          7          *******
   4         11          ***********
   5          9          *********
   6         13          *************
   7          5          *****
   8         17          *****************
   9          1          *


(B-2)
時刻を三つの入力(時、分、秒)で受け取り、零時からその時刻までの経過秒数を返す関数を書きなさい。
その後、この関数を使って与えられた二つの時刻の間の経過秒数を計算するプログラムを書きなさい。

ファイル名: ex13b2.c

[実行例]
% ./a.out 
開始時刻(Hour Minute Second)を入力してください(例:8 30 20)
8 30 20
終了時刻(Hour Minute Second)を入力してください(例:18 20 30)
18 20 30
経過秒数=35410秒


(B-3)
以下に示すプログラムは入力された自然数 i, j について、 i の j 乗の下1桁目の値を求めるものです。まず、以下に示す「変更1」を行い、その動作を確認した後、続いて「変更2」、「変更3」を行いなさい。

ファイル名: ex13b3.c
[実行例]
% ./a.out 
整数i j (i^j)を入力してください(i<0:終了)> 3 4
3^4の時, 下1桁目の値= 1
整数i j (i^j)を入力してください(i<0:終了)> 2 3
2^3の時, 下1桁目の値= 8 
整数i j (i^j)を入力してください(i<0:終了)> -2 3
Good bye!



上級レベル

(C-1)
実行例のような出力になるように、下記のプログラムを完成しなさい。

ファイル名: ex13c1.c
[実行例]
% ./a.out 
成績配列は:
科目    1    2    3    4
学生1   77   68   86   73
学生2   96   87   89   78
学生3   70   90   86   81

最低点:68
最高点:96

学生1の平均点は 76.00
学生2の平均点は 87.50
学生3の平均点は 81.75


(C-2)
下記のプログラムは、年月日を与えるとその曜日を出力しなければなりません。しかし、その中には不注意による文法上のミスやバグ(=文法的には正しいが、意図した結果や出力が得られなくなる間違い)がいくつかあり、正しい出力が得られません。それらを取り除き、正常に動作するように修正しなさい。

ファイル名: ex13c2.c
[実行例]
% ./a.out 
曜日を知りたい日は(年 月 日)? 2006 7 11
2006 年 7 月 11 日は, 火曜日です!
% ./a.out 
曜日を知りたい日は(年 月 日)? 2006 7 14
2006 年 7 月 14 日は, 金曜日です!


(C-3)
整数は約数(1は含むが、その整数自身は含めない)の和がその整数に等しいとき、完全数と呼ばれる。引数 number が完全数であるかどうかを判定する関数 int IsPerfect(int number)と約数判定関数 int IsDivisor(int dividend, int divisor)を作成しなさい。
そして、これらの関数を使って、2 から 10000 までの間にあるすべての完全数を出力するプログラムを作成しなさい。

ファイル名: ex13c3.c

[実行例]
% ./a.out 
完全数リストは下記の通りです:
   6
  28
 496
8128



オプション問題(採点対象外)

(D-1)
関数 int DivisorList(int perfectnumber, int divisorlist[])を作り、下記のような出力が得られるように C-3 のプログラムを書き直しなさい。なお、関数 DivisorList の戻り値は約数の個数とする。

ファイル名: ex13d1.c

[実行例]
% ./a.out 
完全数リストは下記の通りです:
   6=1+2+3
  28=1+2+4+7+14
 496=1+2+4+8+16+31+62+124+248
8128=1+2+4+8+16+32+64+127+254+508+1016+2032+4064



何か疑問や間違いがあれば以下に連絡して下さい。
プログラミング入門演習問題担当(prog0)