Sid 1 (5) Övningsuppgifter till föreläsning 2 Variabler och uttryck Syfte Syftet med övningsuppgifterna är att träna på: Aritmetik, variabler, tilldelning, scanf och printf Generellt Diskutera gärna uppgifterna med andra. Be om att få förklara vad koden gör för någon annan och lyssna när någon annan förklarar för dig. Diskutera om ni löser uppgifterna lite olika. Uppgifter Övningsuppgift 2.1 Vi har på föreläsningen gått igenom variabler. En variabel måste ha ett namn, ett värde och en typ. Du ska skapa en variabel som heter age, som har typen heltal (int), och som får värdet 17. Nedan finns ett förslag till program. Din första uppgift är att skriva in programmet, kompilera och köra det. Vad skrivs ut? int age; age = 17; printf("min ålder är %d \n", age); I programmet deklarerar vi en variabel som heter age, av typen heltal. Det betyder att nu vet datorn om att du vill kunna lagra heltal på ett ställe som kallas age. Därefter tilldelas age värdet 17. Det som står till höger om likamedtecknet (=) beräknas först, i detta fall är det enkelt, det blir 17. Därefter stoppas värdet in i variabeln med hjälp av =. Tänk på = som en pil som pekar åt vänster, först beräknas det till höger, sedan överförs resultatet till variabeln till vänster. Det kan endast stå variabler till vänster om ett likamedtecken. Det finns en hel del andra rader i ditt program. De behövs för att datorn skall förstå en del saker vi vill göra, och finns för det mesta alltid med när vi skriver c-program. Talar om för datorn vilka sedan tidigare färdiga funktioner vi tänker använda, så att den kan kolla att vi gör rätt
Sid 2 (5) Här startar programmet alltid, denna rad måste finnas med. Efter måsvinge - parentesen kommer koden vi skriver printf("min ålder är %d \n", age); printf sköter utskrift på skärmen. Den skriver ut allt som finns mellan, och byter ut saker som %d mot värdet hos en variabel Måste finnas med för att datorn skall vara nöjd (hänger ihop med main) Ligger alltid sist i main, säger att det är slut på kod här Prova nu att experimentera med att ändra värdet i tilldelningen och se att utskriften ändras. Övningsuppgift 2.2 Man kan ha mer komplicerade uttryck till höger om =, till exempel beräkningar. Ett exempel är om vi vill lägga till något till en variabel som redan har ett värde. Säg att vi vill öka på åldern med 2. Det ser ut så här: age = 17; age = age + 2; Det som finns till höger om = beräknas först, i detta fall blir det 17 + 2, dvs 19. Därefter lagras detta resultat i age och ersätter 17 som fanns där tidigare. Prova att skriva in den extra raden i ditt program och se om det fungerar som du tänkt. Övningsuppgift 2.3 Nu är det dags för lite mer komplicerade uttryck. Antag att du skall ha fest och räknar med att det kommer 10 personer. Du har köpt 10 korvar men kommer på att det inte räcker och att varje person nog borde få två korvar var, och att du dessutom behöver fem stycken i reserv ifall några är extra hungriga. Du letar efter miniräknaren för att räkna ut hur mycket korv det blir totalt men inser snabbt att du kan skriva ett program som gör jobbet åt dig. Modifiera programmet ovan så att variabeln heter nrsausages istället för age, och ändra beräkningen så att nrsausages på slutet är lika med dubbla antalet ursprungliga korvar plus 5. Tips: nrsausages * 2 fördubblar antalet. Övningsuppgift 2.4 Att hålla på att skriva in hur många korvar man har i sitt program hela tiden är ju inte särskilt praktiskt, det vore ju bättre om programmet kunde fråga användaren efter det önskade värdet. På så sätt behöver du inte kompilera om programmet för att kolla hur det blir om du startar med 25 stycken istället för 10. I C finns en funktion som heter scanf som gör just det. Ändra ditt program så att du byter ut nrsausages = 10; mot följande: scanf("%d", &nrsausages);
Sid 3 (5) scanf stoppar programmet och väntar på att du skall skriva in ett tal, i detta fall ett heltal. Därefter måste du trycka på enter för att scanf skall vara nöjd. Prova att kompilera och köra ditt program. Fungerar det som du tror? Du märker att du inte får någon ledtråd av programmet att du skall skriva in något, ordna det genom att skriva in en printf-sats som förklarar vad som skall hända, strax innan scanf-satsen. Övningsuppgift 2.5 Vi har hittills använt oss av heltal i våra program, men det är inte alltid så praktiskt. Om vi vill väga saker till exempel vore det bra om det gick att ange 3.1 kilo. Ändra ditt program så att variabeln nrsausages nu heter sausageweight och är av typen double. Programmet ser nu ut ungefär så här: double sausageweight; printf("hur mycket korv har du? "); scanf("%d", &sausageweight); sausageweight = sausageweight * 2 + 5; printf("mängd korv du behöver: %d\n", sausageweight); Vad händer när du kör programmet? Kan du lista ut vad som är fel? Fick du några varningar av kompilatorn? Övningsuppgift 2.6 Både scanf och printf måste få reda på vilken typ det är på variabeln de skall använda, och det anger du med en formatkod, som är %d för ett heltal. För att läsa in flyttal (decimaltal) av typen double så använder du istället %lf. För att läsa skriva ut flyttal (decimaltal) så använder du istället %f. Prova att ändra i ditt program och se om du kan knappa in 3.5 som svar på frågan. Övningsuppgift 2.7 Som du ser av utskriften så får du en hel rad med nollor efter decimalpunkten. Om du vill ha ett snyggare resultat så kan du ändra lite på formatkoden till printf. Ändra till %5.2f och prova sedan att köra programmet och mata in olika stora tal, t.ex. 0.1, 2, 300, 50000.1234567. Formatet 5.2f betyder att talet skall skrivas ut med 2 decimaler och att det skall ta upp 5 positioner, inklusive decimalpunkten, dvs 99.99 borde vara det största talet som kan skrivas ut. Stämmer det? Om inte, varför? Prova även att ändra till %20.2f.
Sid 4 (5) Övningsuppgift 2.8 Det finns en hel del operatorer i C, som till exempel *, /, +, -. Skriv ett program som läser in två decimaltal, number1 och number2, och sedan skriver ut resultatet av: number1 + number2 number1 - number2 number1 * number2 number1 / number2 För att läsa in två tal kan du använda två scanf-satser efter varandra. I C är det tillåtet att utföra beräkningar på de ställen där man kan ha en variabel, så prova att använda följande sats för att skriva ut resultatet av första uttrycket: printf("summan är : %5.2f\n", number1 + number2); Lägg till printf-satser för alla uttrycken ovan. Blir resultatet som du tror? Övningsuppgift 2.9 I föregående uppgift använde vi decimaltal för beräkningarna. Ändra nu ditt program så att number1 och number2 är heltal, och ändra också formatkoderna till %d. Blir resultatet av körningen som du tror? Om inte, varför? Övningsuppgift 2.10 I föregående uppgift blev division av heltal inte riktigt som vi trodde. Det beror på att resultatet omvandlas till ett heltal, så att t.ex. 7 / 2 blir 3, inte 3.5 som man tycker att det borde. För att få ett resultat med decimaler måste vi använda flyttal. Det finns en till operator som används i just detta fall, % ( modulo eller resten vid division ). 7 % 2 ger resultatet 1, dvs vad som blir över när man dividerat 7 med 2. Heltalskvoten 7/2 ger 3, och kvar blir en etta. Prova att lägga till denna rad i ditt program: printf("resten : %d\n", number1 % number2); Provkör nu. Notera att resten blir 1 om du dividerar ett udda tal med två, och 0 om du dividerar ett jämnt tal med två. Detta används ibland som ett enkelt sätt att avgöra om ett tal är udda eller jämnt. Nu bör ditt program se ut ungefär så här: int number1, number2; printf("skriv in tal 1: ");
Sid 5 (5) scanf("%d", &number1); printf("skriv in tal 2: "); scanf("%d", &number2); printf("summan : %d\n", number1 + number2); printf("skillnaden : %d\n", number1 - number2); printf("produkten : %d\n", number1 * number2); printf("kvoten : %d\n", number1 / number2); printf("resten : %d\n", number1 % number2); Övningsuppgift 2.11 Om man har mer komplicerade uttryck så kan man använda parenteser för att göra dem mer lättlästa. Datorn har en inbyggd ordning för hur operatorerna skall användas, t.ex. så beräknas gånger före plus, men man kan ändra på det om man vill. Prova att ändra ditt program så att det skriver ut resultatet av: number1 * number2 + 5 number1 + number2 * 5 Multiplikationen utförs först oavsett i vilken ordning operatorerna kommer. Prova nu: number1 * (number2 + 5) (number1 + number2) * 5 Övningsuppgift 2.12 Skriv ett program som beräknar hur många mil en bil gått under det senaste året och hur stor den genomsnittliga drivmedelsförbrukningen per mil har varit. Indata till programmet är dagens mätarställning, mätarställningen för ett år sedan, samt hur många liter drivmedel som förbrukats det senaste året.