• ベストアンサー

C言語 プログラミングで行詰まりました…

標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

質問者が選んだベストアンサー

  • ベストアンサー
  • tokichim
  • ベストアンサー率42% (88/205)
回答No.6

> たとえばi=1,j=3,k=5,n=5と入力すると > X_0=5.000000 > X_1=1.600000 そもそもの式の定義に従って手計算で計算すると、 X_0 = 5 X_1 = (1+3)/X_0 = 4/5 = 0.8 となり、皆さんの回答の値と一致しますよね。 とすると、そもそもの想定か、式のどちらかがまちがっているのでは?

その他の回答 (5)

回答No.5

掲載のソースをそのまま利用して試してみました。 ---------- i:1 j:3 k:5 n:5 X_0= 5.000000 X_1= 0.800000 X_2= 5.000000 X_3= 0.800000 X_4= 5.000000 X_5= 0.800000 ---------- の結果になりました。 コンパイラの設定や環境に依存した原因では?

  • adbarg
  • ベストアンサー率53% (1134/2108)
回答No.4

このプログラムを見ると、小数点以下6桁の表示を求めているのですが、そもそもfloat型では有効桁数が足りないと思います。 また浮動小数点数の誤差(丸め誤差)も考慮に入れた方がよいと思います。 誤差が誤差を呼び、初期入力値によっては全く有効精度の無い答えになると思います。 最初からdouble型を使った方が良いのでは? 今時わざわざfloat型を使うメリットはないと思いますが…

  • _himajin_
  • ベストアンサー率65% (128/195)
回答No.3

ためしにコピペしてコンパイルしてみましたが、特に大きな問題もなく動いてるように見えますが・・・ 唯一、X_0 = c = float k = 0 としたときは除いて。 # これは、0 では割れない、と言うルールがあるためです。 ## 式中の変数名とプログラム中の変数名が一致してなくてアレアレ、と少し混乱。。 ゼロ除算以外でうまく動かない、と言うことであれば、#2で求められている補足をお願いします。 特に、入力値、期待結果、実行結果が欲しいです。

参考URL:
http://ja.wikipedia.org/wiki/%E3%82%BC%E3%83%AD%E9%99%A4%E7%AE%97
takahir0O0
質問者

補足

たとえばi=1,j=3,k=5,n=5と入力すると X_0=5.000000 X_1=1.600000 X_2=2.875000 X_3=2.043478 X_4=2.468085 X_5=2.215517 と表示されてほしいのに、べつの結果が表示されてしまいます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

いやいやいやいや, そんなことはありえませんよ>#1. さすがに int と float がまざれば, 全て float で計算されますし最終結果も float になります. この手の質問でよくあるんですが, 「うまく表示されない」といわれても普通の人には何がどのように「うまく表示されない」のか全く見当が付かないんですよ. せめて, ・どの処理系で ・どのように実行して ・どのような結果が期待されるところ ・どのようになったのか くらいは書けませんか?

takahir0O0
質問者

補足

たとえばi=1,j=3,k=5,n=5と入力すると X_0=5.000000 X_1=1.600000 X_2=2.875000 X_3=2.043478 X_4=2.468085 X_5=2.215517 と表示されてほしいのに、べつの結果が表示されてしまいます。

  • ojasve
  • ベストアンサー率20% (96/469)
回答No.1

Cの文法は忘れてしまいましたが intをFloatで割ると、まず、intになって、その後floatに代入しても、小数点以下が切り捨てられてしまうから、誤差が出るのでしょう。 (たしか) つまり float f_X(int a,int b,float c) の中で y=(a+b)/c; に問題があります。 例えば、y=((float)a+(float)b)/c; としてみてください。 return y; } 参考URLの4.をご覧下さい。

参考URL:
http://www9.plala.or.jp/sgwr-t/detail/TypeConversion.html

