明解C言語中級編 8章の自由課題解いてみた


8章からソースがなげえええええ! って本を持ってる人にしか分からないネタでごめんなさい。しかも初心者なので長いと思うだけなんだろうなってことも付け加えておきます。

8章はこのくそなげーソースを手打ちコピーすることじたいが、もちろん内容を考えながら書いてないといけないがそれなりに練習になっているはずだ。

全部打ったさ。ああ。

この程度の長さだったら、たしかにプロトタイプ宣言はいらないんだろうけど、むしゃむしゃしてつい出来心でまたapacheのソースを見たんだけど、だいぶ前に見たときよりもまだ何がどうなってるってのかは分かった。っていうか、そうでないと困るw

でも仕様書というか、どういう風になっているかのReadMeがないと、あんな大きさになると訳が分からんね。
つうかフリーのCGIでもパス構成はちゃんと書いてある。基本なのだ。

徐々にいろいろ覚えていくのがいいやろうね。

 

んで、課題は今回は8-1と8-2と8-3で終わります。

何でかっていうと、まずめんどくせーなーってのが主な理由ですが、めんどくせーなーって思いながらやってても、なんつうか、勉強の効率が下がる↘ので、ノリにノってる時にめんどくさい系の問題はやろうと思います。

ほんとにやるのかって?言い換えれば気が向いたらだね。

未定は予定だ! あれ、逆だったっけ。

まあいい!

 

あと今までとちょこっと違うところは、日記に載せる予定のそーすについてですが、サンプルプログラムの中でいじってるところはほんの少しなので、全部公開すると本の内容そのままにネットに公開してしまうことになってしまうので、自分で改変した部分(課題で問われている部分)のソースだけを載せております。

オープンソースじゃなくて、売ってる本からのものなのでちょっと気を使います。
時代だしね。

 

ではではさくっといきましょう。

課題8-1 List8-4は12個の文字列をランダムな順序で練習するものだった。12個すべてではなくて10個をランダムに選ぶように変更せよ。

選ぶ個数は#defineで指定した値になっているので、そもそもの文字列の配列は12個にして#defineで定義しているのを10にした。選出はもともとランダムなので、そこを変えれば10個をランダムに選んだことになる(はず)。

