ながいです。 > こんにちは。e2 の中村です。news にアップしたかったんですが、 > >>Article rejected: 400 No space (spool) [innwatch:32] 6248 lt 8000 > >とでて、アップできなかったので、直接メールを書きます。 ニュースの件はセンターに対応を依頼しました。 質問の件ですが入出力は結構複雑であり、言語に大きく依存するので、説明は あと回しになっていますが、結論からいえば、このままで ok です。 以下に説明をします。 > 第7回3.2 の演習中の quad7a.c ですが、 > >1. > >13: fprintf(stderr,"Input a b c \n"); >14: scanf("%lf%lf%lf", &a, &b, &c ); > >は、 > >13: fprintf(stderr,"Input a b c \n"); >14: scanf("%lf,%lf,%lf", &a, &b, &c ); > ~ ~ >ではないでしょうか。こうしないとa,b,c, のいずれも取得できず、 >d を求めることさえ出来ないようです。 元の scanf("%lf%lf%lf",...) で期待している入力は、 数値 空白 数値 空白 数値 改行 です。空白のところに、それ以外の文字(たとえばカンマ「, 」)があると b,c には、値が代入されず、初期値とないります。初期値はこの場合不定 です。 入力促進メッセージでは a b c とそれを暗示したつもりだったのですが、 説明不足であったかもしれませんね。 あなたの指摘の様に、 scanf("%lf,%lf,%lf", &a, &b, &c ); の場合は 数値 , 数値 , 数値 改行 で入力可能ですが、逆に 「,」 がないと上と同様の結果になります。 unix では、空白を区切りとする場合が多いので、その点を念頭において考え て下さい。 scanf 関数では、戻り値によりいくつまで代入に成功したかを返す様に なっているので、チェックすることも可能ですが、若干複雑になり、 本題から外れることも考慮し、チェックする部分は、入れませんでした。 チェックするとすれば、たとえばつぎの様になります。 int n; ... n=scanf(....);/* 訂正あり:まえは、sscanf だった。 補足:sscanf は文字列から「入力」する関数です */ if( n!=3 ){ fprintf(stderr,"illegal input\n"); exit(1); } >2. > >23行目以降ですが、 > > printf("%27.20e ( %e )\n", x , a*x*x + b*x + c ); > >という行が4行ありますが、いずれも27.20 はいらないのではない >でしょうか。これがあるために、正しく表示できていないようです。 書式中の %27.20e は「精度 20桁、印字桁 27桁 の指数表示」という意味です。 %e は精度と印字桁を省略した形で、予め決められた精度と表示桁で 表示します。省略形の精度では、誤差に関する違いがあまり 明確にならないので精度を指定して表示する様にしました。 以上の点に注意して、再度、試みて下さい。