0

我是一名 C++ 程序员,试图掌握 C 语言语法,但我不明白为什么在此函数中使用指针时会得到垃圾值。

#include<stdio.h>
#include <math.h>

void separate(double, double *dollar, double *quarter, double *dime, double *nickle,  double *penny);
int
main(void)
{
double amount = 38.39, change, paid = 40.0, dollar, quarter, dime, nickle, penny;

change = paid - amount;
separate(change, &dollar, &quarter, &dime, &nickle, &penny);

printf("Your total change is: $%d\n", change);
printf("Dollars: %d\n", dollar);
printf("Quarters: %d\n", quarter);
printf("Dimes: %d\n", dime);
printf("Nickles: %d\n", nickle);
printf("Pennies: %d\n", penny);

getchar();
return (0);
}

void separate(double change, double *dollar, double *quarter, double *dime, double *nickle, double *penny)
{
double coins;
coins = change - floor(change);
*dollar = floor(change);
*quarter = coins / 25;
coins = coins - (*quarter * 25);
*dime = coins / 10;
coins = coins - (*dime * 10);
*nickle = coins / 5;
*penny = coins - (*nickle * 5);
}
4

4 回答 4

2

您正在使用 %d 打印双打!试试 %f

printf("Your total change is: $%f\n", change);
printf("Dollars: %f\n", dollar);
printf("Quarters: %f\n", quarter);
printf("Dimes: %f\n", dime);
printf("Nickles: %f\n", nickle);
printf("Pennies: %f\n", penny);
于 2013-03-21T01:50:43.117 回答
1

确实。相当不直观,但 printf 语句中的 %d 用于整数。尝试使用 %f 打印浮点数

我还建议你看看这个

于 2013-03-21T01:52:39.700 回答
1

您正在尝试使用 打印双精度变量%dprintf然后将双精度(或其一部分)的内存作为整数变量的内存,因为printf用作va_list指向参数的指针,如果您分配不适当的格式,则 arg 点的类型将也会出错。

全部替换%d%f

于 2013-03-21T01:52:59.610 回答
1

我怀疑您的问题是您没有正确进行除法。

看一看:

void separate(double change, double *dollar, double *quarter, double *dime, double *nickle, double *penny)
{
    // for your example, change is initially 1.61
    double coins;
    coins = change - floor(change);  // .61
    *dollar = floor(change);         // 1
    *quarter = coins / 25;           // .0244
    coins = coins - (*quarter * 25); // 0
    *dime = coins / 10;              // 0
    coins = coins - (*dime * 10);    // 0
    *nickle = coins / 5;             // 0
    *penny = coins - (*nickle * 5);  // 0
}

整数除法和浮点除法的工作方式不同。相反,您应该乘以 100 得到美分数,除以 25 得到四分之一数,然后按地板求整数。

*quarters = floor(coins * (100 / 25)); // floor(2.44) = 2
coins = coins - *quarters * 25;        // .11

根据需要重复以获得其他硬币的数量。

此外,其他人都提到您正在使用%d打印双精度而不是%f(%d是整数格式字符串) 所以我也会提到它,因为它是问题的一部分。

于 2013-03-21T01:54:35.453 回答