• 締切済み

関数呼び出しを使った、絶対値出力プログラムについて質問です。

すみませんが、このプログラムを見てもらえませんか? 絶対値が上手く表示できません。よろしくお願いします。 #include <stdio.h> double myabs(double); main() { double x,a; printf("Input number = "); scanf("%lf", &x); if(x < 0) { a = myabs(x); printf("Zetaitti = %f\n", a); } else { printf("Zetaitti = %f\n", x); } } double myabs(double x) { double a; x = -x; return(a); }

みんなの回答

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.7

>すみませんが しつこいようですけど >最後にXに返すとは、main()関数のどこのXに返しているのですか? >何度もすみません。 Xに返すのではなく、Xの内容を返しています。 従って、Xの内容が3であれば、3が返ります。 これは、この関数をよびだしたところの行の a = myabs(x); で aがその3の値を受け取ることをしめしています。 従って  return(X)と書こうが、return(Y)と書こうが、受け取るほうに影響はありません。大切なのは、Xの内容(又はYの内容)です。この内容を呼び出し側は受け取りますから。

hiromatu4
質問者

お礼

あぁ そういう事だったのですね。 ありがとうございました。  自分でも もっと勉強してみます。 ありがとうございました。

  • dekopa-
  • ベストアンサー率42% (161/378)
回答No.6

「絶対値を返す」なら、if文も含めて関数にしないと。 main() 中略 double a = myabs(x); printf("Zetaitti = %f\n", a); double myabs(double x) { if (x < 0) return -x; else return x; }

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.5

何故みんな関数名が myabs() なのに、符号を反転させる関数で OK としているのですか? 今回、main 側で符号を判断してるけど、そんなことを前提にして関数を書いてるんじゃないよね?

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

double myabs(double x) { double a; x = -x; return(a);・・・・これを return(x);にしてください。 }

hiromatu4
質問者

補足

ありがとうございます。 無事に実行できました。 すみませんが しつこいようですけど 最後にXに返すとは、main()関数のどこのXに返しているのですか? 何度もすみません。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.3

> double myabs(double x) > { > double a; > x = -x; > return(a); > } a = -x; かと。 蛇足ですがmainのaと関数内のaは別物であることにご注意ください。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★アドバイス ・なぜ、double a; を宣言しているのですか。  また、その a を返していますが x を返せば良いと思いますよ。 double myabs( double x ) {  return( -x ); } ↑ で良いのでは。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>double myabs(double x) >{ >double a; > >x = -x; > >return(a); >} a には最初から最後まで何も代入されてませんが。。。 変数のスコープについて勉強して下さい。

