0

以下は、学習演習として Python 2.7 で作成した単純なミルから度への変換計算機の (半) 完成版です。私はPythonが初めてで、まだ問題を解決しています。前提は、ユーザーがミルを度に、またはその逆に変換することを選択することです。ユーザーが選択した単位の方位角を入力すると、それが別の単位に変換されます。ユーザーが無効なメニュー オプションを選択すると、その旨が通知されます。範囲外の方位角 (度の場合は 1 ~ 360、ミルの場合は 1 ~ 6400) に入ると、通知され、最初からやり直す必要があります。問題は、ユーザーが無効な方位角 (たとえば 365 度) を入力すると、メニューに戻されることです。if/else ループで前のステップに戻る方法はありますか?フォーラムとドキュメントを検索しましたが、できないようです。また、私は Python を初めて使用するので、このコードをより効率的にするにはどうすればよいですか? 関数定義にifステートメントとelifステートメントを含める必要がありますか? または、エラーや冗長な出力を作成せずにそれらを組み合わせることができますか? 私はそうすることに成功していません。すべてのご意見を歓迎します。

#Mil-Deg.py
#Simple Mils / Degrees Conversion Calculator
#6 JAN 2013

#Note: 6400 mils / 360 degrees in a circle. 17.78 mils to one degree.

import sys
import math
import winsound

#Define menu function
def menu():                     

    print 
    print " Mils / Degrees Conversion Calculator"
    print "-" * 38
    print 
    print "Options: "
    print "1. Degrees to Mils"
    print 
    print "2. Mils to Degrees"
    print 
    print "3. Quit"
    print "-" * 20
    print 
    return input ("Choose your option: ")
    print 

#Define mils to degrees function    
def m2d(a):
    if a <= 6400 and a >= 1:    #get user input within given range      
        b = 17.78
        c = round((a / b),0)    #convert and round to nearest degree  
        if c > 359 or c < 1:    #change 0 degrees to 360               
            c = 360
            #Output
            print
            print a, "mils =", int (c), "degrees"    
        else:
            print
            print a, "mils =", int (c), "degrees"
    elif a > -1 and a < 1:      #change 0 mils to 6400
        a = 6400
        b = 17.78
        c = round((a / b), 0)   #math, same as above
        if c > 359 or c < 1:    #0 to 360, same as above              
            c = 360
            #Output
            print
            print 6400, "mils =", int (c), "degrees"   
        else:
            print
            print a, "mils =", int (c), "degrees"
    else:
        #warning, mulligan
        winsound.Beep(440, 500)
        print 
        print "*** There are only 6400 mils in a circle. Try again. ***"
    print
    print "-" * 38
    print

#define degrees to mils function        
def d2m(b):
    if b <= 360 and b > 0:          #get user input within given range
        a = 17.78
        c = round((b * a),0)        #convert and round to nearest mil
        if c >= 6400:               #set limit to 6400 mils
            c = 6400
            #Output
            print
            print b, "degrees =", int (c), "mils"
        else:
            print
            print b, "degrees =", int (c), "mils"
    elif b > -1 and b < 1:          #change 0 to 360 degrees
        b = 360
        a = 17.78
        c = round((b * a),0)        #math, same as above
        if c >= 6400:
            c = 6400
            #Output
            print
            print 360, "degrees =", int (c), "mils"
        else:
            print
            print b, "degrees =", int (c), "mils"
    else:
        #warning
        winsound.Beep(440, 500)
        print 
        print "*** There are only 360 degrees in a circle. Try again. ***"
    print
    print "-" * 38
    print


#Begin program
loop = 1
choice = 0
while loop == 1:
    choice = menu()                 #Menu function call
    if choice == 1:                 #If user chooses degrees to mils:
        #Output
        print
        print "Enter your azimuth in degrees (1 - 360)"
        print 
        d2m(input("Degrees: "))     #function call

    elif choice == 2:               #If user chooses mils to degrees:
        #Output
        print
        print "Enter your azimuth in mils (1 - 6400)"
        print 
        m2d(input("Mils: "))        #function call

    elif choice == 3:               #If user chooses quit, exit program
        loop = 0

    elif choice != 1 and choice != 2 and choice != 3:   #if user makes invalid menu choice:
        #warning
        winsound.Beep(440, 500)
        print
        print
        print
        print choice, "is not a valid choice."
        print
        print "Please choose from the available options."
        print
        print

