编写一个函数,如果该学生的平均成绩高于给定参数的另一名学生,则该函数返回true。
这里是我的代码
class Student {
var id: Int = 0
var firstName: String = ""
var lastName: String = ""
init(id: Int,firstName: String,lastName: String){
self.id = id
self.firstName = firstName
self.lastName = lastName
}
func fullName() -> String {
return "\(firstName) \(lastName)"
}
var grades: [Float] = []
func addGrade(_ input: Float) {
grades.append(input)
}
func numberOfGrades() -> Int {
return grades.count
}
func average(numbers: Int...) -> Float {
assert(grades.count > 0)
return Float(grades.reduce(0, {$0 + Double($1)})/Double(grades.count))
}
func hasHigherAverageThan() -> Bool {
if lois.hasHigherAverageThan(peter){
print("\(lois.firstName) beats \(peter.firstName)")
}
}
}
let peter = Student(id: 5, firstName: "Peter", lastName: "Parker")
peter.addGrade(2.95)
peter.addGrade(3.45)
let lois = Student(id: 6, firstName: "Lois", lastName: "Lane")
lois.addGrade(4.0)
lois.addGrade(3.2)
如何正确编写代码
我要输出:打印“ Lois beats Peter”
答案 0 :(得分:0)
如果唯一的比较方法是学生的成绩,请考虑以下几点:
func hasHigherGradeThan(_ student: Student) -> Bool {
//In your current construct, the parameter passed to "average" is not necessary, so I'm passing a 0 right now.
return self.average(numbers: 0) > student.average(numbers: 0)
}
仅当一个平均值大于另一个平均值时,才返回true。如果平均值等于或小于平均值,则将返回false。
答案 1 :(得分:-1)
在我看来,您应该编写一个Student
类的实例方法,该方法将另一个Student
作为参数并比较两者:
用于比较2个Student
对象的平均成绩的函数不应包含任何针对特定学生的代码。应该将其编写为实例方法,以将当前学生与另一个学生进行比较。
class Student {
//Your other code here...
func hasHigherAverageThan(otherStudent: Student) -> Bool {
//Your code to compare the current student to otherStudent goes here
//comare `self` to `otherStudent` and return a Bool result
}
}
然后,在Student类之外,您将创建并比较2个学生:
let peter = Student(id: 5, firstName: "Peter", lastName: "Parker")
peter.addGrade(2.95)
peter.addGrade(3.45)
let lois = Student(id: 6, firstName: "Lois", lastName: "Lane")
lois.addGrade(4.0)
lois.addGrade(3.2)
if lois.hasHigherAverageThan(peter) {
print("\(lois.firstName) beats \(peter.firstName)")
} else {
print("\(peter.firstName) beats \(lois.firstName)")
}
(请注意,上面的代码不允许2名学生的平均成绩完全相同。)
查看是否可以为hasHigherAverageThan(otherStudent:)
方法编写代码。
另一件事:您为Student
对象提供了一个等级值数组,这似乎是合理的。为什么您的平均函数采用任何参数,而不是可变参数?应该写成没有参数的
func average() -> Float
它将使用数组grades
来计算平均成绩。
我会这样重写您的平均函数:
func average() -> Float {
guard !grades.isEmpty else { return 0.0 }
return Float(grades.reduce(0.0, { $0 + Double($1) })/Double(grades.count))
}
更改:
(您还可以使其返回Optional
Float
/ Double
,如果数组为空,则返回nil。)
我还建议设置一种浮点类型并在整个过程中使用它。 Double是本机浮点类型,因此我将使成绩数组成为Doubles数组,并使average()
函数返回Double
。