joho1-2016の日記

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

第9回 中間テスト

今週の6組は中間テストだったため,講義の解説はなしです.
また,課題も出ていないため,考え方のヒントは5組のみになります.

来週は5組は中間テストになります.
6組の中間テストの問題のページのURLを載せておきますので,参考にしてください.
http://www.isc.meiji.ac.jp/~re00104/mte2016.html
おおよそ同じ形式で中間テストの問題は出題されます.ただ,注意して欲しいのは,

 ①5組と6組で先生が違い,授業進度も異なるため問題が同じ事はない
 ②提出は実習課題と同様Oh-o! Meijiにテスト時間内に提出
 ③テスト時間中は授業ページとOh-o! Meiji以外のwebページは閲覧不可

という点です.今まで勉強してきたことを確かめるテストなので,ヤマをはって勉強してきても良い点は取れません.加えて,問題数が少ないため,全く解いていない問題があるというのは点数に大きく響きます.これまでの要点をしっかりとおさえておきましょう.
②に関しては,提出するまでを含めたテスト時間です.終わってから提出ではありません.テスト時間の最後の方は皆が一斉に提出するので,通信が重くなります.テスト期間中は何度でも提出できるので,こまめに提出しましょう.
③は,自分でまとめたもの(wordやpdf)は見る事が可能なので,テスト当日までに要点をまとめておきましょう.

明日6月17日(金)に5組の課題の考え方のヒントを更新します.(追記:更新済み)

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

実行例:

文字を入力して下さい: 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;
}

この課題のポイントは,
 ①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.入力された「単語」に含まれる大文字,小文字の数をカウントして表示するプログラムを作成せよ.

実行例:
単語を入力: AAAbbbCdeFG
大文字は 6 個
小文字は 5 個

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

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

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

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

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