2013年5月1日水曜日

開発環境

プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)の第5章(ポインタと配列)、5.2(ポインタと関数引数)、演習5-2を解いてみる。

その他参考書籍

演習 5-2.

コード

sample.c

#include <stdio.h>
#include <ctype.h>
#define SIZE 100

int getfloat(float *pn);
int getch(void);
void ungetch(int);
int buf = 0;

int main(void)
{
    int n, i;
    float array[SIZE];

    for (n = 0; n < SIZE && getfloat(&array[n]) != EOF; n++)
        ;
    for(i = 0; i <= n; i++)
        printf("array[%d] = %f\n", i, array[i]);

    return 0;
}

int getfloat(float *pn)
{
    int c, sign, pow;
    
    while (isspace(c = getch()))
        ;
    if (!isdigit(c) && c != EOF && c != '+' && c != '-') {
        *pn = 1000000;
        return 0;
    }
    sign = (c == '-') ? -1 : 1;

    if (c == '+' || c == '-') {
        if (!isdigit(c = getch())) {
            if (c != EOF)
                ungetch(c);
            return 0;
        }
    }
    
    if (c == EOF) {
        *pn = 1000000;
        return c;
    }
    for (*pn = 0; isdigit(c); c = getch()){
        *pn = 10 * *pn + (c - '0');
    }
    /* 小数点以下を取得 */
    if (c == '.') {
        c = getch();
        for (pow = 1.0; isdigit(c); c = getch()) {
            *pn = 10 * *pn + (c - '0');
            pow *= 10.0;
        }
        *pn /= pow;
    }
    *pn *= sign;
    if (c != EOF) {
        ungetch(c);
    }
    return c;
}

int getch(void)
{
    int c;
    
    if (buf != 0)
        c = buf;
    else
        c = getchar();
    buf = 0;
    return c;
}

void ungetch(int c)
{
    if (buf != 0)
        printf("ungetch: too many characters\n");
    else
        buf = c;
}

入出力結果(Terminal)

$ cat tmp.txt
   a0.0bc.23 456d-1.0 -2.0 -1.5 +1.0 +2.0 +1.5
-12.345 end $ cat tmp.txt | ./a.out
array[0] = 1000000.000000
array[1] = 0.000000
array[2] = 1000000.000000
array[3] = 1000000.000000
array[4] = 1000000.000000
array[5] = 23.000000
array[6] = 456.000000
array[7] = 1000000.000000
array[8] = -1.000000
array[9] = -2.000000
array[10] = -1.500000
array[11] = 1.000000
array[12] = 2.000000
array[13] = 1.500000
array[14] = -12.345000
array[15] = 1000000.000000
array[16] = 1000000.000000
array[17] = 1000000.000000
array[18] = 1000000.000000
$

0 コメント:

コメントを投稿