Permalänk

Fråga om Python uppgift

Hej, har börjat en inledningskurs för att lära mig mer om Python, men har fastnat på en uppgift som jag försökt klura ut efter sökande på bl.a. w3schools och programiz.

Uppgiften lyder som följande:

I kort och gott, ett program som man matar in ett heltal, som sedan konverterar det till binär form samt skriver ut antalet bitar utan att använda inbyggda funktioner, snarare med hjälp av en procedur som inte returnerar någon data.

Här har man fått en pseudokod att gå efter, som finns att läsa här.

Nu kommer vi till krångliga här, som jag upplever det.

Jag har jobbat med funktionen för att det ska kunna skriva ut det binära talet, vilket jag har fått till någorlunda (fungerar när man trycker enter två gånger av någon anledning) och följt psuedokoden (även fast det är riktlinjer, och inte behöver följas slaviskt) så gott jag kunnat.

Däremot fastnar jag helt när jag ska konvertera ett tal till ett givet antalet bitar, vilket jag förmodar ska definieras i procedurdeklarationen allra först i koden, men förstår verkligen inte hur jag får till det, samt att inmatningen skall gå igenom första funktionen samtidigt som den tar hänsyn till. Dessutom vet jag inte om inmatning alls ska ske i första delen alls, eller om det är i huvudprogrammet som det ska ske.

Har suttit i timtals med denna uppgift och även försökt rådfråga utan att komma vidare, men tänker att jag hör är om finns det någon duktig och vänlig själ som ser vart jag gjort fel samt hur jag kommer vidare?

Koden har jag laddat upp här för enkelhetens skull: Länk

Tack på förhand!

Permalänk
Medlem

Du skall alltså skriva ett Python-program som består av:
En procedur dec2bin som tar ett tal som indata och skriver ut värdet i binär form. Proceduren kan, men behöver inte, ta andra värden som indata också.
Ett huvudprogram som läser in ett antal tal från användaren, och anropar proceduren dec2bin för varje.
Det räcker att koden kan hantera tal mellan 0 och 65535, och den skall kunna ange om talen ryms i en byte (8 bitar) eller om det krävs 16 bitar. Talen skall
skrivas ut med 8 bitar om de ryms i det, annars med 16 bitar om de ryms i det. Större tal får, men behöver inte, hanteras.

Uträkning och utskrivning av antal bitar som behövs kan göras antingen i huvudprogrammet eller i dec2bin proceduren. Den pseudo-kod ni fått gör det i huvudprogrammet och anropar dec2bin med antalet som en extra parameter.

Blev det något klarare av den omskrivningen av uppgiften?

Permalänk

@Erik_T: Det blev absolut tydligare med den omformuleringen! Har du också fått denna uppgift att jobba med?

Permalänk
Medlem
Skrivet av milkshake91:

@Erik_T: Det blev absolut tydligare med den omformuleringen! Har du också fått denna uppgift att jobba med?

Nej, men jag har löst en och annan programmeringsuppgift i diverse språk genom årens lopp så jag har fått viss vana på det.

Permalänk
Medlem

När jag läst den här uppgiften slog det mig att jag antingen är dum i huvudet eller totalt iq-befriad. Ledsen att jag inte kan hjälpa till!

Permalänk

@Viktorph: Haha känner detsamma! Tror däremot att jag kan ha försvårat till uppgiften, då det är mest syntaxen och anropet mellan proceduren och huvudprogrammet som försvårar det för mig. Men i slutändan vill jag att man ska mata in ett tal, som först körs i huvudprogrammet för att ta reda på att det är inom 16 bitar, sedan via proceduren som konverterar till binära tal och slutligen visar om det ryms i antingen 16 eller 8 bitar. Men det är just kommunikationen mellan dessa två delar som jag inte får till riktigt.

Permalänk
Medlem

Jag måste skriva att denna uppgift är under all kritik. Då den som har skrivit uppgiften inte verkar ha koll på termer. 1 byte = 8 bitar. och används för olika saker. På samma sätt som att megabit och megabyte är olika. Megabit mäter man hastighet i och megabyte mäter man volym.

Men i högnivås språk som python behöver man inte hålla på med minneshantering eller garbage collection. Men jag blir lite oroad när lärare inte har lärt sig programmering från grunden.

