• ベストアンサー

グローバル変数の定義について質問です。

下記は私が作成した簡易サンプルプログラムです。 #include <stdio.h> #include <stdlib.h> #include <math.h> double a=1; double b=2; double c=3; double f(){ double y; scanf("%lf",&y) ; return y; } double g(){ double y; y=f()*a; return y; } void main(){ double y; y=g()*b*c; printf("y = \n",y) ; } このプログラムでは実行しても答えが出ません。 グローバル変数でscanfを使用して入力した値を上記double g()で使用することは不可能なのでしょうか。 また、もし可能な方法があるのでしたら教えていただければ幸いです。 よろしくお願いします。

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

  • ベストアンサー
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.10

#9です。 なるほど、ニュートンラプソン法について、詳しくはわからないのですが、そういった場合はmain関数でscanfを行って、引数で、方程式を解く関数に渡すのが普通でしょうか。 void calc(double a); int main() { double a; scanf("%lf",&a); calc(a);//この中で方程式を解く。 return 0; } ループについても、cals関数の中で行えば、入力は常に一回で済みます。 本当は解の出力についてもmain関数で行いたいところですが、解が何個になるのか不明なので、例がかけません。 解が1個なら、 double calc(double a); int main() { double a; double x; scanf("%lf",&a); x=calc(a);//この中で方程式を解く。 printf("x=%f\n",x); return 0; } という感じですし、2個ならば void calc(double a,double *px,double *py); int main() { double a; double x,y; scanf("%lf",&a); calc(a,&x,&y);//この中で方程式を解く。 printf("x=%f,y=%f\n",x,y); return 0; } という感じですが、二次以上の式で解が二組以上になったりすると少々面倒なので、calcの中で直接出力するのでも、とりあえずはいいかと思います。

jamboxy
質問者

お礼

お礼のお返事遅くなりましてまことに申し訳ありません。 今は至らないながらも皆様のアドバイスをもとにいろいろ考えながらためしています。 皆様のご協力には本当に感謝しています。 この場を借りてお礼申し上げます。ありがとうございました。 まだまだ分からないところだらけですので、今後ともお力添えいただけたら幸いです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (9)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.9

#1です。 >一度入力をしたらその値を再度入力せずにループをして答えを得るプログラムについて、再度アドバイス、ご指摘をいただければ幸いです。 そんなプログラムはいくらでも書けますが、普通はグローバル変数は使いませんし、こんな関数の作り方もしません。 なぜ、グローバル変数を使っているのかとか、関数を2つも作っているのかとか明らかにしていただけると、それなりのソースを示すこともできると思います。 あと、 >cは何かしらのゴミが入り、 という話ですが、この場合、cはグローバル変数ですので、0で初期化されることが規格で定められています。ゴミが入るということはありません。もちろん、あまり行儀はよくないので、明示的に初期化するほうがいいとは思います。

jamboxy
質問者

お礼

私の説明不足を深くお詫びすると共に、このような自分勝手な質問に対しご回答いただけていることを感謝いたします。 他の回答を頂いた方のお礼にも書かせていただいたのですが、現在私は連立方程式を解くためニュートンラプソン法のプログラムを作成しています。私が解きたい式には3つの未知数が存在するため、3連立方程式を立ててプログラムを作成しているのですが、その式の中には未知数のほかに状況によって変動する値が存在します。この値は未知数ではなく、状況に応じた値(定数)がすでに決まっています。 私としてはいちいちプログラムの実行が終了してから、値を修正して再度実行するよりも、一度実行したら各状況に合わせて自身で入力した値で計算が出来るようなプログラムを作成したいと考えたおりました。 しかしながら自身の勉強不足のためうまく作成することが出来ず、皆様に頼ってしまっている次第です。 見苦しい言い訳となってしまいますが、現在独学でプログラムを修学しているため思うようにプログラムの作成が出来ず、頼るばかりとなってしまっています。

全文を見る
すると、全ての回答が全文表示されます。
  • Alice022
  • ベストアンサー率37% (3/8)
回答No.8

