Permalänk
Medlem

[python] enkla program, hjälp

Hej,

Jag håller på med pythonprogrammering och följande uppgifter är gamla prov frågor. Mina kunskaper om python och programmering är begränsad. Jag skulle bli tacksam om någon kunde visa lösningsförslag uttryckt i enkla funktioner.

1. Ett enkelt sätt att kryptera en text är att ersätta varje bokstav i texten med den följande i
alfabetet. Så ”a” blir ”b” och ”g” blir ”h” etc. Vi använder bara tecken i det engelska
alfabetet. ”z” som kommer sist blir ”a”, dvs vi börjar om vid slutet av alfabetet. Stora
bokstäver blir stora bokstäver på motsvarande sätt (dvs ”A” blir ”B”, ”Z” blir ”A” etc). Tecken
som inte är bokstäver påverkas inte. Exemplevis kommer ”ZTZ-programmet” alltså att
krypteras till ”AUA-qsphsbnnfu”. Skriv en pythonfunktion som tar en text som parameter
och returnerar den krypterade texten. Dela upp problemet så att du först gör en funktion
som krypterar ett enstaka tecken. Prestandakrav: det räcker att klara texter med upp till 150
tecken.

Testa din lösning på 5 väl valda fall. Skriv en funktion uppgift1() som skriver ut alla
testfall (den ska skriva ut ursprungstexter och krypterade texter bredvid varandra) och sist
skriver ut krypteringen av texten i http://user.it.uu.se/~joachim/cf.txt

2. Ett lite mer avancerat sätt är att ersätta varje bokstav med den som kommer n steg efter i
alfabetet, där n är ett positivt heltal. Uppgiften ovan är alltså specialfallet n=1. För
exempelvis n=3 kommer ”a” att ersättas med ”d”, ”g” med ””j, ”x” med ”a” och ”z” med ”c” (vi
börjar fortfarande om i slutet av alfabetet). Stora bokstäver hanteras på samma sätt och
icke-bokstäver påverkas inte. Skriv en pythonfunktion som tar en text och ett positivt heltal
som parametrar och returnerar den krypterade texten. (Ledtråd: du kan helt enkelt anropa
funktionen från uppgiften för godkänt n gånger.)

Ett bra sätt att testa är att kolla att om du krypterar med n så kan du avkryptera, dvs återfå
ursprungstexten, genom att kryptera igen med 26-n, eftersom engelska alfabetet har 26
tecken. Skriv en testfunktion som tar en text som parameter, och för alla n mellan 1 och 25
krypterar först med n och sedan avkrypterar med 26-n. Funktionen ska returnera True om
det i alla fallen efter avkryptering blir samma text som originaltexten, annars False. Kör
funktionen på 5 väl valda testfall. Låt funktionen uppgift2() anropa alla testfall på samma
sätt som ovan och avslutningsvis avkryptera http://user.it.uu.se/~joachim/cg.txt med talet
13.

Visa signatur

| Ryzen 3800XT | Corsair LPX 32GB | B550 Aorus Elite v2 | GTX 970 | Samsung 970 Evo | CM Masterbox 520 | RM750x | Windows 7

| Ryzen 2700 | Corsair LPX 16GB | Prime B450-Plus | GT 1030 | Samsung 970 Evo | Kolink Observatory | RM750x | EndeavourOS

| JDS Labs Atom | Khadas Tone Board | Fostex TX-X00 & HIFIMAN HE4XX |

Permalänk
Hedersmedlem

Hej!

Jag kan tipsa om funktionerna chr och ord.

ord tar en sträng som är 1 tecken lång och gör om den till en teckenkod (heltal). chr tar en teckenkod och gör om den till ett tecken.

T.ex. om du kör detta program:

tecken = "a" teckenkod = ord(tecken) ny_teckenkod = teckenkod + 1 nytt_tecken = chr(ny_teckenkod) print ("tecken: %r" % tecken) print ("teckenkod: %r" % teckenkod) print ("ny_teckenkod: %r" % ny_teckenkod) print ("nytt_tecken: %r" % nytt_tecken)

Får du detta resultat:

tecken: 'a' teckenkod: 97 ny_teckenkod: 98 nytt_tecken: 'b'

Eller testa själv: https://repl.it/repls/InvolvedScientificNetframework

Om du tittar i en ASCII-teckentabell så ser du att teckenkoderna för A, B, C.... etc fram till Z alla ligger precis bredvid varandra. Om du tar teckenkoden för ett a (97) och lägger på 1, så får du teckenkoden för ett b (98).

Du behöver också kunna gå igenom en sträng tecken för tecken. Det kan du göra så här:

straeng = "hej, världen!" for tecken in straeng: print("tecken: %r, teckenkod %r" % (tecken, ord(tecken)))

Resultat:

tecken: 'h', teckenkod 104 tecken: 'e', teckenkod 101 tecken: 'j', teckenkod 106 tecken: ',', teckenkod 44 tecken: ' ', teckenkod 32 tecken: 'v', teckenkod 118 tecken: 'ä', teckenkod 228 tecken: 'r', teckenkod 114 tecken: 'l', teckenkod 108 tecken: 'd', teckenkod 100 tecken: 'e', teckenkod 101 tecken: 'n', teckenkod 110 tecken: '!', teckenkod 33

Eller testa själv: https://repl.it/repls/AlarmedBestTelephone

Till sist så behöver du kunna skriva ihop en sträng tecken för tecken. Det kan du göra så här:

teckenlista = ['h', 'e', 'j', 's', 'a', 'n'] resultat = '' for tecken in teckenlista: print("Lägger till %r till resultatet!" % tecken) resultat += tecken print("resultat är nu: %r" % resultat)

Resultat:

Lägger till 'h' till resultatet! resultat är nu: 'h' Lägger till 'e' till resultatet! resultat är nu: 'he' Lägger till 'j' till resultatet! resultat är nu: 'hej' Lägger till 's' till resultatet! resultat är nu: 'hejs' Lägger till 'a' till resultatet! resultat är nu: 'hejsa' Lägger till 'n' till resultatet! resultat är nu: 'hejsan'

Eller testa själv: https://repl.it/repls/FrizzyNonstopNumber

Hoppas att detta ovan ger dig lite ledning till att fixa en lösning.

Permalänk
Medlem
Skrivet av futhark14:

Uppgift 1.

Spontant hade jag använt/kollat in:

  • ASCII-tabeller

  • Python-funktionerna ord(), chr(), och isalpha()

  • Modulus

Skrivet av futhark14:

Uppgift 2.

En bra lösning av Uppgift 1 behöver bara ändra (lägga till) vilka argument som "byta bokstav-funktionen" tar och använda det nya argumentet för att bestämma antalet steg att rotera. Inga nya delar behövs.

Visa signatur

:(){ :|:& };:

🏊🏻‍♂️   🚴🏻‍♂️   🏃🏻‍♂️   ☕

Permalänk
Hedersmedlem

*Tråd flyttad->Programmering och digitalt skapande*

Visa signatur

Danskjävel så krattar som en skrivare...