我正在尝试编写一个函数来计算一个简单的数学应用程序的平均值。我没有得到任何错误,但代码输出没有出现在我的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)
答案 0 :(得分:3)
当你致电averageOf()
时,它似乎会导致游乐场崩溃(除以零,因为numberTotal
是0
)。
例如,如果您这样称呼它:
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)
}