2011-12-11 3 views
-2

Nooby 코더는 여기! 내 임무는 지정된 날짜의 요일을 인쇄하는 코드를 작성하는 것입니다. 내 코드는 잘 작동되지만 내가 올바른 형식이 아닌 아무것도 실행할 때 (을 즉, "// 2011"또는 "12/A/2011")는 나에게이 오류 줄 것이다 : 그것은 비록Python 3.2 UnboundLocalError - 요일별 날짜 변환기

line 55, in main if is_date_valid(month, day, year) == False: 
UnboundLocalError: local variable 'month' referenced before assignment 

을 내가 "13/2/2011"을 시도하면 정상적으로 실행됩니다. 선생님이 내가 그것에 대해 물었을 때 그 해결책을 알지 못해서 제 문제를 찾도록 도와주세요! 가 대단히 감사합니다 는 여기에 필요한 (P 무시하고 내 의견) 경우 전체 코드 당신이하지 않아도

import sys 
DAYS_IN_MONTH = ('31', '28', '31', '30', '31', '30', '31', '31', '30', '31', '30', '31') 
MONTHS_IN_WORDS = ("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December") 
DAYS_OF_WEEK = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday') 

def get_date(): 
    str_date = input('Enter date: ')#.strip() = method :D 
    parts = str_date.split('/')#pasts = ['12', '2', '2011'] 
    length = len(parts) 
    if length != 3: 
     raise ValueError('Invalid format for date.') 
    for i in range(length): 
     parts[i] = parts[i].strip() 
     if len(parts[i]) == 0 or not(parts[i].isdigit()): 
      raise ValueError('Invalid format for date.') 
    return(int(parts[0]), int(parts[1]), int(parts[2])) 

def is_date_valid(month, day, year): #is_date_valid = name of function 
    if month < 1 or month > 12 or day < 1 or year < 0: 
     return False 
    if month != 2: 
     return int(day) <= int(DAYS_IN_MONTH[month-1]) 
    additional = 0 
    if year % 400 == 0 or year % 4 == 0 and year % 100 != 0: 
     additional = 1 
    return int(day) <= int(DAYS_IN_MONTH[1]) + int(additional) 

#month, day, year = arguments of function 

def date_as_string(month, day, year): 
    if month > 0 and month < 13: 
     return MONTHS_IN_WORDS[month-1] + ' ' + str(day) + ', ' + str(year) 


def day_of_week(month, day, year): 
    if month < 3: 
     month += 12 
     year -= 1 
    m = month 
    q = day 
    J = year // 100 
    K = year % 100 
    h = (q + 26*(m+1)//10 + K + K//4 + J//4 - 2*J) % 7 
    dayweek = DAYS_OF_WEEK[h-2] 
    return dayweek 

def main(): 
    print('This program calculates the day of the week for any date.') 
    try: 
     (month, day, year) = get_date() 
    except ValueError as error: 
     print("ERROR:", error) 
     sys.exit(1) 
    if is_date_valid(month, day, year) == False: 
     print(str(month) + '/' + str(day) + '/' + str(year) + ' is an invalid date.') 
     print() 

    else: 
     print(date_as_string(month, day, year) + ' is a ' + day_of_week(month, day, year) + '.') 
     print() 



#any function call that can raise an error must be put inside a try block 
if __name__ == '__main__': 
    main() 

답변

0

은 첫째, 당신은 어떤 달에 날짜를 입력 D, 프로그램이 당신을 말할 것이다 한 달. 이것은별로 문제가되지 않는 것 같습니다.

둘째, 두 예제 모두 실제로 "ERROR : 잘못된 형식의 날짜"를 제공하고 사용자가 주장하는 예외는 아닙니다. 마지막 예. 2013 년 3 월 2 일에 '2013 년 3 월 2 일에 잘못된 날짜가 표시됩니다.'라고 표시되지만, '12/2/2011'와 같이 유효한 날짜로 변경하면 '2 월 13 일에 2011 년 2 월 13 일 일요일이됩니다. . "

따라서 프로그램이 완벽하게 작동합니다.