Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  5 5151
Hei, har den siste uken prøvd å lære meg python og syntes det har vært veldig gøy. Etter å ha startet litt på codecademy og sett på ulike "tutorials og liknende" på youtube ville jeg prøve å starte mitt eget lille prosjekt.
Jeg bestemte meg for å lage en simpel kalkulator for formler vi har hatt nylig på skolen. Men mitt problem er at jeg ikke klarer å gå tilbake til starten av koden etter jeg er ferdig med å bruke et av "modusene"... er det noen måte, vet at goto ikke finnes i python
(Ja jeg vet det er en dårlig skrevet kode som er uoversiktelig, men som sagt, startet jeg for omtrent en uke siden)

Kode

#Kalkulator laget av megselv
def kalkulator():
    import math

    print ("Velkommen til min Kalkulator 1.0")
    mode = input("Hvilke modus vil du bruke: ")
    if mode == "help":       
        print ("arealsetningen", "sinus, cosinus eller tangens", "kvadratrot", sep="\n")
        return True
    if mode == "arealsetningen":
        a = eval(input("Hvor mange grader er vinkelen: "))
        resultat = math.sin(math.radians(a))
        value_1 = eval(input("Hvor lang er verdi 1: "))
        value_2 = eval(input("Hvor lang er verdi 2: "))
        if a == 0:
            b = eval(input("Hva er arealet av trekanten: "))
            c = b/(0.5 * value_1 * value_2)
            print ("asin er: " +str(c))
        if value_1 == 0:
            b = eval(input("Hva er arealet av trekanten: "))
            c = b/(0.5 * resultat * value_2)
            print ("den ene siden er: " +str(c))
        if value_2 == 0:
            b = eval(input("Hva er arealet av trekanten: "))
            c = b/(0.5 * value_1 * resultat)
            print ("den ene siden er: " +str(c))            
        elif a > 0 and value_1 > 0 and value_2 > 0:
            arealsetningen = 0.5 * resultat * value_1 * value_2
            print ("Arealet av trekanten er: " +str(arealsetningen))
        return True
        if mode == "sinus" or mode == "sin":
           a = eval(input("Hvor mange grader er vinkelen: "))
        else:    
            resultat = math.sin(math.radians(a))
        print ("Sinus av ", (a), "er " +str(resultat))
        return True
    if mode == "cosinus" or mode == "cos":
        a = eval(input("Hvor mange grader er vinkelen: "))
        resultat = math.cos(math.radians(a))
        print ("Cosinus av ", (a), "er " +str(resultat))
        return True
    if mode == "tangens" or mode == "tan":
        a = eval(input("Hvor mange grader er vinkelen: "))
        resultat = math.tan(math.radians(a))
        print ("Tangens av ", (a), "er " +str(resultat))
        return True
    if mode == "kvadratrot":
        a = eval(input("Hvilke tall vil du ha kvadratroten av: "))
        resultat = math.sqrt(a)
        print ("kvadratroten av ", (a), "er " +str(resultat))
        return True
    
    elif mode != True:
        print ("Det er ikke en modus i min kalkulator:D")
        
kalkulator()
Sist endret av tweey; 1. mai 2017 kl. 20:59.
Hvis du wrapper koden din som håndterer valget man tar av formel med en loop, feks, en while-1 loop. Altså en while(true) som bare vil fortsette helt til den termineres. Da kan du eventuelt ha kode for å håndtere break av loop.

Anbefaler deg å ta en titt på switch-case i Python, så blir koden din for if mode == ... litt mer praktisk.

Edit: Ser også at du har return True etter koden for hvert valg. Dette returnerer programmet ditt til hva som skjer etter kallet ditt av kalkulator() metoden i bunn. Dette må fjernes hvis du ønsker å bruke en loop, fordi return True vil terminere hele metoden.
Sist endret av Claryn; 1. mai 2017 kl. 21:10.
Det er rimelig enkelt, bare å sette nesten hele koden inn i en while loop, slik:

Kode

    mode = ''

    while (mode.lower() != 'quit') or (mode.lower() != 'exit'): 
        print ("Velkommen til min Kalkulator 1.0")
        print ("For å avslutte programmet, bruk enten modusene \'quit\' og \'exit\'.")
        mode = input("Hvilke modus vil du bruke: ")
        if mode == "help":       
            print ("arealsetningen", "sinus, cosinus eller tangens", "kvadratrot", sep="\n")
            return True
        if mode == "arealsetningen":
            a = eval(input("Hvor mange grader er vinkelen: "))
            resultat = math.sin(math.radians(a))
        [...]
EDIT: Som @Claryn påpeker, så må du fjerne alle «return True» hvis du ønsker å bruke mitt eksempel, return vil føre til at programmet returnerer ut fra kalkulator () funksjonen.
Sist endret av 0xFF; 1. mai 2017 kl. 21:17.
Noe annet å tenke på:

Hvis du flytter import math utenfor kalkulator() metoden, så slipper du at koden kjøres og biblioteket importeres hver gang kalkulator() kalles.
Sitat av tweey
Ja jeg vet det er en dårlig skrevet kode som er uoversiktelig
Vis hele sitatet...
Ja det er en del og pirke på
Tar noe her.
Ikke bruk eval,konverter til int,float.
Viser det i koden min som jeg poster til slutt.
Prøv og skrive engelsk på alt som ikke skal ut til brukere.

Du kan unngå alle +str(resultat)),
med og bruke string formatting.
Eks:

Kode

>>> import math
>>> result = math.sqrt(10)
>>> print('kvadratroten av av {} er {}'.format(10, result))
kvadratroten av av 10 er 3.1622776601683795

>>> # Pyhon 3.6 f-string
>>> print(f'kvadratroten av av {10} er {result}')
kvadratroten av av 10 er 3.1622776601683795
Tenke litt på struktur av koden,
plasser alt i 1 funksjon eller en while loop,bør kode være kortere.
Funksjoner er greit,her hopper(goto) til en funksjon,
og faller alltid tilbake til menu.

Kode

import math

def square_root():
    square_r = int(input("Hvilke tall vil du ha kvadratroten av: "))
    result = math.sqrt(square_r)
    print ('kvadratroten av {} er {}'.format(square_r, result))
    input('Push enter to retun to menu')

def cosinus():
    degree = float(input('Hvor mange grader er vinkelen: '))
    result = math.cos(math.radians(degree))
    print ('Cosinus av {} er {}'.format(degree, result))
    input('Push enter to retun to menu')

def menu():
    while True:
        print('(1) Solve cosinus')
        print('(1) Solve Square root')
        print('(Q) Quit')
        choice = input('Enter your choice: ').lower()
        if choice == '1':
            cosinus()
        if choice == '2':
            square_root()
        elif choice == 'q':
            return
        else:
            print('Not a correct choice: <{}>,try again'.format(choice))

if __name__ == '__main__':
    menu()
Sitat av Claryn
Anbefaler deg å ta en titt på switch-case i Python.
Vis hele sitatet...
Nå er det ikke noe switch-case i Python
Jeg skjønner hva du mener,
det finnes mange alternative måter og skrive det på.
Sitat av Claryn Vis innlegg
Anbefaler deg å ta en titt på switch-case i Python, så blir koden din for if mode == ... litt mer praktisk.
Vis hele sitatet...
Python har ikke switch-case. Den pythonske ekvivalenten er

Kode

if foo == 1:
   something()
elif foo == 2:
   something_else()
elif foo == 3:
   something_different()
elif foo == 4:
   something_entirely_different()