2016-01-24 122 views
0

我们被要求编写验证GTIN-8代码的程序。 的valdation如下:为什么我得到这个错误“IndexError:字符串索引超出范围”

  1. 乘第一7位交替由3然后1

  2. 添加起来

  3. 减去该数量从10

  4. 的相等或更高的多
  5. 生成的数字是第八位数字

这里是我的代码:

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编码

后,我在一个新的和有效的GTIN-8编码键入它仍然说,这是无效的

之后,出现这种情况:

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 

我不明白为什么我 会感谢任何帮助。

+1

你可以尝试打印gtin,就在你出错之前 – AlokThakur

+1

gtin = str(gtin)'是什么意思?这在Python 2中会有一些意义 - 但是在那种情况下你应该使用'raw_input'。另一方面,如果这个*是* Python 2那么'gtin.isdigit()'会抛出一个运行时错误,如果用户事实上输入了一些只包含数字的东西。 –

+0

请研究发布指南,您必须提取一个最小的发布示例,而不是您在此处引用的所有内容。这也是有原因的! –

回答

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)) 
+0

我希望他能从中学到一些很好的编码风格。 –

1

我会建议做一个“is_valid_gtin”函数,它只检查GTIN是否有效,没有I/O。然后一个简单的 “主()” 来检查代码:

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() 
0

该缺陷是在该行

if eightdigit == (gtin[7]): 

eightdigit是int但gtin[7]是一个字符串。因此,这种比较是始终为 false - 因此您处于无限循环(只要您输入至少包含8个字符的字符串)。你越来越沮丧,然后只是按下回车键 - 它将您的代码传递给空字符串,缺少第八个字符会触发索引超出范围错误。

因此,你将需要:

if eightdigit == int(gtin[7]): 

来解决特定的漏洞,尽管这仍然会留下一个逻辑上的错误 - 因为在您的代码底部的循环不会验证输入和您正在尝试使用之前的输入计算checkdigit来检查新的候选gtins。您应该遵循@JacquesSupik的出色想法并重构代码,以便将验证逻辑从I/O逻辑中分离出来。

相关问题