2016-11-16 4 views
1

В настоящее время я работаю над проектом Университета Maths, который требует от меня создания приложения в отношении ипотеки. Я пытаюсь написать код Swift для расчета основных сумм и процентов, выплачиваемых в каждом месяце ипотеки.Ошибка EXC_BAD_INSTRUCTION при попытке печати функции в Swift Playground

Код я написал следующим образом (стоит отметить, я очень новой для кодирования с небольшим опытом работы с Python, все это самоучка так что любой критический анализ приветствуется!):

// Declare all variables 
// y = periodic interest rate 
// n = time left of repayment period (months) 

let y = [Float](arrayLiteral: 0.02/12,0.03/12,0.04/12,0.05/12) 
let n = [Float](arrayLiteral: 240,180,120,60) 

var x = [Float]() 
var interest = [Float]() 
var T_1 = [Int]() 

// Create Array from 0 to 240 
for a in 0...240 { 
    T_1.append(a) 
} 

// Create Array of all 240 interest values 

for a in 0...239 { 
    if a < 60 { 
     interest.append(y[0]) 
     var repay = n[0] 
     x.append(repay) 
    } 
    else if a < 120 { 
     interest.append(y[1]) 
     var repay = n[1] 
     x.append(repay) 
    } 
    else if a < 180 { 
     interest.append(y[2]) 
     var repay = n[2] 
     x.append(repay) 
    } 
    else { 
     interest.append(y[3]) 
     var repay = n[3] 
     x.append(repay) 
    } 
} 
print("Interest array:",interest) 

// Calculate Each months Principal paid and Interest Paid 

func variablerate(P: inout Float) -> [Float] { 
    var principal = [Float]() 
    var i_paid = [Float]() 
    var repayments = [Float]() 
    var R = Float(0) 
    let temporaryP = P 
    i_paid.append(0) 

    for a in 0...240 { 
     if (a>0) && (a<240) && (interest[a-1] == interest[a]) { 
      let ip = P*(1+interest[a-1])-P 
      i_paid.append(i_paid[a-1] + ip) 
      P = (1+interest[a-1])*temporaryP 
      P = P-R 
      let h = interest[a] 
      R = (P*h)/(1-pow(1+h,Float(interest.count-a))) 
      repayments.append(R) 
      principal.append(round(100*P)/100) 
     } 
     else if a==240 || a==241 { 
      P = P - R 
      principal.append(round(100*P)/100) 
      let ip = P*(1+interest[a-1])-P 
      i_paid.append(i_paid[a-1] + ip) 
      let h = interest[a-1] 
      P = P*(1+h) 
     } 
     else { 
      P = P - R 
      let h = interest[a] 
      R = (P*h)/(1-pow(1+h,Float(interest.count-a))) 
      repayments.append(R) 
      principal.append(round(100*P)/100) 
      let ip = P*(1+interest[a])-P 
      i_paid.append(i_paid[a-1] + ip) 
      P = P*(1+h) 
     } 
    } 
    return i_paid 
    return principal 

} 
var z = Float(100000) 

print(variablerate(P: &z)) //This is where the error appears 

приведенная погрешность:

error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP,subcode=0x0).

Любая помощь или руководство по этому вопросу будет оценена по весу!

+0

Я получаю ошибки до этого, такие как неразрешенный идентификатор 'pow'? – dylan

+0

@dylan На моей Swift Playground нет других ошибок. pow (double, double) используется для выражений с использованием полномочий. –

+0

Выполнение кода в скомпилированном проекте прерывается с «фатальной ошибкой: индекс за пределами диапазона» в 'i_paid.append (i_paid [a-1] + ip)' когда 'a' равно нулю ... –

ответ

1

Причина аварии Индекс за пределами допустимого диапазона.

Вы получаете индекс из исключения диапазона, так как в коде вы работаете цикл от 0 до 240 и от локальной переменной вычитая 1 так что в первой итерации будет содержать 0 и вычитанием 1 из 0 будет дают отрицательный индекс.

Вот ошибка

для в 0 ... 240 {
если (а> 0) & & (а < 240) & & (интереса [A-1] == интерес [а])

Ниже код с коррекцией

// Declare all variables 
// y = periodic interest rate 
// n = time left of repayment period (months) 

let y = [Float](arrayLiteral: 0.02/12,0.03/12,0.04/12,0.05/12) 
let n = [Float](arrayLiteral: 240,180,120,60) 

var x = [Float]() 
var interest = [Float]() 
var T_1 = [Int]() 

// Create Array from 0 to 240 
for a in 0...240 { 
    T_1.append(a) 
} 

// Create Array of all 240 interest values 

for a in 0...239 { 
    if a < 60 { 
     interest.append(y[0]) 
     var repay = n[0] 
     x.append(repay) 
    } 
    else if a < 120 { 
     interest.append(y[1]) 
     var repay = n[1] 
     x.append(repay) 
    } 
    else if a < 180 { 
     interest.append(y[2]) 
     var repay = n[2] 
     x.append(repay) 
    } 
    else { 
     interest.append(y[3]) 
     var repay = n[3] 
     x.append(repay) 
    } 
} 
print("Interest array:",interest) 

// Calculate Each months Principal paid and Interest Paid 

func variablerate(P: inout Float) -> [Float] { 
    var principal = [Float]() 
    var i_paid = [Float]() 
    var repayments = [Float]() 
    var R = Float(0) 
    let temporaryP = P 
    i_paid.append(0) 

    for a in 1...240 { // Code corrected now loop go from 1 to 240 
     if (a>0) && (a<240) && (interest[a-1] == interest[a]) { 
      let ip = P*(1+interest[a-1])-P 
      i_paid.append(i_paid[a-1] + ip) 
      P = (1+interest[a-1])*temporaryP 
      P = P-R 
      let h = interest[a] 
      R = (P*h)/(1-pow(1+h,Float(interest.count-a))) 
      repayments.append(R) 
      principal.append(round(100*P)/100) 
     } 
     else if a == 240 || a == 241 { 
      P = P - R 
      principal.append(round(100*P)/100) 
      let ip = P*(1+interest[a-1])-P 
      i_paid.append(i_paid[a-1] + ip) 
      let h = interest[a-1] 
      P = P*(1+h) 
     } 
     else { 
      P = P - R 
      let h = interest[a] 
      R = (P*h)/(1-pow(1+h,Float(interest.count-a))) 
      repayments.append(R) 
      principal.append(round(100*P)/100) 
      let ip = P*(1+interest[a])-P 
      i_paid.append(i_paid[a-1] + ip) 
      P = P*(1+h) 
     } 
    } 
    //return i_paid 
    return principal 

} 
var z = Float(100000) 

print("\(variablerate(P: &z))") 
+0

Спасибо Сунил, работая, как я надеялся! –

Смежные вопросы