float型関数の定義方法

このQ&Aのポイント
  • 初期化されてないローカル変数が使用されます。
  • float型関数の定義方法を教えてください。
  • float型関数の定義でエラーが出る場合の修正方法は?
回答を見る
  • ベストアンサー

float型関数の定義の仕方がわかりません。

次のプログラミングでfloat型関数を定義しようとしても下の矢印のところにどんな文字を入れても「初期化されてないローカル変数が使用されます。」と出て、どうしてもうまくいきません。 こういう場合どこを直せばエラーが出なくなるのでしょうか? #include<stdio.h> float wa(float  );       ↑ int main(void) { float a; a = wa();      ↑ printf("%f\n",a); return 0; } float wa(float  )       ↑ { float l = 0, i, m, n, x,b; for (i = -2; i <= 0.00005; i++) { x = i; l *= i; m = x*x - x - 1; n = (2 * x) - 1; b = l - (m / n); } return b; }

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

  • ベストアンサー
回答No.1

こうしたいのかしら? #include<stdio.h> float wa(void); int main(void) {  float a;  a = wa();  printf("%f\n",a);  return 0; } float wa(void) {  float l = 0, i, m, n, x, b;  for (i = -2; i <= 0.00005; i++) {   x = i;   l *= i;   m = x*x - x - 1;   n = (2 * x) - 1;   b = l - (m / n);  }  return b; }

hatano1341
質問者

お礼

有難う御座います。 とりあえず、やっと起動できました。

その他の回答 (2)

  • hiodraiu
  • ベストアンサー率15% (447/2819)
回答No.3

float型固有の問題はないですね。同じことをintやlongでやっても同じですよ。

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

>a = wa(); >float wa(float  ) wa関数の実行時には引数がないと言っているのに、 実体の定義時にはfloat型の引数が必要だと言っています。 両者が矛盾しているため、コンパイラーが怒っています。

