2014年6月11日水曜日

開発環境

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 <signal.h>

#include "catch_signal.h"
#include "error.h"

int score = 0;

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

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

int main(int argc, char *argv[])
{
  if (catch_signal(SIGALRM, times_up) == -1)
    error("SIGALRMにtimes_upハンドラを設定出来ません", 2);
  if (catch_signal(SIGINT, end_game) == -1)
    error("SIGINTにend_gameハンドラを設定出来ません", 2);
  srandom (time (0));

  while (1) {
    int a = random() % 11;
    int b = random() % 11;
    char txt[4];
    alarm(5);
    printf("\n%iかける%iはいくつですか? ", a, b);
    fgets(txt, 4, stdin);
    int answer = atoi(txt);
    if (answer == a * b)
      ++score;
    else
      printf("\n間違いです!得点: %i\n", score);
  }
  return (0);
}

Makefile

CC=cc
CFLAGS = -g -Wall
SRC=sample460.c catch_signal.c error.c
OBJ=sample460.o catch_signal.o error.o

all: sample460

sample460: $(OBJ)
 $(CC) $(CFLAGS) $(OBJ) -o sample460

sample460.o: catch_signal.h error.h sample460.c
 $(CC) $(CFLAGS) -c sample460.c -o sample460.o

catch_signal.o: catch_signal.h catch_signal.c
 $(CC) $(CFLAGS) -c catch_signal.c -o catch_signal.o

error.o: error.h error.c
 $(CC) $(CFLAGS) -c error.c -o error.o

clean:
 rm -rf sample460 sample460.o catch_signal.o error.o

入出力結果(Terminal)

$ make
cc -g -Wall -c sample460.c -o sample460.o
cc -g -Wall sample460.o catch_signal.o error.o -o sample460
$ ./sample460

5かける7はいくつですか? 35

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

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

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

2かける6はいくつですか? 12

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

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

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

間違いです!得点: 0

2かける8はいくつですか? 1

間違いです!得点: 0

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

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

最終得点:0
$ ./sample460

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

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

6かける5はいくつですか? 30

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

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

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

最終得点:5
$ 

0 コメント:

コメントを投稿