我们被要求编写一个验证GTIN-8代码的程序。 价值如下:
将前7位数交替乘以3然后1
添加
从10
结果数字是第八位
这是我的代码:
def validgtin():
gtin = input("Enter the 8 digits of GTIN-8 product code: ")
valid = False
while valid == False:
if gtin.isdigit():
gtin = str(gtin)
if len(gtin) == 8:
valid = True
else:
print("That is not correct, enter 8 digits, try again: ")
gtin = input("Enter the 8 digits of GTIN-8 product code: ")
else:
print("That is not correct, type in numbers, try again: ")
gtin = input("Enter the 8 digits of GTIN-8 product code: ")
sumdigit = 3*(int(gtin[0])) + 1*(int(gtin[1])) + 3*(int(gtin[2])) + 1*(int(gtin[3])) + 3*(int(gtin[4])) + 1*(int(gtin[5])) + 3*(int(gtin[6])) #sum of the digits
gtin = str(gtin)
valid1 = False
while not valid1:
if sumdigit%10 == 0:
eightdigit = 0
else:
eightdigit = (((sumdigit + 10)//10)*10) - sumdigit
if eightdigit == (gtin[7]):
valid1 = True
print("Your GTIN-8 product code is valid.")
else:
print("Your GTIN-8 product code is not valid.")
gtin = input("Enter the 8 digits of GTIN-8 product code: ")
return
validgtin()
当我运行此代码并输入无效的GTIN-8代码时,它表示代码无效并提示我输入新的GTIN-8代码
BUT
输入新的有效GTIN-8代码后,它仍然表示无效
AND
之后会发生这种情况:
Traceback (most recent call last):
File "C:\Users\Yash Dwivedi\Documents\Year 10\GCSE Computing\Assignment\Task 1 v2.py", line 29, in validgtin
if eightdigit == (gtin[7]):
IndexError: string index out of range
我不明白为什么 我会感谢任何帮助。
答案 0 :(得分:1)
我建议制作一个“is_valid_gtin”函数,只检查GTIN是否有效,没有I / O.然后用一个简单的“main()”来检查代码:
def is_valid_gtin(gtin):
if len(gtin) != 8 or not gtin.isdigit():
return False
sum = 0
for i in list(gtin)[0:6:2]:
sum += 3*int(i)
for i in list(gtin)[1:6:2]:
sum += int(i)
checksum = (10 - sum % 10) % 10
return checksum == int(gtin[7])
def main():
while (True):
gtin = input("Enter the 8 digits of GTIN-8 product code: ")
if is_valid_gtin(gtin):
print("Your GTIN-8 product code is valid.")
break
else:
print("That is not correct, try again.")
if __name__ == '__main__':
main()
答案 1 :(得分:0)
这是我的快速实施。可悲的是,我没有任何测试数据来检查它是否正确!
def _round_up_ten(number):
if number % 10 == 0:
return number
return 10 * (1 + (number / 10))
def validate_gtin(gtin):
if not gtin.isdigit() or len(gtin) != 8:
raise ValueError("GTIN must be an 8-digit number")
digits = [int(digit) for digit in gtin[:-1]]
check_digit = int(gtin[-1])
multiplied_digits = (
digits[0] * 3
+ digits[1]
+ digits[2] * 3
+ digits[3]
+ digits[4] * 3
+ digits[5]
+ digits[6] * 3
)
expected_check_digit = _round_up_ten(multiplied_digits) - multiplied_digits
if check_digit!= expected_check_digit:
raise ValueError("Incorrect check digit ({}) (expected {})".format(check_digit, expected_check_digit))
答案 2 :(得分:0)
错误在行
if eightdigit == (gtin[7]):
eightdigit
是一个int,但gtin[7]
是一个字符串。因此,此比较始终为false - 因此您处于无限循环中(只要您输入至少包含8个字符的字符串)。你变得沮丧,然后只需按下回车键 - 它会将你的代码传递给空字符串,缺少第八个字符会触发索引超出范围错误。
因此你需要:
if eightdigit == int(gtin[7]):
修复那个特定的bug,虽然这仍然会给你留下一个逻辑错误 - 因为代码底部的循环不会验证输入,而你正试图检查新的候选gtins对照一个用于计算的checkdigit 之前的输入。您应该遵循@JacquesSupik的优点并重构代码,以便验证逻辑与I / O逻辑分离。