/* new.c */ /* The Driver of etude system */ /* for GNU FORTRAN 77 */ /* (C) Kenrou Adachi, 2004 */ #include #include #include /* 実行ファイル etpro の生成コマンド */ #define COMPILE_ETPRO "egg etpro.f func.f -o etpro" 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.f の生成に失敗しました。もう一度最初からやり直して下さい。\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.f というファイルに 関数 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.f", "w")) == NULL) return EXIT_FAILURE; fprintf(file, " real function fx(x, y, r)\n"); fprintf(file, " real x, y, r\n"); fprintf(file, " fx = %s\n", fs); fprintf(file, " return\n"); fprintf(file, " end\n\n"); fprintf(file, " real function gy(x, y, r)\n"); fprintf(file, " real x, y, r\n"); fprintf(file, " gy = %s\n", gs); fprintf(file, " return\n"); fprintf(file, " end\n\n"); fclose(file); free(gs); free(fs); return EXIT_SUCCESS; }