あ、すみません。嘘を書きました。 プロトタイプ宣言はメイン関数の上にサブ関数と一緒の定義になってますね。 プロトタイプ宣言の部分は一部訂正して、いらないところは省いて下さい。

全文を見る
すると、全ての回答が全文表示されます。
  • Alice022
  • ベストアンサー率37% (3/8)
回答No.7

#include <math.h> ★math.hに関数のプロトタイプ宣言をしていると思うので、g()に引数を設定してあげる如何でしょうか。 double g( double *d ); //関数プロトタイプ宣言 ------------------------------------------------ double a=1; double b=2; //double c; double c = 0; //初期化 double f(){ double y; scanf("%lf",&y) ; return y; } double g( double *d ){ double y; //y=f()*a; y = *d * a; //y=f()*a;の変更、ポインタで値を受け取ったので、値を参照して計算します。 return y; } void main(){ int i; double y; y = f(); //main関数が一番始めに動くので、ここで入力するようにする。一度だけの入力となる。 for(i=0;i<=10;i++){ c=c+1; y=g( &y )*b*c; //入力データのポインタを渡します。g()で計算された値が掛け算で計算され、yに入ります。 } printf("y = %lf\n",y) ; } ------------------------------------------------ と、以上な感じです。 すみません、コンパイルで確かめてないので、コーディングミス があるかもしれませんが…、色々考え方があると思いますので、参考程度です。

jamboxy
質問者

お礼

私自身のプログラムを丁寧に修正していただきまことにありがとうございます。 元は私自身のものなので非常に分かり易く、丁寧なご回答に頭が下がるばかりです。 皆様から頂いたご指摘、ご指導を参考に自身でも再度勉強し直したいと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.6

>一度入力をしたらその値を再度入力せずに >ループをして答えを得るプログラムについて、 >再度アドバイス、ご指摘をいただければ幸いです。 flagで制御すればよいのでは? こんな感じです #include <stdio.h> #include <stdlib.h> #include <math.h> double a=1; double b=2; double c; double f(){ static int flag; if (!flag) { double y; scanf("%lf",&y) ; flag = 1; } return y; } double g(){ double y; y=f()*a; return y; } void main(){ int i; double y; for(i=0;i<=10;i++){ c=c+1; y=g()*b*c; } printf("y = %lf\n",y) ; }

jamboxy
質問者

お礼

プログラムのサンプルまで作成していただき、まことにありがとうございます。 flogやその他の制御等のご指摘をいただき、非常に参考になりました。 私としては、ニュートンラプソン法で連立方程式を解くときに呼び出した変数を使用した式を解きたかったのです。そのため今回質問広場の皆様のお力をお借りいたした次第です。丁寧なご回答再度お礼申し上げます。

全文を見る
すると、全ての回答が全文表示されます。
  • Alice022
  • ベストアンサー率37% (3/8)
回答No.5

こんにちは。 titokaniさんへの返答内容を参照すると、 printf("y = %lf", y); という記述でも答えは表示されたけれど、 for文を加えループにしたら、答えが表示されなくなってしまった。 という感じに読み取れますので、asuncionさんのアドバイスのように 1回は入力していると思うので、10回分の入力を待ってしまっているのだと思います。 for文の中で、g()がコールされています。 g()は、f()をコールしています。 f()では、scanf()によりユーザーからの入力を求めています。 この動作を10回以下まで繰り返します。 なので、画面に表示されなかったら、何かしらの値を後、10回入力してあげることで、答えが表示されると思います。 あと気になる点ですが、ちゃんとした答えが出ているのか変数cは何かしら初期化をしてあげて下さい。 変数宣言で、初期化していないのは、for文の中で、 c=c+1; とし、値を代入させているからだと思いますが、始めにcが初期化されていないので、cは何かしらのゴミが入り、+1計算されてしまいますので、意図した値を確認することができません。

jamboxy
質問者

お礼

ご回答、ご指摘まことにありがとうございます。 先に頂いた回答のお礼として書かせていただいたのですが、私としては先のプログラムにて一度入力をしたらその値を再度入力せずにループをして答えを得るプログラムを作りたかったのですが、うまくいきませんでした。 おこがましいのは承知でお願いいたします。一度入力をしたらその値を再度入力せずにループをして答えを得るプログラムについて、再度アドバイス、ご指摘をいただければ幸いです。

