在计算百分比时有垃圾数量

时间:2016-02-12 01:47:14

标签: c++

所以,我讨厌问,但是,我遇到了一些问题,我是C ++的新手,我刚刚开始。一切都在大部分时间完成。期待一件小事。 第35-36行应该计算平均值(由于某种原因,我无法使其工作。) 第41-47行应打印出头/尾的精确到达一位小数的百分比,然后打印出正确的*数来表示百分比。  但是,当我运行它时,我的头/尾数被搞砸了。以及我的百分比数字。我只是想朝着正确的方向努力。

#include <cstdlib>
#include <iostream>
#include <ctime>
#include <iomanip>
using std::cout; using std::cin; using std::endl;
using std::fixed; using std::setprecision;

int main()
{
srand(time(0));
int userInput,
    toss,
    headsCount,
    tailsCount;
double headsPercent = 0,
       tailsPercent = 0;

cout << "How many times do you want to toss the coin? ";
cin >> userInput;
while(userInput < 0)
{
    cout << "Please enter a positive number: ";
    cin >> userInput;
}

for(int i = 1; i < userInput; i++)
{
    toss = rand() % 2;
    if(toss == 0)
        headsCount++;
    else
        tailsCount++;
}

headsPercent = userInput / headsCount * 100;
tailsPercent = userInput / tailsCount;

cout << "Heads: " << headsCount << endl
     << "Tails: " << tailsCount << endl << endl;

cout << "Heads Percentage: " << fixed << setprecision(1) <<  headsPercent << " ";
for(int b = 0; b < headsPercent; b++)
    cout << "*";

cout << "\nTails Percentage: " << tailsPercent << " ";
for(int b = 0; b < tailsPercent; b++)
    cout << "*"; 
return 0;
}

4 个答案:

答案 0 :(得分:2)

除了这里的未初始化变量,其他人已经指出,计算都是错误的。

取出纸和笔,然后用老式的方式运行一些自己的计算。

让我们说有五个投掷,三个头,两个尾巴。这意味着(在修复未初始化的变量之后):

userInput=5
headsCount=3
tailsCount=2

现在,您可以按照以下方式计算所谓的百分比:

headsPercent = userInput / headsCount * 100;
tailsPercent = userInput / tailsCount;

所以,使用你自己的数字,你会得到:

headsPercent = 5 / 3 * 100
tailsPercent = 5 / 2;

这看起来对你好吗?当然不是。你可以自己做算术。将5除以3并乘以100.这是整数除法,因此五除以三是1,乘以100是100.五除以二是二。所以你在这里得到100%和2%。

当然,那是错的。五分之二和三分别是40%和60%。

编写程序意味着:

A)弄清楚如何进行计算

B)编写代码进行计算。

您还在步骤A.您需要弄清楚如何进行这些计算,以便他们首先纠正。

这与C ++没有任何关系。如果您使用任何其他语言,并以此方式编码,您将得到相同的错误答案。

唯一可能与C ++有关的是整数除法,在C ++中不会产生小数量。它是整数除法。但那不是你唯一的问题。

答案 1 :(得分:1)

首先,你必须纠正你的数学基础知识。

  1. 计算%age意味着 例 (获得的商标)/(总商标)* 100 不(总分/标记obt)* 100

  2. 未定义任何0除以0。因此,如果你的当前代码随机分配toss或head = 0,那么显然你会有错误。

  3. 其次谈论代码,U应该从0初始化i,或者你应该使用

    for (i=1; i<=userInput; i++)
    

    否则head + toss值将为userInput-1。

    还记得初始化像

    这样的变量
    Int headsCount=0; 
    

    等。如果未初始化为固定的no,变量将采用任意随机值。 (虽然这不会产生问题)

    只需更改数据类型

    即可
    int userInput,
        toss,
        headsCount,
        tailsCount;
    

    double userInput,
        toss,
        headsCount,
        tailsCount;
    

    这将解决您的问题。

    建议:请使用

    using namespace std; 
    

    在你的程序启动时你必须输入很多std ::

答案 2 :(得分:0)

欢迎使用C ++。您需要初始化变量。你的编译器应该警告你,你在使用一个变量而没有初始化它。如果不初始化值,则程序具有未定义的行为。

我在谈论headsCounttailsCount。这样的事应该没问题:

int headsCount = 0, tailsCount = 0;

另请注意,您的循环应该从0开始,而不是1,因为您在最终条件下使用<运算符。

最后,您的百分比计算是倒退的。它应该是:

headsPercent = headsCount * 100 / userInput;
tailsPercent = tailsCount * 100 / userInput;

现在,因为你使用整数除法,所以可能会发生一些奇怪的事情。也就是说,您的百分比可能不等于100.这里发生的是整数截断。请注意,我使用100x比例 first 隐式处理了其中的一些内容。

或者,由于百分比本身是double,您可以通过强制转换其中一个操作数来强制计算为double,从而避免整数截断:

headsPercent = static_cast<double>(headsCount) / userInput * 100;

事实上,由于只有两种可能性是头部和尾部,因此您只需计算其中一种。然后你可以这样做:

tailsPercent = 100 - headsPercent;

答案 3 :(得分:-1)

1)此循环应从0开始:

ParseQuery query = ParseInstallation.getQuery(); 
query.whereEqualTo("user_id", "1234567890");    
ParsePush push = new ParsePush();
push.setQuery(query);
push.sendPushInBackground();

2)分歧不正确:

for(int i = 1; i < userInput; i++)

3)最后:

//headsPercent = userInput / headsCount * 100;
//tailsPercent = userInput / tailsCount;
headsPercent = headsCount / userInput * 100;
tailsPercent = tailsCount / userInput * 100;