2013年6月30日日曜日

開発環境

プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)の第1章(やさしい入門)、1.10(外部変数と通用範囲)の演習1-24を解いてみる。

その他参考書籍

演習 1-24.

コード

sample.c

#include <stdio.h>

void in_comment(void);
void quote(int);
void check(int);

int parenthesis, brace, bracket;

int main()
{
    int c;
    
    while ((c = getchar()) != EOF) {
        if (c == '/') {
            if ((c = getchar()) == '*') {
                in_comment();
            } else {
                check(c);
            }
        } else if (c == '\'' || c == '"') {
            quote(c);
        } else {
            check(c);
        }
    }
    if (parenthesis > 0) {
        printf("閉じられていない丸括弧がある\n");
        parenthesis = 0;
    }
    if (brace > 0) {
        printf("閉じられていない波括弧がある\n");
        brace = 0;
    }
    if (bracket > 0) {
        printf("閉じられていない角括弧がある\n");
        bracket = 0;
    }
    if (parenthesis < 0) {
        printf("丸括弧の釣り合いがとれていない\n");
    }
    if (brace < 0) {
        printf("波括弧の釣り合いがとれていない\n");
    }
    if (bracket < 0) {
        printf("角括弧の釣り合いがとれていない\n");
    }
    return 0;
}

void in_comment(void)
{
    int c, d;
    
    c = getchar();
    d = getchar();
    while (c != '*' || d != '/') {
        c = d;
        d = getchar();
    }
}

void quote(int c)
{
    int d;
    
    while ((d = getchar()) != c) {
        if (d == '\\') {
            getchar();
        }
    }
}

void check(int c)
{
    switch (c) {
        case '(': parenthesis++; break;
        case ')': parenthesis--; break;
        case '{': brace++; break;
        case '}': brace--; break;
        case '[': bracket++; break;
        case ']': bracket--; break;
        default: break;
    }
}

入出力結果(Terminal)

$ cat test.c
#include <stdio.h>

void in_comment(void);
void quote(int);
void check(int);

int parenthesis, brace, bracket;

/* (}[ */
int main()
{
    int c;
    printf("(}[");
    while ((c = getchar()) != EOF) {
        if (c == '/') {
            if ((c = getchar()) == '*') {
                in_comment();
            } else {
                check(c);
            }
        } else if (c == '\'' || c == '"') {
            quote(c);
        } else {
            check(c);
        }
    }
    if (parenthesis > 0) {
        printf("閉じられていない丸括弧がある\n");
        parenthesis = 0;
    }
    if (brace > 0) {
        printf("閉じられていない波括弧がある\n");
        brace = 0;
    }
    if (bracket > 0) {
        printf("閉じられていない角括弧がある\n");
        bracket = 0;
    }
    if (parenthesis < 0) {
        printf("丸括弧の釣り合いがとれていない\n");
    }
    if (brace < 0) {
        printf("波括弧の釣り合いがとれていない\n");
    }
    if (bracket < 0) {
        printf("角括弧の釣り合いがとれていない\n");
    }
    return 0;
}

void in_comment(void)
{
    int c, d;
    
    c = getchar();
    d = getchar();
    while (c != '*' || d != '/') {
        c = d;
        d = getchar();
    }
}

void quote(int c)
{
    int d;
    
    while ((d = getchar()) != c) {
        if (d == '\\') {
            getchar();
        }
    }
}

void check(int c)
{
    switch (c) {
        case '(': parenthesis++; break;
        case ')': parenthesis--; break;
        case '{': brace++; break;
        case '}': brace--; break;
        case '[': bracket++; break;
        case ']': bracket--; break;
        default: break;
    
}
$ ./a.out < test.c
閉じられていない波括弧がある
$

0 コメント:

コメントを投稿