全文を見る
すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

scanfでdoubleを読み込むのは%lfですがprintfでdoubleを表示するのは%fです(ほとんどのコンパイラが%lfでも動きますが) floatの場合もdoubleに変換されて表示されます

jamboxy
質問者

お礼

丁寧なご指導ご指摘まことにありがとうございます。 皆様のご指摘を受けるたび自身の勉強不足を痛感しております。 また、アドバイス、ご指摘をよろしくお願います。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

おっと失礼。 10回分ではなく11回分でした。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

>下記のようにループにしたところ答えが出ません。 答えが出ないのではなく、10回分の入力を待っているのです。 for文によるループの中で、g()を実行しています。 その、g()の中で、f()を実行しています。 その、f()の中で、scanf()を実行しています。 これでおわかりですね。

jamboxy
質問者

お礼

的確なご指摘ありがとうございます。 補足にて説明いただいたようにやはり11回呼び出されてしまっているようです。 私としては一度入力をしたらその値を再度入力せずにループをして答えを得るプログラムを作りたかったのですが、先に質問させていただいたプログラムとなってしまいました。 重ね重ねになってしまうのですが、もしよろしければアドバイスいただけたら幸いです。よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.1

>このプログラムでは実行しても答えが出ません。 >printf("y = \n",y) ; printf("y = %f\n",y) ; では?

jamboxy
質問者

お礼

ご指摘まことにありがとうございます。 初歩的なミスでお恥ずかしい限りです。 出力を変えたら計算できていました。 しかし、このプログラムを下記のようにループにしたところ答えが出ません。 原因や対処法などご教授いただければ幸いと存じます。 重ねての質問となりますが、よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <math.h> double a=1; double b=2; double c; double f(){ double y; scanf("%lf",&y) ; return y; } double g(){ double y; y=f()*a; return y; } void main(){ int i; double y; for(i=0;i<=10;i++){ c=c+1; y=g()*b*c; } printf("y = %lf\n",y) ; }

全文を見る
すると、全ての回答が全文表示されます。