関連するQ&A

  • 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; } よろしくお願いいたします!!

  • C++でのプログラムについての質問です

    このような二次関数の解を求めるプログラムを作成したのですが、自作関数solveをvoid solve(double, double, double)のように変更し同じ動作をするように変更したいです どのようにへんこうすればよいでしょうか #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; }

  • γ関数のプログラム(初心者です)

    以下のようにγ関数のプログラムを組みました。 とりあえず整数値を入力すれば、正しい値は返しているということがprintfの4で確認できました。 もとはfortranで組んだプログラムをCに置き換えました。 ですが、実際走らせてみると、4で値は確認できますがsegmentation faultが出てしまいます。 ですからサブルーチンファイル(ユーザー関数?)として利用できません。 何がいけないのでしょうか? 正しくyが帰ってくるようにどうなおしたらよいのか教えてください。 #include <stdio.h> #include <math.h> double gamma(double x) { double c[8],y,a,r,b,s; int i; a=1.; r=1.; c[1]=5.771916e-01; c[2]=9.882058e-01; c[3]=8.970569e-01; c[4]=9.182068e-01; c[5]=7.567040e-01; c[6]=4.821993e-01; c[7]=1.935278e-01; c[8]=3.586834e-02; printf("0 %f\n",x); while(1){ if(x>2.){ x=x-1.; a=a*x; printf("1 %f %f\n",x,a); } else if(x<1.){ a=a/x; x=x+1.; printf("2 %f %f\n",x,a); } else{ break; } } x=x-1.; for(i=1;i<8;i++){ b=(double)(i); s=(c[i]*((double)(pow(-1,b))) *((double)(pow(x,b)))); printf("3 %d %f\n",i,c[i]); r=r+s; } y=a*(r+(0.03586834*((double)(pow(-1,8)))*((double)(pow(x,8))))); printf("4 %f\n",y); return y; } main() { double x,y; printf("数字を入力してください。"); scanf("%lf",&x); printf("メインプログラム %lf\n",x); y=gamma(x); printf("%f\n",y); }

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

    指数関数のマクローリン展開のプログラムです。 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で、キ-ボ-ドから整数を1個(mとする)、実数を1個(xとする)それぞれ入力し、 S=Σ(n=0からmまで)1/2n+1×(x-1/x+1)^2n+1 の値を求めるプログラムを作ってみたのですが、あってるかどうかわかりますか? #include<stdio.h> #include<math.h> main() { double y=0; int i,m,x; printf(\" Input m: \") scanf(\"%lf\", &m); printf(\" Input x: \") scanf(\"%lf\", &x); for(i=0; i <= m; i++) { y += 1/(2*i+1)*pow((x-1)/(x+1),2*i+1) } printf(\" S = %d\n\", y) }

  • 最初の x[10]は

    #include <stdio.h> int main() { int a; double s,x[10]; for(a=0; a<10; a++){ scanf("%lf", &x[a]); }for(a=0;a<10;a++){ printf("%f\n", x[a]);} return 0; } のdouble x[10]は、10通りのxがあるということですか?

  • 二分法のプログラムについて

    下の用なプログラムを作ったのですがどうしても正しい答えを導くことができません。自分でもいろいろ調べてみましたがわかりません。誰かご教授宜しくお願いします。 #include<stdio.h> #include<stdlib.h> #define MAX 10 int n , count; double c[MAX+1]; double a,b,e; void nyuuryoku(void) { int i; printf("nの入力>"); scanf("%d",&n); if(n>MAX){printf("最大次数を超えている");exit(1);} else if(n<0){printf("nが負");exit(2);} else{for(i=0;i<=n;i++){printf("係数の値>");scanf("%lf",&c[i]);} }} double f(double x) {double y; int i; y = c[0]; for(i=1;i<=n;i++){ y=y*x+c[i];} return y; } void hani(void){ printf("aの値>");scanf("%lf",&a); printf("bの値>");scanf("%lf",&b); printf("eの値>");scanf("%lf",&e); if(e<=0){printf("eが0または負"); exit(3);} if(f(a)==0){printf("%f",f(a)); exit(4);} if(f(b)==0){printf("%f",f(b)); exit(5);} if(f(a)*f(b)>0){printf("初期値異常"); exit(6);}} double nibun(void) {double c; if(b>a){ while(b-a>e){ count++; c=(a+b)/2; if(f(c)==0){ return c;} if(f(a)*f(c)<0){b=c;} if(f(b)*f(c)<0){a=c;} } return a;} if(a>b){ while(a-b>e){ count++; c=(a+b)/2; if(f(c)==0){ return c;} if(f(b)*f(c)<0){a=c;} if(f(a)*f(c)<0){b=c;} } return a;} } void syutsuryoku(double x){ printf("x=%lf\n",x); printf("f(x)=%lf\n",f(x)); printf("繰り返し回数=%d\n",count); } int main(void){ double ans; count=0; nyuuryoku(); hani(); ans = nibun(); syutsuryoku(ans); }

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

    プログラミングについての質問です。 関数を使った以下のプログラムを作成し、実行してみたのですが、上手くいきません。 どこかおかしいのでしょうか? 教えていただけると幸いです。ご回答お待ちしております。 #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; }

  • C言語 関数化の仕方について

    こんにちは。プログラムの関数化の方法についてお願いがあり投稿いたしました。プログラムの関数化というものを行いたいのですが方法が分からないので、以下のプログラムを関数化していただきたいのです。 #include <stdio.h> int main() { printf("摂氏と華氏を相互変換します。変換したい温度を入力してください。\n"); printf("入力例:32F, 100C, etc.数値と単位の間に空白は不要です。\n"); double x, xc; char u; scanf("%lf%c",&x,&u); if (u=='C') { xc = (x * 9 / 5) + 32; printf("%lf degCは%lf degFです。\n", x, xc); } else if (u=='F') { xc = (x - 32) * 5 / 9; printf("%lf degFは%lf degCです。\n", x, xc); } else { printf("書式が誤っています。\n"); } return 0; } コードを添えていただけるとさらに分かりやすくて助かります。お手数ですがよろしくお願いいたします。

  • 二次関数で

    任意の二次方程式(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("虚数解"); }