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

Having garbage numbers while calculating percentage

本文关键字:计算 百分比      更新时间:2023-10-16

所以,我不想问,但是,我对此有一些问题,我是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;
}

除了其他人指出的未初始化变量之外,计算都是错误的。

拿出纸和铅笔,用老式的方式进行一些自己的计算。

假设有五次抛掷,三次正面,两次反面。 这意味着(在修复未初始化的变量之后(:

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. 计算年龄百分比均值例(获得的分数(/(总分(*100不是(总标记/标记 obt(*100

  2. 未定义将任意 no 除以 0。因此,如果您当前的代码随机分配 toss 或 head =0,那么显然您会遇到错误。

其次说代码,U 应该从 0 初始化 i,或者 u 应该使用

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

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

还要记住初始化变量,例如

Int headsCount=0; 

等。因为如果未初始化为固定编号,该变量将采用任何随机值。(虽然它不会在这里产生问题(

只需更改数据类型

int userInput,
    toss,
    headsCount,
    tailsCount;

double userInput,
    toss,
    headsCount,
    tailsCount;

这将解决您的问题。

建议:请使用

using namespace std; 

在程序开始时,您必须键入大量 std::

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

我说的是headsCounttailsCount. 像这样的东西应该没问题:

int headsCount = 0, tailsCount = 0;

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

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

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

现在,可能会发生一件奇怪的事情,因为您使用的是整数除法。 也就是说,您的百分比加起来可能不会达到 100。 这里发生的是整数截断。 请注意,我首先使用 100x 刻度隐式处理了其中的一些问题。

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

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

事实上,由于只有两种可能性是正面和反面,因此您只需要计算其中一种。 然后你可以做:

tailsPercent = 100 - headsPercent;

1(这个循环应该从0开始:

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

2(划分不正确:

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

3(最后:

cout << "nTails Percentage: " << fixed << setprecision(1) << tailsPercent << " ";