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()
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.
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:")
Vad står det när du pekar på texten?
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
Bra =) fungerar allt nu?
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å
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 =)
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()
Koden du visar är bara din meny. Vi ser inte koden för funktionerna stjarnsprak, visksprak etc.
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)
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 =)
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
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.
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?
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.
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.
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.
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?
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.