print 
print "-" * 38
print 
print "Thank you for using Mil-Deg.py"
print
print
4

2 に答える 2

0

コードを少しクリーンアップし、次の変更を加えました。

  1. 印刷ステートメントを修正しました
  2. メソッド名を修正しました。メソッド名は説明的でなければなりません。文字は自由に入力できるので、完全な単語を入力することにけちをしないでください。
  3. あなたのメソッドは出力を出力し、ロジックを複製していたので、代わりに値を返すようにクリーンアップしました。このようにして、これらのメソッドを後で他のプログラムで使用できます。
  4. ユーザーの入力をチェックするためのヘルパー メソッドを追加しました (同じコードの繰り返し/コピーと貼り付けを停止するため)。
  5. 文字列の関数を使用してformat、計算を簡単に出力できるようにしました。

結果は次のとおりです。

import sys
import math
import winsound

#Define menu function
def menu():                     
    '''This function prints the main menu''' # this is a docstring for your method
    print "\nMils / Degrees Conversion Calculator"
    print "-" * 38
    print "\nOptions: "
    print "1. Degrees to Mils\n"
    print "2. Mils to Degrees\n"
    print "3. Quit\n"
    print "-" * 20
    print "\n"


#Define mils to degrees function    
def mils_to_degrees(a): # use method names that make sense
    '''This function takes mils and converts them into degrees'''
    b = 17.78
    c = round((a / b),0)    #convert and round to nearest degree  
    if c > 359 or c < 1:    #change 0 degrees to 360               
        c = 360
    return (a,int(c))

#define degrees to mils function        
def degrees_to_mils(b):
    '''This method converts degrees to mils'''
    a = 17.78
    if b == 0:
        b = 360
    c = round((b * a),0)        #math, same as above
    if c > 6400:               #set limit to 6400 mils
        c = 6400
    return (b,c)

def check_input(user_input):
    '''Checks if the input is a number'''
    try:
        converted_number = int(user_input)
    except ValueError:
        return -1
    return converted_number

#Begin program
loop = True
while loop:
    menu()
    choice = int(raw_input("Choose your option: "))
    if choice not in [1,2,3]:
        winsound.Beep(440, 500)
        print choice, "is not a valid choice.\n"
        print "Please choose from the available options.\n"
        menu()
        choice = int(raw_input('Choose your option: '))

    if choice == 1:
        print "\nEnter your azimuth in degrees (0 - 360)\n"
        degrees = check_input(raw_input('Degrees: '))
        if degrees > 360 or degrees < 0:
            print 'Please enter a value between 0 and 360'
        else:
            result = degrees_to_mils(degrees) # function call
            print '{} degrees = {} mils'.format(*result)
            print "-" * 38

    elif choice == 2:               #If user chooses mils to degrees:
        print "\nEnter your azimuth in mils (1 - 6400)\n"
        mils = check_input(raw_input('Mils: '))
        if mils > 6400 or mils < 1:
            print 'Please enter a value between 1 and 6400'
        else:
            result = mils_to_degrees(mils)        #function call
            print '{} mils = {} degrees'.format(*result)
            print "-" * 38

    elif choice == 3: 
        loop = False

print "\n"
print "-" * 38
print "\nThank you for using Mil-Deg.py\n\n"
于 2013-01-10T06:19:09.850 に答える
0

コメントで Ashwini が述べたように、if-else条件付きブロックは実際にはループではないため、while ループを使用すると、質問のプログラム フロー部分に答える必要があります。

elif と一般的なエレガンスの観点から、関数の辞書を使用して複数のオプションを処理するこの方法を検討してください。ここにある少数のオプションでは確かに必要ありませんが、Python が辞書と関数をクラスとして処理する方法を練習するのに役立つかもしれません。

\nスタイル的には、これらすべての不要な print ステートメントの代わりに、改行エスケープ シーケンスを使用することをお勧めします。

于 2013-01-09T06:03:49.543 に答える