как написать func о сравнении логического значения в func swift 4 - PullRequest
0 голосов
/ 08 сентября 2018

Напишите функцию, которая возвращает 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)      

Как правильно написать код

я хочу вывод: печатает "Лоис бьет Питера"

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Если ваш единственный метод сравнения - это оценки ученика, учтите следующее:

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.

0 голосов
/ 08 сентября 2018

Мне кажется, что вы должны написать метод экземпляра вашего 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)")
}

(Обратите внимание, что приведенный выше код не позволяет двум учащимся иметь одинаковый средний балл.)

Проверьте, можете ли вы разработать код для метода hasHigherAverageThan(otherStudent:).

EDIT:

Еще одна вещь: вы дали вашему Student объекту массив значений оценки, что кажется разумным. Почему ваша средняя функция принимает какие-либо параметры, а тем более переменный параметр? Вероятно, следует написать без параметров:

func average() -> Float 

Для вычисления средней оценки будет использоваться массив grades.

РЕДАКТИРОВАТЬ # 2:

Я бы переписал вашу среднюю функцию следующим образом:

func average() -> Float {
    guard !grades.isEmpty else { return 0.0 } 
    return Float(grades.reduce(0.0, { $0 + Double($1) })/Double(grades.count))
}

Изменения:

  1. Избавился от параметров
  2. Избавился от assert и вместо этого вернул 0, если массив пуст

(Вы также можете сделать так, чтобы он возвращал Optional Float / Double и возвращал nil, если массив пуст.)

Я бы также предложил остановиться на одном типе с плавающей запятой и использовать его повсеместно. Double является родным типом с плавающей точкой, поэтому я бы сделал массив классов массивом типа Double, а функция average() вернула бы Double.

...