必ずここを見て、ディレクトリ作成と提出方法などを確認して下さい |
---|
A問題(50点)
% ./a.out Input a character: X 'X': 88 in Decimal / 0x58 in Hexadecimal % ./a.out Input a character: x 'x': 120 in Decimal / 0x78 in Hexadecimal % ./a.out Input a character: . '.': 46 in Decimal / 0x2e in Hexadecimal %
% ./a.out Input any characters: char 'c': 99 in Decimal / 0x63 in Hexadecimal 'h': 104 in Decimal / 0x68 in Hexadecimal 'a': 97 in Decimal / 0x61 in Hexadecimal 'r': 114 in Decimal / 0x72 in Hexadecimal % ./a.out Input any characters: NULL 'N': 78 in Decimal / 0x4e in Hexadecimal 'U': 85 in Decimal / 0x55 in Hexadecimal 'L': 76 in Decimal / 0x4c in Hexadecimal 'L': 76 in Decimal / 0x4c in Hexadecimal %
B問題(50点)
isAlpha
という関数を作成して使用する
(AlphaのAは大文字であることに注意すること)。
isAlpha
の関数定義は
int isAlpha(char c)
#define TRUE 1関数
#define FALSE 0
isAlpha
は引数(文字型変数 c)がアルファベットかどうか
検査し(大文字、小文字は問わない)、戻り値としてアルファベットの場合は
TRUE を、それ以外の場合は FALSE を返すようにする。
% ./a.out Input any characters: 5W1H '5': 53 in Decimal / 0x35 in Hexadecimal. It's a non-alphabetic character. 'W': 87 in Decimal / 0x57 in Hexadecimal. It's an alphabetic character. '1': 49 in Decimal / 0x31 in Hexadecimal. It's a non-alphabetic character. 'H': 72 in Decimal / 0x48 in Hexadecimal. It's an alphabetic character. % ./a.out Input any characters: e.g. 'e': 101 in Decimal / 0x65 in Hexadecimal. It's an alphabetic character. '.': 46 in Decimal / 0x2e in Hexadecimal. It's a non-alphabetic character. 'g': 103 in Decimal / 0x67 in Hexadecimal. It's an alphabetic character. '.': 46 in Decimal / 0x2e in Hexadecimal. It's a non-alphabetic character. % ./a.out Input any characters: int a[0] 'i': 105 in Decimal / 0x69 in Hexadecimal. It's an alphabetic character. 'n': 110 in Decimal / 0x6e in Hexadecimal. It's an alphabetic character. 't': 116 in Decimal / 0x74 in Hexadecimal. It's an alphabetic character. ' ': 32 in Decimal / 0x20 in Hexadecimal. It's a non-alphabetic character. 'a': 97 in Decimal / 0x61 in Hexadecimal. It's an alphabetic character. '[': 91 in Decimal / 0x5b in Hexadecimal. It's a non-alphabetic character. '0': 48 in Decimal / 0x30 in Hexadecimal. It's a non-alphabetic character. ']': 93 in Decimal / 0x5d in Hexadecimal. It's a non-alphabetic character. %
isUpper
という関数を追加し、入力された文字がアルファベットの小文字(lower-case)か大文字(upper-case)か、あるいはアルファベット以外かを表示するプログラムを作成せよ。
(関数名のうち、UpperのUは大文字であることに注意すること)。
int isUpper(char c)関数
isUpper
は引数(文字型変数 c)がアルファベット大文字かどうか検査し、戻り値として アルファベット大文字の場合は TRUE を、そうでない場合は FALSE を返すようにする。
% ./a.out Input any characters: Ph.D. 'P': 80 in Decimal / 0x50 in Hexadecimal. It's an upper-case character. 'h': 104 in Decimal / 0x68 in Hexadecimal. It's a lower-case character. '.': 46 in Decimal / 0x2e in Hexadecimal. It's a non-alphabetic character. 'D': 68 in Decimal / 0x44 in Hexadecimal. It's an upper-case character. '.': 46 in Decimal / 0x2e in Hexadecimal. It's a non-alphabetic character. % ./a.out Input any characters: Wi-Fi 'W': 87 in Decimal / 0x57 in Hexadecimal. It's an upper-case character. 'i': 105 in Decimal / 0x69 in Hexadecimal. It's a lower-case character. '-': 45 in Decimal / 0x2d in Hexadecimal. It's a non-alphabetic character. 'F': 70 in Decimal / 0x46 in Hexadecimal. It's an upper-case character. 'i': 105 in Decimal / 0x69 in Hexadecimal. It's a lower-case character. % ./a.out Input any characters: int A[0] 'i': 105 in Decimal / 0x69 in Hexadecimal. It's a lower-case character. 'n': 110 in Decimal / 0x6e in Hexadecimal. It's a lower-case character. 't': 116 in Decimal / 0x74 in Hexadecimal. It's a lower-case character. ' ': 32 in Decimal / 0x20 in Hexadecimal. It's a non-alphabetic character. 'A': 65 in Decimal / 0x41 in Hexadecimal. It's an upper-case character. '[': 91 in Decimal / 0x5b in Hexadecimal. It's a non-alphabetic character. '0': 48 in Decimal / 0x30 in Hexadecimal. It's a non-alphabetic character. ']': 93 in Decimal / 0x5d in Hexadecimal. It's a non-alphabetic character. %
会津大での評点(100点満点)と評価(A,B,C,D,F)並びに Grade Point(GP, 0-4点)は以下のように対応している。
char score2Grade(int score)と、評価(A,B,C,D,F)を渡すと、Grade Point(0-4の整数)を返す関数
int grade2Point(char grade)の2つの関数を作成し、 これらを使用して、各評点に対応する評価(A-F)と全体の Grade Point Average (GPA) を計算するプログラムを作成せよ。
なお、「Grade Point Average (GPA)」とは、それぞれの Grade Point に単位数で重みをつけた (GP*単位数)値の平均値で、下記実行例の 1 つ目の場合では、(4*3 + 3*2)/(3+2) = 3.600… となる。
main 内は無限ループとし、以下の例のように評点と単位数が入力されると、
関数 score2Grade と grade2Point を用いて評価と Grade Point を表示する。
また、CTRL-D (EOF)が入力された場合、Grade Point Average (GPA) と受講単位数を
表示してプログラムを終了する。
% ./a.out Input score and credit (Ctrl+D to stop): 80 3 Grade for 80 is A, Grade Point (GP) is 4. (3 credits) Input score and credit (Ctrl+D to stop): 65 2 Grade for 65 is B, Grade Point (GP) is 3. (2 credits) Input score and credit (Ctrl+D to stop): ^D Grade Point Average (GPA): 3.600, (Total credits: 5) % ./a.out Input score and credit (Ctrl+D to stop): 34 2 Grade for 34 is F, Grade Point (GP) is 0. (2 credits) Input score and credit (Ctrl+D to stop): 49 3 Grade for 49 is D, Grade Point (GP) is 0. (3 credits) Input score and credit (Ctrl+D to stop): 79 4 Grade for 79 is B, Grade Point (GP) is 3. (4 credits) Input score and credit (Ctrl+D to stop): ^D Grade Point Average (GPA): 1.333, (Total credits: 9) %
Extra問題
char VowelChgCase(char)を作成して、入力された文字を一文字づつ変換する。この関数の仕様は以下の通り。
実行例 (赤字が入力分)
% ./a.out The University of AIZU (1993) ThE unIvErsIty Of aiZu (1993) to Advance Knowledge for Humanity tO advAncE KnOwlEdgE fOr HUmAnIty ^D %
% ./a.out sizeof( char): 1 sizeof( short): 2 sizeof( int): 4 sizeof( long): 8 sizeof( float): 4 sizeof(double): 8 sizeof( char[10]): 10 sizeof( short[10]): 20 sizeof( int[10]): 40 sizeof( long[10]): 80 sizeof( float[10]): 40 sizeof(double[10]): 80 %
printf("sizeof(short ) : %d\n",sizeof(s));に対して以下のようなwarning(警告)が出力されます。
lec01-1.c:14:34: warning: format specifies type 'int' but the argument has type 'unsigned long' [-Wformat] printf("sizeof(short ) : %d\n", sizeof(s)); ~~ ^~~~~~~~~ %luこの警告の背景は以下のようなものです。
printf("sizeof(short ) : %lu\n",sizeof(s));とすれば警告は出力されなくなるはずです。
ただ、sizeofの結果を%dで表示させることはよくあり、実際CentOSではこの記述のままでも警告は出力されません。あまり深刻な問題ではなく、このまま実行しても意図通りに動作はしますので、無視しても問題ありません。
一般にコンパイル時のwarning(警告)は、本質的に間違っているわけではないが、何らかのリスクがる記述になっている場合に出力されます。error(エラー)はコンパイル自体が不可能であり、実行ファイルは出力されませんが、警告の場合は実行ファイルは出力されます。 警告の対象となる記述にはさまざまな種類があり、コンパイラの種類・設定によって実際に警告が出力されるかどうかは変わります。今回の例はあまり深刻な問題ではなかったということになります。
ただ、潜在的なバグにつながる問題を指摘してくれる警告もありますので、今後自分の書いたプログラムのコンパイル時に警告が出力された場合は、その内容をよく吟味する方がよいでしょう。