可能是由于对double和int的不正确操作(C语言)导致的疯狂大数

可能是由于对double和int的不正确操作(C语言)导致的疯狂大数,c,function,int,double,C,Function,Int,Double,我正在为我的C语言CS239课程编写一个程序,该程序要求计算某物的成本、支付的金额、计算税款,然后确定要返还的更改类型和最佳的硬币返还 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> void coinage(int c, int q, int d, int n, int p); //change calculation function in

我正在为我的C语言CS239课程编写一个程序,该程序要求计算某物的成本、支付的金额、计算税款,然后确定要返还的更改类型和最佳的硬币返还

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

void coinage(int c, int q, int d, int n, int p); //change calculation function

int main(void)
{
   double price, tax, paid, due, t_back; //used double instead of int for decimal purpose
   int c, b, q, d, n, p; //change, bills, quarters, dimes, nickels, pennies

   printf("\nProgram Author: PuppyBreath\n");
   printf("\nEnter price in dollars: $");
   scanf("%lf", &price);

      tax = 1.06;
      due = price*tax;

   printf("Sales tax in Kentucky is 6%, therefore the amount due is $%.2f. \n", due);
   printf("Enter amount paid: \n");
   scanf("%lf", &paid);

      paid = paid*100+0.5;
      due = due*100;
      c = paid-due;
      b = c/100;
      t_back = (paid-due)/100-0.01; //used a double rather than an int for increased precision

   coinage(c, q, d, n, p); //calls coinage function

   printf("Change back:\n");
   printf("Total: $%.2f\n", t_back);

   if(t_back >= 1)
      printf("Ones: %d\n", b);
   else
      printf("No bills\n");

   if(q >= 1)
      printf("Quarters: %d\n", q);
   else
      printf("NO QUARTERS FOR YOU!\n");

   if(d >= 1)
      printf("Dimes: %d\n", d);
   else
      printf("NO DIMES FOR YOU!\n");

   if(n >= 1)
      printf("Nickels: %d\n", n);
   else
      printf("NO NICKELS FOR YOU!\n");

   if(p >= 1)
      printf("Pennies: %d\n", p);
   else
      printf("NO PENNIES FOR YOU!\n");

   return 0;
}

void coinage(int change, int quarters, int dimes, int nickels, int pennies)
{
   int t_change, t_quarters, t_dimes, t_nickels, t_pennies;

   t_change = change%100;  //use mod to carry remainders and dividing to find number of each   coin
   t_quarters = t_change/25.00;
   t_change = t_change%25;
   t_dimes = t_change/10.00;
   t_change = t_change%10;
   t_nickels = t_change/5.00;
   t_change = t_change%5;
   t_pennies = t_change+0.5;

   quarters = t_quarters;
   dimes = t_dimes;
   nickels = t_nickels;
   pennies = t_pennies;
}
如你所知,如果你的零钱是1.51美元(应该是1.52美元,但那是另一条稍小一点的鱼),那么你肯定不需要4195472个镍币。为什么会这样?提前谢谢!我在这方面不是很有经验,我只做了3周的C语言编程,请温柔一点

void coinage(int change, int quarters, int dimes, int nickels, int pennies)
请记住,在C中,所有参数都是按值传递的,因此在这个函数中修改的任何内容在外部都不会被修改

将其更改为使用指针模拟按引用传递,签名应如下所示,主体应相应修改

void coinage(int change, int *quarters, int *dimes, int *nickels, *int pennies)

这里的核心问题是,
coins
函数被设计为返回多个值,但作者还没有学会这样做的好方法

另一种方法是重新设计接口,使
coinage
函数只返回一个值,但会被调用多次。我们可以让它包含三个参数:变化量、当前硬币的面额以及价值高于当前硬币的最小硬币的面额。它将返回一个简单的整数,表示当前硬币的计数。现有的
铸币
功能有效地将其作为一个代码块来包含,该代码块只会重复数字的变化,而不会重复它正在做的事情


在主要功能变量中,如
q
将替换为表达式
coins(c,25100)
,这意味着如果存在100个单位的硬币或纸币,则兑换金额
c
的25个单位硬币的数量。

不要在代码中包含行号。他们不是真实来源的一部分,所以他们不应该成为你文章的一部分。哦,糟糕,我很抱歉!谢谢你的提示和编辑!谢谢你的回复,我还有另一个程序可以做同样的事情,并且使用指针,但是我的老师告诉我不要使用指针,因为它们还没有被涵盖,并且与他试图通过这个练习教我们的内容无关/@如果指针不是选项,那么唯一的方法就是将此逻辑也放入
main
中。因此,只要删除coinage函数并将变量粘贴到main()函数中就可以了?如果我将main()中的一系列If-else语句移到coinage中,并且没有屏蔽main()中的任何变量,这是否也可以,并且还记得coinage函数中的main()变量值?对不起,如果我在这件事上打扰你了。回答+1@PuppyBreath您还可以为所有硬币使用一个结构(作为属于一起的一组硬币的变量),并将其返回给。又好又干净。我也会在这里输入一个指针:)
void coinage(int change, int *quarters, int *dimes, int *nickels, *int pennies)