Pseudokod är för lik syntaxen för Python. Pseudokod är något man skriver ungefär som flödesdiagram för när och hur saker sak ske i programmet. Denna ska inte vara språk specifik för många gånger när man börjar planera sitt program har man inte bestämt vilket språk man ska skriva det i.

Men för att ge lite hjälp. När det gäller att omvandla en Integer till binär utan att använda inbyggda funktioner. Kan man göra det genom att använda en while loop där man delar värdet med två tills värde blir 0 och sedan byta ordningen.

Nu har jag aldrig skrivit python i min karriär. Men jag tror att det blir något i stil med det här:
def dec2bin(number):
binarynumber = ""
if (number != 0 ):
while (number >= 1 ):
if (number %2 == 0):
binarynumber=binarynumber+"0"
number=number/2
else:
binarynumber=binarynumber+"1"
number=(number-1)/2

else:
binarynumber="0"

return "".join(reversed(binarynumber))

Hoppas det är till hjälp.

Permalänk
Medlem
Skrivet av unixware:

Jag måste skriva att denna uppgift är under all kritik. Då den som har skrivit uppgiften inte verkar ha koll på termer. 1 byte = 8 bitar. och används för olika saker. På samma sätt som att megabit och megabyte är olika. Megabit mäter man hastighet i och megabyte mäter man volym.

Men i högnivås språk som python behöver man inte hålla på med minneshantering eller garbage collection. Men jag blir lite oroad när lärare inte har lärt sig programmering från grunden.

Pseudokod är för lik syntaxen för Python. Pseudokod är något man skriver ungefär som flödesdiagram för när och hur saker sak ske i programmet. Denna ska inte vara språk specifik för många gånger när man börjar planera sitt program har man inte bestämt vilket språk man ska skriva det i.

Men för att ge lite hjälp. När det gäller att omvandla en Integer till binär utan att använda inbyggda funktioner. Kan man göra det genom att använda en while loop där man delar värdet med två tills värde blir 0 och sedan byta ordningen.

Nu har jag aldrig skrivit python i min karriär. Men jag tror att det blir något i stil med det här:
def dec2bin(number):
binarynumber = ""
if (number != 0 ):
while (number >= 1 ):
if (number %2 == 0):
binarynumber=binarynumber+"0"
number=number/2
else:
binarynumber=binarynumber+"1"
number=(number-1)/2

else:
binarynumber="0"

return "".join(reversed(binarynumber))

Hoppas det är till hjälp.

Jag kanske missar något, men på vilket sett har inte läraren koll på termer, och vad har detta med minneshantering att göra?

Uppgiften går ut på att konvertera ett heltal till binär form och även skriva ut om talet får plats i 8bit eller ej 🤷🏼‍♂️

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Medlem
Skrivet av Pamudas:

Jag kanske missar något, men på vilket sett har inte läraren koll på termer, och vad har detta med minneshantering att göra?

Uppgiften går ut på att konvertera ett heltal till binär form och även skriva ut om talet får plats i 8bit eller ej 🤷🏼‍♂️

Om du kollar på bilden där läraren ger exempel på hur programkörningen ska se ut. skriver han/hon: "Talet 234 ryms i 1 byte och blir binärt: 11101010" Notera att han/hon skriver "en byte" och i andra exemplet använder de bitar istället. Man bör inte blanda.

Det jag menade var om läraren skulle ha lärt sig minneshantering skulle han/hon ha koll på dessa termer. Eftersom i python behöver man inte bry sig om hur många bitar någonting är då maxvärdet för vad som får plats i en int i python är 2147483648. Medans i C språken har man olika storlekar på variablerna och man behöver ha koll på hur mycket minne man behöver allokera för variabeln. Vilket gör det helt onödigt att ta reda på om något är 1 bit eller 16 bitar då python sköter detta åt dig.

Men som du skrev är mycket av det här utanför själva uppgiften.

Permalänk
Medlem
Skrivet av unixware:

Om du kollar på bilden där läraren ger exempel på hur programkörningen ska se ut. skriver han/hon: "Talet 234 ryms i 1 byte och blir binärt: 11101010" Notera att han/hon skriver "en byte" och i andra exemplet använder de bitar istället. Man bör inte blanda.

