我有一个程序,用户在其中输入应付款和已付款。函数 makeChange(double amount)传递差额(已付款-到期),并返回一个double数组,其中到期的找零按面额细分。
double* makeChange(double amount) {
double* change = new double[10];
double values[10] = { 100, 50, 20, 10, 5, 1, .25, .10, .05, .01 };
double remaining = amount;
for (int i = 0; i < 10; i++) {
change[i] = floor(remaining / values[i]);
remaining -= (change[i] * values[i]);
}
return change;
}
我并不总是能获得预期的输出。例如,当我通过(0.05-0.00)作为金额时,它返回说我需要1个镍。但是,如果我通过(4.05-4.00)作为金额,它将返回说我需要4便士。
代码中的什么导致这种情况发生? 谢谢!
答案 0 :(得分:0)
我认为您发布的代码没有任何问题。 该函数的调用者可能在您正在解释的地方出现问题 更改数组中的值。 如果您也可以在此处发布该信息,将会更有帮助。
干杯。
答案 1 :(得分:0)
首先,在c ++中,不需要使用指针来创建数组,可以使用std::array
。
您可以替换功能,使其更安全:
array<double, 10> makeChange(double amount) {
cout << "Amount: " << amount << endl;
array<double, 10> change = {};
double values[10] = { 100, 50, 20, 10, 5, 1, .25, .10, .05, .01 };
double remaining = amount;
for (int i = 0; i < change.size(); i++) {
change[i] = floor(remaining / values[i]);
remaining -= (change[i] * values[i]);
}
return change;
}
int main() {
array<double, 10> change;
change = makeChange(4.05f - 4.0f);
for (size_t i = 0; i < change.size(); i++) {
cout << change[i] << endl;
}
return 0;
}
对于更改的问题-将浮点值传递给函数时,请使用f
传递它们,如下所示:
change = makeChange(4.05f - 4.0f);
这将使您的计算变得不那么意外,因为您正在使用点后的数字较少的数字(使用float
而不是double
)。甚至更简单的解决方案,将所有双打替换为浮点数(在概念上无效,但可以解决此问题):
array<float, 10> makeChange(float amount) {
cout << "Amount: " << amount << endl;
array<float, 10> change = {};
float values[10] = { 100, 50, 20, 10, 5, 1, .25, .10, .05, .01 };
float remaining = amount;
for (int i = 0; i < change.size(); i++) {
change[i] = floor(remaining / values[i]);
remaining -= (change[i] * values[i]);
}
return change;
}
int main() {
array<float, 10> change = makeChange(4.05 - 4.0);
for (size_t i = 0; i < change.size(); i++) {
cout << change[i] << endl;
}
return 0;
}