• 締切済み

コンパイルした時になぜ表示されないか

バネのつり合いから,オーバーシュートとその時の時間を求めるのですが,以下のようにプログラムを作り,オーバーシュートは出せましたが,一番下のprintf("t=\n%lf\n\n",(y1-y0)/(1+y1));の部分が画面に表示されません.わかる方ぜひ教えてください. #include<stdio.h> #define G 9.8 double m,K,H,A,N,t; double h=0.01; double f1(double y1,double y2){ return(y2); } double f2(double y1,double y2){ return(-K/m*y1+G-A*N/H/m*y2); } main(){ int i; double k[5][3]; double y0,y1,y2; y1=0; y2=0; printf("m,K,H,A,N="); scanf("%lf,%lf,%lf,%lf,%lf",&m,&K,&H,&A,&N); for(i=0;i<1000;i++){ k[1][1]=h*f1(y1,y2); k[1][2]=h*f2(y1,y2); k[2][1]=h*f1(y1+k[1][1]/2.0,y2+k[1][2]/2.0); k[2][2]=h*f2(y1+k[1][1]/2.0,y2+k[1][2]/2.0); k[3][1]=h*f1(y1+k[2][1]/2.0,y2+k[2][2]/2.0); k[3][2]=h*f2(y1+k[1][1]/2.0,y2+k[1][2]/2.0); k[4][1]=h*f1(y1+k[3][1],y2+k[3][2]); k[4][2]=h*f2(y1+k[3][1],y2+k[3][2]); if(k[1][1]+k[2][1]+k[3][1]+k[4][1]<0){ break; } y1=y1+k[1][1]/6.0+k[2][1]/3.0+k[3][1]/3.0+k[4][1]/6.0; y2=y2+k[1][2]/6.0+k[2][2]/3.0+k[3][2]/3.0+k[4][2]/6.0; } y0=m*G/K; printf("\n%lf\n\n",y1-y0); printf("t=\n%lf\n\n",(y1-y0)/(1+y1)); }

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

「古い規格」では %f しか認められていませんでしたが, 「今の規格」では %lf でも OK です>#3.

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

printf("t=\n%lf\n\n",(y1-y0)/(1+y1)); の前に、 printf("1+y1=%f\n",1+y1); を入れると、なんと表示されますか?

回答No.3

どのコンパイラを使っておられるか情報がないので、当てはまるかどうかわかりませんが、printfでdoubleを出力する場合は、本来の規格では%fしか受け付けません。コンパイラによっては、%lfでも正常に出力される場合があります。 というわけで、printfの%lfを%fにして見て下さい。 ※scanfは、%lfと%fは、元々の規格にありますので、問題ありません。

ayashun
質問者

お礼

丁寧に何度もありがとうございました.今手元にlinuxが使えるパソコンがないので,大学に行き次第やってみます.

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

> 入力データとして、何を与えたときですか? これにもお答えいただけますか? 当方では、入力データの値によって、 最後まできちんと出力する場合と プログラムが異常終了する場合とがあります。

ayashun
質問者

補足

ありがとうございます. 入力データとしては,(m,k,H,A,N)=(1,100,0.00001,0.025,0.5)を入力しました.ちなみに順番に重量,ばね定数,壁と物体の距離,壁に接している面積,動粘度です. 問題はオーバーシュートの値と,その時の時間tを求めるのですが,コンパイルしたとき,オーバーシュートの値は表示され,確認のために与えられた数値と一致したので,プログラム自体は正しいと思われます.ただ時間tが表示されません.『t=』すら表示されません.

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

入力データとして、何を与えたときですか? 今のコードではscanf()の書式文字列にカンマが入っていますので、 1,2,3,4,5 のように入力する必要があります。この点は守っていますね?

ayashun
質問者

補足

回答ありがとうございます. はい,入力のときカンマ入れています.なので, printf("\n%lf\n\n",y1-y0); の部分は出力されます.ただ, printf("t=\n%lf\n\n",(y1-y0)/(1+y1)); が出力されません.なにか追加するべきなのでしょうか?