Lite slarvig stil att blanda byte och bit på det viset, men inte mer fel än att blanda meter och centimeter när man diskuterar längder.
Man skulle kunna klaga på antagandet att 1 byte = 8 bit, eftersom det rent strikt inte är helt korrekt - men för den där typen av inledande programmeringskurs är det tillräckligt sant för att inte behöva gå in på undantagen.

Citat:

Det jag menade var om läraren skulle ha lärt sig minneshantering skulle han/hon ha koll på dessa termer. Eftersom i python behöver man inte bry sig om hur många bitar någonting är då maxvärdet för vad som får plats i en int i python är 2147483648. Medans i C språken har man olika storlekar på variablerna och man behöver ha koll på hur mycket minne man behöver allokera för variabeln. Vilket gör det helt onödigt att ta reda på om något är 1 bit eller 16 bitar då python sköter detta åt dig.

Men som du skrev är mycket av det här utanför själva uppgiften.

Uppgiften har egentligen absolut ingenting med minneshantering eller Python's datatyper att göra - och för övrigt behöver man oftast inte ha mer koll på storleken av datatyper när man skriver i C än i Python.
Det är en övning i hantering av binär representation av tal. Att den skall skrivas i Python är bara för att folk skall lära sig Python samtidigt.

Permalänk
Medlem
Skrivet av Erik_T:

Lite slarvig stil att blanda byte och bit på det viset, men inte mer fel än att blanda meter och centimeter när man diskuterar längder.
Man skulle kunna klaga på antagandet att 1 byte = 8 bit, eftersom det rent strikt inte är helt korrekt - men för den där typen av inledande programmeringskurs är det tillräckligt sant för att inte behöva gå in på undantagen.

Din jämförelse med meter och centimeter är helt fel. Eller brukar du skriva att meter/s är samma sak som meter? För det är en mer korrekt jämförelse då bits mäter hastighet och bytes mäter hur stort någonting är. Antagandet att 1 byte = 8 bits är däremot något som används om man väl måste omvandla. Detta gör man väldigt sällan.

Skrivet av Erik_T:

Uppgiften har egentligen absolut ingenting med minneshantering eller Python's datatyper att göra - och för övrigt behöver man oftast inte ha mer koll på storleken av datatyper när man skriver i C än i Python.
Det är en övning i hantering av binär representation av tal. Att den skall skrivas i Python är bara för att folk skall lära sig Python samtidigt.

Du skriver inte så optimerad kod i C om du inte tänker på allokerat minne. Och om du tänker fel här kan du få memory leaks eller integer overflow. Helt orelaterad till uppgiften. Sedan tror jag du missförstår mig. Jag tog upp minneshantering och datatyper eftersom du behöver ha koll på binär representation och storlek där.

Permalänk
Medlem
Skrivet av unixware:

Din jämförelse med meter och centimeter är helt fel. Eller brukar du skriva att meter/s är samma sak som meter? För det är en mer korrekt jämförelse då bits mäter hastighet och bytes mäter hur stort någonting är. Antagandet att 1 byte = 8 bits är däremot något som används om man väl måste omvandla. Detta gör man väldigt sällan.

Fel.
Både bits och bytes kan och brukar användas för angivelser av såväl hastigheter som storlekar.

Titta till exempel på hårddiskar och SSDer. Deras maximala överföringshastighet är nästan alltid angiven i Megabyte/sekund.
Titta på storleken av ett BIOS Flash på valfritt moderkort. Anges oftast i Megabit.
Storleken på enskilda minneskretsar (både RAM, ROM, och Flash) brukar anges i Megabit eller Gigabit, medan storleken på minnesmoduler brukar anges i Megabyte eller Gigabyte.

Permalänk
Skrivet av unixware:

Din jämförelse med meter och centimeter är helt fel. Eller brukar du skriva att meter/s är samma sak som meter? För det är en mer korrekt jämförelse då bits mäter hastighet och bytes mäter hur stort någonting är. Antagandet att 1 byte = 8 bits är däremot något som används om man väl måste omvandla. Detta gör man väldigt sällan.

Jag tror du blandar ihop bit/s (hastighet) och bits (plural av bit, antal).

Visa signatur

