【问题标题】:Describing and rewriting example code from an exam paper [closed]从试卷中描述和重写示例代码[关闭]
【发布时间】:2013-04-17 14:51:48
【问题描述】:

以下是一些糟糕的编程示例。目的是了解代码在做什么,并用更好的代码重写它。


(来源:gyazo.com


(来源:gyazo.com

我尝试按原样输入它,编译它并尝试弄清楚它在做什么。但我进步很小。 这是一个试卷问题,所以我不能派人去尝试解决这个问题,但同时它也是一个完整的问题。

这些代码在做什么,我怎样才能(更快)弄清楚它们?

谢谢。

编辑: 我不是要代码。我要求对代码进行解释。所以我真的不能给sn-p。

【问题讨论】:

  • 我看不到代码 sn-ps - 但有两个小小的不开心的笑脸...
  • "这些代码在做什么?" - 不,做你自己的考试。 “我怎样才能(更快)弄清楚它们?” - 由于没有建设性而结束,对此有太多可能的答案。
  • 这与拥有代码无关。这是关于知道它正在编写的代码。
  • 第一个例子是大师们写的经典之作之一!不是“糟糕的编程”。但也许不是很可读。
  • 不要使用电脑。只需根据参数类型提供一些输入并手动跟踪代码。这些都是微不足道的。

标签: c syntax


【解决方案1】:

关键是多练习(并学习新概念)。你练习得越多,你接触到的代码就越多。对于初学者来说,这些事情可能看起来非常复杂[在我看到的第一个 C 代码中,我想知道为什么 * 乘法放在变量名 int * a 之前;)]

您可以使用许多很好的参考来消除您的困惑,例如 thisthis

【讨论】:

    【解决方案2】:

    这些是非常基本和出色的代码。 只需在纸上做一个空运行的代码,你就会很容易地得到关于他们在做什么的答案。 就像,在 B 中,我们正在创建一个相同值的数组 item 直到 b != -1。 同样,只需假设一些值并在纸上解决它,然后用适当的行和缩进重新编写。

    【讨论】:

    • 谢谢。我只是很难理解指针是如何工作的。和 *(a++) 一样,它有什么作用?
    • 那么 *(a++) 和 a++ 一样吗?
    • 不,不是,但x=*(a++)a++; x=*a 相同。 a 是一个保存地址的变量。存储在该变量中的地址首先以a++ 递增。然后得到的地址被取消,这仅仅意味着内存中该地址的值被加载。要理解指针,您只需要了解内存是一个字节序列,每个字节都有自己的地址,而变量只是方便的标签,可以引用当前存储在特定内存地址的数据。
    • 其实B节的代码中没有没有赋值。它的作用是检查初始数组a包含多少次值项目。 IE。它递归地迭代数组a,如果找到a[b] == item,它会添加1。例如。如果数组 a 在其三个元素/槽中包含 items,则函数必须返回 3。return (a[b] == item) 部分返回 ether 1(如果元素等于 item)或 0(如果它不等于)。在 C 中,布尔运算的结果可以计算为整数
    • @code.atodi:您对 B 部分的描述不正确; @informatik01 是正确的。起初我犯了同样的错误,但这是一个相等测试,而不是一个作业。此外,您的评论“*(a++) 是值为 a+1 的变量的地址”不明确:address 的值是“a+1”(假设 a 的原始值) ,则该地址处的变量的值未指定。
    【解决方案3】:

    一旦您了解了代码的作用,只需更改变量和函数名称即可。完毕。 在这种情况下,“糟糕的编程”正在为变量使用糟糕的名称,这并没有明确变量本身的用途

    编辑: 你的第二个任务是rewrite it in better code.。这就是练习的美妙之处,除非你在心里“执行”算法,否则很难知道发生了什么。提供更好的名称可以提高代码的质量。如果存在潜在的错误,请提供更好的名称。

    示例:

    // bad code
    int f(int a, int b){
      return a < b ? a : b;
    }
    
    // better code
    int min(int a, int b){
      return a < b ? a : b;
    }
    
    // what? there must be a bug
    int max(int a, int b){
      return a < b ? a : b;
    }
    

    【讨论】:

    • 理解是我坚持的部分。不重写代码。
    • 您应该询问分配的目的!是不是很优秀!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 2011-01-24
    相关资源
    最近更新 更多