• 締切済み

C言語で質問です。

どなたかこの問題を解いてもらえないでしょうか? https://firestorage.jp/download/b1bfc77df8a5fe7c5d964c95f9520acfe387d669

  • abz1
  • お礼率0% (0/1)

みんなの回答

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.1

下記のとおり作ってみましたが、仕様をみたしているかどうかは 定かではありません。 #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; }

関連するQ&A

  • C言語

    main() { int a = 5,b=2,e,f,g=3,i; double c,d,h=2.0; c = a/b; printf("c = %f\n",c); d = a/h; printf("d=%f\n",d); e = a++; f = ++b; g+= 4; i= ++a + b; printf(" a = %d\n",a); printf(" b = %d\n"b); printf(" e = %d\n"e); printf(" f = %d\n"f); printf(" g = %d\n"g); printf(" i = %d\n" i); 答え a=7,b=3,c=2.0,d=2.5,e=5,f=3,g=7,i=10 この問題のa,b,iがどうやってこの値になるのかがわかりません解説お願いします。

  • C言語で質問します

    Sorting Three Numbers 3つの整数を読み込み、それらを値が小さい順に並べて出力するプログラムを作成して下さい。 Input 3つの整数が空白で区切られて与えられます。 Output 小さい順に並べ替えた3つの整数を1行に出力して下さい。整数の間に1つの空白を入れて下さい。 Sample Input 3 8 1 Sample Output 1 3 8 以上がAIZU ONLINE JUDGEというサイトの問題です。 自分が書いたソースプログラムは以下です: #include<stdio.h> int main(void){ int a,b,c; scanf("%d %d %d",&a,&b,&c); if(c>b&&b>a){ printf("%d %d %d",a,b,c); } if(b>c&&c>a){ printf("%d %d %d",a,c,b); } if(a>c&&c>b){ printf("%d %d %d",b,c,a); } if(c>a&&a>b){ printf("%d %d %d",b,a,c); } if(b>a&&a>c){ printf("%d %d %d",c,a,b); } if(a>b&&b>c){ printf("%d %d %d",c,b,a); } if(a==b&&b==c){ printf("%d %d %d",a,a,a); } if(a==b&&b>c){ printf("%d %d %d",c,a,a); } if(a==b&&c>b){ printf("%d %d %d",a,a,c); } if(a>c&&b==c){ printf("%d %d %d",b,b,a); } if(c>a&&b==c){ printf("%d %d %d",a,b,b); } return(0); } 自分のパソコン上でコンパイルして,いろいろ整数を入力してみて,全部大丈夫でしたが,なぜこのオンラインサイトでコンパイルするとエラーが出るでしょうか? よろしくお願いします

  • C言語について

    「キーボードから10個の実数を入力し、それらの平均を求めるプログラムを作れ。」という問題で私は、 #include <stdio.h> void main(void) { float A; float a,b,c,d,e,f,g,h,i,j; printf("実数を入力してください:"); scanf("%f",&a); scanf("%f",&b); scanf("%f",&c); scanf("%f",&d); scanf("%f",&e); scanf("%f",&f); scanf("%f",&g); scanf("%f",&h); scanf("%f",&i); scanf("%f",&j); A=(a+b+c+d+e+f+g+h+i+j)/10; printf("平均は%fです.\n",A); } と考えたのですが、もっとすっきりとしたプログラムはないのでしょうか?もっとシンプルにしたいのです。教えて下さい。よろしくお願いします。

  • c言語についての質問です。

    #include<stdio.h> int main(void){ double a,b; int c; printf("Type two numbers\n"); scanf("%lf",&a); scanf("%lf",&b); printf("Select 1)addition, 2) subtraction, 3)multiplication or 4)division\n"); scanf("%d",&c); switch(c){ case1: printf("%.6f + %.6f = %.6f",a,b,a+b); break; case2: printf("%.6f - %.6f = %.6f",a,b,a-b); break; case3: printf("%.6f * %.6f = %.6f",a,b,a*b); break; case4: printf("%.6f / %.6f = %.6f",a,b,a/b); break; default: printf("Error! Select 1, 2, 3 or 4\n"); break; } return 0; このプログラムをコンパイルして実行しても 正しく動きません。なぜですか?

  • C言語の配列の使い方について質問です。

    以下のプログラムを配列を使って見やすくしたいのですが、どのように作ったら良いでしょうか? 宜しくお願いします。 #include<stdio.h> int main(void) { int a, b, c, d, e, f, g, h, i, j, k, l, m ,n, o; /*5段目の処理*/ for(a = 1; a <= 15; a++) { for(b = 1; b <= 15; b++) { if(a == b) continue; for(c = 1; c <= 15; c++) { if(a == c || b == c) continue; for(d = 1; d <= 15; d++) { if(a == d || b == d || c == d) continue; for(e = 1; e <= 15; e++) { if(a == e || b == e || c == e || d == e) continue; // printf("%d %d %d %d %d\n", a, b, c, d, e); ////4段目//// if(a>b){ f=a-b; } else if(a<b){ f=b-a; } if(b>c){ g=b-c; } else if(b<c){ g=c-b; } if(c>d){ h=c-d; } else if(c<d){ h=d-c; } if(d>e){ i=d-e; } else if(e<d){ i=e-d; } // printf(" %d %d %d %d \n", f, g, h, i); /////3段目//// if(f>g){ j=f-g; } else if(f<g){ j=g-f; } if(g>h){ k=g-h; } else if(g<h){ k=h-g; } if(h>i){ l=h-i; } else if(h<i){ l=i-h; } // printf(" %d %d %d \n", j, k, l); /////2段目//// if(j>k){ m=j-k; } else if(j<k){ m=k-j; } if(k>l){ n=k-l; } else if(k<l){ n=l-k; } // printf(" %d %d \n", m, n); /////三段目///// if(m>n){ o=m-n; } else if(m<n){ o=n-m; } // printf(" %d \n", o); if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o){ printf("%d %d %d %d %d\n", a, b, c, d, e); printf(" %d %d %d %d \n", f, g, h, i); printf(" %d %d %d \n", j, k, l); printf(" %d %d \n", m, n); printf(" %d \n", o); } } } } } } }

  • C言語についての質問です

    プログラミング初心者です if関数を使用して二次方程式の解を解くプログムを作成したのですが、この作成した関数をユーザー定義関数を使用しmain 関数の中でユーザー定義関数を呼び出すことにより、 2次方程式の解を求めるプログラムへ変更したいのですが、どのように行えばいいのか分かりません… 私が作成したプログラムはこのようなものになっています #include<stdio.h> #include<stdlib.h> #include<math.h> int main(void) { double a, b, c; /*二次方程式の定数*/ double D, x1, x2, r1, r2; printf("ax^2 + bx + c = 0 の係数 a, b, c を入力してください---> \n"); scanf_s("%lf %lf %lf", &a, &b, &c); printf("2次方程式を解いた結果は次の通りとなる。\n"); if (a == 0.0) { if (b == 0.0) { printf("係数がおかしい\n"); exit(-1); } { x1 = -c / b; printf("解は%f です。\n", x1); exit(0); } } else { D = b * b - 4 * a * c; if (D >= 0) { x1 = (-b + sqrt(D)) / (2.0 * a); x2 = (-b - sqrt(D)) / (2.0 * a); if (D == 0.0) { printf("解は %f です。\n", x1); } else { printf("解は %f と %f です。¥n", x1, x2); } } else { r1 = -b / (2 * a); r2 = sqrt(-D) / (2 * a); printf("解は%.2f+%.2fi と%.2f-%.2fi \n", r1, r2, r1, r2); } } return 0; } よろしくお願いいたします

  • C言語の質問です。

    {a,b,c,x,d,xx,e,x,f,\0} という文字型配列があったとして、xを取り除いて{a,b,c,d,e,f,\0}という配列にしたいのです。 その場合、例えば'd'の前にはxが1つ、'e' の前にはxが3つ、'f'の前にはxが4つありますよね? その数だけそれぞれの位置をずらせばxを取り除ける処理ができると思うのですが、その場合どのようにすれば実現できるでしょうか。 forでループをするというのは何となく分かるのですが、何分初心者なもので、見当がつきません。

  • tjaplayerについて

    tjaplayerで、段位道場を作ってみたのですがなぜかリザルト画面になるとエラーが発生します。 ほかの段位道場は、普通にできるのですが… https://firestorage.jp/download/686b0adf9d2c99fb791e4c8d37ea8f5b30fc2288 からダウンロードできます。

  • ダウンロード保存先がわからない

    ttp://firestorage.jp/download/132a8c589f4d8f9add3c9b76cb439bec8bdd11ad ↑のサイトで曲をダウンロードしました。 聞き終わりこの曲を消したいのですが保存先がわかりません。 (155メガあるので消したい) ダウンロードしたときは、開くを選びました。 で落とされてメディアプレイヤが自動で立ち上がって曲がかかりだしました。 他の曲が入ってる場所など探したのですがわからないのです。 間抜けな質問ですが捜す方法はあるにでしょうか? お願いします。

  • C言語のプログラムの問題で質問です。

    C言語のプログラムの問題で質問です。 問題は、 与えられた実数(a,b,c,d)に対して、次の連立非線形方程式の解 を「ニュートン法」を用いて解く。 f1(x,y)=y+ax^2-b=0 f2(x,y)=y^2+cx^2-d=0 ただし初期値(a,b,c,d)を入力でき、上記の方程式の解が画面表示されること。 という問題です。まず、どういう方針で作っていくのかが分かりません。 できるのなら参考例を挙げてもらえればありがたいです。お願いします。