2015年6月17日水曜日

開発環境

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

その他参考書籍

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

コード(BBEdit, Emacs)

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

int score = 0;

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

typedef void (*handler_fn)(int);

int catch_signal(int sig, handler_fn handler) {
  struct sigaction action;
  action.sa_handler = handler;
  sigemptyset(&action.sa_mask);
  action.sa_flags = 0;
  return sigaction (sig, &action, NULL);
}

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;
    char txt[4];
    alarm(5);
    printf("\n%dかける%dはいくつですか? ", a, b);
    fgets(txt, 4, stdin);
    char *end;
    int answer = strtol(txt, &end, 10);
    if (answer == a * b) score++;
    else printf("\n間違いです!得点: %d\n", score);
  }
}

入出力結果(Terminal)

$ crun.sh sample460
clang ...

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

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

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

最終得点: 2
$ ./sample460

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

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

5かける3はいくつですか? 15

3かける8はいくつですか?   C-c C-c
最終得点: 2
$ ./sample460

9かける3はいくつですか? 
時間切れ!

最終得点: 0
$ 

0 コメント:

コメントを投稿