Innehåll Förord 1 Kapitel 1 3 1.1 Så kommer du igång...................... 3 1.2 Övningsuppgifter........................ 12 1.3 Lösningsförslag......................... 17 1.4 Eftersnack............................ 24
Innehåll ii
Förord Konsten att programmera är en färdighet, precis som konsten att läsa, skriva och räkna. För att förvärva en färdighet krävs övning övning ger färdighet Denna bok ger dig, genom sina drygt 150 lösta och väl kommenterade program, just möjligheten till övning. Innehållet, uppdelat på 14 kapitel eller föreläsningar, utgör en grundkurs i programmering. Tyngdpunkten ligger på problemlösning och programmering snarare än vid ett visst programspråk. Boken gör därför inte anspråk på att vara en fullständig genomgång av programspråket C. Du kommer snart att inse att du behöver lära dig använda datorsystemets hjälpfiler eller manualer som du enkelt finner på internet. För att översätta en lösning (en algoritm) du funnit till en som datorn kan exekvera, krävs ett programspråk. C är ett lämpligt första språk för den som tänker sig vidare till C++, Java eller C#. Så här använder du boken: Starta med att läsa igenom kapitlets teori och sätt dig in i tillhörande exempel. Gå sedan över till att lösa kapitlets övningsuppgifter. Det är bara om du tycker att ett problem är enkelt, som du har rätt att hoppa
Förord över det. Säkerheten (och glädjen) infinner sig när du löst cirka 100 av bokens uppgifter. Läs igenom texten, tills du säkert förstår vad uppgiften går ut på. Det finns en viss egennytta i att snabbt kunna sätta sig in i ett problem. Se varje uppgift som ett litet uppdrag och texten som en kravspecifikation. Skissa, gärna med penna och papper, hur du tänker dig lösningen. Gör klart för dig vad som är indata och vad som är utdata och hur beräkningarna ska utföras. Översätt din skiss till ett program i C, genom att skriva in det på datorn. Kompilera och testkör. Övertyga dig om att programmet verkligen är korrekt genom att testa det med olika indata. Om du stöter på svårigheter går du till lösningen och läser vad som står under rubriken diskussion. Ändra eventuellt din plan och gör nya försök. Om dessa tips inte ledde dig fram till ett fungerande program går du åter till lösningen och studerar nu koden till lösningsförslaget och läser kommentarerna. I den här situationen kommer du säkert att hamna då och då. Tänk då på att den vanligaste inlärningsmetoden är att just studera vad andra har gjort. Observera att det inte finns någon entydig lösning på en programmeringsuppgift. Det finns kanske lika många lösningar, som det finns programmerare. Detta betyder att ditt förslag till lösning kan skilja sig mycket från bokens, men likväl vara helt korrekt eller nära att fungera. Ge därför inte upp, om du intuitivt känner på dig att du är nära ett fungerande program. Förhoppningsvis kommer materialet i denna bok att ge dig grunderna i konsten att programmera. Även för den som inte tänker sig ett arbete inom IT och programmering, kommer konsten att lösa problem och att strukturera sina lösningar att vara en viktig förmåga i det framtida yrkeslivet. Till boken hör en hemsida där du återfinner alla bokens program och datafiler på elektronisk form. Dessutom finns här en del viktig information av teknisk karaktär. Håkan Strömberg Tyresö 2
Kapitel 1 1.1 Så kommer du igång Innan du kastar dig in i programmeringens underbara värld och innan Du kan få ditt första C-program att fungera behöver du skaffa dig och hjälpligt lära dig hantera en utvecklingsmiljö för C-program. Bäst för en nybörjare är troligtvis en integrerad miljö. Helt enkelt ett enda program från vilket hela programmeringsarbetet utförs. Det finns många alternativ att välja bland, både kommersiella produkter och freeware. Att lösa ett problem i denna bok, innebär för dig att följa detta schema: Sätta dig in i problemet. Det är förstås nödvändigt att förstå vad uppdraget går ut på. Kanske blir du tvungen att läsa texten flera gånger. Finna en plan för hur programmet ska konstrueras. Det är alldeles nödvändigt att du, på ditt modersmål, för dig själv kan beskriva hur programmet ska fungera. Kan du inte det är chansen obefintlig att du kan uttrycka det i det konstgjorda språket C. Skriva in programmet. I editorn skapar du nu källkoden sats för sats, rad för rad. I början kommer du att behöva koncentrera dig på att få syntaxen korrekt. C innehåller en mängd speciella tecken
Kapitel 1 som alla måste finnas med. Så småningom, när du blir mer van, kommer dessa tecken mer eller mindre automatiskt att hamna på rätt plats. Kompilera. Den C-kompilator du använder översätter nu den kod du skrivit in, till instruktioner som datorn kan utföra (exekvera). Visar det sig att din kod inte är korrekt utifrån den syntax som gäller för C, kommer du nu att få meddelande om detta. Dessa fel måste rättas för att komma vidare genom en ny kompilering. Länka. I de flesta integrerade system sker länkning omärkligt, bakom kulisserna. Om den kan genomföras utan fel skapas en exekverbar fil slutprodukten. Att länka innebär just att bygga den exekverbara filen med hjälp av ditt program och byggstenar från standardbibliotek. Testköra. Att ett program klarat sig igenom den syntaktiska kontrollen är ingen garanti för att det kommer att fungera som det är tänkt. Det finns ofta många möjliger till logiska fel. Om man finner ett fel här tvingas man korrigera koden, vilket leder till en ny kompilering och en ny exekverbar fil, som också måste testas... Utvecklingsarbetets gång visas i form av ett flödesschema i figur 1.1. För att konkretisera det hela har vi valt att exemplifiera detta med hjälp av Code::Blocks, freeware, som kan laddas ned gratis. Det är knappast troligt, om du valt att arbeta i en annan miljö, att den exakt motsvarar beskrivningen nedan och du måste därför själv söka upp de kommandon och menyval som gäller i din miljö. För att skapa en fil i vilken du kan lagra källkoden till ditt program väljer du från menyn File - New - Emptyfile. I fönstret som öppnar sig kan du nu skriva in texten, källkoden, till ditt program. Börja med att spara filen med lämpligt namn och med filtillägget.c. Det är viktigt att du redan från början skapar ordning och reda bland dina program. Skapa en biblioteksstruktur där du snabbt hittar dina program. Ett program en mapp kan vara ett sätt. Men lämpligare är kanske här en mapp för varje kapitel. Under Settings - Editor kan Du ställa in färger, fonter med mera, som sedan kommer att sparas tills du ändrar dem. Experimentera gärna, tills du fått en layout du trivs med. 4
1.1 Så kommer du igång När programmet är inskrivet är det dags att kompilera. Observera att programmet automatiskt sparas på hårddisken innan kompileringen startar. Detta kommando utför du genom att klicka på symbolen med en grön pil och ett kugghjul. Datorn synar nu din inskrivna kod och om fel upptäcks kommer detta att rapporteras i ett speciellt fönster längst ned på skärmen, under fliken Build log. Anmärkningarna i detta fönster är av två slag: varningar och fel. Felen måste åtgärdas för att komma vidare, men varningarna kan man hoppa över, när man väl förstått vad de vill förmedla. Då du dubbelklickar på ett felmeddelande eller varning får du upplysning om var i källkoden felet återfinns. När du korrigerat dina fel är det dags att kompilera på nytt. Då kompilering sker utan fel skapas en EXE-fil (exekverbar fil) på hårddisken. Programmet kan nu köras genom att klicka på den gröna pilen. Efter att till exempel ha utvecklat programmet test finns följande filer på hårddisken. test.c. Den viktigaste filen, som innehåller din källkod den text du skrivit in. Filtillägget för dina program bör vara.c. Tillägget.cpp skulle kunna vara ett alternativ, men det betyder då att det handlar om ett C++ program. Det är ju C vi ska studera här och inte C++. test.exe Slutprodukten, själva programmet som kan köras även utanför utvecklingsmiljön. Denna fil kan du ta bort eftersom den enkelt kan återskapas så länge test.c finns kvar. Ett (mycket) enkelt program Detta enkla program får bli det första C-program du möter: Exempel 1. Ett (mycket) enkelt program 1 #include <stdio.h> 2 int main(void){ 3 printf("jag älskar programmering - C Puss Puss"); 4 } 5
Kapitel 1 Figur 1.1: Arbetsgången vid enkel programutveckling Så här kan det förklaras: 1 Den första raden, include, knyter ett så kallat funktionsbibliotek till programmet. Vi behöver det för att klara av utskriften (standard in- och utmatning). Vi kommer att lära oss mer om detta och andra bibliotek senare och accepterar nu denna rad, rakt upp och ned. 2 Raden int main(void) finns i alla C-program i den här boken och inleder huvudfunktionen. Raden avslutas med en vänsterklammer ({), som har sin avslutning på sista raden (}). När du jämför bokens program med andra program, i andra böcker, kanske du upptäcker att det finns alternativ till texten på denna rad: int main() eller bara main(). 3 Mellan dessa klamrar finns själva programmet. Programmet här består av en sats, ett anrop till funktionen printf. Om vi glömt den första raden i detta program, include-raden, hade systemet inte känt igen printf, som förstås är till för att skriva ut något på skärmen. Detta något är denna gång en text Jag älskar programmering - C puss puss. 6
1.1 Så kommer du igång Observera att alla tecken, som finns i detta program, är nödvändiga för en korrekt syntax, semikolon (;), citationstecken (") och parenteser. Dessa små till synes obetydliga tecken kommer Du att få slåss med under hela kursen! För övrigt kan sägas att detta program är fullständigt meningslöst. Ett program, som levererar samma resultat varje gång det körs, har förstås en kort livslängd. För att ett program ska vara intressant måste det på något sätt kunna läsa in data, som efter bearbetning leder till nya, tidigare okända, resultat. Ett program till Detta program är också väl enkelt, men ändå betydligt mer komplicerat än det förra. Programmet tar emot två heltal, summerar dem och skriver ut summan. Fantastiskt! Exempel 2. Ett program till 1 #include <stdio.h> 2 #include <conio.h> 3 int main(void){ 4 int a,b,c; 5 printf("skriv in ett tal: "); 6 scanf("%d",&a); 7 printf("ett till: "); 8 scanf("%d",&b); 9 c=a+b; 10 printf("summan blir = %d",c); 11 getch(); 12 } Programlistningarna i denna bok innehåller en kolumn med tal längst till vänster. Denna radnumrering ingår inte i koden utan används här för att i efterföljande text kunna referera till önskad rad. 7
Kapitel 1 Förklaring: 1-3 Programmet inleds precis som det tidigare med include och int main(void), och så ska alla program inledas i övningarna till detta kapitel, som du senare ska göra. Dessutom finns i rad 2 texten #include <conio.h>, som inkluderar biblioteket conio.h. Förklaring kommer längre ner. 4 int a,b,c; är en så kallad deklaration. Man talar här om att man ska använda tre variabler, som alla ska vara av heltalstyp, int,. Det betyder att de kan anta värden (... 2, 1,0,1,2...). Det här med variabler är viktigt. Program utan variabler är meningslösa. En metafor för begreppet variabel: En variabel kan liknas vid en låda. På lådan står ett namn, variabelns namn (här a, b eller c). I lådan förvaras variabelns värde. Lådan är av en viss typ, i detta fall heltalstyp. Lådan har en adress. Med hjälp av namnet kan man ta reda på var i minnet lådan finns, även om det oftast är ointressant. Frågan vilket värde har b? är liksom kommandot ge variabeln a värdet 7 meningsfulla. 5 printf skickar ut texten Skriv in ett tal: till skärmen. 6 Med scanf får man datorn att läsa in data från tangentbordet. %d betyder att datorn förväntar sig ett heltal (int) och det är ju just det vi tänkt oss mata in. Talet lagras nu i variabeln a. Varför det ska stå ett &-tecken framför återkommer vi till många gånger. Troligtvis kommer du i början ofta att glömma detta &-tecken, vilket leder till en bug. 7-8 De två följande satserna är i stort en upprepning av de två tidigare, men nu är det variabeln b, som får ett värde. 9 I nästa sats sker den stora beräkningen, c=a+b. Denna sats kallas tilldelningssats. För att den ska vara möjlig, måste alla variabler till höger om likhetstecknet tidigare fått ett värde (och de har de ju här). Resultatet då satsen utförs blir att variabeln c tilldelas det värde som erhålles då a s och b s värden adderas. På det sättet får alltså nu också c ett värde. Vilket värde c får bestäms förstås av de värden a och b fått vid inmatningen. Ingenting programmeraren vet något om. Det är operatören, den som kör programmet, som bestämmer detta. 8
1.1 Så kommer du igång 10 Programmets näst sista sats meddelar resultatet. Uttrycket Summan blir =%d ska tolkas som att texten, fram till %-tecknet, skrivs ut. %d meddelar att här ska ett heltalsvärde skrivas ut vilket anges sist i printf-satsen. Det är alltså värdet för c som ska skrivas ut. 11 Följande kommentar beror på vilken utvecklingsmiljö du valt. När du exekverar programmet inifrån en integrerad miljö öppnas ett svart fönster, konsol, där din dialog med programmet kommer att visas. Om du provade det första programmet ovan, så upptäckte du att den konsolen, bara blinkade till och att du inte hann läsa texten. När programmet har exekverat klart stängs konsolfönstret, vilket är logiskt. Detta kan botas genom att lägga till satsen getch() sist i programmet. Vilket betyder att programmet väntar tills en tangent tryckts ned innan exekveringen avslutas och konsolfönstret stängs. För att kunna använda getch() krävs att conio.h är inkluderad. Observera att detta kladd inte är nödvändigt om du kör ditt program från ett redan öppet konsolfönster. conio.h och getch() hör heller inte till ANSI C och kanske har du valt en utvecklingsmiljö där denna teknik inte är möjlig. Fortsättningsvis utelämnar vi detta i våra programlistningar. Att programmera I denna programmeringskurs står du inför två stora uppgifter. Delas att lära dig ett programmeringsspråk (C) och dels att lära dig programmera. Att lära sig C innebär att lära sig syntax (satslära) och semantik (betydelselära) för ett språk, som någon annan har skapat och som gjorts möjlig för datorer att förstå. Att lära sig programmera innebär att lösa problem. Att läsa, tolka och förstå en text, som innehåller ett uppdrag, som någon vill ha utfört. Är uppdraget enkelt eller programmeraren duktig kanske lösningen kan kodas direkt vid datorn, men troligare är att programmeraren måste upprätta en plan innan arbete vid datorn kommer i fråga. Verkliga uppdrag är oftast så stora, att flera personer ingår i arbetsgruppen. Kravet på en plan blir då ännu större. Att lära sig programmera är egentligen oavhängigt programspråk, men vill man genomföra alla stegen, från idé till färdig produkt, måste man ha ett språk att uttrycka sig i. I vårt fall C. En parallell: Ett språk är 9
Kapitel 1 nödvändigt för en författare, men det är inte tillräckligt för att bli en bra författare. Detta gäller också för en programmerare. Därför sätter vi i denna kurs stor vikt vid problemlösandet det som kan göra dig till en bra programmerare. Programspråket C kan delas in i ett antal olika delar. Varje del har ett betydande djup det finns mycket att lära inom varje del. Men i stället för att gå på djupet inom en del i taget, väljer vi här att portionera ut lite i taget från flera områden på en gång. Vi tar en skiva av C-osten Ett tredje exempel Även om problemet är enkelt och du genast kan skriva ned koden, ska vi här genomföra framtagandet av en plan för hur programmet ska fungera. Uppgift: Skriv ett program som tar emot data om resistansen hos två motstånd R 1 och R 2 och beräknar ersättningsresistansen R 3 för R 1 och R 2 parallellkopplade. Indata: Resistansen hos R 1 och R 2. Utdata: Ersättningsresistansen R 3 Lösning: Vi startar med att läsa in värden på R 1 och R 2. Ersättningsresistansen R 3 bestäms sedan med hjälp av formeln 1 R 3 = 1 R 1 + 1 R 2 Om vi uttrycker R 3 explicit får vi formeln R 3 = R 1 R 2 R 1 +R 2 Programmet avslutas med utskrift av R 3. 10
1.1 Så kommer du igång Körningsexempel: Resistans hos R1 (ohm) : 100 Resistans hos R2 (ohm) : 50 R3 beräknas till 33.333 ohm Exempel 3. Ett tredje exempel 1 #include <stdio.h> 2 int main(void){ 3 float r1,r2,r3; 4 printf("resistans hos R1 (ohm) : "); 5 scanf("%f",&r1); 6 printf("resistans hos R2 (ohm) : "); 7 scanf("%f",&r2); 8 r3=r1 r2/(r1+r2); 9 printf("r3 beräknas till %6.3f ohm\n",r3); 10 } Förklaringar till programmet 1-2 Inledningen har vi börjat vänja oss vid nu. Så kommer den att se ut ett tag framåt i kursen och kanske kan det vara arbetsbesparande att skriva en skelett -fil som innehåller just dessa inledande rader tillsammans med den avslutande. För att slippa skriva samma sak gång på gång... 3 De variabler vi tidigare använt har varit av heltalstyp (int). Här använder vi tre variabler som deklarerats float, flyttal. Detta innebär förstås att de är tillåtna att tilldelas reella värden utöver heltal, som till exempel 2.34 och 1234.008. Observera dock att man i denna värld använder decimalpunkt till skillnad från det i vardagsbruk i Sverige vanligare decimalkommat. 5,7 I stället för koden %d i tidigare scanf-satser, där vi läste in heltal, använder vi här %f, som anger att det är fråga om flyttal. 8 Programmets nyckelsats, där resultatet beräknas. Observera att man måste ha parenteser i nämnaren. Vi återkommer till aritmetiska uttryck längre fram, men du är säkert van vid detta skrivsätt från räknedosan. 9 När vi nu ska skriva ut resultatet, skriver vi först en text i vilken vi med %-tecken markerar platsen för det numeriska värdet. Hos 11
Kapitel 1 %6.3f står f för att det handlar om ett flyttal, 6 för att hela talet ska ta upp sex positioner på raden och 3 för att vi önskar tre decimaler. r3, nästan sist på raden, anger att det är denna variabels värde som ska skrivas ut på %-tecknets plats i texten. 1.2 Övningsuppgifter Övning och åter övning, är det säkraste sättet att nå framgång i detta ämne. Vi sätter därför igång direkt. Även om du inte kommer att lyckas lösa dessa problem, kan det vara idé att skriva in dem direkt från facit. Du behöver praktiska övningar på att skriva in kod, kompilera, ändra, spara och köra program. Var inte rädd för att experimentera: Vad händer om jag skriver så här istället? Uppgifterna här leder i allmänhet till program av den raka typen, det vill säga varje sats i programmet utförs precis en gång. Normalt inleds programmen med ett antal printf- och scanf-satser, där indata ges, följt av en eller flera tilldelningssatser. Programmet avslutas så med printfsatser som skriver ut resultatet. För att klara dessa uppgifter ska du... känna till hur ett enkelt C-program ser ut kunna starta den utvecklingsmiljö du valt. Till exempel DevCpp. kunna skriva in, kompilera, rätta och spara ett program kunna köra ett program veta hur man deklarerar variabler av typerna heltal och decimaltal med hjälp av scanf kunna läsa in heltal och decimaltal från tangentbordet kunna skapa en tilldelningssats där uttrycket till höger om liketstecknet använder de fyra räknesätten kunna skriva ut resultatet på bildskärmen med hjälp av printf kunna städa upp i biblioteket som använts, så att endast källkodsfilerna (med filtillägget C) återstår. Det är ju dessa filer som du själv skapat och som därför är viktigast. 12
1.2 Övningsuppgifter Uppgift 1-1. Ohms lag Skriv ett litet enkelt program som frågar efter ström (givet i ampere, A) och spänning (givet i volt, V) och som med hjälp av dessa värden och Ohm s lag bestämmer resistansen (i ohm). En körning av programmet ska ge följande dialog: Ström (A)...: 10 Spänning (V)...: 200 Ger resistansen 20 Ohm Här antar vi att ström och spänning ska kunna anges som decimaltal, det vill säga man ska kunna ange strömmen till 10.5 (observera att man använder decimalpunkt). För att kunna lagra ett sådant tal i en variabel måste variabeln vara av typen float. I scanf-satsen talar vi om att det är ett flyttal vi förväntar oss genom %f Du kommer väl ihåg Ohms lag? Tecknet för division (divisionsoperatorn) är /. När man ska skriva ut resultat av en division kanske man bara vill ha två decimaler. Det ordnar man genom att skriva %.2f i formatet (uttrycket mellan citationstecknen) i printf-satsen. Uppgift 1-2. Bensintanken Man känner till mätarställningen hos en bil (given i mil) före resan och man läser av mätaren efter. Eftersom bensintanken var full vid resans början kan man med hjälp av den volym bensin, som gick att fylla på efter resan, bestämma bensinförbrukningen i liter/mil. Skriv ett program som utför beräkningarna och i övrigt fungerar som körningsexemplet nedan. Mätarställning före resan (mil): 123456 Mätarställning efter resan (mil): 123480 Tanken rymmer efter resan (liter): 20 Bensinförbrukningen 0.833 liter/mil 13
Kapitel 1 Figur 1.2: Uppgift 1-3. Balken Figur 1.2 ovan är symmetrisk (i y-led). Skriv ett program som tar emot uppgifter om de fyra längderna och härur beräknar figurens area. Ett körningsexempel: A: 20 B: 5 C: 18 D: 10 Figurens area är 260 Uppgift 1-4. Ett antal sekunder Skriv ett program, som räknar om ett givet antal sekunder i timmar, minuter och sekunder. Dialogen ska se ut som nedan Antal sekunder: 7356 7356 sekunder = 2 tim 2 min och 36 s Alla variabler i programmet ska vara av heltalstyp. När man i C utför en division likt 125/60 blir resultatet exakt 2, vilket betyder att då två heltal divideras blir resultatet alltid ett heltal decimalerna kastas. Av detta följer att 99/100 blir lika med 0. Denna egenskap passar oss alldeles utmärkt här. 14
1.2 Övningsuppgifter Uppgift 1-5. Herons formel Med hjälp av Herons formel kan man bestämma arean (T) till en triangel då man känner längden hos de tre sidorna, a, b, c. Herons formel ser ut så här: T = s(s a)(s b)(s c)) där s = a+b+c 2 Ge programmet följande dialog: Sidan a: 12 Sidan b: 15 Sidan c: 17 Triangelns area är 87.75 För att beräkna kvadratroten ur ett tal n använder man funktionen sqrt() och skriver sqrt(n). För att systemet ska finna denna funktion måste vi inkludera matematikbiblioteket med #include <math.h>. Vad händer när du kör ditt program för sidlängderna 9, 5 och 3? Varför blir resultatet som det blir och hur skulle programmet kunna garderas mot detta? Uppgift 1-6. Cylindern Skriv ett program som beräknar massan hos en cylinder då dess höjd (h), radie (r) och densitet, (ρ) är givet. Följande formler är till glädje. Först för att beräkna cylinderns volym V c och sedan för att beräkna densiteten ρ: V c = π r 2 h ρ = m v 15
Kapitel 1 Dialogen bör se ut som nedan: Cylinderns höjd (m)...: 0.5 Cylinderns radie (m)...: 0.3 Cylinderns densitet (kg/dm3).: 3 Cylinderns massa är 424.12 kg Uppgift 1-7. Bromssträckan Med hjälp av formeln s = v 4 + v2 125 kan man bestämma, approximativt, bromssträckan s (i meter) hos en bil, som färdas med farten v (km/tim) på torrt underlag. a Skriv ett program som frågar efter hastigheten och bestämmer bromssträckan. b Skriv ett program som frågar efter bromssträckan och bestämmer hastigheten. c Utveckla programmet i a, så att det även tar hänsyn till förarens reaktionstid. Det tar alltid lite tid för föraren att reagera och flytta foten till bromspedalen. Dialogen för c bör se ut som nedan: Hastighet (km/tim)..: 100 Reaktionstid (s)...: 0.2 Stoppsträckan blir 110.56 m 16
1.3 Lösningsförslag 1.3 Lösningsförslag Uppgift 1-1. Ohms lag 1 #include <stdio.h> 2 int main(void){ 3 float i,u,r; 4 printf("ström (A) "); 5 scanf("%f",&i); 6 printf("spänning (V) "); 7 scanf("%f",&u); 8 r=u/i; 9 printf("ger resistansen %6.2f Ohm\n",r); 10 } Kommentarer: H Programmet har stora likheter med 1.1 Ett tredje exempel. 8 Formeln som ska användas är förstås R = U I 9 Resultatet skrivs sedan ut med 2 decimaler. Uppgift 1-2. Bensintanken Diskussion: Tre uppgifter bildar indata, mätarställningen före resan, fore, mätarställningen efter resan, efter och hur mycket bensin tanken rymmer efter resan, bensin. Utdata, förbrukningen per mil, permil, beräknas med formeln permil = bensin efter fore 17
Kapitel 1 1 #include <stdio.h> 2 int main(void){ 3 float fore,efter,bensin,permil; 4 printf("mätarställning före resan (mil) :"); 5 scanf("%f",&fore); 6 printf("mätarställning efter resan (mil) :"); 7 scanf("%f",&efter); 8 printf("tanken rymmer efter resan (liter):"); 9 scanf("%f",&bensin); 10 permil=bensin/(efter fore); 11 printf("bensinförbrukning %.3f l/mil",permil); 12 } Uppgift 1-3. Balken Diskussion: Formeln för arean med de beteckningar som användes i figuren Area = ac 2bd 1 #include <stdio.h> 2 int main(void){ 3 int a,b,c,d,area; 4 printf("a:"); 5 scanf("%d",&a); 6 printf("b:"); 7 scanf("%d",&b); 8 printf("c:"); 9 scanf("%d",&c); 10 printf("d:"); 11 scanf("%d",&d); 12 area=a c 2 b d; 13 printf("figurens area är %d",area); 14 } 18
1.3 Lösningsförslag Uppgift 1-4. Ett antal sekunder 1 #include <stdio.h> 2 int main(void){ 3 int sekunder,t,m,s; 4 printf("antal sekunder: "); 5 scanf("%d",&sekunder); 6 t=sekunder/3600; 7 m=(sekunder 3600 t)/60; 8 s=sekunder 3600 t 60 m; 9 printf("%d sekunder = %d tim, %d min och %d s\n", 10 sekunder,t,m,s); 11 } Kommentarer: H Den här uppgiften ställer lite krav på problemlösaren. Det är inte alldeles givet hur man får fram antalet minuter och sekunder. 6 Genom tipset i texten förstår vi att t kommer att innehålla antalet hela timmar efter att sekunder dividerats med 3600. 7 Nu vet vi hur många sekunder som gått åt för timmarna och kan räkna fram hur många som återstår. Detta antal dividerar vi sedan med 60 för att få fram antalet minuter m. 8 Återstår att ta reda på hur många sekunder, s, som blir över. 9-10 En lång sats kan i C brytas ned till två eller flera rader. Detta görs oftare i boken än du kommer att behöva göra i praktiken. 19
Kapitel 1 Uppgift 1-5. Herons formel 1 #include <stdio.h> 2 #include <math.h> 3 int main(void){ 4 float a,b,c,s,d; 5 printf("sidan a: "); scanf("%f",&a); 6 printf("sidan b: "); scanf("%f",&b); 7 printf("sidan c: "); scanf("%f",&c); 8 s=(a+b+c)/2; 9 d=s (s a) (s b) (s c); 10 if (d<=0) 11 printf("ingen triangel\n"); 12 else 13 printf("triangelns area är %f\n",sqrt(d)); 14 } Kommentarer: 5-7 Hittills har vi i våra program skrivit en sats per rad. Här har vi nu två satser per rad och det fungerar lika bra. Det kan kännas logiskt att ha dessa två satser tillsammans. Vi kommer att diskutera formatering av program längre fram. 8-9 Vi startar med att bestämma värdet av s. Detta värde använder vi sedan på inte mindre än fyra ställen i rad 9. Du glömde väl inte parenteserna i rad 8? 10-13 För att klara av den lilla extrafrågan måste vi skjuta in en if-sats, just nu överkurs. Om diskriminanten, d < 0, kan ingen triangel bildas. Om en sida är 9, så kan de andra två, 3 och 5, inte nå fram till varandra. 20
1.3 Lösningsförslag Uppgift 1-6. Cylindern 1 #include <stdio.h> 2 int main(void){ 3 float h,r,d,v,m; 4 printf("cylinderns höjd (m).......... : "); 5 scanf("%f",&h); 6 printf("cylinderns radie (m).......... : "); 7 scanf("%f",&r); 8 printf("cylinderns densitet (kg/dm3).. : "); 9 scanf("%f",&d); 10 v=3.14159265 r r h; 11 m=d v 1000; 12 printf("cylinderns massa är %.2f kg\n",m); 13 } Kommentarer: 10 Först beräknar vi volymen v. Till det behöver vi π, där vi här nöjer oss med att skriva in konstanten med så många decimaler vi minns. r 2 skriver vi som r*r. Det finns ingen direkt operator för beräkna potenser i C. Det gör det däremot i Basic och Fortran, två andra, vanliga programspråk. 11 Återstår två smärre svårigheter. Först måste vi lösa ut m ur den givna formeln för densiteten och sedan multiplicera med 1000 för att få svaret i kg. 12 När vi inte anger antalet önskade decimaler i printf-satsen får vi leva med ett överdrivet stort antal. 21
Kapitel 1 Uppgift 1-7a. Bromssträckan 1 #include <stdio.h> 2 int main(void){ 3 float s,v; 4 printf("bilens hastighet (km/tim) "); 5 scanf("%f",&v); 6 s=v/4+v v/125; 7 printf("bromssträckan blir %.2f meter\n",s); 8 } Kommentarer: H Kommentarer överflödiga, om du inte råkar deklarera v som int förstås. Är du nyfiken på vad som händer, så ändrar du programmet och testkör. Kan du förklara det felaktiga resultatet? Uppgift 1-7b. Bromssträckan 1 #include <stdio.h> 2 #include <math.h> 3 int main(void){ 4 float s,v,k; 5 printf("bromssträckan (m) "); 6 scanf("%f",&s); 7 k=125.0/8.0; 8 v=sqrt(k k+125 s) k; 9 printf("bilens hastighet är %.2f km/tim\n",v); 10 } Kommentarer: H För att kunna beräkna v, så måste vi ha v explicit uttryckt och för att nå dit måste vi lösa andragradsekvationen med avseende på v s = v 4 + v2 125 22
1.3 Lösningsförslag En andragradsekvation har som bekant två rötter v 1,2 = 5( 25± 625+320s ) Om dessa rötter kommer fram genom handräkning eller med hjälp av Mathematica bryr sig inte uppdragsgivaren om. Vi väljer förstås den positiva roten. Då roten är funnen är programmet lätt att skriva. Detta är därför ett exempel på en uppgift där det största arbetet ligger utanför själva programskrivandet. 8 Uppgift 1-7c. Bromssträckan 1 #include <stdio.h> 2 int main(void){ 3 float s,v,extra,t; 4 printf("bilens hastighet (km/tim) "); 5 scanf("%f",&v); 6 printf("reaktionstid (s) "); 7 scanf("%f",&t); 8 extra=1000.0/3600.0 v t; 9 s=v/4+v v/125; 10 printf("stoppsträckan = %.2f meter\n",s+extra); 11 } Kommentarer: 4-7 Detta program behöver två indata. Reaktionstiden ges i sekunder. 8 Här beräknas hur långt bilen hinner förflytta sig under reaktionstiden. 9 Bromssträckan beräknas som i 1 7a 10 Den totala stoppsträckan skrivs ut som summan av extra och s. 23
Kapitel 1 1.4 Eftersnack En del kapitel avslutas med rubriken Eftersnack, där vi kommer att ställa en del kontrollfrågor, ta upp en del mer eller mindre viktig teori och besvara vanliga studentfrågor: Fråga 1. Hur gammalt är programspråket C? Svar 1. Cirka 35 år. Dennis Ritchie började utvecklingen omkring 1970. Bland annat med idéer från programspråket B, utvecklat av Ken Thompson. 1978 kom Brian Kernighan och Dennis Ritchie ut med boken The C Programming Language, som man ofta refererar till som K&R. Denna bok kom att bilda en första sorts standard, idag kallad Traditionell C. Det riktiga standardiseringsarbetet kom igång i mitten på 80-talet och 1989 lades ANSI C (C89) fram. Denna standard har sedan uppdateras 1995 (C95) och 1999 (C99). I början av 90-talet började C få konkurrens av sin storebror C++. C är nästan, men inte helt en delmängd av C++. Vilken dialekt av C du använder spelar mindre roll i denna kurs. Fråga 2. Är C ett lämpligt nybörjarspråk? Svar 2. På den tiden då Basic och Pascal var vanliga nybörjarspråk nådde programmeringen ut till en bredare publik. Fler lärde sig lite om programmering i början av 80-talet än idag, trots att det då inte var lika gott om datorer. Eftersom C++ och Java är naturliga efterföljare till C, kan man säga att C är ett lämpligt språk att starta med. Fråga 3. Varför ingår det kurser i programmering även i utbildningar, där det inte är tänkt att man efter examen ska arbeta med datorer och programutveckling? Svar 3. Det är inget godtagbart svar på frågan, men denna typ av kurser har funnits i 40 år, insprängda i de flesta tekniska och naturvetenskapliga utbildningar. Den färdighet som en väl genomförd programmeringskurs erbjuder är inte fel att ha, vad man än kommer att syssla med i sitt yrkesliv. I dessa kurser får du möjlighet att strukturera och lösa problem där det finns många olika vägar fram till målet. Du utvecklar din kreativitet och fantasi, 24
1.4 Eftersnack men måste samtidigt lära dig bygga stabila och korrekta program som exakt följer de regler som datormiljön ställer upp. Fråga 4. Jag har sett i andra böcker olika inledningar av main. Till exempel void main(void) och enbart main(). Kan denna rad se ut lite hur som helst? Svar 4. I tidigare versioner av C har det varit tillåtet att utelämna int här, men sedan Standard C (1999) måste main förgås av int. Dina två förslag leder dock, för de flesta kompilatorer, endast till en varning, som man inte behöver bry sig om. Vi återkommer senare till vilken funktion int har här, i samband med funktioner. 25
Kapitel 1 26
Sakregister adress, 8 conio.h, 8, 9 deklaration, 8 filer, 5 funktionsbibliotek, 6 getch, 9 heltalstyp, 8 int, 8 kompilering, 5 källkod, 4 main, 6 printf, 8 raka program, 12 scanf, 8 tilldelningssats, 8 variabel, 8