関連するQ&A

  • float型関数で定義するプログラミング

    今プログラミングを行っているのですが、Xn+1=Xn-f(Xn)/g(Xn)(f(x)=x*x-x-1,g(x)=2x-1,これらはfloat型の関数とすること)で初期値Xo=-2としたときに繰り返しxを求めていき、|f(x)|=<10^-5となるまで計算するプログラムを作成したいのですが結果がおかしくなるので、ここからどう手直しすればいいのかわかりません。 #include<stdio.h> float wa(void); int main(void) { float a,i; for (i = -2; i <= 0.00005; i++) { a = wa(); printf("%f\n", a); } return 0; } float wa(void) { float l = 0, i, m, n, x,b; for (i = -2; i <= 0.00005; i++) { x = i; l *= i; m = x*x - x - 1; n = (2 * x) - 1; b = l - (m / n); } return b; } 結果 -1.000000 -1.000000 -1.000000 正直言ってどういう結果になればいいのかもわかりません。 せめてどういうような結果になるのかだけでも教えていただければありがたいです。

  • 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; } ===================================================================

  • 行列の計算

    #include<stdio.h> #define N 2 #define M 3 void hyoji(float[][M]); int main(){ int i,j,k; float a[N][M] = {{2.0,2.0,2.0},{2.0,2.0,2.0}}; float b[M][M] = {{1.0,1.0,1.0},{2.0,2.0,2.0},{1.0,1.0,1.0}}; float c[N][N]; for(i=0; i<N; i++){ for(j=0; j<M; j++){ c[i][j] = 0; for(k=0; k<M; k++){ c[i][j] += a[i][k] * b[k][j]; } } } hyoji(c); return(0); } void hyoji(float x[][M]){ int i,j; for(i=0; i<N; i++){ for(j=0; j<M; j++){ printf("%4.1f ",x[i][j]); } printf("\n"); } } 以上のプログラムで 行列aと行列bをかけ合せた行列cを求めるのですが コンパイルすると 8 8 8 8 8 1 となり、正しい結果がでません。 なにが間違っているのでしょうか?? よろしくお願いします。

  • 指数関数のプログラムを組んでいるのですが・・・(初心者)

    指数関数のマクローリン展開のプログラムです。 x=1の場合はしっかりと値が収束するのですが、それ以外ではうまくいきません。 以下のように組んだのですが、どこがまちがっているのでしょうか? 1.n!を求める。 2.x^nを求める。 3.これらを割る。 4.exに足していくという手順でやっているつもりです。 よろしくおねがいします。 ______________________ #include<stdio.h> main() { double a,i,j,k,l,m,n,x,ex; printf("x="); scanf("%lf",&x); n=1; ex=1; m=x; for(i=1;i<100;i++){ m=x; n=n*i; for(k=1;k<i;k++){ m=m*m; } a=m/n; if(a<0.000001){ return 0; }else{ m=x; ex=ex+a; } printf("%lf ",ex); } return() }

  • C言語の実数型の足し算

    C言語初心者です。関数の勉強していて、実数型計算に出くわしました。 #include <stdio.h> float add(float a, float b) { return a+b; } int main(void) { float x=10.5,y=20.3; printf("%f %f\n",x,y); printf("%f\n",add(x,y)); return 0; } としたら、 10.500000 20.299999 30.799999 という結果になりました。今のところint型でずーっと勉強していたので、20.3の20.299999表記が怪しく感じられ、結果も同様に怪しく感じられます。どうして、10.5+20.3=30.8とすっっきり表示してくれないのでしょうか。

  • 関数におけるif文とreturn文について

    ◎1-------------------------------------------- #include<stdio.h> #include<math.h> double maxdt(double a,double b); void disp_sqrt(double n); int main(void) { double mx; mx=maxdt(22.33,44.55); printf("mx=%f\n",mx); disp_sqrt(3.0); disp_sqrt(-6.0); return 0; } double maxdt(double a,double b) { if(a>b) return a; else return b; } void disp_sqrt(double n) { if(n<=0.0) return; printf("%f の平方根=%f\n",n,sqrt(n)); } ----------------------------------------------- ◎2------------------------------------------- #include<stdio.h> #include<math.h> double maxdt(double a,double b); void disp_sqrt(double n); int main(void) { double mx; mx=maxdt(22.33,44.55); printf("mx=%f\n",mx); disp_sqrt(3.0); disp_sqrt(-6.0); return 0; } double maxdt(double a,double b) { if(a>b) return a; else return b; } void disp_sqrt(double n) { if(n<=0.0){ return; printf("%f の平方根=%f\n",n,sqrt(n)); } } ----------------------------------------------- ◎3-------------------------------------------- #include<stdio.h> #include<math.h> double maxdt(double a,double b); void disp_sqrt(double n); int main(void) { double mx; mx=maxdt(22.33,44.55); printf("mx=%f\n",mx); disp_sqrt(3.0); disp_sqrt(-6.0); return 0; } double maxdt(double a,double b) { if(a>b) return a; else return b; } void disp_sqrt(double n) { if(n<=0.0){ return; } else{ printf("%f の平方根=%f\n",n,sqrt(n)); } } -------------------------------------------------- ◎1は参考書を参考に作ったものです。 ◎1は正常に動きます。 以上3つのプログラムで、疑問に思ったのは、関数「void disp_sqrt(double n);」についてなのですが、自分はif文が文が1つでもカッコ{ }を付けたい考えなので、◎1の「void disp_sqrt(double n)」の関数のif文に{}を付けようと思い、まず◎2のように変えたところ、平方根の表示が何も出ませんでした。 return文も文の1つだと考え、◎3のような形は正常に動きました。 return文とprintf文の2つの文があるという考えは間違っているのでしょうか? 後、◎1は何故{ }が無くてもよく、◎2は何も表示されないのでしょうか? 教えていただけると嬉しいです。

  • コンパイルエラーです。

    #include <stdio.h> #include <time.h> int main() { float a = 1; float b = 1; clock_t start, end; for(a <= 9999; a++) for(b <= 99999; b++) printf("%fx%f=%f\n",a, b, a*b); end = clock(); printf("[4x4]\n####################\n%fs\n####################\n",(double)(end - start) / CLOCKS_PER_SEC); return 0; } エラーが起きるのですが、僕には、どこが間違っているのかわかりません。 教えてください。

  • 関数の引数と実引数の取り扱いについて

    C言語初心者です. 関数の引数と実引数の取り扱いについて,教えていただきたいことがあります. 例えば,2変数の和を求める関数を考えると,以下のようになると思います. #include <stdio.h> double sum(double x, double y); int main(void) { double a, b, wa; a=2.0; b=3.0; wa=sum(a,b); return 0; } double sum(double x, double y) { double total; total=x+y; return total; } このとき,mainプログラムでは,a,bふたつの変数を定義しておいて,関数sumに入れて計算させているわけですが,mainプログラムで変数x,yを定義しておいて,以下のようなプログラムにするのはありでしょうか? 参考書などをみると,前者のように取り扱っているようなのですが,試しに後者で実行させてみても同じ結果となりました. #include <stdio.h> double sum(double x, double y); int main(void) { double a, b, wa; a=2.0; b=3.0; wa=sum(a,b); return 0; } double sum(double x, double y) { double total; total=x+y; return total; }

  • 関数の出力引数をクラスにするには?

    既出、または基礎の質問でしたらすみません。 ここでも他の検索エンジンでも見つけられなかったので。。。 C++です。 クラスを出力する関数を作りたいのですが、うまくできません。 ソースは以下のとおりです。問題は、プログラム下方のf1(),f2(),main()です。 長くて、そして見づらくてすみません・・・ //////////// #include<stdio.h> class test{ private: int num; float *vec; public: test(int n=1); //ctor ~test(); //dtor int getnum(){return num;} float* getvec(); void set(int,float*); void show(); }; test::test(int n){ num = n; vec = new float[n]; for(int i=0; i<n; i++) vec[i] = (float)i; } test::~test() {delete[] vec;} float* test::getvec(){ float *v; v = new float[num]; for(int i=0; i<num; i++) v[i] = vec[i]; return v; } void test::set(int n, float *v){ num = n; vec = new float[n]; for(int i=0; i<n; i++) vec[i] = v[i]; } void test::show(){ for(int i=0; i<num; i++) printf("%d: %g\n",i,vec[i]); } void f1(test &x, test &y){ int n; float *v; n = x.getnum(); v = x.getvec(); for(int i=0; i<n-1; i++) v[i] = 2.0*v[i]; y.set(n-1,v); } test f2(test x){ test y; //* int n; float *v; n = x.getnum(); v = x.getvec(); for(int i=0; i<n-1; i++) v[i] = 2.0*v[i]; y.set(n-1,v); return y; //** } void main(){ test x,y; int n = 4; float v[4] = {1.0,2.0,3.0,4.0}; printf("x:\n"); x.set(n,v); x.show(); printf("f1:\n"); f1(x,y); y.show(); printf("f2:\n"); y=f2(x); y.show(); } //////////// これを実行すると x: 0: 1 1: 2 2: 3 3: 4 f1: 0: 2 1: 4 2: 6 f2: 0: 7.38979e-38 1: 7.38979e-38 2: 6 となります。 関数f2がうまく動かない理由がわかりません。。。 出力引数にクラスはとれないのでしょうか?? よろしくお願いします。

  • c言語です。

    c言語です。 実行結果 式 3 X1 + 2 X2 + 1 X3 = &g 2 X1 + 5 X2 + 2 X3 = &g 1 X1 + 4 X2 + 1 X3 = &g 解 X1 = 1 X2 = 2 X3 = 3 を 式 3 X1 + 2 X2 + 1 X3 = 10 2 X1 + 5 X2 + 2 X3 = 18 1 X1 + 4 X2 + 1 X3 = 12 解 X1 = 1 X2 = 2 X3 = 3 に直したいのですが&gの所をどのようにしたら10.18.12になりますか? #include <stdio.h> #include <float.h> #define N 3 double A[N][N] = {{3,2,1}, {2,5,2}, {1,4,1}}; double b[N] = { 10, 18, 12 }; void Gauss_J( int, double*, double* ); void main(void) { int i; printf( "%d式\n", N ); for( i = 0; i < N ; i++ ) { printf( "%g X1 + %g X2 + %g X3 = &g \n", A[i][0], A[i][1], A[i][2], b[i] ); } printf("解\n"); Gauss_J(N, (double *)A, (double *)b ); printf("X1 = %g \n", b[0]); printf("X2 = %g \n", b[1]); printf("X3 = %g \n", b[2]); } void Gauss_J(int n, double *a, double *b) { int p, i, j,I ; double pivot, c ; for ( p = 0 ; p < n ; p++ ) { pivot = a[ p*n + p ]; for ( i = p ; i < n ; i++ ) { a[ p*n + i ] /= pivot; } b[ p ] /= pivot; for ( I = 0 ; I < n ; I++) { if (I != p) { c = a[ I*n + p]; for ( j = p ; j < n; j++ ) { a[ I*n + j] -= c * a[ p*n + j ]; } b[ I ] -= c * b[ p ]; } } } return ; }

専門家に質問してみよう