• ベストアンサー

指数形式で入力するには

 このプログラムは球の体積を求めるものです。 #include <stdio.h> main() { double r,v,PI=3.1415926535; printf("球の半径(cm)を入力して下さい: "); scanf("%lf",&r); v=4.0*PI*r*r*r/3.0; printf("球の半径=%12.5e (cm) 球の体積=%12.5e (cm^3)\n",r,v); }  現在入力が小数形式(%lf)になっていますが、 1.00007e+002 -1.71005e-001 のような指数形式にしたいと思います。しかし%lfのところを%eや%gに変更して実行すると、 球の半径(cm)を入力して下さい: 1.00000e+001 球の半径=2.66182e-314 (cm) 球の体積= 0.00000e+00 (cm^3) というふうに正常な出力結果が得られません。どのようにすればこのプログラムが正常に動くのでしょうか。  ご存知の方、お手数ですが教えてください。よろしくお願いします。

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

%lf を %e や %g に変えては駄目なのは当たり前。l の意味がお分かりではないのでしょうか? %le や %lg に変えてもいいですが、%lf のままでも指数入力できませんか?

eliteyoshi
質問者

お礼

 ご回答ありがとうございます。  %lf,%le,%lgのいずれでも正常に作動しました。  %lfのlはlong型変数のことでしょうか?

その他の回答 (3)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

誤動作の原因についてはすでに回答がでているようですので、scanfの書式指定について書きたいと思います。 まず、"%lf"や"%lg"などの'l'についてですが、これは実引数がdoubleへのポインタであることを意味しています。ちなみにlong doubleの場合は'l'の代わりに'L'を付けて"%Lf"のようにします。そして、何も付けない"%f"や"%g"の場合はfloatへのポインタを意味します。 今回の場合、"%e"や"%g"のように、'l'も'L'も付けずに使ったために、実引数がfloatへのポインタと解釈されたことが原因で誤動作したようです。 なお、scanfの場合は、"%f"、"%e"、"%g"、"%E"、"%G"(C99の場合は"%a"や"%A"も)すべて同じ意味になります。これらはprintfの書式指定との対象性のために用意されているだけです。 さて、printfの書式指定ですが、scanfのものとは似ていますが、細かい点ではまったく別のものです。printfの場合、実引数はポインタではなく値そのものを渡しますが、このとき既定の実引数拡張という型変換が行われます。具体的には、int以下の整数はintに、double以下の浮動小数点数はdoubleに変換されます。つまり、floatを渡したつもりでも勝手にdoubleになってしまうわけです。そのため、floatでもdoubleでも、"%f"や"%g"のように'l'は必要ありません(付けてはいけません)。ただし、余りにも間違えて'l'を付ける人が多かったために、C99からは"%lf"や"%lg"のように書くこともできる仕様に変更されています。

eliteyoshi
質問者

お礼

丁寧に説明して頂いてありがとうございます。 結局の所、このような質問をしてしまったのは僕の勉強不足のようです。ご親切な回答を頂いてとても勉強になりました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>正常な結果が出ました。 すみません、指数部分が3桁でも大丈夫なようです。 どうも原因は別のところにあるようです。 ウチでは >球の半径(cm)を入力して下さい: 1.00000e+001 >球の半径=2.66182e-314 (cm) 球の体積= 0.00000e+00 (cm^3) が再現しませんでした。 結局#1様の回答で解決ということだと思われます。お騒がせしました。

eliteyoshi
質問者

お礼

何度もご回答ありがとうございます。 何も問題ないということで安心しました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

scanfで受け付ける指数表現は、 printfで出力されるモノと同じものです。 なので、指数表現は、「2桁」でなければなりません。 1.00007e+002 -1.71005e-001 は 1.00007e+02 -1.71005e-01 のように入力する必要があります

eliteyoshi
質問者

お礼

 ご回答ありがとうございます。  指数表現は、「2桁」でなければならないとのことですが、質問のプログラムで 1.00007e+002 -1.71005e-001 を入力したら正常な結果が出ました。  これからファイル入力のプログラムを作るのですが、入力ファイルの数値の指数表現がすべて「3桁」なのです。「3桁」で問題あるならどうすればよいのでしょうか。

