2016-06-18 5 views
0

Warum funktioniert dieser Code nicht, wenn ich zum ersten Mal ein A hinzufüge, funktioniert es aber dann geht es zu 2.66 und geht von dort weiter, wenn es bei 4.0 bleiben soll.Warum funktioniert mein GPA Double-Wert in Swift nicht korrekt?

import UIKit 

//Quantity of   A A- B+ B B- C+ C C- D+ D D- F 
var gradesQuantity = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] 
var gradesAdded = 0.0 
var gpa = 0.0 

func addGrades(grades: [Double]) -> Double { 
    for grade in grades { 
     gradesAdded += grade 
     if gradesQuantity[0] <= 0 { 
      gradesQuantity[0] = 0 
     } 
    } 

    return gradesAdded 
} 

func calcGPA(grades: [Double]) -> Double { 
    gpa = (grades[0] * 4.0 + grades[1] * 3.7 + grades[2] * 3.3 + grades[3] * 3.0 + grades[4] * 2.7 + grades[5] * 2.3 + grades[6] * 2.0 + grades[7] * 1.7 + grades[8] * 1.3 + grades[9] * 1.0 + grades[10] * 0.7)/gradesAdded 

    return gpa 
} 

class ViewController: UIViewController { 

    @IBOutlet weak var GPALabel: UILabel! 
    @IBOutlet weak var GPANumber: UILabel! 
    @IBOutlet weak var AQuantity: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    @IBAction func AddA() { 
     gradesQuantity[0] += 1.0 
     addGrades(gradesQuantity) 
     let x = calcGPA(gradesQuantity) 
     GPANumber.text = String(x) 
     AQuantity.text = String(Int(gradesQuantity[0])) 
    } 

    @IBAction func SubtractA() { 
     gradesQuantity[0] -= 1.0 
     addGrades(gradesQuantity) 
     let x = calcGPA(gradesQuantity) 
     GPANumber.text = String(x) 
     AQuantity.text = String(Int(gradesQuantity[0])) 
    } 
} 

kann bitte jemand helfen ich dies in Spielplatz setzen und fügen Sie Code darunter, dass das gleiche in den Tasten und es funktioniert, aber in dem Projekt funktioniert es nicht. Dies führt zu der Annahme, dass das Problem in den Schaltflächen addA und subtractA liegt.

+0

Können Sie erklären, etwas mehr darüber, was die App tun soll und wie die gpa gewichtet wird? –

+0

Sollten Sie 'gradeAdded' bei jeder Berechnung nicht auf 0 zurücksetzen? – Paulw11

Antwort

0

Ich denke, die Ursache Ihres Problems ist, dass Sie zu viel Arbeit machen. Wenn Sie die addGrades Funktion löschen (die eigentlich keine Funktionalität erweitert, soweit ich das beurteilen kann), und ersetzen Sie Ihre AddA und SubtractA Funktionen mit den folgenden, dann wird es wie vorgesehen:

@IBAction func AddA() { 
    gradesQuantity[0] += 1.0 
    gradesAdded += 1.0 
    GPANumber.text = String(calcGPA(gradesQuantity)) 
    AQuantity.text = String(Int(gradesQuantity[0])) 
} 

@IBAction func SubtractA() { 
    gradesQuantity[0] -= 1.0 
    gradesAdded -= 1.0 
    GPANumber.text = String(calcGPA(gradesQuantity)) 
    AQuantity.text = String(Int(gradesQuantity[0])) 
} 

Für die weitere Entwicklung Ich würde empfehlen, ein Unterklassen-Array zu erstellen, das Funktionen zum Hinzufügen und Subtrahieren von Noten und zum Zurückgeben des GPA enthält. Dies sollte die Dinge viel lesbarer und wiederverwendbar machen.

+0

Vielen Dank, es funktioniert jetzt richtig! – tchristofferson

1

Sie schreiben Funktionen mit Nebenwirkungen (externe Variablen ändern). Versuche das zu vermeiden. Vielleicht möchten Sie auch etwas mehr Struktur in Ihrem Programm haben. Associate Positionswert von gradesQuantity auf ein Schreiben Klasse ist in Ordnung, aber man kann mit einem Wörterbuch besser:

enum GradeLetter: Double { 
    case A = 4.0 
    case AMinus = 3.7 
    case BPlus = 3.3 
    case B = 3 
    case BMinus = 2.7 
    case CPlus = 2.3 
    case C = 2 
    case CMinus = 1.7 
    case DPlus = 1.3 
    case D = 1 
    case DMinus = 0.7 
    case F = 0 
} 

func calculateGPA(grades: [GradeLetter: Int]) -> Double { 
    let courseCount = grades.reduce(0.0) { aggregate, grade in 
     return aggregate + Double(grade.1) 
    } 
    let totalPoint = grades.reduce(0.0) { aggregate, grade in 
     return aggregate + grade.0.rawValue * Double(grade.1) 
    } 

    return totalPoint/courseCount 
} 

Angenommen, Sie haben 1 A, 2 A- und 3 B:

var grades = [GradeLetter: Int]() 
grades[.A] = 1 
grades[.AMinus] = 2 
grades[.B] = 3 

print(calculateGPA(grades))