【问题标题】:Division answer not executing properly除法答案未正确执行
【发布时间】:2014-04-01 02:06:44
【问题描述】:

以下代码行有问题:

double answer;
answer = num[count] / den[count]
cout << " Fraction" << count + 1 << " " << num[count] 
     << " / " << den[count] << " = " << answer << endl;

为什么我的答案演绎不起作用?我忽略了什么吗?我正在使用数组并从单独的文本文件中获取数据。当我使用上面的代码时,我得到了要正确划分的数字,但答案不正确。结果是一个随机数,通常为 0 或 1。

这是我的代码:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstdlib>

using namespace std;
void read_data(int num[], int den[], int size);
void showValues(int num[],int den[], int size);

int main()
{
    const int size1 = 12;
    const int size2 = 12;
    ifstream dataIn;
    int num[12];
    int den[12];

    read_data(num,den,size1);
    cout << "Here are the fractions: " << endl;
    showValues(num,den,size1);

    system("PAUSE");
    return 0;
}

void read_data(int num[], int den[], int size)
{
    ifstream dataIn;
    dataIn.open("walrus.txt");

    if( dataIn.fail() )
         {
        cout << "File does not exist." << endl;
        exit(1);
         }

     int count;
     for ( count = 0; count < size; count++ )
     {
         dataIn >> num[count];
     }

     for (count = 0; count < size; count++)
     {
         dataIn >> den[count];
     }


     dataIn.close();
 }

void showValues(int num[],int den[], int size)
{
    int count;
        for (count = 0; count < size; count++)
        {
            if (den[count] == 0)
            {
                 cout << " Fraction" << count + 1 << " " 
                      << num[count] << " /" << den[count] 
                      << " Is invalid" << endl;
             }
            else
            {
                double answer;
                answer = num[count] / den[count];
             cout << " Fraction" << count + 1 << " " 
                  << num[count] << " / " << den[count] 
                  << " = " << answer << endl;
             }
        }
 }

【问题讨论】:

  • MCVE 会有所帮助,尤其是数组的声明。
  • 请显示所有相关代码 - 数组等的数据类型及其值。
  • 请记住,如果 num[count]den[count] 是整数类型,则除法会丢弃任何余数/小数部分,例如它会将任何&gt;= 0&lt; 1 舍入到05/2 = 2 等。您可能想使用double(num[count]) / den[count]
  • 有什么理由在打印之前阅读所有内容?如果您立即处理数据,您需要更少的空间(并获得灵活性)。
  • 像现在一样读入,但只够一行输出,计算,打印行,重复。当文件为空时,您就完成了。

标签: c++ arrays


【解决方案1】:

@main ifstream dataIn; 你没有使用这个对象

@函数读取数据:

 int count;
 for ( count = 0; count < size; count++ )
 {
     dataIn >> num[count];
 }

 for (count = 0; count < size; count++)
 {
     dataIn >> den[count];
 }

假设你的文件看起来像:

1 2 23 32 44 // numerators
2 3 1 99 24 // den

正确的阅读方式是:

int count = 0;
while( count < size && dataIn >> num[count++] ) // numerators
    ;

count = 0;
while( count < size && dataIn >> den[count++] )
    ;

@function 显示值: 尝试改变

   double answer;
    answer = num[count] / den[count];
 cout << " Fraction" << count + 1 << " " 
      << num[count] << " / " << den[count] 
      << " = " << answer << endl;

到:

double answer = static_cast<double>(num[count]) / den[count];
cout << " Fraction" << count + 1 << " " 
     << num[count] << " / " << den[count] << " = " << answer << endl;

【讨论】:

  • 工作就像一个魅力。但是你能给我一个关于静态演员如何使它工作的想法吗?因为我是编码初学者,所以我对它的工作原理有点困惑。
  • 原代码说“把这两个ints分开,把结果赋给这个double。”您想要的是“将这两个ints 转换为doubles,将它们分开,然后将结果分配给另一个double。” static_cast 将其中一个int 转换为double,编译器将另一个转换为double 以进行数学运算。
【解决方案2】:

在 C 和 C++ 中,如果你这样做,

double answer = 10 / 3;

你的答案是 3。原因是你有 2 个 整数 并且会发生整数除法。然后将生成的输出隐式转换为双精度。所以步骤是,

  1. 双重答案 = 10 / 3
  2. 双重答案 = 3
  3. 双重答案 = 3.0

要解决此问题,请告诉编译器您希望将其视为浮点除法。

double answer = 10.0 / 3;

这是由,

  1. 双重答案 = 10.0 / 3
  2. 双重答案 = 10.0 / 3.0
  3. 双重答案 = 3.33333333...

编译器会将 3 隐式转换为更大的双精度类型 3.0。

因此,在您的代码中,您必须通过将至少一个除法参数转换为双精度值,将整数除法转换为浮点除法。

double foo = num[count] / den[count];

变成了

double foo = num[count] / static_cast<double>(den[count]);

或者,如果其中一个或两个数组都是双精度类型,则不会遇到需要强制转换的问题。

【讨论】:

  • 感谢您的解释!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 2021-10-24
相关资源
最近更新 更多