無料Wikiサービス | デモページ | [広告] サイト検索サービス Sx4
授業だけでは補えない部分に関する事のまとめ

課題4-8


ここでは問8に関する解説をします。ここでは関数の意味、使い方、ASCIIコードと言った知識が必要とされます。
また、このようなアルゴリズムは他のいたるところで応用される基本的なプログラムですのでしっかり自分のものにしましょう。


8.アルファベット、数字、空白からなる文字列を渡したとき、小文字を大文字にする関数 void to_low(char s[]); を作成しなさい。(提出前に正しく動作することを試すこと。)

「ここで聞かれているのはまず何か?」考えましょう。
今ここで問われていることは関数を作ること。

ではどんな関数か?

「アルファベット、数字、空白からなる文字列を渡したとき、小文字を大文字にする関数」

つまり"Hello"を"HELLO"、"2008 year"を"2008 YEAR"にするような関数を作ればよいわけです。

これは授業では説明されていない部分ですが、いたって難しい事ではありません。


まず、プログラムの全体を書いてみます。


  • おまじない(インクルード)
  • プロトタイプ宣言
  • main関数
  • to_low関数

    ●インクルードとプロトタイプ宣言

    #include <stdio.h>

    void to_low(char s[]);


    まずはじめにおまじない(ヘッダファイルをインクルード)とプロトタイプ宣言をします。
    プロトタイプ宣言いついては型名と引数が問題文に書いてあるとおりですね。
    ここでは型名はvoid、引数はchar s[]となっております。
    関数・プロトタイプ宣言についての記述は別途書いておきます。

    次にmain()関数です。

    この中には具体的な指定はないので文字列を表示した後に、作った関数を呼び出して、もう一度その文字列を表示するプログラムを作ります。

    ●main()関数に記述すること

    int main(void){

    1. 表示させる文字列を宣言する
    2. 文字列を表示させる
    3. to_low()関数を呼び出す
    4. 再び文字列を表示させる
        return 0;
    }


    ●1・文字列を格納する変数を宣言

    引数の中に入れる変数の配列を宣言しておきましょう。

    ここでは文字列を格納するため、char型の配列を取りましょう。

    char 変数名[]="Hello in 2008";

    /*ポイント*/
    配列の後ろの添え字は省略すると代入した文字数の分をとってくれる
    ここでは"Hello in 2008"なので13文字+Null文字なので[]の中は14となる。



    ●2・文字列を表示させる


    printf("%s",a);

    /*ポイント*/
    連続した配列の変数の出力は以上のように書き、%sを使う。"a"と言うものは配列の全体を示しており、書き方は変数の[]をとった形である。また、文字の場合%cであり、出力する変数はa[0]のように指定してやる必要がある。%cや%sのことを変換指定子という。変換指定子については別途記述する。


    ●3・to_low()関数を呼び出す


     to_low(文字列が入っている配列の変数名);

    /*ポイント*/
    この関数はvoid型なので返値を必要しない形なのでこのまま関数を書く。
    これを書くことによって後に記述するto_low()関数を呼び出し、関数のプログラムを実行することができる。
    ここでもやはり関数の全体を現すため変数の[]をとった形で引数を取る。


    ●4・再び文字列を表示させる

        上記の文字列を表示させるものと同じなので省略。

    /*ポイント*/
    返値がないということは、必要とする変数が引数に用いた変数のみということ。

    つまり、数学で言うところのf(x)=なしってことです。
    関数の中で処理してしまうわけですから、数字でもなければ文字でもないわけです。


    これでメイン関数には変換前と変換後の文字列を確認するプログラムが書けた訳です。

    それではto_low()関数には何を書けばいいのか考えて見ましょう。


    ●to_low()関数について
    1つの変数に入っている文字は1文字なので、1文字ずつ変換することが予想できる。
    っという事は以下のような関数になると予想ができる。

    void to_low(char s[]){
    1. 文字列の長さの分だけ繰り返す
      1. 文字を小文字か判断する
      2. もし小文字なら、大文字に変換する
    }

    ●文字列の長さの分だけ繰り返す
    繰り返すと言うことはおなじみのアレを使うことです。
    for文、while文、do while文があります。
    ここではwhile文を使った説明をします。

    文字列の長さの分だけ繰り替えずということは…

       whie( 文字列の長さの分だけ){ }

    ってことですね。「ちょwおいww肝心なところがわかんないよw」って思った人は我慢してください。

     一番ここが重要なところです。


    では文字列ってどうやったら長さがわかるか?
    先ほどの例を思い出してください。

    char a[]="Hello in 2008"

    これには何文字入ってたか覚えていますか?
    13文字じゃありませんよ。文字列の最後には必ずNULL文字が存在します。

    上の配列aには


        a[0] ='H'
        a[1] ='e'
        a[2] ='l'
        a[3] ='l'
        a[4] ='o'
        a[5] =' '
        a[6] ='i'
        a[7] ='n'
        a[8] =' '
        a[9] ='2'
        a[10] ='0'
        a[11] ='0'
        a[12] ='8'
        a[13] ='\0'


    ということですね。
    つまり、一つずつ確かめて'\0'が含まれていたら文末ということになりますね。

    while文にあわせて言い換えると、a[i]が'\0'ではない間だけ繰り返すことになります

    i は 0,1,2,3,4,5,…とはいる変数で。変数iに1ずつ足していけばいいわけです。

    while(a[i] != '\0' )

    とすれば文字列の分だけ繰り返すことになります。


    ●文字を小文字か見分ける。

    小文字を見分けるためにはif文を使います。if文は数字だけではなく、文字も見分けることができます。

    ここで文字と数字のことに説明します。詳しくは別途記述しておきます。

    実は文字と言うものは数値に置き換えられるのです。

     ちなみに'A'と言う文字は十進数では65、'a'と言う文字は十進数で97です。


    文字
    10進数
    文字
    10進数
    'A'
    65
    'a'
    97
    'B'
    66
    'b'
    98
    'C'
    67
    'c'
    99
    'D'
    68
    'd'
    100
    'E'
    69
    'e'
    101
    'Z'
    90
    'z'
    122

    という風に対応しています。

    このように文字に対する数字の対応表をASCIIコード表と言います。

    ASCIIコード表については別途説明します。


    それでは、せっかくa[i]を作ったのでこれを利用しましょう

      if(a [i] == 'a' && a[i] == 'b' && …&& a[i] == 'z')

    と言うように記述すればいいとわかります。
    でも、これじゃめんどくさいですね。
    上の表を思い出してください
    aは97、zは122です。つまり、a[i]が97から122の間であれば小文字だとわかります。

    if (a[i] >= 97 && a[i] <=122)

    ってことになります。


    ●もし小文字なら大文字にかえる

    これが最後の説明となります。

    小文字を大文字に変えるということはどういうことか?

    先ほどの項目でも言いましたが、文字は数字に対応しています。

    ASCIIコード表を見てみましょう

    (表)

     'A'→65   'a'→97
     'B'→66   'b'→98
     'C'→67   'c'→99
     'D'→68   'd'→100
     'E'→69   'e'→101
                 :
                 :
     'Z'→90   'z'→122

    小文字から大文字に変わると言うことは32移動していること、と言うことが見て取れる。

    つまり、小文字に32を足せばそれぞれに対応した大文字に変換できる。



    ●最後に…

    これで今回の8番の課題の説明は終わりです。いったん作成したプログラムをコンパイルして実際に値が出るかを試してみてください。
    プログラミングは難しいものです、慣れるまで苦労すると思うですががんばっていきましょう。ここまで、見てくれてありがとうございました。そして、お疲れ様です。

    一応第一回目なのでできるだけ詳しく書いたつもりです。その他に見づらい、わかりづらい等の意見。間違っている記述、誤字脱字等があればコメントに残しておいてください。


    最終更新 2008/5/17 23:15:07 - kodama
    (2008/5/17 20:35:46 作成)