プログラミングI
第1回 演習問題(HW)

今回の問題の解答は、~/prog1/ex01/ というディレクトリを作成しその中に作成すること。

なお、~/prog1, ~/prog1/ex01 のディレクトリともに
  chmod 705 ディレクトリ名
として group の全パーミッションを落しておくこと。ls -ld コマンドの出力が
  drwx---r-x
となっていれば OK です。 提出期限は「次回の演習の前」です。


基本問題(60点)

演習問題1(基本)

  1. 実行例のように「1文字+改行」の入力で、その文字のアスキーコード (10進と16進)を表示するプログラムを作成せよ。(以後キーボード 入力は赤字で表示する)(prog01a.c)
    % ./a.out
    文字を入力して下さい : D   (注:実際はDの後に改行(リターン)を押した)
    文字 D のアスキーコードは 68(0x44) です
    %
  2. 上で作ったプログラムを改良して、複数の文字のコードを出力するようにする。 実行例のように「複数文字+改行」の入力で、その文字のアスキーコード (10進と16進)を順に総て表示するプログラムを作成せよ。 ループは無限ループとし、ループの脱出条件は「改行文字を読み込んだ」 とする。(prog01b.c)

    補足:複数入力された文字は最後の改行(リターン) で初めてプログラムに読み込まれ、処理を行われる。
    例えば1文字で一回まわるループなら、3文字+改行が入力された場合、 ループは4回まわることになる。
    (ハンドアウト01―17を参照のこと)。
    % ./a.out
    文字を入力して下さい : 6Fg&   (注:&の後に改行(リターン)を押した)
    文字 6 のアスキーコードは 54(0x36) です
    文字 F のアスキーコードは 70(0x46) です
    文字 g のアスキーコードは 103(0x67) です
    文字 & のアスキーコードは 38(0x26) です
    %
  3. 上で作成したプログラムを更に改良し、今度はアスキーコードだけでなく、 その文字がアルファベット(a〜z、A〜Z)かどうかを表示するよう にする。
    そのためにisalphaと言う関数を作成して使用する。 isalphaの関数定義は
    int isalpha(char c)
    とし、更に以下のマクロを定義する
    #define TRUE 1
    #define FALSE 0
    関数は引数(文字 C)がアルファベットかどうか検査し、戻り値として アルファベットの場合は TRUE を、そうでない場合は FALSE を返す ようにする。以下が実行例である(prog01c.c)
    % ./a.out
    文字を入力して下さい : 4Gk%   (注:%の後に改行(リターン)を押した)
    文字 4 のアスキーコードは 52(0x34) で,アルファベットではない
    文字 G のアスキーコードは 71(0x47) で,アルファベットです
    文字 k のアスキーコードは 107(0x6b) で,アルファベットです
    文字 % のアスキーコードは 37(0x25) で,アルファベットではない
    %

演習問題2(基本)

ループを使用して以下の実行例のような、アスキーコードと文字の表を作成しなさい。 但し、表示するコードは10進の40〜126とする。
なお、man asciiと言うコマンドを実行する事でも同じ表を 得ることが出来る。(prog02.c)
% ./a.out
 40 (     41 )     42 *     43 +     44 ,     45 -     46 .     47 /    
 48 0     49 1     50 2     51 3     52 4     53 5     54 6     55 7    
 56 8     57 9     58 :     59 ;     60 <     61 =     62 >     63 ?    
 64 @     65 A     66 B     67 C     68 D     69 E     70 F     71 G    
 72 H     73 I     74 J     75 K     76 L     77 M     78 N     79 O    
 80 P     81 Q     82 R     83 S     84 T     85 U     86 V     87 W    
 88 X     89 Y     90 Z     91 [     92 \     93 ]     94 ^     95 _    
 96 `     97 a     98 b     99 c    100 d    101 e    102 f    103 g    
104 h    105 i    106 j    107 k    108 l    109 m    110 n    111 o    
112 p    113 q    114 r    115 s    116 t    117 u    118 v    119 w    
120 x    121 y    122 z    123 {    124 |    125 }    126 ~    
% 

応用問題(40点)

演習問題3

点数(0〜100)を入力すると、成績(A、B、C、D、F)を判定する プログラムを作成する。判定部分は関数evalにて行うものと する。
evalの関数定義は
char eval(int score)
とし、引数を点数、戻り値をその点に応じた成績(A、B、C、D、F) とする。なお、点数と評価は以下のような関係となっている。 mainは無限ループで点数を入力し、関数evalを用いて作成した評価の文字を表示する。 負の点数か100より大きい点数が入力されと無限ループを終了し、プログラムも 終了する。
なお、可能ならばハンドアウト01―17 を参考にして Control-D でもプログラムが終了するようにせよ。(prog03.c)
% ./a.out
点数を入力して下さい : 37
37点の評価は D です

点数を入力して下さい : 75
75点の評価は B です

点数を入力して下さい : 98
98点の評価は A です

点数を入力して下さい : -5

%

ボーナス問題(extra)

演習問題4

与えられたテキストのアルファベットの出現回数をカウントするプログラムを 作成せよ。与えるテキストを /home/course/prog1/public_html/2007/HW/ex/ex01/prog04.txt とする。(自分のディレクトリに ファイルをコピーして使用する、コピー&ペーストを行うと文字数が変るので、 行わないように)アルファベットは大文字、小文字を区別しない。また、アルファベットでない文字はその他(others)としてカウントし、最後にすべて の文字数もカウントせよ。(prog04.c)
% ./a.out < prog04.txt
a/A :  23
b/B :   1
c/C :  22
d/D :  21
e/E :  61
f/F :   8
g/G :   5
h/H :  18
i/I :  20
j/J :   1
k/K :   3
l/L :   6
m/M :   7
n/N :  27
o/O :  36
p/P :  11
q/Q :   0
r/R :  25
s/S :  31
t/T :  50
u/U :  14
v/V :   4
w/W :   7
x/X :   1
y/Y :   2
z/Z :   0
Others  :  89
Total   : 493
%