Phanteks P600S Grå - Ryzen 9 3900X - Phanteks PH-TC14PE Black - ASUS ROG Strix X570-F Gaming - G.Skill Trident Z Neo 32GB (2x16GB) 3600MHz CL16 - HD7970 - Seasonic Focus+ 650W Platinum

Permalänk
Medlem
Skrivet av unixware:

Din jämförelse med meter och centimeter är helt fel. Eller brukar du skriva att meter/s är samma sak som meter? För det är en mer korrekt jämförelse då bits mäter hastighet och bytes mäter hur stort någonting är. Antagandet att 1 byte = 8 bits är däremot något som används om man väl måste omvandla. Detta gör man väldigt sällan.

Bits mäter inte hastighet??
Bits är standard inom datavetenskap och elektroteknik. Omvandla görs ofta i vissa lägen och många grundläggande programmeringskurser på högskola (och troligen andra med sin följer samma idéer) är skrivna för att även komplettera till ämnen som digital design och datasystem.

Bits är det lägsta informationsgivande du kan ha, binär representation. Byte är bara en förenkling, standarden som anses ligga som grund är 8 bits på en byte men i början var det större variation på vad olika utvecklare använde mm och idag med större minnesbusar mm så är det lite flytande men som regel står det sig fortfarande.

Visa signatur

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Permalänk
Medlem
Skrivet av Ralleballe:

Jag tror du blandar ihop bit/s (hastighet) och bits (plural av bit, antal).

Skrivet av Ferrat:

Bits mäter inte hastighet??
Bits är standard inom datavetenskap och elektroteknik. Omvandla görs ofta i vissa lägen och många grundläggande programmeringskurser på högskola (och troligen andra med sin följer samma idéer) är skrivna för att även komplettera till ämnen som digital design och datasystem.

Bits är det lägsta informationsgivande du kan ha, binär representation. Byte är bara en förenkling, standarden som anses ligga som grund är 8 bits på en byte men i början var det större variation på vad olika utvecklare använde mm och idag med större minnesbusar mm så är det lite flytande men som regel står det sig fortfarande.

Oj, Jag ber om ursäkt. Och det spårade ur något hör inte till tråden egentligen.
I vilket fall av någon anledning tog Sweclockers bort mellanslagen på koden jag postade i ett tidigare inlägg. Det är de som är mest typiskt med pythorn är att den använder mellanslag i sin syntax.

Permalänk
Medlem

@milkshake91

Vad gäller antalet bitar, när du konverterat det decimala talet till ett binärt, kolla längden på det binära talet (antar att du använder en string för att lagra det). Är talet 1-7 siffror långt, fyll ut med inledande nollor till det är 8 siffror långt. Är talet 9-15 siffror långt, fyll ut med inledande nollor till talet är 16 siffror långt. (Kolla talets längd och fyll ut med inledande nollor till närmaste större 8-tal.)

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Datavetare
Skrivet av milkshake91:

Däremot fastnar jag helt när jag ska konvertera ett tal till ett givet antalet bitar.

För positiva heltal kan du rent matematiskt kan du räkna ut detta genom att addera ett till talet, ta 2-logaritmen och avrunda uppåt till närmaste heltal. Gissar att den lösning är diskvalificerad här då den lämpligen löses genom att utnyttja math modulen i Python.

Annars kan du tänka så här: hur översätts en binärt tal till decimalt? Tar vi 1010 som exempel blir detta
Edit: notera att man tar bitarna höger till vänster då minst signifikanta biten (den som ska multipliceras med 2^0, då det är position 0) alltid är längst till höger.

0 * 2^0 + 1 * 2^1 + 0 * 2^2 + 1 * 2 ^ 3 = 0 * 1 + 1 * 2 + 0 * 4 + 1 * 8 = 0 + 2 + 0 + 8 = 10

Omvänt, antal bitar som minst krävs för att representera talet 10 är positionen plus 1 (då datorvärlden börjar räkna positioner från noll...) på den bit vars vikt (2^pos = vikt) är lika med eller större än 10

I.e. något åt det här hållet om vi antar att värdet är ett positivt heltal (faktum är att det även fungerar med noll, d.v.s. alla tal i ℕ)

