以前質問したプログラムについて、新たに質問です。
メインプログラムと、関数プログラムを組みました。
関数の中では、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);
}

このQ&Aに関連する最新のQ&A

A 回答 (4件)

質問で提示のプログラムをいくつかの環境で(*)動かして見ましたが、いずれも


4の printf() で出力した値と、main() の printf() は、同じ値が出ます。

使っているコンパイラとOSは何ですか?

  (*) unix の cc
    Windows の VC++4.2
    Windows の gcc 2.95.2
    • good
    • 0
この回答へのお礼

前回のアドバイスの通りちゃんとやってみたら、ちゃんとできてました。
次点にしてしまって申し訳ありませんでした…m(__)m
ちなみに、結局間違っていたのは配列の添え字の使い方でですか?
あと、変数の%lfと%fの問題ですか?
なんだか腑に落ちないんですけどね…次にまた同じところで引っかかってしまうのではないかと心配です。
でも、とにかくたくさんお世話になりました!!
ありがとうございます。

お礼日時:2002/03/30 16:04

読み直してみたら、大ボケな事を書いてしまった事に気づきました。


printf の %lf で正しく表示されているのですね。
失礼しました。
    • good
    • 0

motsuan さんの仰っている通りだと思います。


非常にまぎらわしいのですが、
scanf の %f は float を意味しますが、printf の %f は double を意味します。
printf の %lf が double でないコンパイラもあるので、printf 側は %f を使用するべきだと思います。
    • good
    • 0

printf("4 %lf\n",y);


printf("x= %f y= %f\n",x,y);
の%lfと%fの違い、
あるいは %lf でyの値が壊れているのではないでしょうか?
ちなみに私のVC++6.0でも正常に動作しているようです。
printf("4 %lf\n",y);
return y;

printf("4 %lf\n",y);
printf("4 again %f\n",y);
return y;
とやってみるとわかるのではないでしょうか?
ちなみに%lfって標準のfの標準のプレフィクスではないのではないでしょうか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

Qprintf("%2.d",0);は?

printf("%2.d",0);
を表示すると何も表示されません・・。
どうしたらいいのでしょうか?

Aベストアンサー

「%2.d」は「%2.0d」と同じです。

つまり「2文字の幅で、少なくとも0ケタの数字を書け」です。

この「少なくとも0ケタの数字を書け」は、言い替えれば「先頭にあるゼロは、全体が0ケタになるまで削ってよし」と言う意味です。

結果「_0」('_'は半角スペースの意味)の先頭のゼロを0ケタになるまで削るので「__」になります。

ゼロの時に「_0」と表示したいなら「%2d」と指定しましょう。

Qtry{}catch(){}とデストラクタの関係を教えてください。

try-catchでメモリ確保を含むクラスをスローした場合、デストラクタはどの時点で働くのか、教えてください。たとえば、↓の使いかたは大丈夫でしょうか?

【1】
try{
 throw(CError(100, "エラー情報"));
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
}

【2】
try{
 CError err(100, "エラー情報");
 throw(err); // (1)
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
 //まだデストラクタはちゃんと動作するのでしょうか?
 //catchが呼び出し元のメンバであったりしても大丈夫なのでしょうか?
}

宜しくお願いします。

Aベストアンサー

【1】【2】どちらの場合も問題がありません。
コンパイラが必要に応じてerrオブジェクトのコピーを作成します。
デストラクタが呼び出されるタイミングはコンパイラに依存するところもあると思いますが、
例えばVC7.1では【2】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) CErrorクラスのテンポラリオブジェクト(以下a)のコピーコンストラクタが呼び出される。
(3) errオブジェクトのデストラクタが呼び出される
(4) catch文まで到達
(5) aオブジェクトのデストラクタが呼び出される。

VC7.1では、【1】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) catch文まで到達
(3) errオブジェクトのデストラクタが呼び出される。

コンパイラがオブジェクトのコピーを省略しているようです。

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

Qprintf("%x", str)

#include <iostream.h>
main(){
char a[] = "02";
char b[] = "20";
printf("%#x %#x", a, b);
}

結果 → 0x64fe01 0x64fdfe

もし結果が 0x30,0x32 0x32,0x30
という感じなら分かるのに
02 がどうして 64fe01 なんですか?

Aベストアンサー

>02 がどうして 64fe01 なんですか?

恐らく、変数a,bのアドレスが表示されていると思います。
%xは与えられた変数の値を16進表示するのでaと書いてprintf渡すと、変数aは配列ですので、aと書けばそのポインタの値(=メモリアドレス)がprintfに渡されることになります。
中身を表示したいのであれば、

printf("%#x %#x", *a, *b);

と書けばうまくいくはずです。


人気Q&Aランキング

おすすめ情報