2011-10-19 5 views
0

なぜ私の部門の結果は切り捨てられているように見えますか?なぜ私の部門の結果はオフに見えますか?

#include <iostream> 
#include <stdio.h> 
using namespace std; 

int rVote, oVote, dVote; 
int rTotal, oTotal, dTotal, total; 
int rPercent, dPercent, oPercent; 

bool loop(char vote){ 
     switch(toupper(vote)){ 
       case 'D': 
        dVote = 1; 
        dTotal = dTotal + dVote; 
        return true; 
       case 'R': 
        rVote = 1; 
        rTotal = rTotal + rVote; 
        return true; 
       case 'O': 
        oVote = 1; 
        oTotal = oTotal + oVote; 
        return true; 
       case 'Q': 
        return false; 
     } 
     return true; 
} 
int main(){ 
     char vote; 
     do{ 
       printf("Enter Vote [D/R/O] or Q to quit: "); 
       scanf("%c%*c", &vote); 
     } while (loop(vote)); 
     total = dTotal + rTotal + oTotal; 
     rPercent = ((rTotal/total)*100); 
     dPercent = ((dTotal/total)*100); 
     oPercent = ((oTotal/total)*100); 
     printf("Democrate total vote %d: %d%%\n", dTotal, dPercent); 

     printf("Republican total vote %d: %d%%\n", rTotal, rPercent); 

     printf("Other total vote %d: %d%%\n", oTotal, oPercent); 
} 

グレート私は本当にばかなことしています.... なぜそれが私の*Percent年代のいずれかがこのC/C++プログラムでの%値を印刷しないということですか?

ありがとうございました。

+2

これがあるためにこれを行いますC/C++プログラムではありません。それはC言語ではコンパイルされないので、C++プログラムだけです。しかし、それはCプログラムのように書かれています。あなたは2人のうちの1人を選び、それを学びなさい。外観にもかかわらず、彼らは非常に異なる言語です。あなたがC++を使うことを決めたら、[良い入門C++の本](http://stackoverflow.com/q/388242/46642)をお勧めします。 –

+0

私はCのプログラマーになりたい、最初に取り上げられたCの一種ですが、C++プログラミングクラスのatmであります。先生は心配していないようです。だから主になぜ私はすべてのコードをcの形式で書くのですか? –

答えて

4

これは、整数除算を行うためです。 C/C++の整数除算は切り捨てられます。だからあなたの次のコード:

rPercent = ((rTotal/total)*100); 
    dPercent = ((dTotal/total)*100); 
    oPercent = ((oTotal/total)*100); 

は、すべてあなたが浮動小数点型にキャストする必要があり、これを修正するには0

に切り捨てされます。

rPercent = (int)((double)rTotal/total*100); 
    dPercent = (int)((double)dTotal/total*100); 
    oPercent = (int)((double)oTotal/total*100); 

EDIT:

上記のコードは、丸めの振る舞いのためにいくつかの奇妙な結果をもたらす可能性があります。それは、最寄り%に丸めので、おそらくこのようなものは、より適切な場合があります:あなたが最初にそれらをゼロにしているので

rPercent = (int)((double)rTotal/total*100 + 0.5); 
    dPercent = (int)((double)dTotal/total*100 + 0.5); 
    oPercent = (int)((double)oTotal/total*100 + 0.5); 
+0

興味深い。ありがとうございました。私はあなたがこのように書くことができるのか分からなかった。私は10分待ってからこれを答えさせるでしょう。私はこの質問をしてうれしかった、私はこの修正が好きで、どのように私は少し前にそれをしたことを覚えている。 –

+0

ダブルに変換するのは残念ですが...最初に100を掛けるだけで、前後にキャストする必要はありません –

+0

ここで浮動小数点演算を使用することは厳密には必要ではありません。値の最初の値ではなく、計算の終わりの値(除算)。 –

1

:)

%の各

dPercent = ((dTotal*100)/total); 
関連する問題