sätt antal_bitar till 0 gör följande till dess att loopen explicit avbryts addera ett till antal_bitar kolla om 2 upphöjt i värdet hos antal_bitar är större än ditt tal, om "ja" avbryt loopen annars kör loopen igen antal_bitar har nu det värde du letar efter

Du behöver inte kolla om antal_bitar överstiger 16 i algoritmen ovan, Python kan hantera hur stora heltal som helst (givet att man har tillräckligt med RAM, det lär vara ett totalt icke-problem i praktiken).

I detta fall begränsas ändå antal bitar då uppgiften säger att dela in talet i en av fyra klasser

  1. negativa tal, dessa förkastas

  2. tal större än 65535, d.v.s. tal som behöver mer än 16 bitar för att representeras, dessa förkastas

  3. tal som kan representeras med 8 eller färre bitar

  4. tal som kräver 8 eller fler bitar, men kan representeras med 16 eller färre bitar

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Skrivet av Yoshman:

För positiva heltal kan du rent matematiskt kan du räkna ut detta genom att addera ett till talet, ta 2-logaritmen och avrunda uppåt till närmaste heltal. Gissar att den lösning är diskvalificerad här då den lämpligen löses genom att utnyttja math modulen i Python.

Annars kan du tänka så här: hur översätts en binärt tal till decimalt? Tar vi 1010 som exempel blir detta

0 * 2^0 + 1 * 2^1 + 0 * 2^2 + 1 * 2 ^ 3 = 0 * 1 + 1 * 2 + 0 * 4 + 1 * 8 = 0 + 2 + 0 + 8 = 10

Omvänt, antal bitar som minst krävs för att representera talet 10 är positionen plus 1 (då datorvärlden börjar räkna positioner från noll...) på den bit vars vikt (2^pos = vikt) är lika med eller större än 10

I.e. något åt det här hållet om vi antar att värdet är ett positivt heltal (faktum är att det även fungerar med noll, d.v.s. alla tal i ℕ)

sätt antal_bitar till 0 gör följande till dess att loopen explicit avbryts addera ett till antal_bitar kolla om 2 upphöjt i värdet hos antal_bitar är större än ditt tal, om jag avbryt loopen annars kör loopen igen antal_bitar har nu det värde du letar efter

Rent krasst behöver du inte ens kolla om antal_bitar överstiger 16, Python kan hantera hur stora heltal som helst (givet att man har tillräckligt med RAM, men det lär vara ett totalt icke-problem i praktiken). I detta fall behöver du ändå det då uppgiften är att dela in talet i en av fyra klasser

  1. negativa tal, dessa förkastas

  2. ta större än 65535, d.v.s. tal som behöver mer än 16 bitar för att representeras, dessa förkastas

  3. tal som kan representeras med 8 eller färre bitar

  4. tal som kräver mer än 8 bitar, men kan representeras med 16 eller färre bitar

Tusen tack för ditt engagemang! Ska kika på detta och hoppas på bra resultat.

Permalänk

@PeCe: Har problem med att fylla på med inledande nollor (för att motsvara 8 samt 16 bitar), för att så som jag kodat uppgiften hittills är det inmatade talet lagrat som integer. Försökt googla fram hur man fyller på med nollor före men verkar endast gå när det är string.

Hur löser man detta lättast?

Min nuvarande kod ser ut som följande.

Permalänk
Medlem

Jag skulle rekommendera att helt enkelt omvandla det till en string och ta str_bin = ((8-len(str_bin)) * "0") + str_bin , detta alltså om den har mindre än 8 bitar ändra 8 till 16 om den behöver mer än 8.

förtydligande
Visa signatur

5900x
RTX 2070
96 GB DDR4
1TB SSD 6TB HDD

Permalänk
Skrivet av ludde127:

Jag skulle rekommendera att helt enkelt omvandla det till en string och ta str_bin = ((8-len(str_bin)) * "0") + str_bin , detta alltså om den har mindre än 8 bitar ändra 8 till 16 om den behöver mer än 8.

Går detta att genomföra i koden då den i while-satsen stämmer av ifall det inmatade värdet är inom korrekt intervall? Får felmeddelande om jag försöker omvandla det till string nämligen... Är nybörjare som sagt så detta är tyvärr utanför min kunskap.

Permalänk
Medlem

