joho1-2017の日記

joho1-2017の日記

情報処理実習1の解説ブログです.皆さんが課題を解く時の助けになれば幸いです.

おさらい

5組

今週は文字列について勉強しました.

以下,課題の解説です.

1.キーボードから1文字入力すると, その文字の文字コードを16進数で表示し, その文字が大文字か,小文字か,数値か,それ以外かを表示するプログラム作成しなさい.
入力は半角文字1文字のみとする.
ヒント:大文字,小文字,数値の区別は,文字コードの範囲によって判定可能.
1文字入力は,scanf()では%cを使用する.getchar()関数というのも有る.

char c;     /* 1文字 */
scanf("%c", &c);    /* 「文字」は文字列ではないので,&が必要! */
実行例:

文字を入力して下さい: M
M の文字コードは 0x4d です.
M は大文字です.
			
文字を入力して下さい: 5
5 の文字コードは 0x35 です.
5 は数値です.
			
文字を入力して下さい: !
! の文字コードは 0x21 です.
! はそれ以外です.

この課題のポイントは,
 ①文字の16進数表示
 ②文字の分類
です.講義中に解説した通り,PC側は文字を文字として認識していません.アスキーコード表にあるように,対応する数を記憶しているだけです.つまり,①はその数を16進数表示すればいいだけであり,何か特別な関数や処理が必要なわけではありません.今まで表示するときには,printf( )を使ったと思いますが,その際,整数型なら%d,実数型なら%f,文字なら%cなど,それぞれの変換指定文字を使いますよね.つまり,文字の16進数表示も何か変換指定文字を使うだけで可能になるのです.
②はヒントにある通り,大文字,小文字,数字はアスキーコード表のある範囲内にありますね.つまり,その範囲内にあるかどうかを条件判定する事で解決しますね.

2.char型(1バイト)の引数をとり,その2進数表記(ビットパターンと言う)を表示する関数 void bitpattern1(char c) を作れ.
次に,この関数を用いて,キーボードより入力した任意の文字の16進表記および2進数表記を表示せよ.
(表示の後ろにかっこ付きで進数を表示する)

#include <stdio.h>
			
void bitpattern1(char c)
{
			
    /* ここを作成 */
			
}
			
			
int main(void)
{
    char c;       /* 1 文字分の変数 */
			
    printf("Input a char: ");
    scanf("%c", &c);      /* 1文字 入力 */
			
    bitpattern1(c);
			
    return 0;
}
実行例
Input a char : C
C (10) = 0x43 (16) = 0100 0011 (2)

この課題のポイントは,
 ①16進数と2進数の対応
です.char型は問題文の通り,1バイト(=8ビット)です.そのため,16進数なら2桁,2進数なら8桁で表現できます.2進数は0と1のみで数値を表現するため,2進数のn桁で表現出来る数のパターンは,2^n個です.具体的には,1桁ならば0 or 1の2個,2桁ならば00,01,10,11の4個といったものになります.そして4桁で表現出来るのは,16個であり,16進数の0~Fまでと同じ数ですね!
8ビットは8桁なので,16進数を2つで表現するのです.そしてこれを2進数に変換するには,上記の説明の逆順を辿ればできますね.

3.以下のように「単語」を順に入力し,大文字で END と入力したら,それまで入力した単語をハイフン(-)区切りで連結し,すべて画面に表示するプログラムを作成しなさい.
「END」は連結しないとする.

実行例:
単語を入力: ABC
単語を入力: zzz
単語を入力: 123
単語を入力: END
全ての単語:ABC-zzz-123

この課題のポイントは,
 ①文字列の結合
です.今回の講義で文字列を連結する関数strcatを習いましたね.つまり,これを使って入力された文字列がENDではなかった場合はハイフン(-)区切りで連結していけば,課題は終了ですね.

4.入力された「単語」に含まれるアルファベットの大文字・小文字の数をカウントして表示するプログラムを作成せよ.

実行例:
単語を入力: AAAbbbCdeFG123!
大文字は 6 個
小文字は 5 個
それ以外は 4 個

この課題のポイントは,
 ①文字の種類判定
です.実は①は課題1の②を解いた方法と同じ方法で判別し,それをカウンタ変数で数えていくといいだけです.

5.入力された「単語」の大文字は小文字に,小文字は大文字に変換して表示せよ.

実行例:
単語を入力: AAAbbbCdeFG
変換後:aaaBBBcDEfg

この課題のポイントは,
 ①文字の種類判定
 ②大文字,小文字の変換
です.①は課題4の①と同じ方法で判定します.②に関しては,アスキーコード表を見ると,同じアルファベットの大文字と小文字は,16進数の1桁目は同じで,2桁目が2違うだけです.つまり,大文字→小文字なら+0x20,小文字→大文字なら-0x20をもとの変数に計算するだけで変換できます.

以上で5組の課題の考え方を終了します.

6組

今週は模擬テストだったので,授業の解説はありません.

提出課題もないので課題の解説もありません.

来週は中間テストです.今までの範囲で理解できていないところがないように,しっかり復習をしておいてください.

復習するなかで疑問点等あればブログでの質問やオフィスアワーを利用して,解決するようにしてください.

Remove all ads