19 svar
67 visningar
destiny99 behöver inte mer hjälp
destiny99 Online 7909
Postad: 10 nov 10:13

utvidga programmet med en meny

Hej!

 

Jag ska göra detta: Utvidga programmet med en meny där användaren kan välja språk och mata in en sträng som ska översättas. Exempel på hur programmet ska fungera: $ python3 sprak.py Välj språk: 1. Stjärnspråket 2. Viskspråket 3. Rövarspråket 4. Översätt rövarspråket 5. Bebispråket 6. Allspråket 7. Fikonspråket 8. Avsluta Ange ditt val: 1 Ange en sträng att översätta: Stjärnprogrammerare Stella *S*t*j*ä*r*n*p*r*o*g*r*a*m*m*e*r*a*r*e* *S*t*e*l*l*a*. 

 Problemet är att när jag kör och  den frågar  om att välja ett språk tex stjarnspraket och sedan make a choice dvs  och jag väljer 1 och skriver vilken sträng jag vill översätta som den ber mig om vilket  i det här fallet är stjarnspraket så säger den då invalid choice. Try again, och den börjar om från början med att fråga om vilken langugage jag ska välja vilket är mystiskt.  koden ser såhär 

input_text= sys.stdin.readline().split()
val=0
try :
   val=sys.argv[1] 
except:
      val=val
def main():
   if not val:
    while True:
        language_choice=int(input("choose a language:"))
        print("1.Stjarnspraket")
        print("2.Viskspraket")
        print("3.Rovarspraket")
        print("4.Rovarspraket_oversattning")
        print("5.Bebisspraket")
        print("6.Allspraket")
        print("7.Fikonspraket")
        print("8.Avsluta")
        choice=int(input("make a choice:"))
        if choice=='8':
            break
        input_text=input("write a string to interpret:")
        match choice:
            case "1":
                print(Stjarnspraket(input_text))
            case "2":
                print(Viskspraket(input_text))
            case "3":
                print(Rovarspraket(input_text))
            case "4":
                print(Rovarsprak_oversattning(input_text))
            case "5":
                print(Bebisspraket(input_text))
            case "6":
                print(Allspraket(input_text))
            case "7":
                print(Fikonspraket(input_text))
            case _:
                print("Invalid choice.Try again.")

if val:
    match val:
        case "-s":
            print(stjarnsprak(input_text))
        case "-v":
            print(visksprak(input_text))
        case "-r":
            print(rovarsprak(input_text))
        case "-o":
            print(rovarsprak_oversattning(input_text))
        case "-b":
            print(bebissprak(input_text))
        case "-a":
            print(allspraket(input_text))
        case "-f":
            print(fikonsprak(input_text)) 
        case _:
            print("""för att översätta programmet till rätt språk,vänligen följ strukturen:echo "[texten som ska översättas]"| python3 sprak.py
        eller cat filen "[filen som ska översättas]"| python3 sprak.py""")
main()
thedifference 373
Postad: 10 nov 10:26

Du omvandlar choice till en int men din switch (match choice) har bara strings. Siffran 1 är inte samma som tecknet 1.

Enklast att låta bli att omvandla till int. Du ska ju ändå inte utföra någon matematik på värdet.

destiny99 Online 7909
Postad: 10 nov 10:30
thedifference skrev:

Du omvandlar choice till en int men din switch (match choice) har bara strings. Siffran 1 är inte samma som tecknet 1.

Enklast att låta bli att omvandla till int. Du ska ju ändå inte utföra någon matematik på värdet.

Okej men då blir det gult på samtliga av dessa om jag tar bort int framför input("make a choice:")

thedifference 373
Postad: 10 nov 10:32

Vad står det när du pekar på texten?

destiny99 Online 7909
Postad: 10 nov 10:34 Redigerad: 10 nov 10:34
thedifference skrev:

Vad står det när du pekar på texten?

Att den inte är definierad men jag ändrade det nu till funktionerna var definierad ovan.  Då försvann gula strecken

thedifference 373
Postad: 10 nov 10:36

Bra =) fungerar allt nu?

destiny99 Online 7909
Postad: 10 nov 10:40
thedifference skrev:

Bra =) fungerar allt nu?

Yes men den verkar inte skriva ut exakt : 