Kan du kopiera in koden här så att jag kan se? Det borde defenitivt funka man får bara inte hantera det som en integer efter omvandlingen.

Visa signatur

5900x
RTX 2070
96 GB DDR4
1TB SSD 6TB HDD

Permalänk
Medlem
Skrivet av milkshake91:

@PeCe: Har problem med att fylla på med inledande nollor (för att motsvara 8 samt 16 bitar), för att så som jag kodat uppgiften hittills är det inmatade talet lagrat som integer. Försökt googla fram hur man fyller på med nollor före men verkar endast gå när det är string.

Hur löser man detta lättast?

Min nuvarande kod ser ut som följande.

När du har det binära talet i en sträng, ta reda på hur många bytes som krävs för att rymma det.

Det kan göras genom att dividera längden på det binära talet med 8 (antalet bitar på en byte) och runda av resultatet till närmaste högre heltal. Två sätt att göra det på:

1. math.ceil(len(bin_tal) / 8) (kräver att math importeras)
2. (len(bin_tal) + 8 - 1) // 8

För att sedan få till inledande nollor kan strängfunktionen zfill användas. zfill fyller ut med inledande nollor tills strängen når den önskade längden. Den önskade längden är antalet bytes som krävs för att rymma talet multiplicerat med 8 (antalet bitar på en byte).

print("123".zfill(8)) ger alltså "00000123" medan print("123".zfill(16)) ger "0000000000000123".

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk

@ludde127: Absolut! Så här ser den ut:

