2017-03-12 11 views
-3

프로그램을 실행하고 값 3, 1, 1을 넣으면 한 컵을 스푼으로 변환 할 때, 그것은 하단에있는 TOtbsp 함수를 사용합니다. 문제 해결을 위해 최종 결과가 나오기 전에 4 가지 변수를 출력하도록했습니다.사전 값 (정수)으로 정수를 곱하려고하면 아무런 의미가없는 답을줍니다.

은에 컵을 변환 : 이러한 변수는 모든 즉, 무엇을 제공하는 것은 이것을 TOtbsp 기능입니다 있어요 ^, 올바른 결과에서

def TOtbsp(): 
    os.system('cls') 
    print ('Convert ' + convFROMconv + ' to: tablespoons') 
    dictEnt = dCallOne['tbsp'] 
    print (dCallOne['tbsp']) 
    print (dCallOne) 
    print (dictEnt) 
    print (convFactor) 
    calc = convFactor * dictEnt 
    print(calc) 

를 인쇄 큰술

16 
{'tbsp': 16, 'tsp': 48, 'quart': 0.25, 'floz': 8.32674, 'pint':0.5,'gal':0.0625, 'ml': 236.588, 'liter': 0.236588} 
16 
1 
1111111111111111 

이들은 제외한 모든 올바른지 마지막 하나, calc. 내가 아는 한

