練習 [12] ファイル処理(5/5)

練習 5(提出プログラム名:p1205a.c)※加点対象

この問題は中級クラスの受講生は必須ではない(提出しなくてもよい)が,
上級クラスの受講生は必須とする.
なお,どちらのクラスであっても適切に正解すれば加点対象として扱う.

まず,このプログラム(p1205a.c)をダウンロードしなさい.
そして,このプログラムを編集して以下の実行例のように実行できるようにしなさい.

このプログラムでは,以下の処理を行おうとしている:
①コマンドライン引数で指定されたファイル(1個のみ)を読み出しモードで開く(未完成).
 そのためのファイルポインタは fp とする.失敗した場合はエラーメッセージを出力して終了する.
② ファイルから 1 文字ずつ最後まで順番に読み込みながら,
 その文字がアルファベットならばそれぞれの個数を数える(未完成).
 'a' の個数は count[0] で,'b' の個数は count[1] で,…,'z' の個数は count[25] で管理する.
 なお,大文字と小文字は区別しない(小文字に統一して考える)ので注意せよ.
③ ファイルを閉じる(完成済み).
④ 実行例のかたちで各アルファベットの登場回数を出力する(未完成).
 その際,最大の登場回数の後ろには *** も出力する.もし登場回数が最大のアルファベットが複数あった場合はそれらすべてに *** も出力させよ.

【編集すべき内容】
上記の手順のうち,①②④に該当する内容を完成させなさい.

【ヒント】
変数 c にあるアルファベット(ただし小文字)が入っている場合,c-'a' を計算すると配列 count を扱うのに都合がよい.
なぜなら,'a' から 'z' までの文字コードは連続しているので,
c の内容が
 'a' だった場合は c-'a' は 0 となり,
 'b' だった場合は c-'a' は 1 となり,
 …,
 'z' だった場合は c-'a' は 25 になるからである.

ただし,変数 c に入っている文字が必ず小文字とは限らないため,
いったん c = tolower(c); として強制的に小文字に変換しておくと処理が簡単である.

  • 【プログラムの実行例】(その1)※赤字は実行時にキーボードから入力する内容
    ※先の sample1203a1.c を使った場合
アルファベットのカウント結果:⏎
a: 9⏎
b: 5⏎
c: 8⏎
d: 5⏎
e: 8⏎
f: 8⏎
g: 3⏎
h: 5⏎
i: 25 ***⏎
j: 0⏎
k: 0⏎
l: 2⏎
m: 4⏎
n: 15⏎
o: 12⏎
p: 6⏎
q: 0⏎
r: 14⏎
s: 11⏎
t: 13⏎
u: 2⏎
v: 2⏎
w: 1⏎
x: 0⏎
y: 3⏎
z: 3⏎

  • 【プログラムの実行例】(その2)※赤字は実行時にキーボードから入力する内容
    ※先の sample1203a2.c を使った場合
アルファベットのカウント結果:⏎
a: 10⏎
b: 5⏎
c: 13⏎
d: 5⏎
e: 9⏎
f: 6⏎
g: 1⏎
h: 3⏎
i: 16 ***⏎
j: 0⏎
k: 0⏎
l: 2⏎
m: 1⏎
n: 15⏎
o: 2⏎
p: 5⏎
q: 0⏎
r: 11⏎
s: 15⏎
t: 13⏎
u: 3⏎
v: 1⏎
w: 0⏎
x: 0⏎
y: 1⏎
z: 4⏎

【過去にあったミス(減点となり,やり直しを命じられる)】
■ 2 種類の実行例を確認せずに提出してしまっている.
■ インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).


第12回(Cプログラミング;3 限目の方)の練習問題は以上の5問です.
p1201a.c ~ p1205a.c を Moodle から提出してください.※ただし,p1205a.c は必須ではないです.
くれぐれも各問題で記載されている注意事項や「過去にあったミス」を見落とさないようにしてください.
なお,コンパイルエラーや無限ループになるプログラムを 1 個でも提出した場合は総合評価を 0 点とするので十分に注意すること.
なお,提出後に間違いに気付いた場合,〆切前であれば差し替え(上書き)は可能です.