こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

翔泳社のC言語の環境について

#include<stdio.h>
int main (void){
float ins,syo,tok,zei,nin;
syo=1.05;
tok=0.03;

printf("飲食費は?-->");
scanf("%f" , &ins);

printf("人数は?-->");
scanf("%f" , &nin);

if(ins>7500)
{
zei=ins*(syo+tok)*nin;
printf("税込み%f円" , zei);
}
if(ins<=7500)
{
zei=ins*syo*nin;
printf("税込み%f円" , zei);
}

return 0;
}

上記のようなプログラムを作成し、コンパイルしようとしても「コマンドの構文が誤っています」というわけのわからんメッセージしか出ずうまく実行しません。ちなみに書籍名は「はじめてのCプログラミング」でコンパイラは本書付属のCD-ROM収録LSI-C(試食版)です。このままだと課題はできないので死活問題です。早めの回答をお願いします。

投稿日時 - 2005-06-21 02:21:53

QNo.1462658

すぐに回答ほしいです

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

>本当は自分で計算すると3780円なのに3779.…となってしまい、うまく計算結果が出ません。どうしたらいいのでしょうか?
これは、多分、10進数の小数を2進数で正確に表現できない場合がある(例えば10進数で0.1は、2進数では無限小数になる)ということででてくる計算誤差だと思います。
さしあたりは、
floatをdoubleに変えて
scanf("%lf" , &ins);
とかにすると
有効桁数が増えるので、計算の精度が増します。
そして、こういう計算(表現)誤差がコンピュータではあるということを念頭に置いて、小数部分を四捨五入とかするとか、(それでその場合に良いかは考える必要があります)
もっと、重要な場合には10進演算(10進のまま表現して計算する)をするライブラリを作ってそれで計算するとか、
必要に応じて考えてプログラムを作る必要があります。
料金の計算をするこの場合で言えば、1円未満の値というのは、結局要らないのだし、実際の1円未満の計算の端数に比べて表現による誤差は充分小さいので、単に四捨五入すればいいような気がします。

投稿日時 - 2005-06-24 03:08:13

お礼

ありがとうございました。
おかげで何とかなりそうです。

投稿日時 - 2005-06-25 01:07:48

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.5

>ifと入れて実行しようとすると
バッチコマンドのIFと解釈されるからでしょうね。
プログラムの名前を変えるか
if.exeとして実行すればいいと思います。

投稿日時 - 2005-06-22 14:48:28

お礼

3回にわたってありがとうございます。
質問なんですが、このプログラムだと税率がうまく出ずに自分で計算した結果とプログラムで計算した結果とかなり違ってきます。
例えば、本当は自分で計算すると3780円なのに3779.…となってしまい、うまく計算結果が出ません。どうしたらいいのでしょうか?

投稿日時 - 2005-06-24 00:48:14

その本は持っていませんがLSI-C試供版は以前ダウンロードしたのがありますので、
やってみましたら確かにコンパイルとリンクが問題無く完了しますが実行すると仰るようなメッセージが出ますね。

どうもプログラムの名前がまずいようです。
試しに実行ファイル名を iif.exe に変えたら問題無く実行できました。実行ファイル名だけ変更するなんて普通はしませんけど時間を惜しんだだけです。(^_^;

OSのコマンド名やバッチ処理のコマンド名とかち合うのもまずいのかもしれません。
ソースファイル名を他のユニークな名前に変えてコンパイル&リンクをやり直して下さい。
演習なら例えば ex01.c みたいな。

私も昔DOSの時代にLSI-Cを使った事があります。りっぱな商品として売られていた物の試供版としてメモリがsmallモデルに限定されているだけで当時の他のメーカーのコンパイラと比べて、出来たプログラムの実行速度が速い場合があり(関数に引き渡すパラメータが少なければレジスタで渡すだけですむので)、とてもまともな物です。

投稿日時 - 2005-06-22 08:01:34

お礼

ありがとうございます。
名前を変えたらコンパイルができました。

投稿日時 - 2005-06-24 00:44:39

ANo.3

>おしえていただいた方法でやってみたんですが相も変わらず「コマンドの構文が誤っています。」としか出てくれません。正直、八方塞です(死)
再起動とか(ログアウト)はやってみましたか?
「コマンドの構文が誤っています。」
というメッセージがでるという状況がよくわかりません。
よろしければ、状況を細かく補足して下さい。

>どこかでC言語のコンパイラを無料でダウンロードできる所がありましたら教えていただきたいのですが。
ボーランドのbccがよろしいかと思いますが、
コンパイラのせいではないと思われます。

>LSI-Cでは所詮しょぼいからscanfなどは読み取れないとかはないと思いますが。
質問文のプログラムは、lccで問題なくコンパイル&実行できます。

投稿日時 - 2005-06-22 01:09:47

お礼

ありがとうございます。

状況:
まずlsiをしnotepad if.c(すでに制作済)を確認し、lcc if.cでコンパイルし(一応コンパイルはできるみたいです)そしてdirで確認し、ifと入れて実行しようとすると「コマンドの構文が誤っています」と馬鹿の一つ覚えのごとく出てきます。一応一度ログオフしました。

おそらく最悪ボーランドのbccに変えようと思います。僕には時間がないので。これでできればもうけものですが。

投稿日時 - 2005-06-22 07:53:25

ANo.2

>lcc if,c
「,」ではなく「.」を使って下さい。

>パスと_lccの設定をどうにかする方法を教えていただきたいです。
http://okweb.jp/kotaeru.php3?qid=1129790

をみて下さい。

参考URL:http://okweb.jp/kotaeru.php3?qid=1129790

投稿日時 - 2005-06-21 12:38:52

補足

授業ではUNIX(emacs)を使ってこのようなプログラムを書いています。

投稿日時 - 2005-06-21 22:55:48

お礼

ありがとうございます。

おしえていただいた方法でやってみたんですが相も変わらず「コマンドの構文が誤っています。」としか出てくれません。正直、八方塞です(死)

どこかでC言語のコンパイラを無料でダウンロードできる所がありましたら教えていただきたいのですが。

LSI-Cでは所詮しょぼいからscanfなどは読み取れないとかはないと思いますが。

途中愚痴っぽくなってすみません。

投稿日時 - 2005-06-21 22:55:23

ANo.1

LSI-Cの場合
コンパイルするコマンドは
lcc
です。
例えば、このプログラムが、
zei.c
だとすると

lcc zei.c

です。
コマンドが見つからないとかなんとか怒られたら、
パスとか
_lcc の設定が間違っていると思われます。

投稿日時 - 2005-06-21 03:13:53

お礼

ありがとうございます。
lcc if,c
としてコンパイルしようとして最後の最後でミスります。
このあたりは本を見ながらやったので大丈夫なはずです。あとパスと_lccの設定をどうにかする方法を教えていただきたいです。

投稿日時 - 2005-06-21 08:09:38