calc = convFactor * dictEnt 
calc = (convFactor * dictEnt) 
calc = (convFactor * dCallOne['tbsp']) 
calc = (convFactor * (dCallOne['tbsp']) 
(convFactor * dictEnt) = calc 
(convFactor * (dCallOne['tbsp']) = calc 
convFactor * dictEnt = calc 
(convFactor * dCallOne['tbsp']) = calc 

,이 모두가, 어쩌면 바닥 네, excapt 모두 convFactor, dictEntdCallOne 모두 얻을 수 있기 때문에 정확한 답변을 얻을해야한다 : 나는 몇 가지 다른 방법으로 그것을 설정 시도했습니다 정수.

전체 코드는 다음과 같습니다.

import os 

tbsp = {'tbsp' : 1 , 
     'cup' : 0.0625 , 
     'tsp' : 3 , 
     'quart' : 0.015625 , 
     'floz' : 0.5 , 
     'pint' : 0.03125 , 
     'gal' : 0.00390625 , 
     'ml' : 14.7868 , 
     'liter' : 0.0147868} 
tsp = {'cup' : 0.0208333 , 'tbsp' : 0.333333 , 'quart' : 0.0052083333 , 'floz' : 0.1666666667 , 'pint' : 0.0104166667, 'gal' : 0.00130208323 , 'ml' : 4.92892 , 'liter' : 0.00492892} 
dictcups = cups = {'tbsp' : 16 , 
     'tsp' : 48 , 
     'quart' : 0.25 , 
     'floz' : 8.32674 , 
     'pint' : 0.5 , 
     'gal' : 0.0625 , 
     'ml' : 236.588 , 
     'liter' : 0.236588} 
quart = {'cup' : 4 , 'tsp' : 192 , 'tbsp' : 64 , 'floz' : 32 , 'pint' : 2 , 'gal' : 0.25 , 'ml' : 946.353 , 'liter' : 0.946353} 
floz = {'cup' : 0.125 , 'tsp' : 6 , 'quart' : 0.03125 , 'tbsp' : 2 , 'pint' : 0.0625 , 'gal' : 0.0078125 , 'ml' : 29.5735 , 'liter' : 0.0295735} 
pint = {'cup' : 2 , 'tsp' : 96 , 'quart' : 0.5 , 'floz' : 16 , 'tbsp' : 32 , 'gal' : 0.125 , 'ml' : 473.176 , 'liter' : 0.473176} 
gal = {'cup' : 16 , 'tsp' : 768 , 'quart' : 4 , 'floz' : 128 , 'pint' : 8 , 'tbsp' : 256 , 'ml' : 3785.41 , 'liter' : 3.78541} 
ml = {'cup' : 0.0042267571 , 'tsp' : 0.202884 , 'quart' : 0.00105669 , 'floz' : 0.033814 , 'pint' : 0.00211338 , 'gal' : 0.000264172 , 'tbsp' : 0.067628 , 'liter' : 0.001} 
liter = {'cup' : 4.226757063 , 'tsp' : 202.884 , 'quart' : 1.05669 , 'floz' : 33.814 , 'pint' : 2.11338 , 'gal' : 0.264172 , 'ml' : 1000 , 'tbsp' : 67.628} 
acceptableInputs = ['1', '2', '3', '4', '5', '6', '7', '8', '9'] #This is used to check if what the user entered is one of the eight acceptable units 

def takeUnit1(): #Figure out what unit the user wants to convert 
    global convFactor 
    print ('Unit Converter') 
    print ('') 
    print ('') 
    print ('Select the unit you want to convert FROM') 
    print ('') 
    print ('1 Tbsp - Tablespoon') 
    print ('2 Tsp - Teaspoon') 
    print ('3 C - Cups') 
    print ('4 qt. - Quart') 
    print ('5 fl. oz. - Fluid Ounce') 
    print ('6 gal. - Gallon') 
    print ('7 ml - Milliliter') 
    print ('8 L - Liter') 
    print ('9 P - Pints') 
    convFROM = input('Unit: ') 
    convFactor = input('How many?: ') 

    if convFROM in acceptableInputs: #Check if input is acceptable 
     global convFROMconv 
     global dCallOne 
     if convFROM == '1': 
      convFROMconv = 'Tablespoons' 
      dCallOne = tbsp 
      takeUnit2() # Run the function to figure out what unit to convert to 

     elif convFROM == '2': 
      convFROMconv = 'Teaspoons' 
      dCallOne = tsp 
      takeUnit2() # Run the function to figure out what unit to convert to 

     elif convFROM == '3': 
      convFROMconv = 'Cups' 
      dCallOne = dictcups 
      takeUnit2() # Run the function to figure out what unit to convert to 

     elif convFROM == '4': 
      convFROMconv = 'Quarts' 
      dCallOne = quart 
      takeUnit2() # Run the function to figure out what unit to convert to 

     elif convFROM == '5': 
      convFROMconv = 'Fluid Ounces' 
      dCallOne = floz 
      takeUnit2() # Run the function to figure out what unit to convert to 

     elif convFROM == '6': 
      convFROMconv = 'Gallons' 
      dCallOne = gal 
      takeUnit2() # Run the function to figure out what unit to convert to 

     elif convFROM == '7': 
      convFROMconv = 'Milliliters' 
      dCallOne = ml 
      takeUnit2() # Run the function to figure out what unit to convert to 

     elif convFROM == '8': 
      convFROMconv = 'Liters' 
      dCallOne = liter 
      takeUnit2() # Run the function to figure out what unit to convert to 

     elif convFROM == '9': 
      convFROMconv = 'Pints' 
      dCallOne = pint 
      takeUnit2() # Run the function to figure out what unit to convert to 

     else: 
      print ('') 

    else: 
     print('That is not an acceptable input, please try again') 


def takeUnit2(): #This function is to figure out what unit the user wants to convert TO 
    os.system('cls') 
    print ('Select the unit you want to convert TO') 
    print ('1 Tbsp - Tablespoon') 
    print ('2 Tsp - Teaspoon') 
    print ('3 C - Cups') 
    print ('4 qt. - Quart') 
    print ('5 fl. oz. - Fluid Ounce') 
    print ('6 gal. - Gallon') 
    print ('7 ml - Milliliter') 
    print ('8 L - Liter') 
    print ('9 P - Pints') 
    convTO = input('Unit: ') 

    if convTO in acceptableInputs: #Checking if it is one of the 8 accepted units 
     global convTOname #Making convTOconv global 
     global TOfunc1 
     if convTO == '1': #This whole statement converts the input number to its corresponding name 
      convTOname = 'tbsp' 
      TOfunc1 = 'TOtbsp' 
      TOtbsp() 

     elif convTO == '2': 
      convTOname = 'tsp' 
      TOfunc1 = 'TOtsp' 
      TOtsp() 

     elif convTO == '3': 
      convTOname = 'cup' 
      TOfunc1 = 'TOcups' 
      TOcup() 

     elif convTO == '4': 
      convTOname = 'quart' 
      TOfunc1 = 'TOquarts' 
      TOquart() 

     elif convTO == '5': 
      convTOname = 'floz' 
      TOfunc1 = 'TOfloz' 
      TOfloz() 

     elif convTO == '6': 
      convTOname = 'gal' 
      TOfunc1 = 'TOgal' 
      TOgal() 

     elif convTO == '7': 
      convTOname = 'ml' 
      TOfunc1 = 'TOml' 
      TOml() 

     elif convTO == '8': 
      convTOname = 'liter' 
      TOfunc1 = 'TOliters' 
      TOliter() 

     elif convTO == '9': 
      convTOname = 'pint' 
      TOfunc1 = 'TOpint' 
      TOpint() 


     else: #Statement requires an else, not intended to ever be used 
      print ('') 

    else: 
     print('That is not an acceptable input, please try again') 


def TOtbsp(): 
    os.system('cls') 
    print ('Convert ' + convFROMconv + ' to: tablespoons') 
    dictEnt = dCallOne['tbsp'] 
    print (dCallOne['tbsp']) 
    print (dCallOne) 
    print (dictEnt) 
    print (convFactor) 
    calc = convFactor * dictEnt 
    print(calc) 

def TOtsp(): 
    os.system('cls') 
    print ('Convert ' + convFROMconv + ' to: teaspoons') 
    print (dCallOne) 
    calc = dCallOne['tsp'] 
    print(calc) 

def TOcup(): 
    os.system('cls') 
    print ('Convert ' + convFROMconv + ' to: cups') 
    print (dCallOne) 
    calc = dCallOne['cup'] 
    print(calc) 

def TOquart(): 
    os.system('cls') 
    print ('Convert ' + convFROMconv + ' to: quarts') 
    print (dCallOne) 
    calc = dCallOne['quart'] 
    print(calc) 

def TOfloz(): 
    os.system('cls') 
    print ('Convert ' + convFROMconv + ' to: fluid ounces') 
    print (dCallOne) 
    calc = dCallOne['floz'] 
    print(calc) 

def TOml(): 
    os.system('cls') 
    print ('Convert ' + convFROMconv + ' to: milliliters') 
    print (dCallOne) 
    calc = dCallOne['ml'] 
    print(calc) 

def TOgal(): 
    os.system('cls') 
    print ('Convert ' + convFROMconv + ' to: gallons') 
    print (dCallOne) 
    calc = dCallOne['gal'] 
    print(calc) 


def TOpint(): 
    os.system('cls') 
    print ('Convert ' + convFROMconv + ' to: pints') 
    print (dCallOne) 
    calc = dCallOne['pint'] 
    print(calc) 

def TOliter(): 
    os.system('cls') 
    print ('Convert ' + convFROMconv + ' to: liters') 
    print (dCallOne) 
    calc = dCallOne['liter'] 
    print(calc) 

takeUnit1() 
+0

불분명. "이것들은 모두 정확합니다, 마지막 것을 제외하고는"- 정확하지 않은 것은 정확히 무엇입니까? "(이유 삽입) 1234를 얻을 것으로 예상했지만 대신 4567을 얻었습니다."라고 말합니다. – Brandin

답변

2

파이썬 3에서는 input() 문자열 (사용자가 숫자를 입력하는 경우에도)을 반환하고, 그래서 convFactor = input('How many?: ') 문자열로 convFactor의 값을 설정한다. 문자열을 숫자로 곱하면 (calc = convFactor * dictEnt에서와 같이) 단순히 문자열을 여러 번 반복하므로 결국 16 개로 끝납니다. 1.

convFactor = int(input('How many?: ')) 
+0

감사! 나는 당신의 대답을 받아들이 기 위해 약간 기다려야 만 할 때 할 것이다. –

+0

사용자가 정수가 아닌 금액을 변환하려면 어떻게해야합니까? ;) –

1

jwodder 귀하의 질문에 대답했습니다 :이 문제를 해결하려면, 이상적으로 input()에 대한 호출 후, 숫자로 convFactor 변환 int()를 사용하여 당신은 당신이 그들과 함께 연산을 수행 할 경우 번호를 입력 문자열을 변환해야 . int()으로 변환 할 수 있지만 float() :을 사용하면 10 진수를 입력 할 수 있습니다.

그러나 프로그램에는 로트 반복이 있습니다. 이것은 이 아니며 좋은 디자인입니다. 프로그램이 필요한 시간보다 길어지고 읽기와 유지가 더 어려워집니다. 독자는 어느 비트가 동일하고 어떤 비트가 다른 것으로 생각되는지 파악해야합니다. 그리고 수정을 원할 때 수정을 여러 장소에 복제해야하는데, 이는 지루하고 오류를 발생시키기 쉽습니다. 위키 백과 문서 Don't repeat yourself을 참조하십시오.

다음은 프로그램의보다 컴팩트 한 버전입니다. 내가 만든 주요 변화는 모든 별도의 변환 비율 사전을 사전으로 사전에 넣는 것입니다. 루프를 사용하여 각 메뉴를 개별적으로 인쇄하는 대신 단위 메뉴를 표시합니다. 또한 루프를 사용하여 유효한 FROM 단위, 변환 할 유효 금액 및 유효한 TO 단위를 가져야합니다.

이 코드는 모든 주요 운영 체제에서 실행됩니다. Python3 용으로 설계되었지만 Python 2 용으로 쉽게 수정할 수 있습니다.

#!/usr/bin/env python3 

''' Volumes conversion calculator 
    See http://stackoverflow.com/q/42743397/4014959 

    Written by Ari Madian 
    Modified by PM 2Ring 2017.03.12 
''' 

import os 

# Clear the terminal. Works on Windows, Mac, and Linux 
def clear(clear_cmd='cls' if os.name == 'nt' else 'clear'): 
    os.system(clear_cmd) 

# Various conversion ratios, in alphabetical order. 
conversion_factors = { 
    'cup': {'cup': 1, 'floz': 8.32674, 'gal': 0.0625, 'liter': 0.236588, 
     'ml': 236.588, 'pint': 0.5, 'quart': 0.25, 'tbsp': 16, 'tsp': 48}, 
    'floz': {'cup': 0.125, 'floz': 1, 'gal': 0.0078125, 'liter': 0.0295735, 
     'ml': 29.5735, 'pint': 0.0625, 'quart': 0.03125, 'tbsp': 2, 'tsp': 6}, 
    'gal': {'cup': 16, 'floz': 128, 'gal': 1, 'liter': 3.78541, 
     'ml': 3785.41, 'pint': 8, 'quart': 4, 'tbsp': 256, 'tsp': 768}, 
    'liter': {'cup': 4.226757063, 'floz': 33.814, 'gal': 0.264172, 'liter': 1, 
     'ml': 1000, 'pint': 2.11338, 'quart': 1.05669, 'tbsp': 67.628, 'tsp': 202.884}, 
    'ml': {'cup': 0.0042267571, 'floz': 0.033814, 'gal': 0.000264172, 'liter': 0.001, 
     'ml': 1, 'pint': 0.00211338, 'quart': 0.00105669, 'tbsp': 0.067628, 'tsp': 0.202884}, 
    'pint': {'cup': 2, 'floz': 16, 'gal': 0.125, 'liter': 0.473176, 
     'ml': 473.176, 'pint': 1, 'quart': 0.5, 'tbsp': 32, 'tsp': 96}, 
    'quart': {'cup': 4, 'floz': 32, 'gal': 0.25, 'liter': 0.946353, 
     'ml': 946.353, 'pint': 2, 'quart': 1, 'tbsp': 64, 'tsp': 192}, 
    'tbsp': {'cup': 0.0625, 'floz': 0.5, 'gal': 0.00390625, 'liter': 0.0147868, 
     'ml': 14.7868, 'pint': 0.03125, 'quart': 0.015625, 'tbsp': 1, 'tsp': 3}, 
    'tsp': {'cup': 0.0208333, 'floz': 0.1666666667, 'gal': 0.00130208323, 'liter': 0.00492892, 
     'ml': 4.92892, 'pint': 0.0104166667, 'quart': 0.0052083333, 'tbsp': 0.333333, 'tsp': 1}, 
} 

# Valid menu selections are single digits 
menu_numbers = '123456789' 

#This is used to check if what the user entered is one of the nine acceptable units 
acceptable_inputs = set(menu_numbers) 

# Convert menu number to conversion ratio key 
units = { 
    '1': 'tbsp', '2': 'tsp', '3': 'cup', '4': 'quart', '5': 'floz', 
    '6': 'gal', '7': 'ml', '8': 'liter', '9': 'pint', 
} 

# Short & long unit names, in menu order 
unit_names = { 
    'tbsp': ('Tbsp', 'Tablespoons'), 
    'tsp': ('Tsp', 'Teaspoons'), 
    'cup': ('C', 'Cups'), 
    'quart': ('qt.', 'Quarts'), 
    'floz': ('fl. oz.', 'Fluid Ounces'), 
    'gal': ('gal.', 'Gallons'), 
    'ml': ('ml', 'Milliliters'), 
    'liter': ('L', 'Liters'), 
    'pint': ('P', 'Pints'), 
} 

def get_unit(): 
    # Display the units menu 
    for i in menu_numbers: 
     key = units[i] 
     short_name, long_name = unit_names[key] 
     print('{0} {1} - {2}'.format(i, short_name, long_name)) 

    # Loop until we get an acceptable input 
    while True: 
     unit_num = input('Unit: ') 
     if unit_num in acceptable_inputs: 
      break 
     print('Please select a unit by its number') 
    return units[unit_num] 

# Perform the conversion 
def convert(from_key, amount, to_key): 
    clear() 
    from_name = unit_names[from_key][1] 
    to_name = unit_names[to_key][1] 
    print('Converting {0} to: {1}'.format(from_name, to_name)) 

    conv_factor = conversion_factors[from_key][to_key] 
    calc = amount * conv_factor 
    print(calc) 

def main(): 
    print('Unit Converter\n\n') 
    print('Select the unit you want to convert FROM\n') 
    from_key = get_unit() 

    # Get number to convert. Loop until we get a valid number. 
    while True: 
     try: 
      amount = float(input('How many?: ')) 
      break 
     except ValueError: 
      print('Bad number. Please try again.') 

    print('Select the unit you want to convert TO\n') 
    to_key = get_unit() 

    convert(from_key, amount, to_key) 


if __name__ == '__main__': 
    main()