CS50 PSET 1贪心

时间:2015-06-04 09:52:17

标签: c greedy cs50

我真的很喜欢编程,我刚刚开始在哈佛的CS50上尝试一些问题集。如果有人能指出我为什么我的代码是错误的,那将不胜感激。

编译并运行代码后,没有任何输出。

另一方面,任何人都可以向我解释" round"作品?我不是真的从终端上的男人那里得到它。谢谢!

#include <stdio.h>
#include <math.h>
int main(void)
{   
  printf(" O hai! How much change is owed?\n");

  float change;
  change=GetFloat();
  double round(double change); 
  int x= change*100;

  int i=0;

  while(x>25) { 
    x=x-25;
    i++;
    return i;
  }

  while(x>10) { 
    x= x-10;
    i++;
    return i;
  }

  while(x>5) {
    x=x-5;
    i++;
    return i;
  }

  while(x>1) {
    x=x-1;
    i++;
    return i;
  }

  printf("%d\n",i);

}

6 个答案:

答案 0 :(得分:1)

第一件事 在您输入美元之后 你应该在它之后将它乘以100以将其转换为美分 并使用 round 功能。 使用

change = round(change) ;

在你的代码中 因为变化是浮点值 但我们需要整数钱来计算所用硬币的数量 所以我们使用round将其更改为整数 因为我们无法计算使用浮点值的硬币数量

然后: return i ; 声明不应该使用 在每个循环中 从每个循环中删除它。

因为,如果你在每个lopp中使用它 它会计算出那些特定的硬币 然后退出程序。 因此,删除所有这些return i语句 你可以写return 0 ; 之后 printf("%d\n", i);声明!

答案 1 :(得分:0)

一个问题可能是调用round函数。你可以调用函数

double value=round(variable);

其中value为您提供舍入的数字。 见这个链接---

http://fresh2refresh.com/c/c-arithmetic-functions/c-round-function/

答案 2 :(得分:0)

您的代码无效,因为您在每个i循环中都返回while

当行return i执行时,main函数返回,程序终止。

可能的解决方案是删除循环中的所有return语句。

答案 3 :(得分:0)

return语句表示函数的结束。循环不是函数,因此返回语句不是必需的。

您没有收到输出,因为Main本身就是一个功能。因此,当达到“返回i”时,机器认为已经达到主要功能的结束并且停止运行。

因此,第一个while循环下面的所有内容都不会运行。这就是你没有看到printf输出的原因。

稍后在编程中,您将使用多个return语句来表示函数(或程序本身)应停止运行的位置。但是在第一个作业中,你最后应该只有一个return语句。

答案 4 :(得分:0)

首先,我建议您阅读cs50Style并添加一些注释,以便代码更清晰,不仅适合我们,还适合您。另一个建议是增加一些&#34;测试&#34;在程序期间,例如,如果您想知道程序的某些部分是否正在执行,请添加一些代码,如:

printf("TEST1\n");   //check 1

通过这样做,您可以检查您的程序何时到达某个点或在另一个点失败。 (在发送或检查问题之前,将删除此测试,不要忘记)。

现在让我们解决主要问题。要了解功能或任何功能的作用,您可以访问[参考cs50]:https://reference.cs50.net或在您的&#34; cs50设备中进行写入&#34; console: man后跟 man round 中的函数名称

这个函数基本上将数字四舍五入到最接近的整数值( 2.70到3.00 )。

关于你的计划为什么不起作用的问题。

首先,我想看一下在输入部分实现do..while循环的方法:

printf(" O hai! How much change is owed?\n");
float change;
change=GetFloat();

因为如果我写下-5.00,结果会是什么?

其次,在每次迭代中返回i的值都不是必需的。

第三,我发现符号存在问题,例如:x> 25,x> 10。如果您写的x> 10?,如果剩余的硬币是10,该怎么办?解决这个问题非常容易:)

第四,如果你考虑一下,你真的不需要写代码的最后一部分

while(x>1)
{
x=x-1;
i++;

因为硬币值为1,所以你可以将剩余1个硬币的数量加到总数中( i + x )。

在编写代码

时尝试使用它来冒险
x = x-1;

等于

x -= 1;

最后我想告诉你,有一种方法可以解决这个问题而不用任何while(x&gt; = 25,x&gt; = 10,...),只需要做总和,划分(想想类型为int)财产)和模数运算。

此外,我希望你不要放弃这门课程,这是一项具有挑战性的课程,但是一旦你学到了东西,这真的很有趣,就像某种雪球一样。

祝你好运!

答案 5 :(得分:0)

正如JPG所提到的,它没有给你任何输出的原因是因为每当你使用return语句时,它会立即尝试退出当前活动的函数。当该函数为main时,表示程序本身将尝试退出。

你试图用剩余价值做某事的想法是正确的,这是你需要做的,但是你需要以不同的方式做。您可能可以使用除法,但我建议您查看mod(%)运算符。它会更清洁。

此外,您的循环存在流量问题。嵌套循环在每个级别下降。为了满足您的期望,每个循环都需要处于同一级别。您将很快遇到嵌套循环,理解逻辑流程非常重要。

这实际上是我第一次见到这种尝试,说实话真的很有趣!如果你删除了回报,你实际上会得到(不正确的)输出。有更简单的方法可以获得结果,但一旦修复了逻辑错误,这种方法就可以正常工作。