如果学生的平均成绩高于作为参数给出的另一个学生,则写一个返回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”
如果您唯一的比较方法是学生的成绩,请考虑以下因素:
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。
听起来像你应该写一个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是本机浮点类型,因此我将使得等级数组成为双打数组,并使average()
函数返回Double
。