Lektion 1 - Steg 1 Introduktion Kursen är utvecklad som ett projekt med syfte att stödja ett flexibelt lärande. Idéerna bakom den successiva examinationen är att synliggöra de enskilda inlärningsstegen i kursen. Tanken är att du ska få större möjlighet att kontrollera dina framsteg och därmed också planera dina självständiga studier så bra som möjligt. Vi hoppas att en större valfrihet bland de praktiska tillämpningarna ska upplevas stimulerande, samtidigt som varierat material och olika svårighetsnivåer tillgodoser flera målgrupper. Det ska kännas lagom utmanande för både dig som är nybörjare och för dig som redan tidigare programmerat. En översiktlig beskrivning av kursupplägget och de olika kursstegen hittar du på kurswebbens Om kursen. Den kurswebbsida du ska utgå från just nu är Steg1, där du i högerkolumnen hittar "Förslag till arbetsgång", vilken du bör följa. Under denna finns stegets aktuella studie- och arbetsmaterial, bl.a. praktiska tillämpningar samt ytterligare kompletterande material på förenklande eller fördjupande nivå. Var uppmärksam på att instuderingsfrågorna är till för att hjälpa dig läsa boken och kontrollera att du förstått innehållet. De innehåller också en del kompletterande teori. I Steg 1 är detta kanske framför allt kunskapen om att en variabel både är en synonym för en adress i datorns minne (l-value) och det data man kan lagra där (r-value). Till höger på kurswebbens Steg 1 hittar du Mappstruktur för programmeringsuppgifter (1DV433(cpp) som du bör använda för de praktiska tillämpningarna. Packa inför första programmeringsuppgiften upp denna på P: om du använder skolans datorer eller på t ex C: om du använder egen dator. Där finns en färdig samling av mappar för dina laborationsuppgifter samt programkod för ”0-poängarna” och de obligatoriska uppgifterna. Eftersom kursen läses av både svensk- och engelskspråkiga studenter, kan tillgängliga dokument i viss mån skilja sig mellan de båda versionerna av kurswebbplats. För dig som läser den svenska kursen finns exempelvis visst inspelat lektionsmaterial (”föreläsningar”, eller programmerings-demonstrationer som härrör från tidigare kursomgångar). Dessa är inte tillgängliga på engelska. Å andra sidan har vi i stor omfattning valt att använda engelska för språket i den kod som du kan stöta på i materialet, eftersom det underlättar en enhetlig tolkning kring ev. gemensamma arbetsuppgifter. Kursens teoretiska examination – de stegtest som sker i slutet av varje steg, sker på engelska. För de programmeringstekniska koncept som kursen behandlar, finns svenska översättningsförsök av varierande art, men svenska begrepp är inte alltid entydiga eller vedertagna. För att undvika feltolkningar och underlätta användning av din engelskspråkiga litteratur, så är därför stegtestens frågor på engelska, vilket många kursdeltagare har efterlyst. Testbanken (såväl som QuizMaster-programmet) är skapad av förlaget Pearson Education. Var noga med att, i god tid före det första stegtestet, läsa den (viktiga) information som finns under menyrubriken Examination på kurswebbplatsen! Hello World Vi ska skapa ett program som skriver ut Hello World på skärmen. Detta är en tradition, att visa hur ett "Hello World"-program ser ut i ett nytt språk. Källkoden skriver vi in i en editor t ex Notepad eller EDIT. Den fullständiga koden ser ut så här: /* --------------------------------------------------------------------------------File: Hello.cpp Purpose: Prints “Hello World” on the screen Ver : 2005-10-31 Author: Tommy Löfqvist ------------------------------------------------------------------------------------- */ #include <iostream> // For the use of ‘cout’ using namespace std; // We use the namespace std int main() { cout << "Hello World\n"; return 0; // Returns 0 to the “calling” Operating System, ie Windows } /* --------------------------------------------------------------------------------File: Hello.cpp Purpose: Prints “Hello World” on the screen Lektion 1 - Steg 1 Ver : 1 Author: Tommy Löfqvist ------------------------------------------------------------------------------------- */ #include <iostream> // For the use of ‘cout’ using namespace std; // We use the namespace std int main() { cout << "Hello World\n"; return 0; // Returns 0 to the “calling” Operating System, ie Windows } Lektion 1 - Steg 1 Kommentarer till programkoden. För att vi ska veta vad programmet gör skriver vi en kommentar i början. All text mellan /* och */ ignoreras av kompilatorn (översättaren) och är bara till för programmeraren som läser koden. Längre ner i koden finns exempel på enradskommentarer, //, som endast gäller raden ut. Använd helst enradskommentarer i koden så kan man kommentera bort större (felaktiga?) avsnitt med /* och */ Utskriftsfunktioner t ex cout ingår inte i själva språket utan är en biblioteksrutin. För att kompilatorn ska veta hur den ska tolka funktionen cout inkluderas information om hur cout är definierad. <iostream> är en s.k. headerfil för in/out funktioner. Där finns nödvändig information om hur cout ska tolkas. Observera att de nya biblioteken till C++ använder namn utan ändelsen .h, t ex <iostream.h> som var vanligt tidigare. using namespace std talar om att cin hör till C++ standard namnrymd (namespace), där finns alla funktioner som hör till C++ standard bibliotek. Det är en slags klassning av funktioner som hör ihop. Detta används för att undvika namnkollisioner. Det är möjligt att du eller någon annan vill skapa en funktion som heter cout, den måste i så fall läggas i en annan namnrymd, annars vet inte kompilatorn vilken funktion som ska användas. Ett annat sätt är att i stället skriva std::cout << "Hello World" ; Om du vill använda någon annan version av cout skriver man myNamespace::cout << "Hello Word"; All exekverbar kod i C++ måste skrivas i en funktion. (Nästan) alla C++ program ska ha en funktion som heter main(). Programkörningen startar alltid i main() från första raden och nedåt. Programmet avslutas med return 0; som returnerar värdet 0 till anroparen, dvs. operativsystemet eller något annat program. Om det uppstår ett fel ska man se till att returnera en felkod, dvs. ett tal som är större än 0. (Vi returnerar vanligen 0 i våra övningsprogram) Koden mellan klamrarna { och } dras ALLTID in ett tab-steg. Detta kallas indentering och används för att göra koden mer läsbar. Detta kommer du att förstå senare när koden blir mer komplicerad. Kompilering och länkning Källkoden beskriven ovan kan inte köras av processorn utan måste först översättas (kompileras) till maskinkod. Vi kommer att kompilera, länka och köra vårt första program från kommandotolken som följer med utvecklingsmiljön Visual Studio. I katalogstrukturen som nämns ovan, kan du hitta en beskrivning över hur du (bl.a.) öppnar denna, i en textfil med namnet ReadMe. (Titta efter den i mappen Step1->3_CompileError eller Step1->4_LogicalError.) Vi skriver cl -c -EHsc hello.cpp för att kompilera koden. (Kompilera = översätta till maskinkod) Vi får då en objektfil, hello.obj, som innehåller en något ofullständig maskinkod. Eftersom programmet anropar biblioteksrutiner vet inte kompilatorn exakt var dessa finns i minnet utan det finns bara referenser till dessa. Det blir sedan länkarens uppgift att lägga in rätt adress till dessa biblioteksrutiner i koden och bilda en körbar .exe fil som enbart består av maskinkod som kan köras av processorn. Vi länkar med kommandot: link hello.obj Lite experiment Det känns lite torftigt att skriva ett program som bara skriver ut ett enda Hello World på skärmen, därför testar vi for-satsen som har möjlighet att upprepa utskriftraden hur många gånger vi vill. Vi gör följande ändringar i main: int main() { for (int i = 0; i < 10; ++i) { cout << "Hello World\n"; } return 0; } Och får 10 st Hello World under varandra i=0; i<10 false true cout << "Hello World" ++i; Lektion 1 - Steg 1 for-satsen fungerar så här: i är en variabel, ett reserverat minnesutrymme i datorn där man kan spara ett heltal, (int = integer = heltal) som från början initieras till 0. Därefter kontrolleras om villkoret i < 10 är sant (vilket det är från början), då utförs alla satser som finns i blocket, dvs. mellan { och }. Sedan utförs uppdateringsuttrycket ++i vilket ökar i med 1. Nu testas åter uttrycket i < 10, om detta är sant utförs åter satserna i blocket avslutat med ++i. Till slut blir i lika med 10 och repetitionen avslutas. I samband med variabeln tittade vi på hur variabeln lagras i minnet. Det finns beskrivet i instuderingsuppgifterna. Intressanta effekter 1) Skriv ut värdet på i så får vi numrerade Hello World-rader for (int i = 0; i < 1000; ++i) { cout << i << " Hello World\n"; } 2) Tag bort nyradtecknet så får vi hela skärmen full med Hello World for (int i = 0; i < 1000; ++i) { cout << "Hello World "; } Programutveckling består av ett antal steg 1. Analys - Vad ska vi göra 2. Design - Hur ska vi göra det 3. Implementation - Koda 4. Test 5. Leverans Vi ska göra ett program som beräknar hyrkostnaden för en bil (precis som den animerade filmen om problemlösarna som du hittar i högerkolumnen på hemsidan) Hyrkostnad ========== 1) Analys Grundfakta: Fast avgift: 100kr/dag Rörlig avgift 25kr/mil (heltal) (flyttal) Vi behöver veta antal dagar och mil för att beräkna kostnad. Kostnaden = 100*dagar + 25*mil (flyttal) Skiss av skärmbilden underlättar förståelse av vad som ska ske! 2) Design Skapa algoritm! Här visas några alternativa sätt! Ange antal dagar : 3 Ange antal mil : 40 ===================== Kostnad : 1300 k Start Skriv rubrik Läs dagar a) Flödesschema - - - - - -> Läs mil b) Pseudokod Skriv rubrik Läs dagar (int) Läs mil (double) Beräkna kostnad (double) enl. formel Rita streck Skriv kostnad kostnad = dagar*100 + mil*25 Rita streck Skriv kostnad Stopp Lektion 1 - Steg 1 c) Strukturdiagram Strukturdiagram ritas med datastruktur (hur data är organiserat) som grund Skriv upp alla operationer som behöver göras i valfri ordning Hyrkostnad 1. Rubrik 2. Läs dagar (int) 3. Läs mil (double) Beräkning Indata 4. Rita streck 5. Skriv kostnad 6. Beräkna kostnad Utskrift Tid Hyrkostnad Placera in operationerna logiskt i strukturdiagrammet. • Var ska rubriken skrivas - I början av Indata • Var ska dagar och mil läsas - Efter rubriken • Var ska strecket ritas - I början av utskrift • Var ska kostnaden skrivas - I slutet av utskrift • Var ska kostnaden beräknas -I beräkning Beräkning Indata 1 2 3 6 Utskrift 4 3. Implementation - Första versionen #include <iostream> using namespace std; int main() { // Definition av (lokala) variabler int dagar; double mil; double kostnad; // Indata cout << "Bilkostnad\n"; cout << "==========\n\n"; cout << "Ange antal dagar : "; cin >> dagar; cout << "Ange antal mil : "; cin >> mil; Programmet skapades i Visual Studios utvecklingsmiljö och placerades i egen mapp under STEG1. Det finns en grundlig Introduktion till Visual Studio 2013 i högerkolumnen till STEG 1 som visar hur det går till att skapa det första projektet med sin källkodsfil. // Beräkning kostnad = dagar*100 + mil*25; // Utskrift cout << "==========================\n"; cout << "Kostnad : " << kostnad << " kr" << endl; return 0; } 5