使用函数计算平均值

时间:2014-06-14 20:11:39

标签: swift average

我正在尝试编写一个函数来计算一个简单的数学应用程序的平均值。我没有得到任何错误,但代码输出没有出现在我的Xcode游乐场的右侧边栏中。它在我的代码中输出两个零并停在那里。有什么问题的想法?

func averageOf(numbers: Int...) -> Float {
    var sum = 0
    var numberTotal = 0

    for number in numbers {
        sum += number
        numberTotal = numbers.count
    }

    return Float(sum / numberTotal)
}

averageOf()
averageOf(10, 56, 75, 90, 109)

3 个答案:

答案 0 :(得分:3)

当你致电averageOf()时,它似乎会导致游乐场崩溃(除以零,因为numberTotal0)。 例如,如果您这样称呼它:

averageOf(10, 56, 75, 90, 109)
averageOf(10, 20, 30)
averageOf()
averageOf(10, 20, 30)

你会得到前两个电话的输出,但不是第二个电话的输出。

更新3 (@wumm的积分) 如果您点击右侧面板上的任何变量或打开了助理编辑器,您会看到错误(虽然很奇怪):

Playground execution failed: error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
The process has been left at the point where it was interrupted, use "thread return -x" to return to the state before expression evaluation.
* thread #1: tid = 0x1c4a02, 0x000000010aff7e14, queue = 'com.apple.main-thread', stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
  * frame #0: 0x000000010aff7e14

解决方案是最后检查numberTotal。顺便说一下,没有必要在循环中分配它:) 这是一个固定版本:

更新:在开头的数字总数确实更合理(归功于@kovpas): 更新2:更改了return部分。归功于`@MartinR。

func averageOf(numbers: Int...) -> Float {
    var numberTotal = numbers.count
    if numberTotal == 0 {
        return 0
    }
    var sum = 0

    for number in numbers {
        sum += number
    }
    return Float(sum)/Float(numberTotal)
}

averageOf(10, 56, 75, 90, 109)
averageOf(10, 20, 30)
averageOf()
averageOf(10, 20, 30)

答案 1 :(得分:2)

当然,除了学习练习外,averageOf()最好重复使用现有功能:

func averageOf(_ head: Int, rest: Int...) -> Double {
  return Double (rest.reduce (head, combine: +)) / Double (1 + rest.count)
}
27> averageOf (1, 2, 3)
$R6: Double = 2

以上内容避免了你如何平均无数字'需要一个参数的问题。您还需要小心您的部门使用:

 33> Double (3/2)
$R9: Double = 1
 34> Double(3)/Double(2)
$R10: Double = 1.5

此外,使用...创建的可选参数的有用性是有限的,直到有apply()函数,如

   var theAverage = apply (averageOf, someGiantArrayOfInts)

答案 2 :(得分:1)

您应首先检查您的数组是否包含数字。否则你除以0。

func averageOf(numbers: Int...) -> Float {
    if numbers.count == 0 {
        return 0
    }

    var sum = 0

    for number in numbers {
        sum += number
    }

    return Float(sum / numbers.count)
}