2016-03-24 22 views
0

'a nasıl uygulanacağından emin değilim Şu anda bir kimya dersi alıyorum ve güçlü/zayıf asit çözeltilerinin pH'sini hesaplayabilen bir program yapmak eğlenceli olacağını düşündüm. Kod oyun alanlarında çalışıyor ve sonunda bir iOS projesine uygulamak istiyorum. Program 3 parametreyi alır: Asidin başlangıç ​​konsantrasyonu, asidin kimyasal formülü ve asitin denge sabiti (gerekirse). Program, asidin başlangıç ​​konsantrasyonunu alarak başlar, daha sonra asidin kimyasal formülünü alır ve asitin kuvvetli mi zayıf mı olduğunu belirler. Daha sonra, asitin kuvvetine göre pH'yi hesaplamak için bir if ifadesi hazırladım. Asit zayıfsa, bir denge sabiti gereklidir. İşte ben bugüne kadar ne var:Kod çalışıyor, ancak iOS

import UIKit 

func acidConcentration(acidMolarity: Double) -> Double { 
    return acidMolarity 
} 

let initialConcentration = acidConcentration(0.50) 

var hydroniumConcentration = 0.00 

var pH = 0.00 

func determineAcidStrength(acidName: String) -> String { 

    var acidStrength = "" 

    if acidName=="HBr" || acidName=="HI" || acidName=="HClO4" || acidName=="HCl" || acidName=="HClO3" || acidName=="H2SO4" || acidName=="HNO3" { 
     acidStrength = "strong" 
    } else { 
     acidStrength = "weak" 
    } 

    return acidStrength 

} 

let strength = determineAcidStrength("HBr") 

if strength == "strong" { 

    hydroniumConcentration = initialConcentration 

    pH = -log10(hydroniumConcentration) 

    print(String(format: "%.2f", pH)) 

} else { 

    func equilibriumConstant(ka: Double) -> Double { 
     return ka 
    } 

    let eqConstant = equilibriumConstant 

    var weakAcidConcentration = sqrt(eqConstant(1.8e-5) * initialConcentration) 

    pH = -log10(weakAcidConcentration) 

    print(String(format: "%.2f", pH)) 

} 

Ben programlama için çok yeni olduğum için ve bu, acaba herhangi bir kod yazma benim ilk girişimi Elimde ne temizlemek için herhangi bir yolu ya da herhangi bir ipucu varsa kodu daha iyi organize etmek. Herhangi bir yardım takdir edilir. Teşekkürler.

cevap

2

Gönderdiğiniz kod, tek bir işlevde gerçekleştirilebilecek bir şey için aşırı derecede karmaşıktır.

fonksiyonu aşağıdaki 2 bağımsız değişken, bir String olarak acidName ve Double olarak initialConcentration kabul eder ve Double değeri olarak konsantrasyonunu verir. (Aynı çalışır)

İşte
//Just pass in your acid name and initial concentration 
let concentration = calculateConcentration("HBr", initialConcentration: 0.50); 
print(String(format: "%.2f", concentration)); 

daha verimli biraz yazılı fonksiyonun daha küçük bir versiyonu: Burada

func calculateConcentration(acidName: String, initialConcentration: Double) -> Double { 
    var acidIsStrong = false; 

    if acidName=="HBr" || acidName=="HI" || acidName=="HClO4" || acidName=="HCl" || acidName=="HClO3" || acidName=="H2SO4" || acidName=="HNO3" { 
     acidIsStrong = true; 
    } 
    if acidIsStrong { 
     return -log10(initialConcentration); 
    } else { 
     return -log10((1.8e-5) * initialConcentration); 
    } 
} 

fonksiyon örneği kullanımıdır

func calculateConcentration(acidName: String, initialConcentration: Double) -> Double { 
    if acidName=="HBr" || acidName=="HI" || acidName=="HClO4" || acidName=="HCl" || acidName=="HClO3" || acidName=="H2SO4" || acidName=="HNO3" { 
     return -log10(initialConcentration); 
    } 
    return -log10((1.8e-5) * initialConcentration); 
} 

Ve çok okunaklı olmayan daha küçük bir versiyon:

func calculateConcentration(acidName: String, initialConcentration: Double) -> Double { 
    return -log10(initialConcentration * ((acidName=="HBr" || acidName=="HI" || acidName=="HClO4" || acidName=="HCl" || acidName=="HClO3" || acidName=="H2SO4" || acidName=="HNO3") ? (1.8e-5) : 1.0)); 
} 
0

Ben bu yüzden, ben formülü hakkında emin değilim bir kimyagerin pek değilim, ama bu nasıl: Bu gibi basit bir uygulama için ... Bir uygulamayı oluşturmaya gelince

class Acid: CustomStringConvertible { 

    static let strongAcids = [ "HBr", "HI", "HClO4", "HCl", "HClO3", "H2SO4", "HNO3" ] 

    var name: String 
    var concentration: Double 
    var equilibriumConstant: Double? 

    var pH: Double { 
     get { 
      var adjustedConcentration = concentration 
      if !Acid.strongAcids.contains(name) { 
       guard let ka = equilibriumConstant else { 
        return Double.NaN; 
       } 
       adjustedConcentration = sqrt(ka * concentration) 
      } 
      return -log10(adjustedConcentration) 
     } 
    } 

    init(name: String, concentration: Double, equilibriumConstant ka: Double? = nil) { 
     self.name = name 
     self.concentration = concentration 
     self.equilibriumConstant = ka 
    } 

    var description: String { 
     get { 
      if let ka = equilibriumConstant { 
       return "\(name) (concentration: \(concentration)/EqK: \(ka) pH: \(String(format: "%.2f", pH)))" 

      } else { 
       return "\(name) (concentration: \(concentration)/pH: \(String(format: "%.2f", pH)))" 
      } 
     } 
    } 
} 

let acid = Acid(name: "HBr", concentration: 0.5); 
print("\(acid)") // prints "HBr (concentration: 0.5/pH: 0.30)" 
print(String(format: "%.2f", acid.pH)) // prints "0.30" 
let weakAcid = Acid(name: "Weak", concentration: 0.2, equilibriumConstant: 1.8e-5) 
print("\(weakAcid)") // prints "Weak (concentration: 0.2/EqK: 1.8e-05 pH: 2.72)" 

yapabilirsiniz Muhtemelen 3 metin alanları (isim, konsantrasyon ve sabit) ile bir "Tek Görünüm Uygulaması" oluşturun ve bir düğme "hesaplayın". Umarım bu mantıklıdır.

İlgili konular