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

このQ&Aのポイント
  • 関数の引数と実引数の取り扱いについて、詳しく教えてください。
  • C言語初心者ですが、関数の引数と実引数の扱い方について教えてください。
  • 関数の引数と実引数の違いを教えてください。
回答を見る
  • ベストアンサー

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

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

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

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

> 以下のようなプログラムにするのはありでしょうか どちらも全く同じです。 前者は、sum関数呼び出し時の実引数a,bが、それぞれsum関数の仮引数x,yに正しく対応しています。 前者は、sum関数呼び出し時の実引数x,yが、それぞれsum関数の仮引数x,yに正しく対応しています。 ところで、せっかく和の値を求めたのですから、出力する方がよいと思いませんか?

asa_hikawa
質問者

お礼

結局,対応関係を間違えないようにすれば,計算をしてくれるのですね? ありがとうございました. > ところで、せっかく和の値を求めたのですから、出力する方がよいと思いませんか? はい.もちろん,そうします.

その他の回答 (2)

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

一箇所typoがありました。 後者の「前者」は「後者」が正しいです。あ~ややこし。

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

前者のコードと後者のコードが全く同じであるように見えます。 どこが違っていますか?

asa_hikawa
質問者

補足

すみません.後者のコード,正しいのは以下です. #include <stdio.h> double sum(double x, double y); int main(void) { double x, y, wa; x=2.0; y=3.0; wa=sum(x,y); return 0; } double sum(double x, double y) { double total; total=x+y; return total; }