関連するQ&A

  • コンパイルした時に表示されません

    バネのつり合いから,オーバーシュートとその時の時間を求めるのですが,以下のようにプログラムを作り,オーバーシュートprintf("\n%lf\n\n",y1-y0);は出せましたが,一番下のprintf("t=\n%lf\n\n",(y1-y0)/(1+y1));の部分が画面に表示されません.わかる方ぜひ教えてください. #include<stdio.h> #define G 9.8 double m,K,H,A,N,t; double h=0.01; double f1(double y1,double y2){ return(y2); } double f2(double y1,double y2){ return(-K/m*y1+G-A*N/H/m*y2); } main(){ int i; double k[5][3]; double y0,y1,y2; y1=0; y2=0; printf("m,K,H,A,N="); scanf("%lf,%lf,%lf,%lf,%lf",&m,&K,&H,&A,&N); for(i=0;i<1000;i++){ k[1][1]=h*f1(y1,y2); k[1][2]=h*f2(y1,y2); k[2][1]=h*f1(y1+k[1][1]/2.0,y2+k[1][2]/2.0); k[2][2]=h*f2(y1+k[1][1]/2.0,y2+k[1][2]/2.0); k[3][1]=h*f1(y1+k[2][1]/2.0,y2+k[2][2]/2.0); k[3][2]=h*f2(y1+k[1][1]/2.0,y2+k[1][2]/2.0); k[4][1]=h*f1(y1+k[3][1],y2+k[3][2]); k[4][2]=h*f2(y1+k[3][1],y2+k[3][2]); if(k[1][1]+k[2][1]+k[3][1]+k[4][1]<0){ break; } y1=y1+k[1][1]/6.0+k[2][1]/3.0+k[3][1]/3.0+k[4][1]/6.0; y2=y2+k[1][2]/6.0+k[2][2]/3.0+k[3][2]/3.0+k[4][2]/6.0; } y0=m*G/K; printf("\n%lf\n\n",y1-y0); printf("t=\n%lf\n\n",(y1-y0)/(1+y1)); }

  • ルンゲクッタ法(RK4)で斜方投射の問題を解く

    下のように自由落下する物体の速度の変化を求めるプログラムをC言語で作成しました。これを応用して斜方投射された物体のx、y座標の「位置」の変化を求めるプログラムをルンゲクッタ法(RK4)で作成したいです。x,yについて2つの式を立てないといけないと思うのですがどのような式を立ててプログラムを組めかよいかよく分かりません。どなたか式とできればプログラムを教えて下さい。 k:空気抵抗、m:物体の質量 g:重力加速度としています。 #include <stdio.h> double yd(double t,double y){ double k=0.1; double m=0.1; double g=9.8; double r=g-((k*y)/m); return r; } double runge(double t,double y,double h){ double k1,k2,k3,k4,r; double h2=h/2.0; k1=yd(t,y); k2=yd(t+h2,y+(h2*k1)); k3=yd(t+h2,y+(h2*k2)); k4=yd(t+h,y+(h*k3)); r=y+(h/6.0)*((k1+(2.0*k2)+(2.0*k3)+k4)); return r; } void main(){ double y=0.0; double h=0.001; double t=0.0; int i; for(i=0;i<100;i++){ t+=h; y=runge(t,y,h); printf("%f %f\n",t,y); } }

  • 微分方程式(ルンゲ=クッタ)がうまくいきません

    C言語で物体の自由落下運動(空気抵抗を考慮する)を微分方程式を用いて解かなければならないのですが、どうしてもグラフの形が曲線になりません。どこが間違っているのか指摘お願いします。 空気抵抗を考慮しているので、落下速度はどんどんある一定の値に近づいていくはずなのですが、グラフは直線になってしまいます。いろいろと方法を試しましたがどれも外れました。 写真は赤が今の状態(間違っています)、黒が理想形です。 ここではルンゲ=クッタ法を使用しています。 #include <stdio.h> #include <math.h> double yd(double t,double y){ double m = 50.0; 質量 double g = 9.8; 重力加速度 double k = 0.01; 空気抵抗の定数係数 double a= g - ((k *y)/m); 運動方程式 return(a); } double runge(double t,double y,double h){ double k1,k2,k3,k4,r; double h2 = h / 2.0; k1 = yd(t,y); k2 = yd(t+h2,y+(h2*k1)); k3 = yd(t+h2,y+(h2*k2)); k4 = yd(t+h,y+(h*k3)); a = y + (h/6.0) * ((k1 + (2.0 * k2) + (2.0 * k3) + k4)); return(a); } void main(){ double y = 0.0; double h = 0.001; double t = 0.0; int i; for(i = 0; i < 1000; i++){ t += h; y = runge(t,y,h); printf("%f %f\n",t,y); } }

  • ルンゲクッタのプロクラム実行できません

    プログラムの実行ができません。 どこを直したらよいのか教えて下さい。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <math.h> double *dvector(long i,long j); void free_dvector(double *a,long i); double func(double x,double y); double *rk4(double y0,double a,double b, int n,double(*f)()); int main(void) { double *y,h,a=0.0, b=1.0, y0=1.0; int i,n; printf("分割数を入力して下さい------->"); scanf("%d",&n); y=dvector(0,n); y=rk4(y0,a,b,n,func); h=(b-a)/n; for(i=0;i<=n;i++) { printf("x=%f \t y=%f \n",a+i*h,y[i]); } return 0; } double *rk4(double y0,double a, double b,int n,double (*f)()) { double k1,k2,k3,k4,h,*y,x; int i; y=dvector(0,n); h=(b-a)/n; y[0]=y0; x=a; for(i=0;i<n;i++) { k1=f(x,y[i]); k2=f(x+h/2.0,y[i]+h*k1/2.0); k3=f(x+h/2.0,y[i]+h*k2/2.0); k4=f(x+h,y[i]+h*k3); y[i+1]=y[i]+h/6.0*(k1+2.0*k2+2.0*k3+k4); x +=h; } return y; free_dvector(y,0); }

  • 大学のC言語の課題で

    ルンゲクッタ法を用いたバネの単振動を解析する課題をやっています。以下の部分まで作ったのですが、 どうしても最後のほうがわかりません。 関数fとf2のreturn やメイン関数を変更すればいいとおもうのですが、どうやっても満足な結果が得られません。どなたか詳しい方教えてもらえない? #include<stdio.h> #include<math.h> double f(double t,double y1) { return y1; } double f2(double t2,double y2) { double w=5.0,k=0.5; return -w*w*f(t2,y2)-2.0*k*y2; } int main(void) { int count,bunkatu,npr; double t_0,T; double k1,k2,k3,k4; double y,t,dt,dt_2,dt_6; t_0 = 0.0; T=10.0; bunkatu=2000; npr=1000; y=1.0; printf("\n# [t_0,T]=[%6.4lf,%6.4lf] N=%d\n",t_0,T,bunkatu); t=t_0; dt=(T-t_0)/(double)bunkatu; dt_2=dt/2.0; dt_6=dt/6.0; for(count=0;count <=bunkatu;count++) { if(count %(bunkatu/npr)==0) printf("\n %5.2lf %10.5f",t,y); k1=f2(t,y); k2=f(t+dt_2,y+k1*dt_2); k3=f(t+dt_2,y+k2*dt_2); k4=f(t+dt,y+k3*dt); y+=(k1+2.0*k2+2.0*k3+k4)*dt_6; t+=dt; } printf("\n"); 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; }

  • シンプソン則について

    大学の課題で ∫0~5 e^(-3t) * cos^2 *(2t) をシンプソン則を用いて求めるプログラムを作成せよ。積分の刻みは0.01毎  という課題がでました。 私は授業で作ったプログラムを元に、以下のプログラムを作ったのですが、答えが大きすぎて(5より大きいと間違いと言っていました)受け取ってもらえません。どこがいけないのでしょうか? あと、nには どのような数字をいれればよいのでしょうか?nは使わないのでしょうか。 お願いします。 #include "stdio.h" #include "math.h" void main() { int n; double i, a, b, h, S, S1, S2, S3; double f (double); a = 0.; b = 5.; printf ("N="); scanf ("%d", &n); h = (b - a) / (double)n; S1 = 0.; S2 = 0.; S3 = f (a) + f (b); /* 両端の値*/ /* 奇数番目の値*/ for (i = 0.01; i < 5; i = i + 0.02) { S1 = S1 + 4. * (f (a + (double)i * h)); } /* 偶数番目の値*/ for (i = 0.0; i < 5; i = i + 0.02) { S2 = S2 + 2. * (f (a + (double)i * h)); } S = (h / 3.) * (S1 + S2 + S3); printf ("%d %lf\n", n, S); } double f (double t) { double y; y = (exp(-3. * t) / 2.) + ((exp(-3.* t) * cos(4. * t)) / 2.); 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); }

  • 数値解析法

    このHeun法のプログラムをRunge-Kutta法にするにはどうしたらいいですか? #include <stdio.h> #include <math.h> double f1(double y) { return y; } double f2(double y) { return -4*y; } int main(){ double a=0; double b; int m=10; int n; double h; double x,y; int k; double e; double f; double k1,k2; printf("Heun法計算例:y=e^x, y=1/e^4x\n\n"); // y = e^x b = 1; for(n=100;n<=10000;n*=100){ h = (b-a)/n; printf("y' = y: h(=dx) = %.1e (y=e^x)\n",h); x = a; y = 1; for(k=0;k<=n;k++) { x = k*h; if(k%(n/m)==0) { f = exp(x); e = fabs(y-f); printf("x=%.2f, y=%f, e^x=%f er=%.0e\n",x,y,f,e); } // Heun's method k1 = h*f1(y); k2 = h*f1(y+k1); y += (k1+k2)/2; } }

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

    以下のようにγ関数のプログラムを組みました。 とりあえず整数値を入力すれば、正しい値は返しているということが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); }

専門家に質問してみよう