*S*t*j*ä*r*n*p*r*o*g*r*a*m*m*e*r*a*r*e* *S*t*e*l*l*a*. 

Utan så

thedifference 373
Postad: 10 nov 10:41

Ok. Du får visa den koden om du behöver hjälp. Den finns inte i ditt första inlägg. Men försök själv först; du har ju precis upptäckt problemet =)

destiny99 Online 7909
Postad: 10 nov 10:42 Redigerad: 10 nov 10:47
thedifference skrev:

Ok. Du får visa den koden om du behöver hjälp. Den finns inte i ditt första inlägg. Men försök själv först; du har ju precis upptäckt problemet =)

Jag kan klistra in koden igen. Men jag vet inte vad problemet beror på. Förmodligen mellanslag. 

input_text= sys.stdin.readline().split()
val=0
try :
   val=sys.argv[1] 
except:
      val=val
def main():
   if not val:
    while True:
        language_choice=int(input("choose a language:"))
        print("1.Stjarnspraket")
        print("2.Viskspraket")
        print("3.Rovarspraket")
        print("4.Rovarspraket_oversattning")
        print("5.Bebisspraket")
        print("6.Allspraket")
        print("7.Fikonspraket")
        print("8.Avsluta")
        choice=input("make a choice:")
        if choice=='8':
            break
        input_text=input("write a string to interpret:")
        match choice:
            case "1":
                print(stjarnsprak(input_text))
            case "2":
                print(visksprak(input_text))
            case "3":
                print(rovarsprak(input_text))
            case "4":
                print(rovarsprak_oversattning(input_text))
            case "5":
                print(bebissprak(input_text))
            case "6":
                print(allspraket(input_text))
            case "7":
                print(fikonsprak(input_text))
            case _:
                print("Invalid choice.Try again.")

if val:
    match val:
        case "-s":
            print(stjarnsprak(input_text))
        case "-v":
            print(visksprak(input_text))
        case "-r":
            print(rovarsprak(input_text))
        case "-o":
            print(rovarsprak_oversattning(input_text))
        case "-b":
            print(bebissprak(input_text))
        case "-a":
            print(allspraket(input_text))
        case "-f":
            print(fikonsprak(input_text)) 
        case _:
            print("""för att översätta programmet till rätt språk,vänligen följ strukturen:echo "[texten som ska översättas]"| python3 sprak.py
        eller cat filen "[filen som ska översättas]"| python3 sprak.py""")
main()
thedifference 373
Postad: 10 nov 11:02

Koden du visar är bara din meny. Vi ser inte koden för funktionerna stjarnsprak, visksprak etc.

destiny99 Online 7909
Postad: 10 nov 11:07 Redigerad: 10 nov 11:07
thedifference skrev:

Koden du visar är bara din meny. Vi ser inte koden för funktionerna stjarnsprak, visksprak etc.

justnu upplevde jag bara problem med stjarnsprak. tex rovarsprak funkar enligt ett test jag gjorde nyss, ska också testa resterande språk för säkert skull.  

def stjarnsprak(inrad):
 """Returnerar inrad dar vartannat tecken ar en stjarna. Denna
 implementation ar mer effektiv eftersom den anvander en forandringsbar
 lista och inte langre och langre strangobjekt som ar oforanderliga."""
 letters=[]
 for ord in inrad :
   letters.append('*')
   for bokstav in ord:
     letters.append(bokstav)
     letters.append('*')
   letters.append(" ")   
 return "".join(letters)
thedifference 373
Postad: 10 nov 11:32

Ok. Om det är okej att använda string joins till uppgiften kan du kanske kolla vad detta blir:

" * ".join(inrad)

Kan vara lättare att jobba med =)

destiny99 Online 7909
Postad: 10 nov 11:33 Redigerad: 10 nov 11:55
thedifference skrev:

Ok. Om det är okej att använda string joins till uppgiften kan du kanske kolla vad detta blir:

" * ".join(inrad)

Kan vara lättare att jobba med =)

Var hade du tänkt att detta ska vara nånstans?   Såhär blev det. Finns ingen stjärna framför s i början slutet på bokstaven hos namnet stella

thedifference 373
Postad: 10 nov 19:16

Det var inte meningen att det skulle vara hela lösningen, men som du ser så kom du väldigt långt med det. Du behöver bara slänga på en stjärna i början och slutet.

