Programmet ska läsa in två heltal (till exempel 17 och 19), och omvandla dessa till binär form, i form av bitsträngar (som 00010001 och 00010011). Sen ska det addera bitsträngarna till en summasträng, och slutligen omvandla summasträngen tillbaka till ett heltal och skriva ut det (36).
För att kunna hantera tal med olika antal bitar (till exempel 8-bitarstal, 16-bitarstal och 64-bitarstal) ska programmet börja med att läsa in antalet bitar i bitsträngarna, och strängarna ska sen skapas dynamiskt. (Det kommer dock att finnas en begränsning i hur många bitar vi kan hantera, eftersom vi läser in och skriver ut talen med hjälp av vanliga heltal, alltså datatypen int.)
För att avbilda negativa heltal används tvåkomplementmetoden.
Det krävs ingen hantering av overflow, alltså då antalet bitar inte räcker till. Med "ingen hantering av overflow" menar jag att man bara låter det bli det bitmönster som blir, med det angivna antalet bitar, även om det blev overflow och negativt. Man ska ju simulera en ALU, så jag tycker att det ska funka som i en riktig processor, och har man en ALU med fyrabitarstal som representerar negativa tal med tvåkomplementmetoden, så kan den representera talen -8 (1000) till 7 (0111) Om man lägger ihop 4 och 4, så kan resultatet (8) inte lagras, utan det blir overflow och man får svaret -8.
Programmet ska byggas i moduler enligt figuren:
Försök separera modulerna ordentligt, så koden i en modul inte blir onödigt hopvävd med koden i en annan!
Så här ser specifikationsfilen Bit.h ut:
/* Bit.h */ char and(char a, char b); /* Returnerar '1' om a '1' och b '1' */ char or(char a, char b); char xor(char a, char b); char not(char a); char nand(char a, char b); char nor(char a, char b); void add(char a, char b, char ci, char *sum, char *cu); /* Adderar två bitar a och b med ci som in-carry och cu som ut-carry enligt figur */
Så här ser specifikationsfilen Bitstr.h ut:
/* Bitstr.h */ void addstr(char *astr, char *bstr, char *sumstr); /* Adderar astr och bstr till sumstr */ void twokomp(char *str); /* Tvåkomplementerar str */
Så här ser specifikationsfilen Omvandla.h ut:
/* Omvandla.h */ void tal_str(int tal, char *str, int nrbits); /* Omvandlar tal till en binär sträng med nrbits bitar */ int str_tal(char *str); /* Omvandlar den binära strängen str till ett heltal */
Här är föreläsningsanteckningarna från Gunnar Jokis presentation av digsim-uppgiften. Klicka på bilden för större format.
Komplettera modulen Bitstr med en funktion för multiplikation av binära strängar, och komplettera huvudprogrammet med multiplikation av heltal.
Om samarbete på inlämningsuppgifterna: Varje grupp (som normalt består av en eller två studenter) ska göra en egen lösning, och skicka in den, men det är inte förbjudet att samarbeta eller fråga andra studenter om hjälp. Däremot ska man i så fall tydligt ange vilka som man samarbetat med. Varje lösning måste ange namnet på alla som bidrog i arbetet. Samarbete är alltså tillåtet, men måste redovisas. |
Godkänd redovisning utgör en del av delkurs 2 i kursen Programmeringsmetodik.
Inlämningsuppgifterna bör göras, och lämnas in, före tentan. Man får tenta utan att ha lämnat in uppgifterna, men: