1

所以我才刚刚开始学习埃菲尔。我正在使用的书中的第一个练习中说要创建一个不使用 ^ 的函数来执行 base^exp。我在下面复制了我的代码。

class
    APPLICATION

inherit
    ARGUMENTS

create
    make

feature {NONE} -- Initialization

    make
            -- Run application.
        do
            create power(2;3)
            printf("2 to the power of 3 is " + answer)
        end

    power(base : REAL; exp : INTEGER) : REAL
        -- computers base raised to the bower of exp without using ^
        local
            remain : INTEGER
        do
            remain := exp
            if remain = 0 then
                result := 1
            else
                from
                until
                    remain = 0
                loop
                    result := result * result
                    remain := remain -1
                end
            end
        end
end

我该如何使用它?我需要它与feature{NONE}'s相同的级别make吗?我知道我怎么称呼它是错误的,我在刚刚阅读的章节中找不到任何内容,或者在网上找不到关于如何将参数传递给它或如何使用它的结果的任何内容。

4

1 回答 1

6

原始代码有几个问题:

  1. create用于创建一个对象,但您不会创建任何东西,而是power通过调用它来获得函数的计算结果。create因此不需要关键字。

  2. 您正在使用实体answer在屏幕上报告评估结果。但是,它没有在任何地方声明。我相信合适的地方是局部变量声明部分。

  3. 实体answer未初始化为函数的结果power。这通常由分配指令完成。

  4. 功能参数由逗号分隔,而不是由分号分隔。

  5. 从原始代码中不清楚变量的类型是什么answer。假设它与函数的类型匹配power,在将其添加到字符串之前,需要将其转换为字符串。这是通过调用功能来完成的out

  6. 将字符串打印到控制台的标准功能是print,不是printf

结合上面的关键点,我们得到

make
        -- Run application.
    local
        answer: REAL
    do
        answer := power(2, 3)
        print ("2 to the power of 3 is " + answer.out)
    end

之后就可以编译代码了。现在不太关键的点:

  1. 将特性放在专用的特性子句中是一种很好的风格,所以我会feature -- Basic operations在特性之前添加一行power

  2. 该功能的实现power至少有两个问题。我不打算在这里详细说明它们,而是给出两个提示:

    • 默认情况下 numericResult初始化为0,这需要考虑到使用它而不首先分配任何其他值的操作

    • 即使将参数base传递给函数power,它在原始版本的代码中仍然未使用

于 2015-07-17T18:13:51.547 回答