C言語関係掲示板

過去ログ

No.509.sinなどの関数のグラフ

[戻る] [ホームページ]
No.3917

ぐらふ{さいん}
投稿者---nagai (2002/12/17 11:58:20)


サインのぐらふを表示する方法を教えてください

No.3927

Re:ぐらふ{さいん}
投稿者---かずま(2002/12/17 18:43:07)


> サインのぐらふを表示する方法を教えてください

sin だけではつまらないので、
もっとたくさんの関数のグラフが書けるようにしてみました。

関数 func の 区間 [a, b] のグラムを書きます。
func, a, b: とプロンプトが出たら、sin 0 6.28 と入力します。
#include <stdio.h>
#include <math.h>
#include <string.h>

double x1(double x) { return x; }
double x2(double x) { return x * x; }
double x3(double x) { return (x-0.9) * x * (x+0.9); }

struct { double (*func)(double); char *name; } table[] = {
    { sin, "sin" }, { cos, "cos" }, { tan, "tan" },
    { exp, "exp" }, { log, "log" }, { sqrt, "sqrt" },
    { x1,  "x1"  }, { x2,  "x2"  }, { x3,  "x3" },
};

#define TABLESIZE  (sizeof table / sizeof table[0])

int main(void)
{
    double a, b, dx, y, dom, max_y, min_y;
    int i;
    char name[256], scr[25][80];
    double (*f)(double);

    while (printf("func, a, b: "), scanf("%s%lf%lf", name, &a, &b) == 3) {
        for (i = 0; i < TABLESIZE && strcmp(name, table[i].name); i++)
            ;
        if (i == TABLESIZE) break;
        f = table[i].func;
        dx = (b - a) / 64;
        max_y = min_y = f(a);
        for (i = 1; i <= 64; i++) {
            y = f(a + i*dx);
            if (y > max_y) max_y = y;
            if (y < min_y) min_y = y;
        }
        dom = max_y - min_y;
        if (dom == 0) dom = 1;
        memset(scr, ' ', sizeof scr);
        for (i = 0; i <= 64; i++)
            scr[(int)((max_y - f(a + i*dx))/dom * 20 + 1.5)][i+2] = '*';
        for (i = 1; i < 24; i++)
            printf("%.79s\n", scr[i]);
    }
    return 0;
}