TDT4102: Prosedyre- og objektorientert programmering
# Introduksjon
__C++__ er et programmeringspråk _Bjarne Stoustrup_ lagde med C som basis. C++ gir C objekt-orientert funksjonalitet. Kode skrevet som C er gyldig C++, men kode skrevet som C++ er ikke nødvendigvis gyldig C.
# Læringsmål
Fra <https://www.ntnu.no/studier/emner/TDT4102/2013>
## Kunnskap
* Har bred og praktisk orientert kunnskap om programmeringsspråket C++. Kan syntaks og regler for variabeldeklarasjoner og [datatyper](#datatyper), typekonvertering, kontrollstrukturer, funksjoner og operatorer, overlagring, klasser, arv, templates, unntakshåndtering.
* Har kunnskap om automatisk og dynamiske variabler og bruk av pekere.
* Har kunnskap om rekursjon, enkle algoritmer og datastrukturer.
* Har kunnskap om prosedural og objektorientert modularisering av koden og har kunnskap om hvordan kode kan organiseres i flere kildekodefiler, kompilering og lenking.
* Har kunnskap om standarbiblioteket, inn/ut datahåndtering, vanlig brukte funksjoner og template-klasser.
* Har kunnskap om moderne utviklingsverktøy, teknikker for feilfinning og enkel testing av egen kode.
* Har kunnskap om diagramtyper for objektorienterte programmer.
## Ferdigheter
* Kan utvikle et program fra problembeskrivelse til fungerende og feilfri løsning.
* Kjenner vanlige brukte kodingsteknikker og kan jobbe iterativt og effektivt med konstruksjon av egen kode.
* Kan programmere proseduralt hvor koden er fornuftig modularisert i funksjoner og objektorientert hvor koden er organisert i klasser. Kan velge hvilke hvilken løsning som er best for et gitt problem.
* Kan skrive kode som er gjenbrukbar, lesbar og enkel å vedlikeholde.
* Kan lese kode og forstå hvordan koden oppfører seg i kjøretid.
## Generell kompetanse
* Kan jobbe effektivt med med å analysere et problem og konstruere en løsning.
* Kan kommunisere og diskutere kodeløsninger og forklare hvordan et program fungerer.
* Kan finne frem til å benytte nødvendige hjelpemidler, kan bruke dokumentasjon for programmeringsspråket og standarbiblioteket.
# Grunnleggende
## Datatyper
||__Type__||__Størrelse__||__Beskrivelse__||
||int ||32 bit ||Heltall ||
||double ||64 bit ||Flyttall. Eks.: -2.4, 4.0||
||float ||32 bit ||Flyttall ||
||char ||8 bit ||Enkelt bokstav ||
||bool || ||`true`/`false` ||
## Objektstrukturer
### Class
En _klasse_ er en struktur for å definere en ny objekttype. Skal man f.eks. lage en program som håndterer bil-objekter, må man lage en klasse kallt Car. I klassedefinisjonen ramser man opp hvilke egenskaper og funksjoner en bil har.
### Enum
En _enumerering_ ligner en klasse. Forskjellen er at man med en enum må definere alle de mulige varianter man kan ha.
### Struct
# Tilfeldige tall
Ettersom datamaskiner er deterministiske, kan de ikke finne på tilfeldige tall. Man må derfor lage ett _pseudo-random_ tall ved hjelp av klokkeslettet. På denne måten får man et tall som er tilfeldig nok til de fleste formål.
## Eksempel
\#include <cstdlib>
\#include <ctime>
\#include <cmath>
int randomNumber( int from, int to) {
return ( rand() % (to-from) ) + from;
}
int main () {
std::srand( (unsigned)time(0) );
for ( int i = 0; i < 10; i++ )
std::cout << randomNumber(5, 10) << std::endl;
}
I første linje i main "seeder" man tallgeneratoren med klokken. Merk at dette må gjøres utenfor selve random-funksjonen. Hadde denne linjen vært inni randomNumber, hadde alle de tilfeldige tallene blitt det samme.
I randomNumber finner rand() et "tilfeldig" tall mellom 0 og en maksgrense satt av kompilatoren. En modulusoperasjon gjør at tallet reduseres til et tall mellom 0 og $$ to - from $$. Til slutt legges $$ from $$ til tallet slik at det som står igjen er et tall mellom $$ to $$ og $$ from $$.