2015年1月7日水曜日

開発環境

Head First C ―頭とからだで覚えるCの基本(David Griffiths (著)、Dawn Griffiths (著) 中田 秀基(監訳)(翻訳)、木下 哲也 (翻訳)、オライリージャパン)の10章(プロセス間通信: お話は楽しい)、長いエクササイズ(p.460)を解いてみる。

その他参考書籍

長いエクササイズ(p.460)

コード(BBEdit, Emacs)

sample460.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>
#include <signal.h>
#include <glib.h>

#include <catch_signal.h>
#include <stopif.h>

int score = 0;

void end_game(int sig) {
  printf("\n最終得点: %i\n", score);
  exit(0);
}

void times_up(int sig) {
  printf("\n時間切れ!\n");
  raise(SIGINT);
}

int main() {
  catch_signal(SIGALRM, times_up);
  catch_signal(SIGINT, end_game);
  srandom (time (0));
  while (1) {
    int a = random() % 11;
    int b = random() % 11;
    alarm(5);
    printf("\n%iかける%iはいくつですか? ", a, b);
    char txt[4];
    fgets(txt, 4, stdin);
    txt[strlen(txt) - 1] = '\0';
    char *end;    
    int answer = strtol(txt, &end, 10);
    if (*end) fprintf(stderr,
                      "I couldn't parse '%s' to a number. "
                      "I had trouble with '%s'.",
                      txt, end);
    else if (answer == a * b) score++;
    else printf("\n間違いです!得点: %i\n", score);
  }
}

入出力結果(Terminal)

$ crun.sh sample460
...

1かける6はいくつですか? 6

3かける7はいくつですか? 21

3かける1はいくつですか? 3

10かける7はいくつですか? 70

10かける6はいくつですか? 60

10かける1はいくつですか? 
時間切れ!

最終得点: 5
$ ./sample460

10かける0はいくつですか? 
時間切れ!

最終得点: 0
$ ./sample460

0かける4はいくつですか? 0

10かける5はいくつですか?   C-c C-c
最終得点: 1
$ ./sample460

10かける6はいくつですか?   C-c C-c
最終得点: 0
$ ./sample460

2かける9はいくつですか? 10

間違いです!得点: 0

6かける10はいくつですか? 10

間違いです!得点: 0

9かける5はいくつですか?   C-c C-c
最終得点: 0
$ ./sample460

8かける9はいくつですか? a
I couldn't parse 'a' to a number. I had trouble with 'a'.
3かける8はいくつですか? 
時間切れ!

最終得点: 0
$ ./sample460

0かける8はいくつですか? ab
I couldn't parse 'ab' to a number. I had trouble with 'ab'.
4かける4はいくつですか? 
時間切れ!

最終得点: 0
$ 

0 コメント:

コメントを投稿