2016-07-25 46 views
-1

該代碼應該採用5位數的郵政編碼輸入並將其轉換爲條碼作爲輸出。每個數字條形碼是:Python - 郵編到條碼

{1:'...!!',2:'..!.!',3:'..!!.',4:'.!..!',5:'.!.!.',6:'.!!..',7:'!...!',8:'!..!.',9:'!.!..',0:'!!...'} 

例如,郵政編碼95014應該產生:

!!.!.. .!.!. !!... ...!! .!..! ...!!! 

有一個在開始和結束一個額外!,其用於確定條碼開始和停止的地方。請注意,在條形碼的到底是一個額外的...!!這是1.這是校驗位,你通過得到的校驗位:

  • 在郵編添加了所有的數字,使之ž
  • 選擇校驗位ç使得Z + C是10

例如一個倍數,郵編95014具有Z的總和 = 9 + 5 + 0 + 1 + 4 = 19,所以檢查di的git Ç是1,使總和Ž + Ç等於20,這是10

def printDigit(digit): 
    digit_dict = {1:'...!!',2:'..!.!',3:'..!!.',4:'.!..!',5:'.!.!.',6:'.!!..',7:'!...!',8:'!..!.',9:'!.!..',0:'!!...'} 
    return digit_dict[digit] 

def printBarCode(zip_code): 
    sum_digits=0 
    num=zip_code 
    while num!=0: 
     sum_digits+=(num%10) 
     num/=10 
    rem = 20-(sum_digits%20) 
    answer=[] 
    for i in str(zip_code): 
     answer.append(printDigit(int(i))) 
    final='!'+' '.join(answer)+'!' 
    return final 

print printBarCode(95014) 

多我現在有的代碼產生的

!!.!.. .!.!. !!... ...!! .!..!!輸出

爲郵政編碼95014缺少校驗位。我的代碼中是否缺少導致代碼不輸出校驗位的內容?另外,在我的代碼中包含哪些內容以要求用戶輸入郵政編碼?

+0

你字面上有校驗位算法。你在編碼時有什麼問題?另外,你是否搜索過「python請求用戶輸入」? –

+0

我知道我有它,但它不工作... – akse232

+0

你正在計算'rem'並從不使用它。 –

回答

1

您的代碼基於數字總和計算rem,但您從不使用它將校驗數字條添加到輸出(answerfinal)。您需要添加代碼才能獲得正確的答案。我懷疑你也沒有正確計算rem,因爲你使用的是%20而不是%10

rem = (10 - sum_digits) % 10 # correct computation for the check digit 
answer=[] 
for i in str(zip_code): 
    answer.append(printDigit(int(i))) 
answer.append(printDigit(rem)) # add the check digit to the answer! 
final='!'+' '.join(answer)+'!' 
return final 
+0

這產生'!!!!!! !! ...... !! !..! !! !!'而不是'!!!!! !! ...... !! !..! ...!'。 – akse232

+0

當我嘗試它時,我會得到後者,所以你必須做出與我所展示的不同的東西。這兩行註釋是唯一不同於問題代碼的。 – Blckknght

0

有趣的問題:

我會跟你替換函數的最後幾行。我注意到你作爲一個C風格的程序員解決了這個問題。我猜你的背景是C/C++。我想提供更多Pythonic方法:

def printBarCode(zip_code): 
    digit_dict = {1:'...!!',2:'..!.!',3:'..!!.',4:'.!..!',5:'.!.!.', 
        6:'.!!..',7:'!...!',8:'!..!.',9:'!.!..',0:'!!...'} 
    zip_code_list = [int(num) for num in str(zip_code)] 
    bar_code = ' '.join([digit_dict[num] for num in zip_code_list]) 
    check_code = digit_dict[10 - sum(zip_code_list) % 10] 
    return '!{} {}!'.format(bar_code, check_code) 

print printBarCode(95014) 

我使用列表理解來處理每個數字而不是迭代。我可以使用map()函數使其更具可讀性,但列表理解更多是Pythonic。另外,我使用Python 3.x格式進行字符串格式化。這裏是輸出:

!!.!.. .!.!. !!... ...!! .!..! ...!!! 
>>>