関連するQ&A

  • Switch文を使ったプログラミング

    switch文を使って1のときは円周、2のときは円の面積、3のときは球の面積を求めるという問題をしています。xが1の時は出力結果は合っているのですが、xが2と3のときはdefaultの結果の"もう一度やり直し"になってしまいます。 どこが間違っているのかわかりません。 rは半径、Lは円周、Sは円の面積、Vは球の体積です。paiはπです。 #include<stdio.h> #include<stdio.h> int main(void){ double L, x, r, S, V, pai=3.14159; printf("半径rを入力:"); scanf("%lf",&r); printf("処理番号(1:円周は 2:円の面積は 3:球の体積は)"); scanf("%lf",&x); switch(x){ case 1: L = 2*pai*r; printf("円周は%0.2lf",L); break; case 2: S = pai*r*r; printf("円の面積は%0.2lf",S); break; case 3: V = 4*pai*r*r*r/3; printf("球の体積は%0.2lf",V); break; default: printf("もう一度やり直し\n"); } return 0; }

  • 初めてのC言語 

    半径rで円周をだすプログラムを作りたいのですが作ってみたところ答えが0.00しかでてきません。 どこが間違っているのでしょうか。 #include <stdio.h> #define PI 3.14159265358979 /* 円周率 */ int main(void) { double r,a; printf("r="); scanf("%lf",&r); a=r*2*PI; printf("r*2*PI=%5.2lf\n",a); return 0; }

  • 球の体積と表面積を表示するプログラム

    高校生です。 学校であった問題なのですがいまいち理解できません。 いまのところ習ったものはprintf関数とscanf関数のみです。 問題を書くので誰かご教授ねがえませんでしょうか? Q.半径をキーボードから入力し球の体積と表面積を表示するプログラムを作成しなさい。なお、入力は整数値で行い、面積は実数値で表示するものとする。 公式 球の体積=4/3πr3(三乗です。)    球の表面積=4πr2(二乗です。)    r:球の半径 π:円周率(プログラム上では3.14を用いる) お願いします。

  • C++総和の質問です

    Microsoft Visual Basic 6.0の質問です. 色々試してもうまくいかない箇所があるので質問させていただきます. この式の中で,am=1となっているものをam=1からam=x(xはscanfで入力) とし,最後のRRR上で1からxまでのRRRの総和を計算させることは可能でしょうか? 基本的な総和と違い,RRRより前に計算しているKmやKn上にそれぞれのamを代入し,最終的にRRRの総和を計算するという形にするやりかたがわからない状態です. プログラムが無駄に長くて申し訳ありませんが,わかる方いらっしゃいましたらよろしくお願いいたします. 以下プログラムです //hello2.cpp #define _COMPLEX_DEFINED #include <iostream> #include <string> #include "complex.h" #include "bessel.h" #include <math.h> #include <cmath> #include <stdio.h> #define RADIAN(ARC) ((ARC) * 3.14159 / 180) using namespace std; int main(void) { const double pi=3.141592654; const double I0=2829; const double r0=0; const double z=0; const double B1=6.07*pow(10,7); int k; double omega,freq,x; double R,Rk; double lambdag,ag; double lambda1,a1,l1; double lambda2,a2,l2; double p,p2,pg; double a11,a21,ag1,Rk1,l11,l21,p11,p21; double Km,Kn,Kg,am; complex r1,g,S2; complex sigma1,sigma2,sigmag; complex G,P,B,H; complex RR,NI,NI2,NI3,BE,RRR; double r,r00,r001,r01; double imag(),real(); printf("接触熱抵抗"); scanf("%lf",&R); printf("加熱光半径(10^-6)×"); scanf("%lf",&Rk1); Rk=Rk1*pow(10,-6); printf("1層目熱伝導率"); scanf("%lf",&lambda1); printf("1層目温度伝導率(10^-6)×"); scanf("%lf",&a11); a1=a11*pow(10,-6); printf("1層目厚み(10^-6)×"); scanf("%lf",&l11); l1=l11*pow(10,-6); printf("2層目熱伝導率"); scanf("%lf",&lambda2); printf("2層目温度伝導率(10^-6)×"); scanf("%lf",&a21); a2=a21*pow(10,-6); printf("2層目厚み(10^-6)×"); scanf("%lf",&l21); l2=l21*pow(10,-6); printf("バッキング熱伝導率"); scanf("%lf",&lambdag); printf("バッキング温度伝導率(10^-6)×"); scanf("%lf",&ag1); ag=ag1*pow(10,-6); printf("1層目半径境界(10^-6)×"); scanf("%lf",&p11); p=p11*pow(10,-6); printf("2層目半径境界(10^-6)×"); scanf("%lf",&p21); p2=p21*pow(10,-6); printf("バッキング半径境界"); scanf("%lf",&pg); x=2; freq=pow(10,x); omega=2*pi*freq; am=1; Km=am/p; Kn=am/p2; Kg=am/pg; sigma1=cpow(pow(Km,2)+complex(0,omega/a1),0.5); sigma2=cpow(pow(Kn,2)+complex(0,omega/a2),0.5); sigmag=cpow(pow(Kg,2)+complex(0,omega/ag),0.5); r1=B1/sigma1; g=(lambdag*sigmag)/(lambda1*sigma1); S2=(lambda2*sigma2)/(lambda1*sigma1); G = (1/(2*(S2+g)))*((S2-g)*(-1+R*lambda2*sigma2+S2)*cexp(-2*sigma2*l2)-(S2+g)*(1+R*lambda2*sigma2+S2)); P = (1/(2*(S2+g)))*((S2-g)*(1-R*lambda2*sigma2+S2)*cexp(-2*sigma2*l2)-(S2+g)*(-1-R*lambda2*sigma2+S2)); B = (1/(2*(S2+g)))*((S2-g)*((1-R*lambda2*sigma2)*r1+S2)*cexp(-2*sigma2*l2)-(S2+g)*(-1*(1+R*lambda2*sigma2)*r1+S2)); H = ((g+r1)*cexp(sigma1*l1)*G+(1-g)*cexp(-1*B1*l1)*B)/((1-g)*cexp(-1*sigma1*l1)*P+(1+g)*cexp(sigma1*l1)*G); r=0; r00=0; r001=1; r01=0.00005; BE=1; NI= exp(-1*(2*pow(r01,2)/pow(Rk,2)))*j0(Km*r)*r01; NI2=2*pi*r001*j0(Km*r00); NI3=cpow(j1(am),-2); RR= (B1*I0/(2*lambda1*(cpow(sigma1,2)-pow(B1,2))))*2*pow(p,-2)*cpow(BE,-2)*NI*(1/(1-g))*(-2*H+r1+1)*NI2*cexp(sigmag*z); RRR=-atan(((RR.imag())/(RR.real()))*(180/pi)); printf("%e\n",R*Rk); printf("%e\n",Rk); printf("%e\n",lambda1); printf("%e\n",B1); printf("%e\n",sigma1); printf("%e\n",sigmag); printf("%e\n",g); printf("%e\n",r1); printf("%e\n",j0(am)); printf("%e\n",G); printf("%e\n",P); printf("%e\n",B); printf("%e\n",H); printf("%e\n",NI3); printf("%e",RR.real()); printf("+"); printf("%e",RR.imag()); printf("i""\n"); printf("%e\n",RRR); scanf("%d",&k);// return 0; }

  • ヒントをください!

    ある課題があるんですが、 「ユーザに好きな整数を10個入力させ、その最小値と最大値を出力するプログラムを書いてください。if文を使ってください。」 このプログラムを作る際のヒントをください。ぜんぜんわからないので。。。 答えは作ってから見たいので。。。 よろしくおねがいします。 10個数字を入力させるプログラムは作りました。 #include <stdio.h> int main(void){ int c,e,r,u,t,v,d,a,p,n; printf("好きな整数を10個入力してください。\n"); printf("整数を入力:"); scanf("%d",&c); printf("整数を入力:"); scanf("%d",&e); printf("整数を入力:"); scanf("%d",&r); printf("整数を入力:"); scanf("%d",&u); printf("整数を入力:"); scanf("%d",&t); printf("整数を入力:"); scanf("%d",&v); printf("整数を入力:"); scanf("%d",&d); printf("整数を入力:"); scanf("%d",&a); printf("整数を入力:"); scanf("%d",&p); printf("整数を入力:"); scanf("%d",&n); return 0; } このようになりました。

  • C言語のプログラムについてです。

    円を描くプログラムを作りたいのですが、条件としてpointを使わないでつくらなければなりません。あとそのプログラムについての説明もいるので、合わせて回答お願いします。pointを使うと↓のプログラムです。 #include<stdio.h> #include<math.h> int main(void); int main(void) { double point[2][2]; double r; double pi=3.14159; int i; onenpl(); space(-100.0,-100.0,100.0,100.0); printf("円を描きます\n"); printf("半径を入力してください\n"); scanf("%lf",&r); point[0][0]=r*cos(0.0); point[0][1]=r*sin(0.0); for (i=1;i<360;i=i+1) { point[1][0]=r*cos(pi/180.0*i); point[1][1]=r*sin(pi/180.0*i); line(point[0][0],point[0][1],point[1][0],point[1][1]); point[0][0]=point[1][0]; point[0][1]=point[1][1]; } closepl(); return(0); }

  • C言語(条件処理)

    二つの球の接触を判断するプログラムを作るという宿題が出されてたのですが、if文による条件処理をどのように書けば良いか分かりません。お助けください。 接触パターンはいくつかあると思いますが、その接触するときの条件について以下のソースコードより後、どんなソースコードを追加すれば良いか教えてもらえませんか? 接触する条件を記述するだけでも良いので回答のほうを至急、お願いします。 何か間違っていれば修正のほうもお願いします。 ソースコード #include<stdio.h> int main(void) { float x1,y1,z1; //x1,y1,z1は球1の中心の位置座標 float x2,y2,z2; //x2,y2,z2は球2の中心の位置座標 //例えば(3,0,0)であれば球の中心がx軸に3の位置にいることを指す。 float r1; //球1の半径 float r2; //球2の半径 printf("x1="); scanf("%f",&x1); printf("y1="); scanf("%f",&y1); printf("z1="); scanf("%f",&z1); printf("r1="); scanf("%f",&r1); printf("x2="); scanf("%f",&x2); printf("y2="); scanf("%f",&y2); printf("z2="); scanf("%f",&z2); printf("r2="); scanf("%f",&r2); この部分の追加をお願いします。 if(){ printf("接触した"); } else{ printf("接触していない"); } return 0; } もしくは r1とr2を入力ではなく、初期化したほうが良いのでしょうか?・・・ そうであれば、修正のほうもお願いします。

  • scanfの入力形式確認について

    scanfで入力形式を%dに指定した場合、文字をタ-ミナル上で入力しても読みとばされるようで、結果 printf("please input 0 or 1.\n") while(1){ scanf("%d",&a); if(a==0 || a==1)break; printf("please input 0 or 1!\n") } といったプログラムをかいた場合、while内を永遠さまようプログラムになってしまいました。 入力を%cにしてatoiを使う以外の手法で、入力を%dに固定するかもしくは文字が入力された場合にはエラ-をはくプログラムにしたいのですが、そのような変更は可能でしょうか? 初歩的な質問で申訳ありませんが、ご教授よろしくお願いします。

  • C++の繰り返し

    たびたび申し訳ありません.C++総和の質問です Microsoft Visual Basic 6.0の質問です. 以下の用に繰り返しの総和計算を書いたのですが,それぞれの総和が計算されず,例えば最もシンプルな総和sumも0となってしまう状態です.(他の総和も全て0になります) 何か間違いなどありますでしょうか? //hello2.cpp #define _COMPLEX_DEFINED #include <iostream> #include <string> #include "complex.h" #include "bessel.h" #include <math.h> #include <cmath> #include <stdio.h> #define RADIAN(ARC) ((ARC) * 3.14159 / 180) using namespace std; int main(void) { const double pi=3.141592654; const double I0=2829; const double r0=0; const double z=0; const double B1=6.07*pow(10,7); int k; double omega,freq,x; double R,Rk; double lambdag,ag; double lambda1,a1,l1; double lambda2,a2,l2; double p,p2,pg; double a11,a21,ag1,Rk1,l11,l21,p11,p21; double Km,Kn,Kg,am; complex r1,g,S2; complex sigma1,sigma2,sigmag; complex G,P,B,H; complex RR,NI,NI2,NI3,BE; double ANS,sumRIm,sumRRe,sumKm,sum; int x1; double r,r00,r001,r01; double imag(),real(); printf("接触熱抵抗"); scanf("%lf",&R); printf("加熱光半径(10^-6)×"); scanf("%lf",&Rk1); Rk=Rk1*pow(10,-6); printf("1層目熱伝導率"); scanf("%lf",&lambda1); printf("1層目温度伝導率(10^-6)×"); scanf("%lf",&a11); a1=a11*pow(10,-6); printf("1層目厚み(10^-6)×"); scanf("%lf",&l11); l1=l11*pow(10,-6); printf("2層目熱伝導率"); scanf("%lf",&lambda2); printf("2層目温度伝導率(10^-6)×"); scanf("%lf",&a21); a2=a21*pow(10,-6); printf("2層目厚み(10^-6)×"); scanf("%lf",&l21); l2=l21*pow(10,-6); printf("バッキング熱伝導率"); scanf("%lf",&lambdag); printf("バッキング温度伝導率(10^-6)×"); scanf("%lf",&ag1); ag=ag1*pow(10,-6); printf("1層目半径境界(10^-6)×"); scanf("%lf",&p11); p=p11*pow(10,-6); printf("2層目半径境界(10^-6)×"); scanf("%lf",&p21); p2=p21*pow(10,-6); printf("バッキング半径境界"); scanf("%lf",&pg); printf("am範囲"); scanf("%lf",&x1); x=2; freq=pow(10,x); omega=2*pi*freq; sum=0; sumRIm=0; sumRRe=0; sumKm=0; for (int i=1; i<=x1; i++) { sum+=i; am=(double)i; Km=am/p; Kn=am/p2; Kg=am/pg; sigma1=cpow(pow(Km,2)+complex(0,omega/a1),0.5); sigma2=cpow(pow(Kn,2)+complex(0,omega/a2),0.5); sigmag=cpow(pow(Kg,2)+complex(0,omega/ag),0.5); r1=B1/sigma1; g=(lambdag*sigmag)/(lambda1*sigma1); S2=(lambda2*sigma2)/(lambda1*sigma1); G = (1/(2*(S2+g)))*((S2-g)*(-1+R*lambda2*sigma2+S2)*cexp(-2*sigma2*l2)-(S2+g)*(1+R*lambda2*sigma2+S2)); P = (1/(2*(S2+g)))*((S2-g)*(1-R*lambda2*sigma2+S2)*cexp(-2*sigma2*l2)-(S2+g)*(-1-R*lambda2*sigma2+S2)); B = (1/(2*(S2+g)))*((S2-g)*((1-R*lambda2*sigma2)*r1+S2)*cexp(-2*sigma2*l2)-(S2+g)*(-1*(1+R*lambda2*sigma2)*r1+S2)); H = ((g+r1)*cexp(sigma1*l1)*G+(1-g)*cexp(-1*B1*l1)*B)/((1-g)*cexp(-1*sigma1*l1)*P+(1+g)*cexp(sigma1*l1)*G); r=0; r00=0; r001=1; r01=0.00005; BE=1; NI= exp(-1*(2*pow(r01,2)/pow(Rk,2)))*j0(Km*r)*r01; NI2=2*pi*r001*j0(Km*r00); NI3=cpow(j1(am),-2); RR= (B1*I0/(2*lambda1*(cpow(sigma1,2)-pow(B1,2))))*2*pow(p,-2)*cpow(BE,-2)*NI*(1/(1-g))*(-2*H+r1+1)*NI2*cexp(sigmag*z); sumKm+= Km; sumRIm+= RR.imag(); sumRRe+= RR.real(); } ANS=-atan((sumRIm/sumRRe)*(180/pi)); printf("%e\n",R*Rk); printf("%e\n",Rk); printf("%e\n",lambda1); printf("%e\n",B1); printf("%e\n",Km); printf("%e\n",sigmag); printf("%e\n",g); printf("%e\n",r1); printf("%e\n",j0(am)); printf("%e\n",G); printf("%e\n",P); printf("%e\n",B); printf("%e\n",H); printf("%e\n",NI3); printf("%e",RR.real()); printf("+"); printf("%e",RR.imag()); printf("i""\n"); printf("%e\n",sumKm); printf("%e\n",sumRRe); printf("%e\n",sum); printf("%e\n",ANS); scanf("%d",&k);// return 0; }

  • Fortran90に詳しい方、お願いします。

    「Fortran90を使って、以下↓の機能を持つプログラムを作成し、ソースと実行結果を示せ」という問題です。 「実数rを入力すると、そのrを半径とする円の面積、球の体積、球の表面積を表示する。」 まず、自分で以下のようなプログラム文をTeraPadで作成しました。 !-----課題1(2)----- REAL :: pi, r, S1, V, S2 pi = 3.141593 PRINT *, 'Hankei r' READ *, r S1 = pi * r**2 V = 4 * pi * r**3/3.0 S2 = 4 * pi * r**2 PRINT *, 'Ennomenseki =', S1 PRINT *, 'Kyuunotaiseki =', V PRINT *, 'Kyuunohyoumenseki =, S2 END 次にCygwin画面上で、gfortran -o Hankei r.exe Hankei r.f90と打ったら、 gfortran: Hankei r.f90: No such file or directoryという文字列が出てきました。拡張子はちゃんと、f90にしてるし、プログラム文も文法的に間違ってないはずなのに、どうしてうまくいかないのでしょうか?

専門家に質問してみよう