|
> サインのぐらふを表示する方法を教えてください
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;
}
|