7c7,8
< #define NO 12
---
> #define NO 10
>
21c22
<       char *str[NO] = {"book", "computer", "define", "comfort",
---
>       char *str[12] = {"book", "computer", "define", "comfort",

課題8-2と8-3は同じソースに書いてます。

課題8-2 List8-7のC言語と英会話の単語問題はNO個の文字列を出題、1つ前と重複しないようにしているが、過去のものとも比較するように変更しなさい。

課題8-3 英会話トレーニングで      こんにちわ。 Hello!
と表示してHello!をタイプするモードを追加しなさい。

void word_training_j(const char *mes, const char *str[], int n)
{
    int stage;
    int i = 0, j;
    int qno, pno;
    int check[NO] = {0};
    int tno, mno;
    clock_t start, end;
    int retry = 0;

    printf("\n%sを%d個練習します。\r\n", mes, NO);
    printf("スペースキーで開始します。\r\n");
    fflush(stdout);
    while(getch() != ' ')
        ;

    tno = mno = 0;
    pno = n;

    start = time(NULL);

    for(stage = 0; stage < NO; stage++){
        do{
            qno = rand() % n;
                if(qno % 2)
                    qno++;

            for(j = 0; j < stage; j++){
                if(check[j] == qno)
                    retry = 1;
            }
            retry = 0;
        }while( retry == 1 );

        printf("%s %s                              \r", str[qno], str[qno+1]);
        fflush(stdout);
        mno += go(str[qno]);
        tno += strlen(str[qno]);
        pno = qno;
        check[stage]=qno;
    }

    end = time(NULL);

    printf("問題:%d文字/ミス : %d回\r\n", tno, mno);
    printf("%.1f秒でした。\r\n", (double)difftime(end, start));
    fflush(stdout);
}

課題8-3の方はループを一つ増やして、チェック用の配列にステージ回数を入れて比較するものを増やして、課題8-4の方は、単語帳の右側(偶数側)に日本語訳を入れて2の倍数が出たら、インクリメント、あとはループで捜査するようになってます。

何回かバグチェックはしたけど、たぶん大丈夫なはず・・。

残りの8-4からの問題は脳内解決で終わた。
ACミラン対パルマを見ながらなので、ちゃんとできたかは謎だけど。

しかし、つまらんなあ。もうちょっとカッサーノを見たかった。
日本人の選手が世界各国でプレイしているこんな時代が来るとはね。
年をとったということか。

 

ってことで、あと9章と10章だけとなりました。

9章はファイル操作で、10章はメモリみたい。ソケット通信でそのあたりはいろいろと使うと思うので、それなりに力は入れた方がいいかなあってなあ。
日記の更新がスロークエリーになっているけど、パイプを使ったプログラムとか、サーバとクライアントでやりとりするような簡単なC言語のプログラムはネット上で調べて試してみたりはやってみたりはしているんどあ。

PHPでブラウザとサーバーでやりとりするプログラムは簡単に作れるんだけど、Cでやるとなんか違うんだなあ。まあいいか。

Cについては初級編もわりと端折って進んだところもあるけど、それでも中級編もそれなりに進めているし、大した問題にはならないだろう。と思う。
PHPもたぶんそのせいで書けたし。

viva C!

 

PS: C/C++をやるって話をしたら、9割がなんでCなの?って言うのは何故なのだ。

 

Similar Posts:


3 thoughts on “明解C言語中級編 8章の自由課題解いてみた

  1. かぼちゃ

    >9章はファイル操作で、10章はメモリみたい。ソケット通信でそのあたりはいろいろと使うと思うので、それなりに力は入れた方がいいかなあってなあ。
    私の(短い)経験では動的なメモリ管理はヘッダの解釈/自作に必須なので大事かも.
    さらに,ビットマスクが使えると非常に便利かと思います.(TCPヘッダのフラグを自分で読もうと思うと,論理演算によるビットマスクが非常に有用.)

    >PS: C/C++をやるって話をしたら、9割がなんでCなの?って言うのは何故なのだ。
    カーネルの機能をガンガン呼ばなければならないプログラムっていまどき流行らないからじゃないですかね.
    システムコールが必要な(一つの例としてソケット)プログラミングをしようと思わなければC/C++にあまり魅力は無いのかもしれません.
    しいていえばC/C++は組み込み系のソフトウェアで話を聞いた気がします.

    業界人ではないただの学生の想像です><

    Reply
    1. たけけん Post author

      こんばんわー、いつもありがとうございます。

      かぼちゃさんが数当てゲームのプログラムを書いてらっしゃったんで、おお!参考にしよう!と思って見てたんですが、全然わからんw
      座標平面の概念がワカラナイですた。その辺がクリアできたら自分でもなんとかできそ~、とか感じるような・・・。

      ++がついただけなのに、なかなか分からなくなるもんすな。

      >カーネルの機能をガンガン呼ばなければならないプログラムっていまどき流行らないからじゃないですかね.
      インフラで上にノシノシ上に上がろうと思ったらカーネルレベルで理解できてたらだいぶ(かどうかは謎ですが)重宝されるんじゃないかなぁと思いますね。
      自分なんかは自分専用の作業ツールを作ってるレベルなんで、まだまだです。

      ビットマスクと座標平面ってことばは覚えておこうと思います。

      Reply
      1. かぼちゃ

        >座標平面の概念がワカラナイですた。その辺がクリアできたら自分でもなんとかできそ~、とか感じるような・・・。
        わざわざビットでフラグ作ってるのでわかりにくくなってます.
        説明書いてみました.
        http://foxism.net/?p=671

        >++がついただけなのに、なかなか分からなくなるもんすな。
        私の書き方が汚いというのも一因かと(反省

        Reply

Leave a Reply

Your email address will not be published. Required fields are marked *