関連するQ&A

  • C言語 プログラミング 行列演算

    下記のプログラムのおかしい点と解決法を教えてください。 コンパイルは通りますがうまく動きません。。 #include<stdio.h> #define MAX 500 int main(void){ int matrA[MAX][MAX],matrB[MAX][MAX],matrC[MAX][MAX],l,m,n,i,j,k; printf("lとmを入力してください:"); scanf("%d",&l); scanf("%d",&m); printf("行列Aを入力してください"); for(i=0;i<l;i++){ printf(">"); for(j=0;l<m;j++){ scanf("%d",&matrA[i][j]); } printf("\n"); } printf("nを入力してください(m = %d):",m); scanf("%d",&n); printf("行列Bを入力してください"); for(i=0;i<m;i++){ printf(">"); for(j=0;j<n;j++){ scanf("%d",&matrB[i][j]); } printf("\n"); } printf("C=\n"); for(i=0;i<l;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ matrC[i][j]+=matrA[i][k]*matrB[k][j]; } printf("%d",matrC[i][j]); } printf("\n"); } }

  • C言語のプログラミングで質問です

    C言語のプログラミングで質問です. 時間を測ろうと下記のようなプログラムをしてみましたが計測時間がoTime, nTime共に0.000になってしまいます.(winmm.libはリンクさせてます) おかしいところはどこでしょうか? #include<stdio.h> #include<time.h> #include<windows.h> #include<mmsystem.h> #include<stdlib.h> #define N 2048 #define M 32 int main(int argc, char* argv[]) {   int i, j, k, l;   float target = 0;   float* a;   float* b;   float c;   DWORD nTime, oTime;     a = (float*)malloc(sizeof(float)*N);   b = (float*)malloc(sizeof(float)*N);   c = 0;   for(i = 0; i < N; i++)   {     a[i] = 1000;     b[i] = 0;   }  oTime = timeGetTime();   for(i = 0; i < M; i++)   {    for(j = 1; j < N/M; j += j)    {      for(k = 0; k < N/M; k++)      {        if(k % 2 == 0)        {          a[k+i*N/M] += a[k+j+i*N/M];        }      }    }    b[i] = a[i*N/M];    printf("%f\n", a[i*N/M]);   }   for(i = 0; i < M; i++)   {     target += b[i];   }   c = target;   nTime = timeGetTime();   printf("%f\n%f\n%f", c, oTime, nTime);   getch();   return 0; }

  • c言語のプログラムで行列の積を計算する

    指定された行・列数(それぞれ10以下とする)の行列 X, Y の積 Z = X × Y を求めるプログラムを作成せよ.行列の要素はすべて整数とする. このプログラムで行と列の成分を入力するときに、1列になってしまうのですがどうしたらちゃんと入力できますか? int main(void) { double A[10][10]; double B[10][10]; int i,j,m,n,p,k; printf("行列xの行数は?:"); scanf("%d",&m); printf("行列xの列数(行列yの行数)は?:"); scanf("%d",&n); printf("行列yの列数は?:"); scanf("%d",&p); printf("行列xを入力してください。\n"); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { scanf("%d", &A[i][j]); } } printf("行列yを入力してください。\n"); for (i = 0; i < n; i++) { for (j = 0; j < p; j++) { scanf("%d", &B[i][j]); } }

  • 行列の積を関数を使って求める・・?

    2つの行列の行と列を入力し、積を計算するプログラムを関数を使って書きたいのですが、上手く行きません。どこをどのように直したらよいか教えてください!お願いします!! 以下が私が書いたプログラムです。 #include<stdio.h> #define NUMBER 10 int first(int x1,int x2,int y1,int y2,int i,int j,int k) { int a[NUMBER][NUMBER] = {0}; int b[NUMBER][NUMBER] = {0}; int c[NUMBER][NUMBER] = {0}; do{ printf("2つの行列の行と列を入力してください\n"); scanf("%d", &x1); scanf("%d", &x2); scanf("%d", &y1); scanf("%d", &y2); if(x1 != y2){ printf("行列の積は計算できません\n"); } }while(x1 != y2); printf("行列Aの要素を入力してください\n"); for(i=0; i<x1; i++){ for(j=0; j<x2; j++) scanf("%d", &a[i][j]); } printf("行列Bの要素を入力してください\n"); for(j=0; j<y1; j++){ for(k=0; k<y2; k++) scanf("%d", &b[j][k]); } } int second(int x1,int x2,int y1,int y2,int i,int j,int k) { int a[NUMBER][NUMBER] = {0}; int b[NUMBER][NUMBER] = {0}; int c[NUMBER][NUMBER] = {0}; for(i=0; i<x1; i++){ for(k=0; k<y2; k++){ for(j=0; j<x2; j++) c[i][k] = c[i][k] + a[i][j]*b[j][k]; } } for(i=0; i<x2; i++){ for(k=0; k<y2; k++) printf("%3d", c[i][k]); printf("\n"); } } int main(void) { int a[NUMBER][NUMBER] = {0}; int b[NUMBER][NUMBER] = {0}; int c[NUMBER][NUMBER] = {0}; printf("行列の積を計算します\n %d\n", first(x1,x2,y1,y2,i,j,k)); printf("行列Aと行Bの積は\n %3d",second(x1,x2,y1,y2,i,j,k)); }

  • c言語で行列の積の値を求める

    行列の成分を入力した後に、 入力された行列は X = 1 2 3 4 5 6 7 8 9 10 11 12 Y = 1 5 2 6 3 7 4 8 のように表示して、(上の数字は適当です。) 行列 X と行列 Y の積を求めて結果を表示するプログラムが作りたいのですが、上手く表示できなくて困っています。 #include <stdio.h> int main(void) { double A[10][10]; double B[10][10]; double C[10][10]; int i,j,m,n,p,k; printf("行列xの行数は?:"); scanf("%d",&m); printf("行列xの列数(行列yの行数)は?:"); scanf("%d",&n); printf("行列yの列数は?:"); scanf("%d",&p); printf("行列xを入力してください。\n"); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { scanf("%d", &A[i][j]); } } printf("行列yを入力してください。\n"); for (i = 0; i < n; i++) { for (j = 0; j < p; j++) { scanf("%d", &B[i][j]); } } この後にどうすればいいのか教えてください。 よろしくお願いします。

  • C言語の問題です!!

    すみません。 詳細表示をする際に、未ソート部の先頭要素の上に記号文字「*」を表示し、未ソート部の最小要素の上に記号文字「+」を表示したいと思い、以下のソースプログラムを作成したのですが、結果が何か違う気がします…。どこが違うのか、教えていただけませんか? また、プログラムを修正していただけませんか? #include<stdio.h> #include<stdlib.h> #include<time.h> #define swap(type,x,y) do{type t=x;x=y;y=t;}while(0) /*--- 単純選択ソート ---*/ void selection(int a[], int n) { int i, j,k,flg; char *disp[]={" ","[* ]","[ +]","[*+]"}; for (i = 0; i < n - 1; i++) { int min = i; for (j = i + 1; j < n; j++) { if (a[min] > a[j]) { min = j; } } for (k = 0; k < n; k++) { flg=0; if(k==i) flg|=1; if(k==min) flg|=2; printf("%s",disp[flg]); } printf("\n"); for (k = 0; k < n; k++) printf("[%2d]", a[k]); printf("\n"); swap(int, a[i], a[min]); } } int main(void) { int i, nx; int *x; printf("要素数 : "); scanf("%d", &nx); x = calloc(nx, sizeof(int)); srand(time(NULL)); for (i = 0; i < nx; i++) { x[i] = rand() % 100; printf("x[%d] = %d\n", i, x[i]); } selection(x, nx); for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]); free(x); return 0; }

  • c言語 パスカルの三角形

    c言語でパスカルの三角形を出力するプログラムを作りたいのですが、上手くいきません。 何を直せばいいのか教えてください。 #include <stdio.h> #define N 10 int main(void){ int i, j = 1, x, y; int d[N][N]; /* 三角形を作成 */ for (i = 1 ; i < N ; i++){ d[i][0] = 1; while (j <= i - 1){ d[i][j] = d[i-1][j-1] + d[i-1][j]; j ++; } } /* 三角形の表示 */ for (y = 0; y < N; y++) { for (x = 0; x < N-y; x++) printf(" "); for (x = 0; x < y; x++) printf("%3d ", d[x][y]); printf("\n"); } return 0; } 実行結果 -2147417616 2665208 1629976532 1627572249 1629101723 1 1629982744 2665256 2665548 3407923 1629345053 1627571017 0 3538997 1629739051 10 1629345053 2665368 3670071 2665384 1629739040 1627927140 2665244 1628040295 57 1628810863 1629476960 1628602749 2665560 2665304 1629345053 0 1629739040 1629740576 1628992224 2 4411498 1628040588 -2147417600 0 1629476960 1629740664 1629739040 1 267574 0

  • C言語

    #include <stdio.h> #include <stdib.h> int main (void){ double a[5]={0.0,4.0,0.0,-5.0,1.0}; double x; int i,j,k,n; n=4; x=0.75; for(i=1;i<=n;i++) printf("%10.5f ,",a[i]); printf("\n"); for (i=1; i<=n+1; i++) printf("----------") printf("\n"); while(n>=1){ for(i=1; i<=n; i++) a[i]=a[i-1]*x+a[i]; for(i=1; i<=n; i++) prontf("%10.5f ,"a[i]); printf("\n"); n=n-1; } return 0; }

  • C言語に関して

    C言語に関して 100までの自然数を文字列に変換したいのですが、以下のプログラムを実行すると、001,002,…010,…099,100のようになってしまいます。左詰めにしたいのですが、どこが間違っているかご教示下さい。 #include <stdio.h> #define N1 100 #define N2 5 int get_ketasuu(); void henkankun(); int main(void) { int i, dig, x; int num1 = N1; int num2 = N2; int buff1[N1], buff2[N1]; char buff3[N1][N2]; for (i = 0; i < N1; i++) { x = buff2[i] = buff1[i] = i + 1; dig = get_ketasuu(x); henkankun(&buff2[i], &buff3[i], dig); printf("%s\n", buff3[i]); } return 0; } int get_ketasuu(x) int x; { int dig; dig = 0; do { x /= 10; dig++; } while (x > 0); return dig; } void henkankun(x, y, dig) int *x; int dig; char (*y)[N2]; { int j, k; switch (dig) { case 1 : k = 1; case 2 : k = 10; case 3 : k = 100; } j = 0; do { (*y)[j] = (*x / k) + '0'; *x %= k; k /= 10; j++; } while (k > 0); (*y)[j] = '\0'; }

  • C *での三角形描画

    課題で*を使って三角形を描画するプログラムを作るんですが、ネットで見たかぎり、 #include<stdio.h> int main() { int n, i, j, k, l; printf("段数を入力してください:"); scanf("%d", &n); for(i = 0; i < n; i ++) { for(j = 0; j < n; j ++) { for(k = 0; k < n*n-i*n-j-1; k ++) printf(" "); for(k = 0; k < i; k ++) { for(l = 0; l < j*2+1; l ++) printf("*"); for(; l < n*2; l ++) printf(" "); } for(k = 0; k < j*2+1; k ++) printf("*"); printf("\n"); } } return 0; } となっているのが、  段数を入力してください:2     *    ***   *   *  *** *** という風に表示されるので、これを  段数を入力してください:2     *    *** という形に表示させられるよう変更すべき箇所を教えてください。

専門家に質問してみよう