print('Omvandling av decimalt tal till binärt') def dec2bin(value): if value > 1: dec2bin(value // 2) print(value % 2, end = '') ### Nedan stämmer av så inmatade talet är i rätt intervall: invärde_ok = False invärde = 0 while invärde_ok is False: invärde = int(input("Ange ett heltal: ")) if invärde > 65535: print('Fel. Kan inte hantera så stora tal.') elif invärde < 0: print('Fel. Kan bara hantera positiva tal.') else: invärde_ok = True if invärde < 256: print('Talet', invärde ,'ryms i 8 bitar och blir binärt:', ) dec2bin(invärde) else: print('Talet', invärde ,'ryms i 16 bitar och blir binärt:') dec2bin(invärde)

Då det inmatade talet ska omvandlas via procedur så fastnar jag på hur man ska konvertera det till en string som i sin tur kan mata på med nollor.

Permalänk
Medlem
Skrivet av milkshake91:

Då det inmatade talet ska omvandlas via procedur så fastnar jag på hur man ska konvertera det till en string som i sin tur kan mata på med nollor.

Skicka med antalet bitar som krävs till proceduren (inte strikt nödvändigt, men gör saker enklare)
Ha en loop inne i proceduren som kör 8 eller 16 steg (beroende på hur många bitar som krävs för att rymma talet) och i varje steg så lägger du på antingen "0" eller "1" (beroende på vad det skall vara på den platsen) till resultatsträngen.
Gör du så kommer inledande nollor att komma med automatiskt.

Permalänk
Medlem
Skrivet av milkshake91:

@ludde127: Absolut! Så här ser den ut:

print('Omvandling av decimalt tal till binärt') def dec2bin(value): if value > 1: dec2bin(value // 2) print(value % 2, end = '') ### Nedan stämmer av så inmatade talet är i rätt intervall: invärde_ok = False invärde = 0 while invärde_ok is False: invärde = int(input("Ange ett heltal: ")) if invärde > 65535: print('Fel. Kan inte hantera så stora tal.') elif invärde < 0: print('Fel. Kan bara hantera positiva tal.') else: invärde_ok = True if invärde < 256: print('Talet', invärde ,'ryms i 8 bitar och blir binärt:', ) dec2bin(invärde) else: print('Talet', invärde ,'ryms i 16 bitar och blir binärt:') dec2bin(invärde)

Då det inmatade talet ska omvandlas via procedur så fastnar jag på hur man ska konvertera det till en string som i sin tur kan mata på med nollor.

Du kan väll använda return i dec2bin och sen göra om det talet man får till string.

Visa signatur

5900x
RTX 2070
96 GB DDR4
1TB SSD 6TB HDD

Permalänk
Datavetare
Skrivet av milkshake91:

Då det inmatade talet ska omvandlas via procedur så fastnar jag på hur man ska konvertera det till en string som i sin tur kan mata på med nollor.

Finns ju ett tips i beskrivningen av uppgiften: skicka med bitbredd till dec2bin(). Detta andra argument kommer i praktiken att vara 8 eller 16 i detta fall, men framförallt ger ett sådant argument en begränsning till hur många tecken du måste skriva ut -> utnyttja det!

Antag denna signatur

def dec2bin(value, bit_width): ....

du kan då lösa problem på detta sätt:

sätt bit_pos till bit_width minus ett så länge som bit_pos är noll eller större kolla om biten "2 upphöjt till bit_pos" är satt, i så fall skriv ut '1' annars skriv ut '0' minska bit_pos med ett

Skrivet av ludde127:

Du kan väll använda return i dec2bin och sen göra om det talet man får till string.

Uppgiften säger att man ska skriva en funktion som skriver ut strängen och inte returnerar något.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Skrivet av Yoshman:

Finns ju ett tips i beskrivningen av uppgiften: skicka med bitbredd till dec2bin(). Detta andra argument kommer i praktiken att vara 8 eller 16 i detta fall, men framförallt ger ett sådant argument en begränsning till hur många tecken du måste skriva ut -> utnyttja det!

Antag denna signatur

def dec2bin(value, bit_width): ....

du kan då lösa problem på detta sätt:

sätt bit_pos till bit_width minus ett så länge som bit_pos är noll eller större kolla om biten "2 upphöjt till bit_pos" är satt, i så fall skriv ut '1' annars skriv ut '0' minska bit_pos med ett

Har försökt följa tipset i beskrivningen men osäker på var det fallerar någonstans. Ser att ditt förslag skiljer sig lite åt den som finns i beskrivningen, men 2 upphöjt till bit_pos (eller antal_bitar) finns med i bägge och även delen med att minska med 1. Har definierat det som följande, men vet inte om jag är i närheten av att lösa det:

def dec2bin(värde, antal_bitar): if värde > 1: dec2bin(värde // 2) print(värde % 2, end = '') bitvärde = 2 ** (antal_bitar - 1) if värde >= bitvärde: print('1') värde = värde - bitvärde else: print('0') antal_bitar = antal_bitar - 1

Får då felmeddelandet "TypeError: dec2bin() missing 1 required positional argument: 'antal_bitar'" så något är ju galet. Som nybörjare blir det lätt att man sitter länge med samma problem och försöker googla fram lösningar utan att komma vidare så uppskattar all den hjälp jag fått hittills!

Permalänk
Medlem
Skrivet av milkshake91:

Har försökt följa tipset i beskrivningen men osäker på var det fallerar någonstans. Ser att ditt förslag skiljer sig lite åt den som finns i beskrivningen, men 2 upphöjt till bit_pos (eller antal_bitar) finns med i bägge och även delen med att minska med 1. Har definierat det som följande, men vet inte om jag är i närheten av att lösa det:

def dec2bin(värde, antal_bitar): if värde > 1: dec2bin(värde // 2) print(värde % 2, end = '') bitvärde = 2 ** (antal_bitar - 1) if värde >= bitvärde: print('1') värde = värde - bitvärde else: print('0') antal_bitar = antal_bitar - 1

Får då felmeddelandet "TypeError: dec2bin() missing 1 required positional argument: 'antal_bitar'" så något är ju galet. Som nybörjare blir det lätt att man sitter länge med samma problem och försöker googla fram lösningar utan att komma vidare så uppskattar all den hjälp jag fått hittills!

Det felet är pågrund av att du inte ger funktionen argumentet: antal_bitar när du kallar den ifrån funktionen.

Visa signatur

5900x
RTX 2070
96 GB DDR4
1TB SSD 6TB HDD

Permalänk
Medlem
Skrivet av ludde127:

Det felet är pågrund av att du inte ger funktionen argumentet: antal_bitar när du kallar den ifrån funktionen.

Dessutom så borde du inte alls anropa dec2bin inifrån dec2bin.
Det går visserligen alldeles utmärkt att göra så och lösa uppgiften med hjälp av en rekursiv procedur, men dels tror jag inte att ni har gått igenom rekursion i kursen ännu, och dels så skulle proceduren behöva delvis andra argument då.