関連する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; }

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

    下の用なプログラムを作ったのですがどうしても正しい答えを導くことができません。自分でもいろいろ調べてみましたがわかりません。誰かご教授宜しくお願いします。 #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); }

  • 二次関数で

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

  • ax^2+bx+c=0の解を求めたいのですが・・(初歩的です)

    タイトル通り、a、b、cを入力させて、ax^2+bx+c=0の解xを求めたいのですが、結果をどう求めればいいのか、実解・虚数解・重解の場合をどうしたらいいのか、の2点がよくわかりません。 #include<math.h> #include<stdio.h> double sqrt(double a,double b,double c) { return (b*b-4*a*c); } main(void) { double a,b,c,sqrt,ans; do{ printf("ax^2 + bx +c = 0 の解 x を求めます。\n a,b,cを入力してください。\n"); printf("a : "); scanf("%lf",&a); printf("\nb : "); scanf("%lf",&b); printf("\nc : "); scanf("%lf",&c); if(a = 0){ printf("a は0以外を入力してください。\n"); } }while(a = 0); ans = (-b+dist(a,b,c))/(2*a); printf("%lf", ans); printf("\n"); return(0); } 他にも多々ダメな部分があると思いますがご指摘・アドバイス等いただけたらと思います。よろしくお願いします。

  • 空間上の四面体の体積

    C言語で空間上の四面体の体積を求めるプログラムを作りたいんですが、どうすればいいのかわかりません。 構造体を使って空間上(三次元)の4点A,B,C,Dの座標を定義するのですが。 四面体の求め方もわかりません。ヘロンの公式じゃ求められませんよね(^^; 空間上の三角形の面積を求めるプログラムを作ってみました。 少しでも参考になれば幸いです。 よろしくお願いします。 #include <stdio.h> #include <math.h> int main(void) { double AB, BC, CA, s, m; struct zahyo { double x; double y; double z; }A, B, C; scanf("%lf %lf %lf",&A.x,&A.y,&A.z); scanf("%lf %lf %lf",&B.x,&B.y,&B.z); scanf("%lf %lf %lf",&C.x,&C.y,&C.z); AB=sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)+(A.z-B.z)*(A.z-B.z)); BC=sqrt((B.x-C.x)*(B.x-C.x)+(B.y-C.y)*(B.y-C.y)+(B.z-C.z)*(B.z-C.z)); CA=sqrt((C.x-A.x)*(C.x-A.x)+(C.y-A.y)*(C.y-A.y)+(C.z-A.z)*(C.z-A.z)); printf("AB=%lf\nBC=%lf\nCA=%lf\n",AB,BC,CA); s=(AB+BC+CA)/2; m=sqrt(s*(s-AB)*(s-BC)*(s-CA)); printf("m=%lf\n",m); return 0; }

  • 定積分のプログラミングについて

    刻み幅dxを入力し、f(x)=4/(1+x^2)を0~1まで定積分するというプログラムを作ったんですが、なぜか、刻み幅を入力してENTERを押すと、 ずら~~~~~っと無限に結果の文字列が出てきてしまいます。 書いたプログラムを載せるので、間違っている箇所を教えてもらえませんか。お願いします。 #include <stdio.h> #include <math.h> double f(double m); main(){ double x,F,dx; printf("Numerical integration of y=4/(1+x^2).\n"); /*刻み幅の入力*/ scanf("%lf,&dx:"); /*aとbと刻み幅*/ printf("The lowwer bound:0.0\n"); printf("The upper bound:1.0\n"); printf("The meth width:dx\n"); /*関数*/ for(x=0.0;x<1.0;x+=dx) { F=f(x); /*計算結果を出力*/ printf(" f(%lf)= 4/(1+x^2) =%lf\n",x,F); } } double f(double m) { double y; y=4/(1+m*m); return y; }

  • 値の渡し方?(初心者)

    以前質問したプログラムについて、新たに質問です。 メインプログラムと、関数プログラムを組みました。 関数の中では、print文を使うと計算は正しく行われていて、結果が正しいことが分かりました。 でうが、メイン文の出力では、どこにも出てこない変な値が出てきてしまいます。 値の渡し方がおかしいのでしょうか? 誰か、アドバイスをお願いします。 ***以下プログラムです。*** #include <stdio.h> #include <math.h> double gamma(double x) { double c[9],y,a,r,b,s,z; 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<9;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; printf("4 %lf\n",y); return y; } main() { double x,y; printf("数字を入力してください。"); scanf("%lf",&x); printf("メインプログラム x= %lf \n",x); y=gamma(x); printf("x= %f y= %f\n",x,y); }

  • C言語の基本的な質問ですが・・

    #include<stdio.h> #include<math.h> int main() { double a,b; b=2; a=b; printf("%f",a); return(0); } このプログラムで、a=b;のbには 2.000000が入ってると考えればよいでしょうか? それとも2が入っていると考えるべきでしょうか? bはfloat型なんで、前者だと思ったのですが。 よろしく願いします。

  • 平均を求めるプログラムを作ったのですが答えが0.0

    としか出ません。 #include<stdio.h> void main (void) {   double a; double b;   double c; printf("Aを入力する"); scanf("%lf",&a); printf("Bを入力する"); scanf("%lf",&b); c=(2*a*b)/(a+b); printf("平均値は"); printf("%8.6lf",c); } というプログラムを作ったのですが、プログラムはコンパイルするのですが出てくる答えは0.000000しか出ません。ほかにもよく0.0000という答えが出ることがあります。原因を教えていただけませんでしょうか。 

はがき印刷できない
このQ&Aのポイント
  • はがき印刷を初めて行いましたが、印刷時間が極端に遅く、はがきの途中で印刷エラーとなり排出されます。
  • お使いの環境はWindows10で、無線LANで接続しています。電話回線はひかり回線です。
  • ブラザー製品についての質問です。
回答を見る