/* new.c */ /* The Driver of etude system */ /* (C) Kenrou Adachi, 2004 */ #include #include #include /* 実行ファイル etpro の生成コマンド */ #define COMPILE_ETPRO "cc -O2 -o etpro etpro.c func.c -I/usr/X11R6/include -I/usr/local/include -L/usr/X11R6/lib -L/usr/local/lib -lX11 -lm -leggx" int main(void) { int defun(void); int status; /* 挨拶 */ fprintf(stderr, "自励系微分方程式\n"); fprintf(stderr, "dx/dt = f(x,y), dy/dt = g(x,y)\n"); fprintf(stderr, "の解軌道を描画します。\n\n"); fprintf(stderr, "f(x,y,r), g(x,y,r) を入力して下さい。\n"); fprintf(stderr, "ただし、r = sqrt(x*x+y*y) です。\n\n"); fprintf(stderr, "入力式には空白を入れないで下さい。\n\n"); /* 関数入力 */ status = defun(); /* etpro のコンパイル */ if (status == EXIT_SUCCESS) { status = system(COMPILE_ETPRO); } else { fprintf(stderr, "入力した関数の定義式に誤りがあるか、あるいはその他の何らかの理由で、\n"); fprintf(stderr, "func.c の生成に失敗しました。もう一度最初からやり直して下さい。\n"); exit(EXIT_FAILURE); } /* etpro 実行 */ if (status == EXIT_SUCCESS) { system("./etpro"); } else { fprintf(stderr, "何らかの理由で etpro のコンパイルに失敗しました。\n"); fprintf(stderr, "処理を中止します。\n"); exit(EXIT_FAILURE); } /* 終了 */ return EXIT_SUCCESS; } /* func.c というファイルに 関数 fx(x,y,r) と gy(x,y,r) の定義を書き込む */ int defun(void) { FILE *file; char *fs, *gs; fs = (char *)malloc(60 * sizeof(char)); gs = (char *)malloc(60 * sizeof(char)); fprintf(stderr, "Input dx/dt = f(x, y, r)\n ? "); scanf("%s", fs); fprintf(stderr, "\nInput dy/dt = g(x, y, r)\n ? "); scanf("%s", gs); fprintf(stderr, "\n"); if ((file = fopen("func.c", "w")) == NULL) return EXIT_FAILURE; fprintf(file, "#include \n\n"); fprintf(file, "double fx(double x, double y, double r)\n"); fprintf(file, "{\n"); fprintf(file, "\t return %s ;\n", fs); fprintf(file, "}\n\n\n"); fprintf(file, "double gy(double x, double y, double r)\n"); fprintf(file, "{\n"); fprintf(file, "\t return %s ;\n", gs); fprintf(file, "}\n\n\n"); fclose(file); free(gs); free(fs); return EXIT_SUCCESS; }