関連するQ&A

  • 二次関数で

    任意の二次方程式(ax^2+bx+c=0)を解くプログラムを作るのですが、以下の条件を満たした方法で作るというものです。 1、関数の引数は、3つの係数と、解の入る変数二つとする。 (計5つの引数をとる。) いずれかの引数がアドレス渡し(ポインタ)になる。 2、解は関数呼出の時に指定した2つの変数にそれぞれ代入されること。 3、解の表示は関数側ではなく呼出側で行うこと。 4、グローバル変数は使用しない。 一応作ってみたのですがコンパイルすらできません。 初心者なので全くわかりません教えてください。 #include<stdio.h> #include<math.h> void solve(double *x, double *y); int main(void) { double x,y; solve(&x,&y); return 0; printf("x=%f\n", x); printf("y=%f\n", y); } void solve(double *x, double *y) { doble a,b,c; puts("二次方程式 a*x^2+b*x+c=0 を解きます"); puts("係数a, b, cを入力してください"); printf("a="), scanf("%lf", a); printf("b="), scanf("%lf", b); printf("c="), scanf("%lf", c); putchar('\n'); double d = b * b - 4 * a * c; if(d >= 0){ x = (-b + sqrt(d)) / (2 * a); y = (-b - sqrt(d)) / (2 * a); } else puts("虚数解"); }

  • 関数を引数とする方法?

    いつもお世話になっています。 MFCでプログラムをしています。 今、任意の関数(Func1)を 積分する関数(Func2)を作っています。 現在は、被積分関数の数だけ、 積分関数(Func2)を書いているのですが、 非効率的なので、なるべく汎用性を持たせたいと 考えています。 参考書(新C言語入門シニア編)の該当個所で、 クラスでない通常の関数を引数とする場合は、 うまくいったのですが、 クラスのメンバ関数を引数とした場合、 どうしてもコンパイルエラーが 発生してしまいます。 関数Func、I及びエラーメッセージは大凡次のとおりです。今のところ、引数とする関数(Func1)の引数は、 同一個数としています。 <被積分関数の例> double ClassA::Func1 (double a){ return a * 10; } <積分関数> double ClassA::Func2 (double (*f)(double), double a, double b){ return b * f(a); } void classA::Integration() { ... Func2(Func1,a,b); ... } <エラーメッセージ> classA::Integrationの呼び出し箇所で、 「1番目の引数を double(double)からdouble(__cdecl)(double)に 変換できません」 と出ます。 double(double)の部分は合っているようなのですが、 (__cdecl)の部分が違うということまでは 分かりました。 メンバ関数であることが原因のようなので、 Func2での引数宣言を double ClassA::Func2 (double (ClassA::*f)(double), double a, double b){ return b * f(a); } に変えてみたところ、 引数受け渡しのところはクリアするのですが、 Func2(Func1,a,b); の呼び出し時に、Func2が関数ではないという エラーがでます。 アドバイス又は参考URL等を 教えていただければ助かります。 よろしくお願いします。

  • C言語の関数に関する質問ですが

    C言語の初心者です。よろしくお願いいたします。 授業でこのような演習が出ました。 演習:実数x を入力したときの最大値を求めるプログラムを作れ. 実数x を入力すると,x; -x; x2; xの絶対値の平方根 の中で一番大きい値を答える プログラムを作れ(ファイル名はmax.c とする). 表示は以下のようにする. Input x: -0.5 【Enter】 Answer is 0.707107. #include<stdio.h> #include<math.h> double max(double a, double b){ if( a > b) return a; else return b; } int main(void) { double x,y; printf(\"Input x: \"); scanf(\"%lf\",&x); y = max (x,-x); y = max (y,x*x); y = max (y,sqrt(fabs(x))); printf(\"Answer is %f.\\n\",y); } このように書けばうまく実行できますが、関数の中に関数を使えないでしょうか。うまく言えないですが、たとえば、以下のように書いてみましたが、うまく実行できません。どう直したらいいでしょうか、お忙しい中教えていただけたらうれしいです。 #include <stdio.h> #include <math.h> int max(double a,double b) { if (a<b) return b; else return a;} int main(void) { double x,result; printf(\"Input x:\"); scanf(\"%lf\",&x); result=max(max(x,-x),max(pow(x,2),sqrt(fabs(x)))); printf(\"%.2f\",result); return 0; } よろしくお願いいたします!!

  • プログラミング 関数について教えて下さい。

    プログラミングについての質問です。 関数を使った以下のプログラムを作成し、実行してみたのですが、上手くいきません。 どこかおかしいのでしょうか? 教えていただけると幸いです。ご回答お待ちしております。 #include <stdio.h> double add (double x,double y); int main(void) { double a,b,c; printf("double型の数を入力して下さい。\n"); scanf("%f\n",&a); printf("もうひとつdouble型の数を入力してください\n"); scanf("%f\n",&b); c=add(a,b); printf("入力された2数の和は%fです。\n",c); return 0; } double add(double x,double y) { double z; z=x+y; return z; }

  • 使い回しの効く関数の作り方

    ある関数をaからbまで積分する関数integralがあります. integral(double (*func)(double, void*), void* t, double a, double b) 例えば次の関数 fx=5x double fx(double x, void* y0) { double y =*(double*)y0; return y*x; } を積分するときには double y=5.0; integral(fx, &y, 1.0, 5.0); としています. さらに gx=5x+5 のようなときは, 構造体を宣言して double gx(double x, void* y0) { parameter p =*(parameter*)y0; return p.y*x + p.z; } としています. これはいい方法なのでしょうか? 関数funcの引数の数を変えてしまうと, integralの使い回しができなくなると思い, このような方法にしていますが, これも被積分関数ごとに構造体を用意しなければならず, あまり良くないんじゃないかな~って思っています. もっといい方法があれば教えていただきたいです. よろしくお願いします.

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

  • 二次関数の係数と切片 オーバーフローになってしまいます

    二次関数の通る、二つの座標(x1,y1)、(x2,y2)から y=ax+bの、aとbを求めるプログラムを目指して作ったのですが、 実行すると値がNANになってしまいます。 アドバイスしていただけないでしょうか? ソースです ↓ #include<stdio.h> double main(){ double x1,x2,y1,y2,a,b,a1,a2; printf("x1="); scanf("%f",&x1); printf("y1="); scanf("%f",&y1); printf("x2="); scanf("%f",&x2); printf("y2="); scanf("%f",&y2); printf("***RESULT***\n"); printf("y=%f x+ %f",a,b); a1=y1-y2; a2=x1-x2;      a=a1/a2; b=y1-a*x1; return 0; }

  • 引数の個数を変えないで変数(定数)を扱う

    別に積分に限らないと思うのですが、積分を例にして質問させていただきます。 次のようなルーチンがあります。 integral( double (*func)(double), double a, double b ); /* a~bまで関数funcを積分する。 */ そこで、簡単に被積分関数を fx=3*x とすれば、 double fx(double x) { return 3*x; } というようにすれば良いですよね。 でも、例えば fx = exp(x-X) とか fx = x*X のような関数を積分したいときはどうすればよいのでしょうか? Xは変数ですが、xにはよらないので積分の中では定数とみなせます。 ループで X=0 のときにfxを積分 X=1 のときにfxを積分 X=2 のときにfxを積分… というようにしたいのですが、 fxの引数をfx(double x, double X) とすると、プロトタイプ宣言もルーチンの中も書き換えなければならなくなりますよね。 さらに fx = x-X + x' などとなったりすると、さらに書き換えなければならなくなり、せっかくの積分のルーチンをうまく使えません。 Xをグローバルで宣言する方法と、 プログラミングの前に、x-X を x' などと置きかえた式を実際に手計算で作る方法を思いついたのですが、 グローバル変数を使うのはあまりよくないし、手計算では簡単な場合しか置換を思いつかなかったりします。 fxの中で X を宣言して、 double fx(double x) { static double X; double y; y = x-X; X++; return y; } という方法も考えたのですが、どうもイマイチ良くないような… こういう場合に、良い方法はありますか? ここには簡単な関数を書きましたが、少し複雑な関数を積分するので。 質問の意図がうまく伝わらなかったらすいません。 書きにくかったです。

  • 引数に二重配列のある関数について

    void calc(int *a,int b,int c){ a[0]=b+c; a[1]=b-c; } void main(void){ int x[2]; int y=2,z=5; calc(x,y,z); printf("x[0]=%d,x[1]=%d\n",x[0],x[1]); } 上のように引数が普通の配列の関数ならできるのですが, 引数が下のような多重配列になるとエラーが出てしまいできません。 void keisan(int **a,int b,int c){ a[0][0]=b+c; a[0][1]=b-c; a[1][0]=b*c; a[1][1]=b/c; } void main(void){ int x[2][2]; keisan(x,6,2); printf("x[0][0]=%d,x[0][1]=%d\n",x[0][0],x[0][1]); printf("x[1][0]=%d,x[1][1]=%d\n",x[1][0],x[1][1]); } 引数に多重配列を使った場合の関数の作り方について教えてください. お願いいたします.

  • 数の大小の出力

    C言語で関数を用いたプログラムを作成しているのです、行き詰まっています。内容は、double型の数を2つ入力して大きい数を出力するというものですが、エラーは1つもでてはいないのですが結果が0と表示されてしまいます。私の書いたプログラムに問題点はなんなのか教えていただけないでしょうか? ちなみに、このプログラムの条件は ・main関数は値の入力と関数を呼び出し、結果を出力する。 ・大小を判別する部分は関数として作成。 ・関数の引数は入力した2つの値。 ・関数の戻り値は大きいと判定した数。となっております。 ちなみに私の書いたプログラムはこちらです。条件とあわせて指摘をおねがいいたします。 #include<stdio.h>  double daisyou(double x, double y);  int main(){  printf ("数を入力してください。");  scanf("%f %f",&a,&b);  max = ookii;  printf("大きい数は%f\n",max);  }  doubele daisyou(double x, double y){  double ookii;  if(x>y){  ookii = x;  returun ookii;  }else if(x<y){  ookii = y;  return ookii;  } }

専門家に質問してみよう