destiny99 Online 7909
Postad: 10 nov 19:24 Redigerad: 10 nov 19:25
thedifference skrev:

Det var inte meningen att det skulle vara hela lösningen, men som du ser så kom du väldigt långt med det. Du behöver bara slänga på en stjärna i början och slutet.

Jag försökte med det , men det gick inte bra tyvärr. Din lösning hjälpte såklart. Var menar du att jag ska slänga på en stjärna i början och slutet?

thedifference 373
Postad: 10 nov 19:36
my_word = "ordet"
stars_between = " * ".join(my_word)
print(stars_between)
# stars_everywhere = ?
# print(stars_everywhere)

# tips
first_name = "Sven"
middle_name = "Sverker"
last_name = "Svensson"
# full_name = ?
# print(full_name)

Försök fixa översta så du får stjärnor framför och bakom. Om du fastnar, lös nedersta så kanske du kommer på hur.

destiny99 Online 7909
Postad: 10 nov 20:16 Redigerad: 10 nov 20:17
thedifference skrev:
my_word = "ordet"
stars_between = " * ".join(my_word)
print(stars_between)
# stars_everywhere = ?
# print(stars_everywhere)

# tips
first_name = "Sven"
middle_name = "Sverker"
last_name = "Svensson"
# full_name = ?
# print(full_name)

Försök fixa översta så du får stjärnor framför och bakom. Om du fastnar, lös nedersta så kanske du kommer på hur.

def stjarnsprak(inrad):
 """Returnerar inrad dar vartannat tecken ar en stjarna. Denna
 implementation ar mer effektiv eftersom den anvander en forandringsbar
 lista och inte langre och langre strangobjekt som ar oforanderliga."""
 letters=[]
 for ord in inrad :
   letters.append('*')
   for bokstav in ord:
     letters.append(bokstav)
     letters.append('*')
   letters.append(" ")   
   return "*"+"*".join(inrad) +"*"
 return "".join(letters)

Nu funkar det. 

thedifference 373
Postad: 10 nov 21:09 Redigerad: 10 nov 21:09

Ja, snyggt =) men du har en massa onödig kod nu.

def stjarnsprak(inrad):
   return "*"+"*".join(inrad) +"*"

Det här är allt som behövs. Det andra gör inget du använder dig av. Sista raden som den ser ut nu är inte ens "reachable code" om inte inrad är tomt.

Dokumentationen är så klart bra att ha där.

destiny99 Online 7909
Postad: 10 nov 21:24 Redigerad: 10 nov 21:34
thedifference skrev:

Ja, snyggt =) men du har en massa onödig kod nu.

def stjarnsprak(inrad):
   return "*"+"*".join(inrad) +"*"

Det här är allt som behövs. Det andra gör inget du använder dig av. Sista raden som den ser ut nu är inte ens "reachable code" om inte inrad är tomt.

Dokumentationen är så klart bra att ha där.

Nu förstår jag inte vad du menar med dokumentation? Tack för korrigeringen. Jag flyttar den under def stjarnsprak(inrad) vilket jag inte kom på. Nu har jag problem med koden igen pga hur jag flyttade den runt. Det kanske var en dålig ide att ha den där du säger? 

thedifference 373
Postad: 10 nov 21:43

Dokumentationen är det du har inom citationstecknen.

Du har sabbat indentationen, så den vet inte vad inrad är, men det du ska göra är att ta bort allt under rad 4. Den koden åstadkommer inget oavsett om den ligger innan eller efter din return.

Låt mig ta till ett överdrivet exempel.

def foo(some_word):
    some_number = 1+1
    some_other_number = 3+5
    some_sum = 0
    for i in range(some_number, some_other_number):
        some_sum += 9
    some_sum *= 3
    some_sum -= 15
    return ",".join(some_word)

Vad har någon effekt på vad du får ut av denna funktion? Bara sista raden. Den tramsar runt med some_sum utan att använda det till något. Likadant kör du några operationer på letters, men vi använder inte längre letters. 

Ingen kod efter en return kommer köras (den skickar tillbaka ett värde och går ur funktionen), och du har en return på rad 4 som alltid kommer köras och som inte beror på något annat än inrad.

Svara
Close