タイムマシーンがあったら、過去と未来どちらに行く?

はじめまして。大学で週一でC言語を習っている全くの初心者です。
過去ログを確認したのですがなかったようなので質問させていただきます。
タイトルの通りなのですが「入力される実数が負の数の場合」に四捨五入するプログラムを作れ!とのことなんですが・・・。
正の数の四捨五入のプログラムは作りましたが、逆がわかりません。
-------------------------------------------------------------
//入力された正の実数を四捨五入して整数にするプログラム
#include <stdio.h>

int main(void)
{
int seisu;
double jissu;

printf("実数=");
scanf("%lf" ,&jissu);

seisu =jissu + 0.5;

printf(" %lf の四捨五入は %d です。\n",jissu,seisu );
}
------------------------------------------------------------
ちょこっと変えればいいのかなぁ・・・とは思うのですが・・・。
ご教授お願いします。
ちなみにOSはXP、使っているコンパイラはbcc32というやつです。

A 回答 (7件)

小学生で教わる形式なら、


seisu =jissu + 0.5;
でOKです。数直線上で考えれば負数だったとしても四捨五入はいつもこうなります。そのままのプログラムで問題ありません。
(-1.3なら-1に、-2.5なら-2に、-0.5なら0に丸めます。真ん中の場合は必ず大きいほうに丸められます。)

ただし、JISやISOなんかでは、定義が変わります。
ちなみに、JISやISOの定義だと
(1) 一番近い丸め結果候補が1つだけなら,その数に丸める,
(2) 一番近い丸め結果候補が2つある場合は,末尾が偶数のものに丸める,
(3) 丸め処理は1段階で行なわなければならない.
(引用: http://www.okada.jp.org/RWiki/index.php?JIS%2CIS … )
となっています。

また、特殊な例としては、負数の場合は小さいほうに丸めるという方法をとる場合もあります。
if(jissu < 0){/*負数の場合*/
  seisu =jissu - 0.5;
}else{/*正数の場合*/
  seisu =jissu + 0.5;
}
これがその丸め方になると思います。(これは四捨五入と呼べるか怪しいので、参考にしないほうが良いと思います)

極めて細かいところまで精度を求めるようなものでない限り、小学生方式の四捨五入で問題ないと思います。

>決まった教場でしかプログラムが実行できないために確かめようがない
bcc32はBorlandからフリーでダウンロードできるコンパイラです。あなたでも環境を整えることはできると思われますので、やろうと思えば確かめることはできるはずですよ。↓
http://www.borland.com/jp/products/cbuilder/free …
ぜひ試してみると良いと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
昨日提出だったのですが結局
seisu =jissu - 0.5;
にしてしまいました。
seisu =jissu + 0.5;の場合に-1.1の四捨五入が0になってしまうというものの解決方法がわからなかったので・・・。
実はBorlandのコンパイラは入れてみたのですが簡単には動いてくれなかったので大学でなんとかやってみました。
if文を使って作ってくださったものは今後他の方の参考になると思います。
コンパイラの紹介等含め、親切な回答をありがとうございます!

お礼日時:2006/09/22 00:15

#6で紹介されている方法は、通常「JIS丸め」と呼ばれるもので、標準Cライブラリの多くの実装では、四捨五入を必要としている箇所では、この方式を用いている場合が多いと思います。



以下は、JIS丸めを実現するためのコードです。ほとんど反則に近いですが、一応参考までに書いておきます。

sprintf(buf, "%.0f", jissu);
sscanf(buf, "%d", &seisuu);
    • good
    • 0
この回答へのお礼

今後四捨五入で悩む方がいらっしゃったら非常に参考になる回答だと思います。ちょっと自分ではまだ理解できなくて残念なんですが・・・。
親切に回答ありがとうございます。

お礼日時:2006/09/22 00:17

「負の数の四捨五入」の定義を出題者に確認してください。


あとはそれに従って

seisu =jissu + 0.5;

の部分を変えるだけです。
単純に考えると、正負によってifで分岐させる必要があるかもしれません。
    • good
    • 0
この回答へのお礼

「負の数の四捨五入」の定義ですが、問題を出された時点で濁されたのでそこは自分で考えろ、ということだと思うのですが・・・。
あくまで負の数を入力した場合だけですので分岐等は必要ないのですが、実際にはそういったやり方が四捨五入のプログラムとしては正しいですよね。
親切な回答ありがとうございます。

お礼日時:2006/09/22 00:08

負数の四捨五入については2通りの考えがあるので


-1.5の四捨五入を-1とするか-2とするかで違ってきます
五入を繰り上がりと定義すると-1 > -1.5 > -2ですので繰り上がりは-1になります。
2通りのプログラムを作っておいたほうがいいかもしれませんね
    • good
    • 0
この回答へのお礼

やはり負の数になると2通り考えていいのでしょうか?
昨日提出だったのですが結局迷ったあげく
-1.5 → -2.0
のほうにしてしまいました・・・。
親切な回答ありがとうございます。

お礼日時:2006/09/22 00:05

fabs は、絶対値を求める関数です。


私の言ってる方法だと、例えばこんな感じかな。
特にやり方にはこだわらずに色々やってみればいいかと思います。
----------------------------------------------------------------
#include <stdio.h>
#include <math.h>

int round_aux(double num){
//正の実数を四捨五入する
return (int)(num + 0.5);
}

int main(void){
int seisu;
double jissu;

printf("実数=");
scanf("%lf" ,&jissu);
//正の実数の四捨五入したものに符号を付ける
seisu = round_aux(fabs(jissu))*(jissu<0 ? -1 : 1);

printf(" %lf の四捨五入は %d です。\n",jissu,seisu );
return 0;
}
    • good
    • 0
この回答へのお礼

わわ!わざわざ新たに作っていただいてありがとうございます!
しかし講義で習っていないような命令も出てきているので、せっかく書いていただいたのに活かせなくて残念です。
最初の質問にも書いたとおり、初歩の初歩ですので少しの変更でできるとは思っているのですが・・・もう少し考えてみます。ありがとうございました。

お礼日時:2006/09/21 11:05

正の実数を四捨五入できるのだから


fabs で正数化したものを四捨五入して符号をつければいいのでは?

この回答への補足

回答ありがとうございます。
自分も単純に-をつければいいのかなとも思ったのですが、入力する時点で負の数を入力するのでいらないのかなと・・・。
それと僕のC言語の理解度は今回のプログラム程度なので fabs の使い方がわかりません。もしその方法で簡単に解決するのであれば、理解が足りず申し訳ありません。

補足日時:2006/09/21 03:57
    • good
    • 0

例えば正の数のとき、以下のようになるはずですね。


--
1.0→1
1.4→1
1.5→2
1.9→2
2.0→2
--
では負の数のときはどうなるべきでしょうか。
それを、正の数のときと比べてみれば、やるべきことが見えてくるはずです。
#ヒント:四捨五入と切り捨て、或いは整数化の違いに注意

この回答への補足

回答ありがとうございます。
正の数のときは確かにそうなりました。
負の数 -1.5の場合は-2.0でしょうか?
となると
seisu =jissu + 0.5; を
   ↓
seisu =jissu - 0.5;
にすればいいのかな・・・。
実は大学の決まった教場でしかプログラムが実行できないために確かめようがないのです。
整数化の違いに注意ということはまだ変える部分があるのでしょうか?
よろしければお付き合いお願いいたします。

補足日時:2006/09/21 03:56
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報