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