- 締切済み
C言語で質問です。
どなたかこの問題を解いてもらえないでしょうか? https://firestorage.jp/download/b1bfc77df8a5fe7c5d964c95f9520acfe387d669
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- asuncion
- ベストアンサー率33% (2127/6289)
下記のとおり作ってみましたが、仕様をみたしているかどうかは 定かではありません。 #include <stdio.h> #include <ctype.h> #include <stdlib.h> #define LEN (128) /* 入力する文字列の最大長 */ struct real { enum { RATIONAL, /* 有理数を表わすタグ */ FLOAT /* 浮動小数点数を表わすタグ */ } tag; union { struct { int n; /* 有理数の分子 */ int d; /* 有理数の分母 */ } Rational; struct { double d; /* 浮動小数点数 */ } Float; } as; }; void get_real(struct real *r); void print_real(struct real *r); void multiply(struct real *r1, struct real *r2, struct real *result); int main(void) { struct real a, r; a.as.Rational.n = a.as.Rational.d = 1; a.tag = RATIONAL; while (1) { get_real(&r); multiply(&a, &r, &a); print_real(&a); } return EXIT_SUCCESS; } void get_real(struct real *r) { char s[LEN], d; fgets(s, LEN, stdin); switch (toupper(s[0])) { case 'R' : if (sscanf(s, "%c %d %d", &d, &(r->as.Rational.n), &(r->as.Rational.d)) == 3) { if (r->as.Rational.n == 0 || r->as.Rational.d == 0) { exit(EXIT_SUCCESS); } r->tag = RATIONAL; break; } else { printf("input error\n"); exit(EXIT_FAILURE); } case 'F' : if (sscanf(s, "%c %lf", &d, &(r->as.Float.d)) == 2) { if (r->as.Float.d == 0.0) { exit(EXIT_SUCCESS); } r->tag = FLOAT; break; } else { printf("input error\n"); exit(EXIT_FAILURE); } default : printf("input error\n"); exit(EXIT_FAILURE); } } void print_real(struct real *r) { if (r->tag == RATIONAL) { printf("%d/%d\n", r->as.Rational.n, r->as.Rational.d); } else if (r->tag == FLOAT) { printf("%f\n", r->as.Float.d); } } void multiply(struct real *r1, struct real *r2, struct real *result) { if (r1->tag == RATIONAL) { if (r2->tag == RATIONAL) { r1->as.Rational.n *= r2->as.Rational.n; r1->as.Rational.d *= r2->as.Rational.d; } else { r1->as.Float.d = (double) r1->as.Rational.n / r1->as.Rational.d; r1->as.Float.d *= r2->as.Float.d; r1->tag = FLOAT; } } else { if (r2->tag == RATIONAL) { r2->as.Float.d = (double) r2->as.Rational.n / r2->as.Rational.d; r1->as.Float.d *= r2->as.Float.d; } else { r1->as.Float.d *= r2->as.Float.d; } } result = r1; }