Comments
Description
Transcript
2 ASCII コードと文字型変数
2 ASCII コードと文字型変数 2-1 ASCII コード コード 文字 コード 文字 10 進 コード 文字 10 進 コード 文字 10 進 コード 文字 10 進 コード 文字 10 進 コード 文字 10 進 コード 文字 10 進 10 進 0 16 SP 32 0 48 @ 64 P 80 ` 96 p 112 1 17 ! 33 1 49 A 65 Q 81 a 97 q 113 2 18 " 34 2 50 B 66 R 82 b 98 r 114 3 19 # 35 3 51 C 67 S 83 c 99 s 115 4 20 $ 36 4 52 D 68 T 84 d 100 t 116 5 21 % 37 5 53 E 69 U 85 e 101 u 117 6 22 & 38 6 54 F 70 V 86 f 102 v 118 \a 7 23 ' 39 7 55 G 71 W 87 g 103 w 119 \b 8 24 ( 40 8 56 H 72 X 88 h 104 x 120 \t 9 25 ) 41 9 57 I 73 Y 89 i 105 y 121 \n 10 26 * 42 : 58 J 74 Z 90 j 106 z 122 \v 11 27 + 43 ; 59 K 75 [ 91 k 107 { 123 \f 12 28 , 44 < 60 L 76 \ 92 l 108 | 124 \r 13 29 - 45 = 61 M 77 ] 93 m 109 } 125 14 30 . 46 > 62 N 78 ^ 94 n 110 ~ 126 15 31 / 47 ? 63 O 79 _ 95 o 111 DEL 127 \a(alert) \b(backspace) :警報音(ピーとかピッとか。機械によって違う)を 1 回鳴らす。 :直前の位置へ移動する。 \t(horizontal tab) \n(new line) \r(carriage return) SP(space) :次の水平タブ位置へ移動する。 :改行して、次の行の先頭へ移動する。 :現在の行の先頭位置へ移動する。 :スペース なお、\f,\v はプリンタへの出力で用いられるので説明は略。 また、128~255 までは半角カタカナなどが割り当てられているが、機種によって違う。半角カ タカナを使うと文字化けを起こすことがあるのは、この為である。 次のプログラムを実行してみよう(イヤホンを付けること。ボリューム注意)。 #include <stdio.h> main() { printf(“¥a¥aHello¥n”); /* 警告音が 2 回鳴った後、Hello と表示される */ printf(“Good night¥b¥b¥b¥b¥bmorning¥n”); /* Good morning と表示される */ printf(“H¥te¥tl¥tl¥to¥n”); /* H e l l o と表示される */ printf(“April¥rMay¥n”); /* Mayil と表示される */ } 最初の printf は問題ないだろう。 2 つめは「Good night」表示した後カーソルが 5 つ戻って「n」の位置になり、そこから「morning」 を上書きするので「Good morning」となる。 3 つめは、各文字の間にタブが入るので、離れて表示される。 最後は、 「April」と表示した後、カーソルが先頭の「A」の位置になり、そこから「May」が上書 きされるので「Mayil」と表示される。 問題 2-1 次のプログラムを実行するとどう表示されるか。 プログラムを実行せずに考えなさい。ただし、タブはスペース 4 文字文とする。 #include <stdio.h> main() { printf(“Cat¥b¥bome¥bing¥n”); printf(“¥tDog¥tPig¥n”); printf(“Cool¥rHot¥n”); printf(“Blue¥t¥bMoon¥n”) } 2-2 文字型 「文字型」となっているが、実質は整数型で 0~255 または-127~127 までを範囲とする。 文字型変数に文字を代入すると、入力した文字の ASCII コードが変数に格納される。 なお、文字型変数の宣言は「char」で行う。 また、文字型変数への代入は、ASCII コードを数字で入力するか、代入したい文字(一文字) を「’」(シングルクオーテーション)でくくる。 #include <stdio.h> main() { char ch = „b‟; printf(“ch = %c¥n”, ch); printf(“ch = %d¥n”, ch); } 実行結果 b 98 実行結果からも分るとおり、%c で指定すると文字を、%s で指定すると数字(文字の ASCII コード)を表示する。 また、文字型同士の演算も出来る。 #include <stdio.h> main() { char ch1 = „f ‟; char ch2 = „c‟; 実行結果 printf(“%d¥n”, ch2 – ch1); } printf(“%c¥n”, „a‟ + 4); -3 printf(“%c¥n”, „1‟ + „3‟); e d 「アルファベットの小文字を入力して、それが何文字かを表示せよ(’a’を 1 文字目とする)。 また、その文字の大文字を表示せよ」という問題は、2 通りの書き方が出来る。 #include <stdio.h> main() { char ch; int num; printf("アルファベットの小文字を入力して下さい:"); scanf("%c", &ch); num = ch - 96; printf("%c はアルファベットの%d 文字目です。¥n", ch, num); printf("%c の大文字は%c です。¥n", ch, 64 + num); } #include <stdio.h> main() { char ch; int num; printf("アルファベットの小文字を入力して下さい:"); scanf("%c", &ch); num = ch – „a‟; printf("%c はアルファベットの%d 文字目です。¥n", ch, num + 1); printf("%c の大文字は%c です。¥n", ch, ‟A‟+ num); } 上は、文字コードの数字を使って計算している。下は、文字そのものを使って計算している。 英数字を使っている分にはどちらでも問題ないはずだが、万が一割り当てられたコード番号が 違うような場合、下のような書き方をするとコード番号を意識せずプログラムを動かすことが 出来る。 問題 2-2 次のプログラムの間違いを訂正せよ。なお、各行の左端は行番号なので気にしなくてよい。 1:/* 入力したアルファベットの小文字を指定した文字数ずらし さらに大文字に変換する暗号を作る。 */ 2: 3:#include <stdio.h> 4:main 5:{ 6: chara Cha; /* 入力された文字を格納する変数 */ 7: int shift; /* ずらす文字数を格納 8: imt new_c; /* 変換された文字の文字コードを格納 */ 9: 10: printf(アルファベットの小文字を入力して下さい:); 11: scanf(“%d”, &cha); 12: printf(“何文字ずらしますか:”) 13: scanf(“%d”, shift); 14: 15: new_c = (cha + shift – „a‟) / 26 + „A‟; 16: printf(“%c を変換すると%c になります。¥n”, &cha, &num); 問題解答 2-1 実行結果 Coming Dog Pig Hotl BlueMoon d ・1 行目は「Cat」と出力後 2 つ戻って「ome」を上書きして「Come」となり、さらに一つ戻って「ing」 を上書きして「Coming」になる。 ・2 行目は「Dog」と「Pig」の前に、それぞれタブが入る。 ・3 行目は「Cool」と出力した後カーソルが先頭に戻って「Hot」と上書きするので「Hotl」とな る。 ・4 行目は「Blue」と入力した後タブが入る。次に「\b」で一文字戻るが、タブも 1 文字なので「e」 の次にカーソルが移動する。そして「Moon」が出力されるので、全体で「BlueMoon」となる。 2-2 4 行目: 「main」の後に()がない。 6 行目: 「char」が「chara」になっている。 7 行目:コメントの最後の「*/」が抜けている。 8 行目:「int」が「imt」になっている。 10 行目:「 “」が抜けている。 11 行目:文字の入力に「%d」が使われている。 12 行目:最後の「;」が抜けている。 13 行目:変数の前の「&」が抜けている。 16 行目:変数に「&」が付いている。 最後の「}」が抜けている。 変数名を「Cha」で宣言しているのに、 「cha」を使っている。小文字と大文字は区別される。 なお、15 行目の計算は間違いではない。コードの数字を使う代わりに、コードが表す文字を使っ ている。