Process 从问题传递到代码的过程。你是怎么学的?

Process 从问题传递到代码的过程。你是怎么学的?,process,Process,我在教/帮助一个学生编程 我记得当我开始的时候,下面的过程总是帮助我;这看起来很直观,我想知道是否有其他人也有类似的方法 阅读问题并理解它(当然) 确定可能的“功能”和变量 写下我将如何一步一步地做(算法) 把它翻译成代码,如果有你不能做的事情,创建一个函数为你做,并继续前进 随着时间和实践,我似乎已经忘记了从问题描述到编码解决方案是多么困难,但通过应用这种方法,我成功地学会了如何编程 因此,对于以下项目描述: 系统必须根据以下规则(规则说明……客户、折扣、可用性等)计算物品的价格 我的第一步是

我在教/帮助一个学生编程

我记得当我开始的时候,下面的过程总是帮助我;这看起来很直观,我想知道是否有其他人也有类似的方法

  • 阅读问题并理解它(当然)
  • 确定可能的“功能”和变量
  • 写下我将如何一步一步地做(算法)
  • 把它翻译成代码,如果有你不能做的事情,创建一个函数为你做,并继续前进
  • 随着时间和实践,我似乎已经忘记了从问题描述到编码解决方案是多么困难,但通过应用这种方法,我成功地学会了如何编程

    因此,对于以下项目描述:

    系统必须根据以下规则(规则说明……客户、折扣、可用性等)计算物品的价格

    我的第一步是了解问题所在

    然后确定项目、规则和变量等

    伪代码类似于:

    function getPrice( itemPrice, quantity , clientAge, hourOfDay ) : int 
       if( hourOfDay > 18 ) then
          discount = 5%
    
       if( quantity > 10 ) then
          discount = 5%
    
       if( clientAge > 60 or < 18 ) then
          discount = 5%
    
    
            return item_price - discounts...
    end
    

    你采取了类似的方法吗?。。是否有人教过你类似的方法,或者你发现了自己(正如我所做的:()

    我做了类似的事情

    • 找出规则/逻辑
    • 算出数学
    • 然后试着编写代码

    在这样做了几个月后,它就被内在化了。直到你遇到一个复杂的问题,需要你去解决它,你才意识到你在这样做。

    一厢情愿可能是解决复杂问题的最重要的工具。当有疑问时,假设存在一个函数来解决你的问题(首先创建一个存根)。稍后您将返回到它进行扩展。

    我采用测试驱动的方法

    1.我写下(在纸上或纯文本编辑器上)满足问题需求的测试或规范列表。 2.寻找我认为最容易实现的项目,并为其编写测试。例如,单个项目看起来很容易 使用Nunit和C#创建样本

    通过以下方式实现该目标:

    public decimal GetPrice(decimal amount, int quantity)
    {
        return amount * quantity; // easy!
    }
    
    然后转到这两个项目

    [Test]
    public void TwoItemsItems()
    {
        Assert.AreEqual(10, GetPrice(5, 2));
    }
    
    该实现仍然通过了测试,因此继续进行下一个测试

    3.始终注意重复并删除它。当所有测试都通过时,您就完成了,您再也无法考虑任何测试。
    这并不能保证你会创造出最有效的算法,但只要你知道测试的内容并且全部通过,它就能保证你得到正确的答案。

    请记住,如果你得到5%的折扣,那么再获得5%的折扣,你就不会得到10%的折扣。相反,你支付95%的95%,即90.25%或9.75%的折扣。因此,你应该无法添加百分比。

    对于寻找流程的初学者来说,这是一本好书:

    是的。TDD在我开始的时候并不存在(或者不是很流行)。TDD会是从问题描述到代码的途径吗?…这不是有点先进吗?我的意思是,当“未来”来临时开发人员很难理解什么是编程语言,这会不会适得其反

    hamcrest如何从算法过渡到代码。

    传统的OO方式:

    • 写下问题及其解决方案的描述
    • 圈出名词,这些是候选对象
    • 在动词周围画方框,这些是候选消息
    • 将动词与“做”动作的名词分组;列出需要帮助的任何其他名词
    • 看看你是否能用名词.动词(其他名词)的形式重述解决方案
    • 编码

    [这种方法先于CRC卡,但它太长了(超过20年),我不记得在哪里学过它]

    我从顶部开始,一路向下。基本上,我将从编写高级程序开始,勾勒出其中的细节,然后开始填充细节

    假设我有这个问题(来自欧拉计划)

    第一组的平方和 十个自然数是,1^2+2^2+ …+10^2=385

    前十位之和的平方 自然数是,(1+2++ 10) ^2=55^2=3025

    因此,总和之间存在差异 前十个正方形的 自然数与平方 总和为3025385=2640

    找出两个变量之和之间的差异 前一百个的正方形 自然数与平方 总数

    所以我开始是这样的:

    (display (- (sum-of-squares (list-to 10))
                (square-of-sums (list-to 10))))
    

    现在,在Scheme中,没有平方和、平方和或函数列表。所以下一步是构建每一个函数。在构建每一个函数时,我可能会发现我需要抽象出更多的内容。我尽量保持简单,以便每个函数只真正做一件事。当我构建一些可测试的功能时e、 我为它编写了一个单元测试。当我开始注意到一些数据的逻辑分组以及作用于它们的函数时,我可能会将其推到一个对象中。

    在学习编程时,我认为TDD没有帮助。以后当你对编程有了一些概念时,TDD是很好的,但对于初学者来说,有一个编写te编码并在最快的时间内查看结果是最重要的

    我会立即从问题陈述到代码。对其进行破解。帮助学生了解编写软件/结构化算法的不同方式。教学生改变想法并重新编写代码。尝试教授一点代码美学

    一旦他们能够破解代码……然后在重构方面引入形式化重组的思想。然后引入TDD的思想,将其作为一种使流程更加健壮的方法。但只有当他们感到能够自如地操纵代码以完成他们想要的任务时,才可以。在那个阶段,能够指定测试就更容易了。Th
    public decimal GetPrice(decimal amount, int quantity)
    {
        return amount * quantity; // easy!
    }
    
    [Test]
    public void TwoItemsItems()
    {
        Assert.AreEqual(10, GetPrice(5, 2));
    }
    
    (display (- (sum-of-squares (list-to 10))
                (square-of-sums (list-to 10))))