C++ Programmering V

Størrelse: px
Starte visningen fra side:

Download "C++ Programmering V. 0.9991"

Transkript

1 Indholdsfortegnelse 1. Indledning Forudsætninger: Udeståender Start med C Det første C++ program Formatering af output Kommentarer Funktions prototyper Konstanter Inline funktioner Rækkevidde operatoren enumerations Link specifikation Overload Referencer for løkken i C Opgaver Klasser og objekter Objektets liv Overførsel af data til et objekt Konstant erklæringer Medlemmer defineret som static Friends Array af objekter Pointere This pointeren Afrunding Opgaver Nedarvning Den førstefødte Opgaver Multibel nedarvning Polymorfi Pointere og nedarvning Virtuelle funktioner Abstrakte klasser Hvorfor abstrakte klasser? Absktrakte destructorer Opgaver Introduktion til objektorienteret design Indkapsling Klassehirakiet Opgaver Sidst men ikke mindst Exceptions Operator overstyring...80 Sponsor: Ingeniørfirmaet Synkro Side 1 af 107

2 4.3 Et eksempel Opgaver...92 Appendix A Operatorer...93 A.1 Aretmetiske operatorer...93 A.2 Relations- og betingelsesoperatorer...93 A.3 Bitvise operatorer...93 A.4 Præcendens...94 Appendix C Standardbiblioteker for C Sponsor: Ingeniørfirmaet Synkro Side 2 af 107

3 1. Indledning Denne bog er en videreudvikling/tilpasning af den jeg udgav i 2001 med titlen C/C++, men her er kun C++ delen. Bogen udgives on-line som pdf fil, og kan frit benyttes og kopieres af alle som de ønsker det, delvis eller i uddrag. Ved kopiering skal der dog mindst kopieres en fuld side med header og footer, og der må ikke fjernes noget fra siderne. 1.2 Forudsætninger: Kendskab og færdigheder der svarer til on-line bogen (pdf-filen) C-programmering, der kan findes på Kapitel 1 er en kortfattet introduktion til en række nye måder som C++ bruger, de skal kunnes inden man går videre. Kapitel 2. Her dykker vi ned i hvad en klasse og et objekt er og hvordan vi kan bruge dem. Kapitel 3 handler om begrebet nedafvning Kapitel 4 Her afrundes med de ting man måske er lidt for doven til at få lært sig. Sidst i bogen er et appendix, hvor der findes praktiske informationer i form af tabeller og C++ standardbiblioteker. Sponsor: Ingeniørfirmaet Synkro Side 3 af 107

4 1.3 Udeståender Der udestår først og fremmest en tilpasning til de nye dele der kom lige efter den oprindelige udgievlse, derefter udestår en del kontrol af kapitel og afsnitsnumre, og et grundigt tjek af kildeteksterne passer til den lidt mere moderne tekst. Så skal jeg have ændret outputtet så det passer med UNIX verdenen, altså, Linux, Apple og Android's måde at se verden på. Er du i MS verdenen er du velkommen til at bruge alting, men jeg gider ikke bruge mere tid på den verden. Har været der, har prøvet det, har tabt lysten, nu har jeg så valgt UNIX. Har du valgt noget andet er du i din bedste ret til det, men kræv ikke at jeg også er der. Der udestår en gennemgang af layout, så det hele bliver meget nemmere at læse. Som altid er kritik velkommen, men det er ikke ensbetydende med jeg altid er enig i den :) Henrik Kressner kressner@synkro.dk Sponsor: Ingeniørfirmaet Synkro Side 4 af 107

5 1 Start med C++ Hvis vi kigger lidt på navnet på programmeringssproget, og tænker lidt på det vi har lavet hidtil, så kan vi opfatte C som en variabel, og ++ som en operator. Derved fremkommer, at C++ er C og så lidt mere, hvad der faktisk er sandt. Alt hvad der kan laves i C, kan også laves i C++, men ikke omvendt. C++ er C udviddet med objektorienteret programmering og nogle andre små godter. Dette kapitel vil gennemgå de små godter der kan siges at være en udvidelse af C, de resterende kapitler vil udelukkende beskæftige sig med den objektorienterede del af C Det første C++ program Det første program i ethvert programmeringssprog går ud på at skrive noget på skærmen. I C++ kan det se således ud. /* Filnavn = prg1.cpp */ #include <iostream> int main() std::cout << "Jeg tænker, ergo er jeg\n"; return 0; Figur $ cpp prg1.cpp $ prg1 Jeg tænker, ergo er jeg $ For at dette program skal kunne kompileres forlanger de fleste kompilere, at kildeteksten gemmes i en fil med ekstendet CPP, i dette tilfælde har vi valgt at kalde filen prg1.cpp. Kompileringsprocessen er den samme som for C, find ud navnet på din c++ kompiler, og eksekver den med kildeteksten som argument. I forhold til C er der nogle ændringer. For det første inkluderes headerfilen iostream. i stedet for stdio.h. Derudover virker den nye syntaks std::cout << "Jeg tænker, ergo er jeg\n" noget anderledes. std::cout er hvad der i C++ kaldes, en standard output stream, de 2 "mindre end" tegn betyder i denne sammenhæng, at data flyttes, fra strengen, til standard output, det er skærmen. For at være mere korrekt så er cout en standard outputstrøm, som tilhører objektet ved nevn std, men meget mere om det senere. Vores første program skriver altså "Jeg tænker, ergo er jeg" på skærmen, og slutter af med et linieskifte. Sponsor: Ingeniørfirmaet Synkro Side 5 af 107

6 Vi kan også udskrive tal i C++, det gøres på følgende måde: /* Filnavn = prg2.cpp */ #include <iostream> $ cpp prg2 123$ int main() int vaerdi = 123; std::cout << vaerdi; return 0; Figur Programmet udskriver 123 uden linieskift. Bemærk, at C's formateringsparametre ikke bliver benyttet. Vi kan udvide programmet til både at udskrive tekst og tal, det kan gøres således: /* Filnavn = prg3.cpp */ #include <iostream> int main() int vaerdi = 123; $ cpp prg3 Indholdet af vaerdi er 123 $ std::cout << "Indholdet af vaerde er " << vaerdi << '\n'; return 0; Figur Programmet sender 3 datatyper til standard output. Først en streng (Indholdet af vaerdi er ), derefter sendes et heltal (123), og til sidst en tegnkonstant nemlig '\n' Bemærk at der er trykket på enter lige efter det sidste gåseøje i linien: std::cout << "Indholdet af vaerdi er " Vi kan dele en linie blot vi gør det lige før, eller lige efter << operatoren. Sponsor: Ingeniørfirmaet Synkro Side 6 af 107

7 Programmet kan udviddes med en input funktion: /* Filnavn = prg4.cpp */ #include <iostream> int main() int vaerdi; cpp prg4 Indtast en værdi : 246 Den indtastede værdi er : 246 $ std::cout << "Indtast en vaerdi : "; std::cin >> vaerdi; std::cout << "Den indtastede værdi er : " << vaerdi << '\n'; return 0; Figur Dette program beder først om at få indtastet en værdi, derefter udføres et linieskift, og til sidst udskrives resultatet, det er unægtelig nemmere end i C. >> operatoren betyder, at data hentes fra cin, der er standard input, og placerer det i variablen ved navn vaerdi. Det er muligt at bede om flere input i den samme linie, men det er ikke smart når vi arbejder emd standard input, da det ikke er muligt at prompte brugeren. Opgave Skriv et program der udskriver dit fornavn og dit efternavn på en linie. Opgave Skriv et program der udskriver dit fornavn på en linie, og dit efternavn på efterfølgende linie. Opgave Skriv et program der først beder om dit fornævn, derefter om dit efternavn, og så til sidst udskriver dit efternavn og fornavn, i den rækkefølge, på en linie. Sponsor: Ingeniørfirmaet Synkro Side 7 af 107

8 1.2 Formatering af output. I C skulle vi bruge lidt kryptiske metoder for at formatere vores output, det er en del mere forståeligt i C++. I C++ er der 3 manipulatorer, der kan benyttes til at ændre udskriftformattet. De 3 manipulatorer er dec, oct og hex. De kan benyttes på følgende måde: /* Filnavn = prg5.cpp */ #include <iostream> int main() int vaerdi = 15; std::cout << dec << vaerdi << '\t' << oct << vaerdi << '\t' << hex << vaerdi; std::cout << '\n'; return 0; Figur $cpp prg f $ Dette program udskriver først decimalværdigen af variablen vaerdi, derefter udskrives den octale værdig, og til sidst udskrives den hexadecimale værdig på skærnen. Vi benytter tabulring mellem udskrifterne for at skille dem lidt ad, og gøre output mere læselig. Opgave Skriv et program der beder om et tal fra brugeren. Derefter skal tallet udskrives som hex, decimal og octaltal på hver sin linie. Sponsor: Ingeniørfirmaet Synkro Side 8 af 107

9 1.3 Kommentarer Kommentarer i C++ kan udføres med /* for start og */ for slut kommentar, ganske som i C. Dette kan være en ganske upraktisk teknik, hvilket enhver der har ledt efter en fejl der skyldes et manglende */ kan skrive under på. Derfor er der udviklet en ny måde at kommentere på i C++. En Kommentar starter med // og afsluttes automatisk ved linieskift. Brug af kommentarer kan se således ud: /* Filnavn = prg6.cpp Demoprogram kan ikke kompileres */ Kan ikke kompileres. // Program til demo af kommentarer #include <iostream> /* Dette er også en lovlig kommentar i C++ */ int main() char biltype[10]; // Erklær en streng std::cout << "Indtast biltypen : "; // Bed om input std::cin >> biltype; // Indlæs biltypen... // O.S.V return 0; Figur Som det fremgår af eksemplet, kan variabler i C++ erklæres på samme måde som i C 1.4 Funktions prototyper I C kan man undlade at erklære en funktion, før den benyttes. Der sker blot det, at selve funktionen også fungerer som erklæring. Dette er ikke tilladt i C++. Følgende vil give en kompilerfejl i C++. /* Filnavn = prg7.cpp */ // ****** FEJL testfunction HAR INGEN PROTOTYPE ****** #include <iostream> int main() testfunction(); return 0; void testfunction()... Figur Sponsor: Ingeniørfirmaet Synkro Side 9 af 107

10 Vi kan få programmet kompileret ved at indføre prototyperne: /* Filnavn = prg8.cpp */ // ****** RIGTIGT testfunction har en prototype****** #include <iostream> void testfunction() int main() testfunction(); return 0; void testfunction()... Figur En anden løsning kan være at placere testfunction() før den kaldes, så er det nemlig ikke nødvendigt at have en prototype. Hvis en function er defineret i en anden fil, skal den have en prototype, i den fil hvorfra den kaldes. Prototypen skal stå i kildeteksten, før functionen kaldes. I C++ kan en funktions prototype initialisere de argumenter der er i funktionen. Dette betyder, at når man kalder funktionen, kan man undlade at overføre parametre, herved vil funktionen benytte sine initialiseringsparametre. /* Filnavn = prg9.cpp */ #include <iostream> void display(int a = 1, char b = 'a'); int main() display(); display(3); display(5,'c'); return 0; $ spp prg5 1 : a 3 : a 5 : c $ void display(int a, char b) std::cout << a << " : " << b << '\n'; Figur Ikke alle argumenter behøves udfyldes, men initering af argumenter skal altid foregå fra venstre mod højree. Sponsor: Ingeniørfirmaet Synkro Side 10 af 107

11 Følgende er ikke lovligt. Da det andet argument ikke er initieret må det 3. argument ikke forsøges initieret. void display(int a = 1, char b, int c = 4); Men det er fuldt tilladt kun at initiere det første argument således. void display(int a = 1, char b = 'a', int c); 1.5 Konstanter Variabler kan defineres som konstanter ved at benytte det reserverede ord const. Når en konstant erklæres skal den tilskrives, da en konstant i sagens natur kun kan tilskrives én gang. // KAN IKKE KOMPILERES #include <iostream> int main() const int testvar = 100; // Dette er i orden testvar = 25; Return 0; // Kompiler melder fejl, forsøg på at ændre konstant. Figur En pointer kan også defineres som en konstant. Dette medfører, at det pointeren peger på kan ændres, men selve pointeren kan ikke ændres. Pointeren vil hele tiden pege på samme plads i hukommelsen. // Filnavn = konst1.cpp #include <iostream> int main() int tal = 10; int *const pegepind = &tal; $ spp konst1 *pegepind = 12 $ *pegepind = 12; std::cout << "*pegepind = " << *pegepind << '\n'; return 0; Figur Dette program har defineret en konstant pointer, der peger på et hukommelseselement. I dette element står heltallet 10. Linien *pegepind = 12; tilskriver det pegepind peger på, med tallet 12. Dette er legalt, da pegepind ikke er forsøgt at pege på noget andet. Sponsor: Ingeniørfirmaet Synkro Side 11 af 107

12 Det vil derimod fremkalde en kompilerfejl, hvis pointeren forsøges at pege et andet sted hen end defineret. // Filnavn = konst2.cpp // KAN IKKE KOMPILERES Kan ikke kompileres #include <iostream> int main() int a = 10; int b = 12; int *const pegepind = &a; pegepind = &b; // FEJL! std::cout << "Indholdet af pegepind er : " << *pegepind; return 0; Figur Hvis en pointer erklæres til at pege på en konstant, vil det ikke være muligt at ændre indholdet af konstanten, heller ikke ved at pege på den med pegepinden. Der er altså lukket for snedig tilskrivning. Et eksempel kan illustrere dette.!!!! EKSEMPEL SKAL TJEKKES!!!! // Filnavn = konst3.cpp #include <iostream> int main() char minstreng[] = "A"; char dinstreng[] = "B"; const char *pegepind = minstreng; $ cpp konst1 $ pegepind peger på : B pegepind = dinstreng; std::cout << "pegepind peger på : " << *pegepind << '\n'; return 0; Figur Sponsor: Ingeniørfirmaet Synkro Side 12 af 107

13 En pointer der peger på en konstant, må ikke ændre indholdet af den konstant den peger på, følgende er ikke tilladt:!!!! EKSEMPEL SKAL TJEKKES!!!! // Filnavn = konst4.cpp // Programmet kan ikke kompileres Kan ikke kompileres #include <iostream> int main() char minstreng[] = "a"; char dinstreng[] = "b"; const char *pegepind = minstreng; *pegepind = 'c'; std::cout << "pegepind peger på : " << *pegepind; return 0; Figur Man kan altså sige, at en pointer der peger på en konstant er en skrivebeskyttet pointer, fordi det ikke er muligt at ændre det pointeren peger på. Sponsor: Ingeniørfirmaet Synkro Side 13 af 107

14 1.6 Inline funktioner C++ supporterer en udviddelse af C makroer. Disse makroer, kaldet inline og er lidt mere sofistikerede end C makroer, i det makroer blot er en simpel genkendelse af tekst, mens inline blive tjekket ved kompilering, således at en klassisk fejl undgåes. // Filnavn = inline.cpp #include <iostream> #define MAX(A,B) ((A) > (B)? (A) : (B)) $ cpp inline1 1. x = y = x = y = 21 $ inline int max(int a,int b) return (a > b)? a : b; int main() int i,x,y; x = 10; y = 20; i = MAX(x++,y++); std::cout << "1. x = " << x << "1. y = " << y << '\n'; x = 10; y = 20; std::cout << "2. x = " << x << "2. y = " << y << '\n'; return 0; Figur Den højeste værdi inkrementeres 2 gange i en makro, men udføres som forventet af en inline. Bortset fra dette fungerer inline funktioner som makroer. Sponsor: Ingeniørfirmaet Synkro Side 14 af 107

15 1.7 Rækkevidde operatoren I C kan man få fat i en global variabel ved at erklære den med det reserverede ord extern. C++ tilbyder en mulighed mere, nemlig rækkevidde operatoren ::. Med denne kan man definere at man vil benytte den globale variabel. // Filnavn = scope2.cpp #include <iostream> int alder = 18; int main() int alder = 67; variabel // Global variabel // Lokal $ cpp inline1 alder er = 67 men ::alder er = 18 $ std::cout << "alder er = " << alder << '\n'; std::cout << "men ::alder er = " << ::alder << '\n'; return 0; Figur Rækkevidde operatoren :: henviser altid til den globale variabel. Hvis variablen alder var defineret flere steder, evt. nestet, så ville ::alder stadig henvise til den globale variabel alder. Sponsor: Ingeniørfirmaet Synkro Side 15 af 107

16 1.8 enumerations Enumerations fungerer helt som i C, med den udviddelse, at man ikke behøves at bruge det reserverede ord enum, når først enumerationen er erklæret. // Filnavn = enum2.cpp #include <iostream> enum farve hjerter, kloer, ruder, spar ; $inline1 hjerter = 0 spar = 3 $ int main() farve kortfarve; kortfarve = hjerter; std::cout << "hjerter = " << kortfarve << '\n'; kortfarve = spar; std::cout << "spar = " << kortfarve << '\n'; return 0; Figur Sponsor: Ingeniørfirmaet Synkro Side 16 af 107

17 1.9 Link specifikation Selv om C++ skal kunne kompile en C kildetekst, er det ikke sikkert, at alle header filer kan kompiles. For at sikre dette, kan et include kald defineres som extern "C". Dette medfører at den inkluderede fil, vil blive kompilet af en C kompiler. // Filnavn = externc.cpp // KAN IKKE KOMPILES #include <iostream> extern "C" #include <stdio.h> extern "C" #include <mitlib.h> #include <ditlib.h> void main() printf("hallo verden \n"); Figur Flere C headerfiler kan inkluderes ved at sætte dem ind i en blok, som vist med mitlib.h og ditlib.h. Hvis du får mærkelige problemer når du kompilerer et C program med en C++ kompiler, så skal du bruge extern C i forbindelse med alle dine C inkludelinier. Sponsor: Ingeniørfirmaet Synkro Side 17 af 107

18 1.10 Overload Ved at "overloade" en function, kan man opnå flere funktioner med samme navn. Rigtigt brugt kan dette gøre det nemmere at programmere, og nemmere at læse et program. Forkert brugt, kan overloadning gøre et program ganske ulæseligt. Lad os se på et eksempel hvor overloadning virker naturlig. Vi ønsker at skrive en funktion max(a,b). Functionen skal returnere det højeste af de 2 tal a og b. Problemmet er, vi ved ikke om a og b er int eller float, derfor: // Filnavn = overload1.cpp #include <iostream> int max(int a, int b); float max(float a, float b); $ cpp inline1 Integer sammenligning 2 Float sammenligning 3.23 $ int main() int t1,t2; float t3,t4; t1 = 1; t2 = 2; t3 = 1.23; t4 = 3.23; std::cout << "Integer sammenligning! " << max(t1, t2) << '\n'; std::cout << "Float sammenligning " << max(t3, t4) << '\n'; return 0; int max(int a, int b) return (a > b)? a : b; float max(float a, float b) return (a > b)? a : b; Figur C++ kan se forskel, blot parameterlisten for funktionen er forskellige, enten i antallet, eller i typen. 2 Funktioner må ikke have samme navn, hvis deres eneste forskel er den type der returneres. C++ ser kun på parameterlisten, ikke på returværdier. Sponsor: Ingeniørfirmaet Synkro Side 18 af 107

19 1.11 Referencer Referencer benyttes til at overføre parametre til funktioner, samt til at returnere data fra funktioner. En reference kan betragtes som et alias for en variabel. Sådan at forstå, at alt hvad der sker med et alias, sker med den variabel aliaset refererer til. Et lille eksempel kan belyse sagen. // Filnavn = reference1.cpp #include <iostream> int main() int mittal = 1; int &aliastal = mittal; std::cout << "mittal = " << mittal << '\n'; std::cout << "aliastal = " << aliastal << '\n'; mittal++; std::cout << "mittal = " << mittal << '\n'; std::cout << "aliastal = " << aliastal << '\n'; aliastal++; std::cout << "mittal = " << mittal << '\n'; std::cout << "aliasttal = " << aliastal << '\n'; return 0; Figur $ cpp reference1 mittal = 1 aliastal = 1 mittal == 2 aliastal = 2 mittal = 3 aliastal = 3 $ Vi kan se, at alt hvad der sker med mittal, sker samtidig og identisk på aliastal, dette skyldes at aliastal er defineret som en reference. Denne defenition sker i linien: int &aliastal = mittal; En reference erklæring kan altså erkendes, når et & starter navnet på en variabel, og der umiddelbart inden er erklæret en type. Navnet på variablen skal efterfølges med navnet på den variabel der refereres til. Det er nærligende at mene, at en reference kan forveksles med en addresse. Dette er dog ikke muligt hvis man holder sig følgende for øje. int *pind; // Erlærer en pointer til int int &alias = i; // Erklærer alias som refernce til i. pind = &i; // pointeren pind peger nu på i's addresse. I det ovenstående eksempel er det nødvendigt at initialisere referencen når den erklæres. Dette gøres ved at tilskrive referencen aliastal med indholdet af variablen mittal. Sponsor: Ingeniørfirmaet Synkro Side 19 af 107

20 En reference skal initieres, med mindre: - Den er medlem af en klasse. I så fald må man formode, at klassens constructer sørger for initiering. - Den er erklæret som parameter i en functions erklæring. I det referencen så vil blive initieret nå functionen kaldes. - Den er en erklæret som en return type for en function. I så fald sørger functionen selv for at initiere reference. - Den er erklæret med extern, i så fald vil referencen være initieret et andet sted. Når en reference benyttes som parameter i en function, fungerer det på nogenlunde samme måde, som når et PASCAL program benytter VAR erklæringer i en Procedure's parameterliste. Funktionen (Proceduren) arbejder på selve variablen. Dette betyder at en funktion kan returnere et resultat, i en ændret parameter. Dette kan være uhensigtsmæssigt, da det kan gøre koden sværere at læse. Det må dog være op til den enkelte programmør at vurdere, hvorledes man ønsker at benytte referencer. Her er et eksempel. På næste side er programmet reference2.cpp der viser hvordan structurer og funktioner kan bruge referencer. Programmet starter med at erklære struct'en record. I samme arbejdsgang oprettes et tilfælde ved navn datablok, og data initialiseres. I starten af main udskrives indholdet af datablok, og test1 kaldes. Funktionen udskriver data uden at ændre dem, og fungerer helt forudsigeligt. Derefter kaldes test2 der lægger en til tal og udskriver indholdet på skærmen. Her er der heller ikke de store overaskelser. Nå programmet returnerer til main, udskriver main indholdet af datablok, og vi kan nu se, at test2's manipulation også har virkning her, som om vi havde overført en pointer til funktionen. Slutteligt kaldes test3, der lægger en til tal efter at have skrevet værdien ud på skærmen, og returnerer struct'en til main. Som det ses af den sidste linie i main får vi også på denne måde fat i de manipulerede data. Sponsor: Ingeniørfirmaet Synkro Side 20 af 107

21 // Filnavn = reference2.cpp #include <iostream> struct record int tal; char navn[12]; datablok = 10, " Petersen" ; C:\reference2 10 Petersen 10 Petersen Petersen Petersen 12 C:\ void test1(struct record &minrec) std::cout << minrec.tal << minrec.navn << '\n'; void test2(struct record &minrec) minrec.tal++; std::cout << minrec.tal << minrec.navn << '\n'; struct record &test3(struct record &minrec) std::cout << minrec.tal << minrec.navn << '\n'; minrec.tal++; return minrec; int main() std::cout << datablok.tal << datablok.navn << '\n'; test1(datablok); std::cout << datablok.tal << '\n'; test2(datablok); std::cout << datablok.tal << '\n'; datablok = test3(datablok); std::cout << datablok.tal << '\n'; return 0; Figur Sponsor: Ingeniørfirmaet Synkro Side 21 af 107

22 Opgave Skriv en funktion findop(char *s). Når den kaldes skal den søge den streng *s peger på gennem, indtil den finder en operator for en af de 4 regnearter. Når operatoren er fundet, skal den returnes til den kaldende function, via en reference til en char. Opgave Skriv en function filter(char *s). Når den kaldes, skal den søge den streng gennem som *s peger på. Funktionen skal filtrere det første heltal i strengen ud, og returnere det via en reference af typen int. Opgave Udvid opgave og opgave , således at du har et program, der beder om et input. Dette input skal være et regnestykke, baseret på de 4 regnearter. Når der trykker på enter, skal programmet filtrere operator, samt de 2 argumenter fra, og udføre den aktuelle beregning. Sponsor: Ingeniørfirmaet Synkro Side 22 af 107

23 6.12 for løkken i C++ I C++ er det gjort muligt at erklære variabler inde i en for løkke således. for (int i = 0; i < MAX; i++)... Argumentet for at tillade denne teknik er, at det kan være en fordel at erklære variablen der hvor den skal bruges, så kan man se variabelerklæringen mens man arbejder med den. Det kan dog også være en svaghed, da man risikerer at bruge samme variabelnavn flere gange, og dermed tabe overblikket. I ovenstående tilfælde er rækkevidden af variablen i selve løkken, og intet andet. Det må være op til personligt behag om man vil bruge denne teknik eller ej. I denne bog bruges teknikken når det er praktisk, og ellers ikke, men det er en af de fornøjelige småting der åbner mulighed for lidt personlighed i kildeteksterne. Sponsor: Ingeniørfirmaet Synkro Side 23 af 107

24 1.13 Opgaver Opgave Skriv en et program, der henter indtastede data fra standard input, indlæser det i en variabel, og derefter udskriver variablen til standard output. Opgave Skriv en function, der har 2 konstanter a og b. Functionen skal udskrive forskellen på de 2 konstanter i hexadecimalt format. Opgave Skriv et program der skal have 3 strengkonstanter. Programmet skal ved hjælp af en pointer udskrive de 3 strengkonstanter, én linie ad gangen. Opgave Skriv en function alder(a,b). Funktionen skal aflevere aldersforkellen (b - a). Hvis a ikke bliver overført skal a = 18. Hvis b ikke overføres, skal b = 67. Opgave Skriv et program speed. Programmet skal have en global konstant mspeed = 110. Programmet skal have en function ved navn nufart(int mspeed). Functionen skal trække den lokale mspeed fra den globale. Hvis resultattet er over nul, skal functionen aflevere en pointer til sætningen: "Advarsel, du kører for stærkt.", ellers skal functionen aflevere en pointer til ordet OK. Hovedprogrammet skal kalde mspeed, og udskrive den tekst pointeren peger til. Opgave Skriv de funktioner der skal til for at udføre de fire regnearter (+-*/). Functionens navn er regn(int a,int b, char operator). a og b skal kunne være int eller float. Functionen skal aflevere resultattet af beregningen til den kaldende function. Opgave Skriv en funktion beregn(char a[]). Funktionen modtager strengen a, (faktisk en pointer til strengen) i denne skal et regnestykke modtages defineret på følgende form. <tal1>operator<tal2> Funktionen skal udskille tal1 til et int, operatoren til en char, og tal2 til et integer. Derefter skal functionen lade regn(a,b,operator) udføre beregningen, og udskrive resultatet. Opgave Udvid programmet fra opgave således at det også kan håndtere kommatal. Sponsor: Ingeniørfirmaet Synkro Side 24 af 107

25 2 Klasser og objekter iterator const_iterator explicit #ifndef TEXTFINDER_H #define TEXTFINDER_H #include <QWidget> namespace Ui class TextFinder; class TextFinder : public QWidget Q_OBJECT public: explicit TextFinder(QWidget *parent = 0); ~TextFinder(); private: Ui::TextFinder *ui; ; #endif // TEXTFINDER_H copy constructor!!! namespace!!! Lad os starte med defenitionen: En klasse er en definerbar type Sponsor: Ingeniørfirmaet Synkro Side 25 af 107

26 Et objekt er et tilfælde af en klasse. Klasser er en datatype, der ikke findes i C. Klasser kan og vil normalt indeholde både data og kode. En klasse er skabelonen for et objekt, på samme måde som en struct erklæring kan bruges til at skabe mange arkivkort. En klasse bruges til at samle alt beslægtet under et sæt vinger. Herfra kan man så føde andre klasser, der har til opgave, at løse definerede delopgaver inden for hovedopgaven. 2.1 En simpel klasse For at hugge hul på isen, så lad os skabe en klasse der kan omregne temperaturen fra Fahrenheit til Celcius, i intervalet Vi starter med at lave en headerfil der skal indeholde erklæringer. // Filnavn = f_til_c1.h Headerfil class celsius ; public: celsius(int fahr); void showtemp(); // Constructor ~celsius(); // Destructor private: int resultat; Figur Det ser dette jo temmelig anderledes ud hvis man sammenligner med C. Til at starte med har vi en klasseerklæring, klassens navn er celsius, hvilket jo straks burde give accosiationer. Det handler altså om temperatur. celsius er en type vi netop har defineret. Den efterfølgende blok indeholder et par nye begreber såsom Constructer, Destructor, public og private. Lad os starte med public og private. public er et reserveret ord der betyder, at det efterfølgende kan ses af hele verden. Hvis intet defineres er private default (underforstået). private kan altså udelades, men det hjælper på læseligheden, hvis det skrives. private er et reserveret ord der betyder, at det efterfølgende er privat. Det betyder at private variabler eller funktioner kun kan ses af klassen og dens medlemmer. Man kan bruge public og private så ofte man ønsker inde i en klasse erklæring, men det er god orden, og hjælper på læseligheden af programmet, hvis man kun benytter hvert ord en gang per klasse. Constructor: Dette er det sted hvor klassens elementer initialiseres. Alle klasser har en construktor, hvis programmøren undlader den vil compilereren lave sin egen constructor. Constructoren er en Sponsor: Ingeniørfirmaet Synkro Side 26 af 107

27 funktion der kaldes hver gang klassen erklæres og ellers aldrig. Ved rigtig brug af constructoren for en klasse kan man sikre sig, at alle elementer er korrekt initialiseret. Constructoren skal have samme navn som klassen. Der kan defineres flere constructorer, blot de har forskellige parametre. Constructore kan med andre ord overloades. En constructor kan ikke returnere værdier, den skaber et object. Destructor: Denne har den modsatte opgave af Constructoren. Hvor constructoren bygger op, river destructoren ned. Det kan lyde destruktivt, men er faktisk bare en måde at sikre sig mod forurening, i det destructoren ryder op efter klassen, frigiver hukommelse m.m. Der kan kun være en destructor per class. En destructor kan ikke modtage og aflevere data. Destructoren kan ikke overloades. En klasse definition afsluttes med et semikolon. Man kan sammenligne klassen med en samling af prototyper. I C++ er det ikke noget man må gøre, men noget man skal gøre. Hele klassens indhold skal erklæres i klasseerklæringen, senere skal klassen implementeres, det vil ske i filen f_til_c1.cpp. Det første vi lægger mærke til i den fil er gode gamle main. Her er intet ændret, main skal være der. (I nogle kompilermiljøer er main erstatet af en funktion med beslægtet navn, den kan eksempelvis hedde winmain(), det er ikke lige efter C++ standarden, men funktionaliteten er den samme.) Sponsor: Ingeniørfirmaet Synkro Side 27 af 107

28 // Filnavn = f_til_c1.cpp #include <iostream> #include "f_til_c1.h" $ cpp f_til_c1 celcius = 93 $ celsius::celsius(int fahr) // Constructor fahr = (fahr > 0)? fahr : 0; fahr = (fahr < 300)? fahr : 300; resultat = 5*(fahr 32)/9; void celsius::showtemp() std::cout << "celcius = " << resultat << '\n'; celsius::~celsius() // Intet // Destructor int main() celsius mintemp(200); mintemp.showtemp(); return 0; Figur Når klassen er defineret, skal de enkelte medlemmers funktion beskrives. Vi starter med constructoren: En klasses constructor implementeres ved klassens navn, efterfulgt af to koloner,m (rækkeviddeoperatoren) efterfulgt af klassens navn igen. Herefter følger en evt. parameterliste I dette eksempel vil konstruktoren sikre, at ingen værdier af variablen fahr er større end 300, og ingen er mindre end 0. Derefter udfører construktoren beregningen 5*(fahr-32)/9 og tilskriver resultatet af beregningen til den private variabel resultat. Det er ikke den normale måde at bruge en construktor på, men det belyser en dens funktion. Sponsor: Ingeniørfirmaet Synkro Side 28 af 107

29 Variablen resultat, kan kun ses af klassen celcius'es medlemmer, main kan altså ikke se hvad der står i resultat, det kan showtemp derimod. Og det er også showtemp der udskriver resultatet af den beregning der blev foretaget i constructoren. Til sidst har vi destructoren. Dens navn begynder med ~(tilde). Destructoren erklæres på næsten samme måde som en klasses constructor, blot med den forskel, at destructoren skal starte med et tilde. Alle medlemsfunktioner der defineres i klassen, skal fremgå af den følgende tekst. En klasses medlemmer, behøves ikke at fremkomme i nogen speciel orden, men det hjælper på programmets læselighed hvis de gør. At en senere defineret funktion hører til klassen celsius, kan ses ved at dens navn skal begynde med celsius::. I main erklæres et object af typen celcius. Dette gøres i linien celcius mintemp(200); herved oprettes et objekt af typen celcius. Objektet bliver initialisret med værdien 200. Linien kan opfattes som et kald til konstruktøren, der skaber objektet ud fra klassen. Objektets navn er mintemp, klassens navn er celsius. Med linien: mintemp.showtemp(); kaldes celcius'es medlemsfunktion showtemp. Da showtemp ikke modtager variabler, kan man ikke overføre variable i dette kald. showtemp udfører en beregning på de initialiserede variabler, med det resultat, at fahrenheit 200 grader, bliver udskrevet som celcius. Dette var lidt mere omfattende, end vores første program, men egentlig ikke så indviklet endda. I næste afsnit vil vi bore lidt mere i hvad constructoren og destructoren foretager sig. Opgave Omskriv programmet celsius, så det i stedet omregner fra selsius til fahrenheit. Opgave Omskriv programmet fra opgave således, at programmet regner med kommatal. Opgave Omskriv programmet fra opgave således at der skrives en omregningstabel på skærmen for selsuis = 0 til selcius = 25 i step på 1. Sponsor: Ingeniørfirmaet Synkro Side 29 af 107

30 2.2 Objektets liv For at beskrive et objekts livssyklus lidt mere udtømmende har vi lavet programmet showoff1.cpp. Programmet viser objektets livscyklus, ved at vise hvornår constructor og destructor kaldes. Programmet fungerer på den måde, at før, efter og mens constructor og destructor kaldes, så udskrives en besked på skærmen om, hvor i programmet dette foregår. // Filnavn = showoff1.h class showoff ; public: private: showoff(char *s); ~showoff(); char besked[25]; Figur Som det ses af klasseerklæringerne, er programmet så simpelt som det kan være. Ud over Constructeren og destructoren er der en streng. Den er lokal for hvert objekt der oprettes af denne klasse. Den bruger vi til at gemme informationer om, hvem der kaldte constructoren. I filen showoff1.cpp bliver arven fra C meget synlig, i det vi frækt blander ordinær C kode ind i vores objektorienterede program, ved at indføre en testfunktion. Her er det gjort for at demonstrere en pointe, men det viser også hvor nært beslægtet C og C++ er med hindanden. Før main, ude midt i kildeteksten opretter vi et globalt objekt af typen showoff. I main opretter vi to objekter af typen (klassen) showoff, det ene objekt kalder vi for mainoff, som erklæres på normal vis, det andet objekt kalder vi statisk, og det erklæres som static. Senere i main kaldes testfunktionen, der også opretter et objekt af showoff klassen. Sponsor: Ingeniørfirmaet Synkro Side 30 af 107

31 // Filnavn = showoff11.cpp #include <iostream> #include "showoff1.h" showoff::showoff(char *s) strcpy(besked,s); std::cout << "Constructor kaldt af " << besked << '\n'; C:\showoff1 Constructor kaldt af Globalobject Constructor kaldt af Netop ankommet til main Constructor kaldt af Erklærer statisk Inde i main før kald til test Constructor kaldt af Testfunction Inde i testfunctionen Destructor kaldt af Testfunction Inde i main, efter kald til test Destructor kaldt af Netop ankommet til main Destructor kaldt af Erklær statisk Destructor kaldt af Globalobject C:\ showoff::~showoff() std::cout << "Destructor kaldt af " << besked << '\n'; void test() showoff testoff("testfunktion"); std::cout << "Inde i tesfunctionen \n"; showoff globaloff("globalobject"); int main() showoff mainoff("netop ankommet til main"); static showoff statisk("erklærer statisk"); std::cout << "Inde i main før kald til test\n"; test(); std::cout << "Inde i main, efter kald til test\n"; return 0; Figur Når vi eksekverer programmet kan vi se, at for lokale objekter gælder, at når objektet erklæres (fødes) udføres constructoren. Objektet nedlægges (dør) og kalder destructoren når funktionsblokken forlades. Programmøren kan ikke kalde destructoren, det sker automatisk under programafviklingen, og det er en fejl at forsøge at kalde destructoren. For globale objekter gælder, at dets constructor kaldes når programmet startes. Dets destructor kaldes når programmet forlades. Sponsor: Ingeniørfirmaet Synkro Side 31 af 107

32 For static objecter kaldes constructoren når objectet første gang erklæres. Destructoren kaldes når programmet forlades. 2.3 Overførsel af data til et objekt Op til nu har vi demonstreret en klasse ved at bruge nogle atypiske teknikker. Programmet distance.cpp, indeholder en klasse der har til opgave, at beregne en kørt distance. Dette udføres af funktionen getdistance(). Denne funktion er medlem af klassen distance. Klassens constructor sikrer, at hvis getdistance() kaldes før nogle data er initialiseret, så vil de private variabler have værdien nul. Dette sikrer igen mod uønskede programafviklingsfejl, som funktion af hvad der tilfældigvis stod i de aktuelle dataelementer, da programmet blev startet. Programmet udskriver resultatet af en multiplikation. Multiplikationen udføres i klassen på klassens private variabler. Main programmet har ingen muligheder for at manipulere variablerne lokaltid, og lokaldistance. Produktet af de 2 variabler kan dog hentes, i det funktionen getdistance()afleverer produktet af de 2 variabler. // Filnavn = distance1.h class distance ; public: private: distance(); int getdistance(); void setafstand(int afstand); void settid(int tid); ~distance(); int lokaltid, lokaldistance; Figur Blot ved at kigge på klasseerklæringen i headerfilen kan man få et godt indtryk af hvad klassen kan, og hvordan den bærer sig ad med at gøre det. Klasseerklæringen kan, hvis man tænker sig lidt om når man skriver den, virke meget i retning af en pseodokode, og dermed i sig selv være forklarende. Sponsor: Ingeniørfirmaet Synkro Side 32 af 107

33 Sponsor: Ingeniørfirmaet Synkro Side 33 af 107

34 // Filnavn = distance1.cpp #include <iostream> #include "distance1.h" $ cpp distance1 distance før tilskrivning fra main 0 distance efter tilskrivning af settid 0 distance efter tilskrivning af setafstand 8 $ distance::distance() // Constructor lokaltid = lokaldistance = 0; int distance::getdistance() return lokaltid*lokaldistance; void distance::setafstand(int afstand) lokaldistance = afstand; void distance::settid(int tid) lokaltid = tid; distance::~distance() // Destructor int main() distance beregner; std::cout << "distance før tilskrivning fra main " << beregner.getdistance() << '\n'; beregner.settid(2); std::cout << "distance efter tilskrivning af settid " << beregner.getdistance() << '\n'; beregner.setafstand(4); std::cout << "distance efter tilskrivning af setafstand " << beregner.getdistance() << '\n'; return 0; Figur Sponsor: Ingeniørfirmaet Synkro Side 34 af 107

35 Programmet starter med at oprette et objekt af typen distance, dette objekt kaldes beregner, herefter skal enhver adgang til funktioner og variabler i objektetet beregner indledes med beregner.(beregner punktum), på samme måde som når vi vil tilgå variabler i en struct. I programmet har vi lavet hele implementeringen af destructoren på en linie, hvilket er ganske legalt. Hvis vi ikke ønsker at implementere noget i destructoren, kan den helt udelades. Opgave Skriv en klasse. Klassen skal indeholde medlemsfunctionen givmig(char *s). Denne function skal modtage en pointer til en streng. Klassen skal også indeholde medlemsfunktionen skrivmig(). Denne function skal udskrive det der blev modtaget i givmig(char *s). Hvis givmig(char *s) ikke har været kaldt, skal skrivmig() udskrive "Intet defineret" på skærmen. Opgave Skriv et program der kan udskrive et vandret histogram på skærmen. Programmet skal indeholde en klasse, histoclass. Denne klasse skal garentere, at ingen værdier over 79, og ingen under 0, vil blive udskrevet. Klassen skal have en medlemsfunktion modtag(int a). Dette medlem skal modtage den værdi der skal symboliseres i histogrammet. Klassen skal også have en medlemsfunction udskriv(). Dette medlem skal udskrive selve histogrammet, med de værdier der er givet i modtag(int a). Hvis data er større eller mindre end de tilladte, skal udskriv() ikke skrive på skærmen, men aflevere en pointer til en fejlmeddelse. Hovedprogrammet skal kontrollere for fejl, og udskrive evt. fejlmeddelelser. Sponsor: Ingeniørfirmaet Synkro Side 35 af 107

36 2.4 Konstant erklæringer const funktioner, classer og objekter!!! Et objekt kan defineres som værende en konstant. Det medfører at ingen funktioner kan kaldes, da kompileren ikke kan se hvilke funtioner der har lov til hvad. Variabler der er public kan læses udefra. Medlemsfunktioner i en klasse kan erklæres som konstanter, med det reserverede ord const. Når et medlem af en klasse defineres som konstant, kan funktionen ikke ændre på data i det objekt det bliver en del af. Der kan derfor ej heller overføres parametre til medlemmet. Det kan være praktisk hvis en programmør ikke ønsker andre programmører skal kunne ændre i data, men have adgang til at læse data. class indud public: indud(int n1, int n2); int skriv() const; void input(int tal); private: int temp1, temp2; ; Figur Programmet demonstrerer brugen af en konstantfunktion. Funktionen skriv er erklæret som en konstantfunktion, men det hindrer ikke at funktionen kan kaldes, da funktionen ikke tilskriver nogen af objektets variabler. Funktionen input kan derimod ikke kaldes, det skyldes vi har oprettet objektet som et konstantobjekt. Sponsor: Ingeniørfirmaet Synkro Side 36 af 107

37 // Filnavn = indud1.cpp #include <iostream> #include "indud1.h" indud::indud(int n1, int n2) temp1 = n1; temp2 = n2; C:\indud1 2 skriv = 2 C:\ Retur fra 1 : int indud::skriv() const std::cout << temp1 << " : " << temp2 << '\n'; return temp2; void indud::input(int tal) temp1 = tal; int main() const indud test(1,2); std::cout << "Retur fra skriv = " << test.skriv() << '\n'; // test.input(5); // Ulovligt, test er en konstant return 0; Figur Hvis vi ønkser at bruge input funktionen, så skal linien: Ændres til: const indud test(1,2); indud test(1,2); Et konstant objekt kan initieres. Det gælder jo for alle konstanter, at de initieres når de bliver defineret. Et medlem der er defineret som konstant, kan ikke skrive i klassens variabler. Forsøg herpå vil give fejl ved kompilering. Opgave Tilpas programmet indud1.cpp således at input funktionen erklæres const. Undersøg om programmet kan kompileres. Sponsor: Ingeniørfirmaet Synkro Side 37 af 107

38 2.5 Medlemmer defineret som static Når en variabel defineres som static i en klasse, så kan den kun initieres én gang. Dette sker første gang der bliver erklæret et objekt af klassen. Det betyder, at variablen herefter har den samme værdi i alle de objekter der oprettes af klassen. Variabler der erklæres som static i en klasse kaldes klassevariabler, fordi det vil være den samme variabel i alle de objekter der oprettes af klassen. Sagt på en anden måde, en klassevariabels rækkevidde er hele klassen, en objektvariabel (ikke static) rækkevidde er objektet. // Filnavn = ibrug1.h class ibrug ; public: private: ibrug() antal++; void netopnu(); ~ibrug() antal ; static int antal; Figur I headerfilen sker der noget nyt, vi implementerer contructoren og destrutctoren i headerfilen, men ikke netopnu() funktionen. Det er ganske legalt at gøre det på denne måde, men bør kun gøres når implementeringen er så lille som her. Bemærk i øvrigt at antal erklæres som static, det er det der gør den til en klassevariabel. Funktionen i constructoren er at lægge en til antal hver gang constructoren kaldes, og det er hver gang der fødes et nyt objekt af klassen, destructoren gør det modsatte. Det betyder, at antal til enhver tid indeholder antallet af objekter der er skabt af klassen. Sponsor: Ingeniørfirmaet Synkro Side 38 af 107

39 // Filnavn = indud1.cpp // Tæller antal af klassen // der er i brug netop nu. #include <iostream> #include "ibrug1.h" $ cpp ibrug Der er 1 af denne klasse i brug nu Der er 2 af denne klasse i brug nu Der er 1 af denne klasse i brug $ int ibrug::antal = 0; void ibrug::netopnu() std::cout << "Der er " << antal << " af denne klasse i brug nu\n"; void testfunc() ibrug no2; no2.netopnu(); void main() ibrug no1; no1.netopnu(); testfunc(); no1.netopnu(); Figur Bemærk linien: int ibrug::antal = 0; Den står helt for sig selv, i det globale område af kildetekten. Det er vigtigt at en variabel der er erklæret som static, kun bliver erklæret én gang, ellers vil der fremkomme en fejlmeddelelse under eksekveringen. Dette er årsagen til den bliver tilskrevet før det første objekt af klassen skabes. En Sponsor: Ingeniørfirmaet Synkro Side 39 af 107

40 ting der bør springe i øjnende er, at variablen antal tilskrives uden for klassen, selv om det er et private medlem. Dette kan kun foretages på medlemmer der er erklæret static. Dette eksempel skulle også gerne give lidt forståelse for destructorens virkemåde. Årsagen til at den 3. linie i vores output skriver, "Der er 1 af denne klasse i brug nu" er, at destructoren kaldes når testfunc() forlades. Herved slettes de objecter der blev skabt af funktionen, med mindre de er erklæret som static. En klassevariabel er global for alle tilfælde af den klasse, og er derfor velegnet til kommunikation mellem objekter. Det er ikke altid en god ide at kommunikere mellem objekter på den måde, da variablerne jo netop virker som en global variabel, og kanmedfører mistet overblik. Opgave Erklær no2 som static i testfunktionen i programmet indud1.cpp. Undersøg og forklar hvad der sker. 2.6 Friends Klasser der har meget brug for at kommunkiere kan oprettes som værende venner. Dette gøres med de reserverede ord friend class, efterfulgt af den klasse der skal være en ven til denne klasse. Når en klasse defineres som værende ven med en anden, betyder det, at vennen kan se alt der er eklæret i den klasse der erklærer en ven. Omvendt kan klassen der har defineret en anden som sin ven, ikke se noget inde i den klasse, med mindre den også er erklæret som ven. Venskabet går altså kun en vej. // Filnavn = friend1.h class ven1 ; friend class ven2; ven1() a = 1; private: int a; Figur I filen friend1.h erklæres ven2 som værende ven til ven1, det betyder, at alle objekter der skabes af ven2, kan se variablerne i ven1, men ikke omvendt. Klassen ven2 erklærer ikke ven1 som sin ven, hvorfor ven1 ikke kan se noget inde i ven2. Sponsor: Ingeniørfirmaet Synkro Side 40 af 107

41 // Filnavn = friend2.h class ven2 public: ven2() void display(); ; Figur // Filnavn = friend1.cpp // Demonstration af friend class #include <iostream> #include "friend1.h" #include "friend2.h" $ cpp friend1 ven1.a = 1 $ void ven2::display() ven1 minven; std::cout << "ven1.a = " << minven.a << '\n'; int main() ven2 vennetest; vennetest.display(); return 0; Figur Når ven2 erklærer minven i sin display() funktion, så vil ven1's constructor blive kaldt. Her tilskrives variablen a værdien 1. Så når display() lidt efter sender minven.a til standard output, er det ganske legalt. Man kan også definere en enkelt funktion som værende en ven, ved at bruge det reserverede ord friend. Det gøres på denne måde. Sponsor: Ingeniørfirmaet Synkro Side 41 af 107

42 class ven1 public: friend void testfunktion(); private: int hemmeligt; Herved gives funktionen testfunction adgang til ven1's variabler. Opgave Omskriv programmet friend1.cpp således at ven1 kan se ven2's variabler og funktioner. 2.7 Array af objekter Da en klasse er en datatype kan den også erklæres som en array. Det følgende program erklærer en array med 10 elementer, af typen flere. Derefter løber den alle 10 elementer igennem, og udskriver sit gennemløbsnummer. // Filnavn = flere1.h class flere public: flere() void fler(int i); ~flere() ; Figur Tilgang til variabler og funktioner er som hvis det var en struct. Sponsor: Ingeniørfirmaet Synkro Side 42 af 107

43 // Filnavn = flere1.cpp #include <iostream.h> #include "flere1.h" void flere::fler(int nr) std::cout << "Jeg er nr " << nr << '\n'; int main() int i; flere mange[10]; $ cpp flere Jeg er nr 0 Jeg er nr 1 Jeg er nr 2 Jeg er nr 3 Jeg er nr 4 Jeg er nr 5 Jeg er nr 6 Jeg er nr 7 Jeg er nr 8 Jeg er nr 9 $ for (i = 0; i < 10; i++) return 0; mange[i].fler(i); Figur Der er ikke meget behov for at arbejde videre med objekt array's, da der ikke rigtigt er vundet noget ved det. Skal vi bruge en samling af objekter må det varmt anbefales at benytte kædede lister af objekter i stedet, som vi vil se i næste afsnit, er det langt mere smidigt. 2.8 Pointere I C skal man benytte funktionen malloc, hvis man ønsker at reservere plads i hukommelsen. malloc funktionen har et par ulemper. Først og fremmest returnerer den en void pointer, der hvis man ikke benytter en cast, genererer en advarsel fra kompileren. Herudover skal malloc have at vide hvor meget plads der skal alloceres. Dette udføres typisk med sizeof operatoren. Set i relation til C++, har malloc nogle ulemper. Hvis man reserverer plads til et objekt med malloc, så vil objektet blive skabt, men constructoren vil ikke blive kaldt. For at imødegå dette, findes new operatoren i C++. New operatoren har en anden fordel over for malloc. New operatoren afleverer en pointer, af rette type. Hvis programmøren har taget fejl af typerne, leverer kompileren en kompilerfejl. Alt i alt er new noget nemmere at bruge end malloc. New returnerer 0, hvis der ikke kunne allokeres hukkommelse, på samme måde som malloc. Sponsor: Ingeniørfirmaet Synkro Side 43 af 107

44 I C findes funktionen free, til at frigøre benyttet hukommelse. I C++ hedder den tilsvarende operator delete. Når delete kaldes frigives hukommelse, en evt. destructor kaldes, og den ledige plads returneres til operativsystemet. Vi vil nu skrive et program der demonstrerer et objekts lyvscyklus når objektet oprettet som et dynamisk objekt, altså på samme måde som når vi ville lave en kædet liste. // Filnavn = prttest1.h Headerfil class testclass public: testclass(); ~testclass(); ; Figur Der er ikke noget nyt i headerfilen, hele klasseerklæringen er upåvirket af vi ønsker objektet oprettet som et dynamisk objekt. Sponsor: Ingeniørfirmaet Synkro Side 44 af 107

C++ Programmering V. 0.99

C++ Programmering V. 0.99 Indholdsfortegnelse 1. Indledning...3 1.2 Forudsætninger:...3 1.3 Udeståender...4 6 Start med C++...5 6.1 Det første C++ program...5 6.2 Formatering af output...8 6.3 Kommentarer...9 6.4 Funktions prototyper...9

Læs mere

Videregående Programmering for Diplom-E Noter

Videregående Programmering for Diplom-E Noter Videregående Programmering for Diplom-E Noter 1. Uddelegering Ét af de væsentlige principper i objektorienteret programmering er, at enhver klasse selv skal kunne "klare ærterne". Enhver klasse skal altså

Læs mere

Programmering i C. Lektion 4. 5. december 2008

Programmering i C. Lektion 4. 5. december 2008 Programmering i C Lektion 4 5. december 2008 Funktioner Eksempel Fra sidst 1 Funktioner 2 Eksempel Funktioner Eksempel Eksempel: 1 / f u n k t i o n s p r o t o t y p e r / i n t i n d l a e s ( void )

Læs mere

Java Programmering. En bog for begyndere. Skrevet af Henrik Kressner

Java Programmering. En bog for begyndere. Skrevet af Henrik Kressner Java Programmering En bog for begyndere Skrevet af Henrik Kressner Indholdsfortegnelse Introduktion...3 1 Introduktion til Java...4 1.1 Javakoden...4 1.2 Det første program...6 1.2 Skriv til skærmen...6

Læs mere

Eksempel: Skat i år 2000

Eksempel: Skat i år 2000 Kursus 02199: Programmering afsnit 2.1-2.7 Anne Haxthausen IMM, DTU 1. Værdier og typer (bl.a. char, boolean, int, double) (afsnit 2.4) 2. Variable og konstanter (afsnit 2.3) 3. Sætninger (bl.a. assignments)

Læs mere

Abstrakte datatyper C#-version

Abstrakte datatyper C#-version Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Abstrakte datatyper C#-version Finn Nordbjerg 1/9 Abstrakte Datatyper Denne note introducerer kort begrebet abstrakt datatype

Læs mere

Ugeseddel 4 1. marts - 8. marts

Ugeseddel 4 1. marts - 8. marts Ugeseddel 4 1. marts - 8. marts Læs følgende sider i kapitel 6 i lærebogen: s. 233 258 og s. 291 317 (afsnit 6.3 overspringes). Begynd at overveje, hvad afleveringsopgaven skal omhandle. Læs vejledningen,

Læs mere

METODER ARV KLASSER. Grundlæggende programmering Lektion 5

METODER ARV KLASSER. Grundlæggende programmering Lektion 5 METODER KLASSER ARV Grundlæggende programmering Lektion 5 1 METODER Sekvenser af kode om samme emne 2 REPETITION Række af statements der udfører en handling Mindst én metode der hedder main Forskellen

Læs mere

C Programmering V1.37

C Programmering V1.37 Indholdsfortegnelse Indledning...3 1 I gang med C...5 1.2 Variabler...12 1.3 Intelligens...17 1.6 Afrunding...38 1.7 Opgaver...41 2 Grundbegreber...42 2.1 Blokke...42 2.2 Datatyper...47 2.3 Typekonvertering...49

Læs mere

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007 AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007 Opgavebesvarelsen skal afleveres som enten en printerudskrift eller som et passende dokument sendt via email til fjj@noea.dk. Besvarelsen skal

Læs mere

Kursusarbejde 3 Grundlæggende Programmering

Kursusarbejde 3 Grundlæggende Programmering Kursusarbejde 3 Grundlæggende Programmering Arne Jørgensen, 300473-2919 klasse dm032-1a 21. november 2003 Indhold 1. Kode 2 1.1. forestillinger.h............................................. 2 1.2. forestillinger.cc.............................................

Læs mere

Kursusarbejde 2 Grundlæggende Programmering

Kursusarbejde 2 Grundlæggende Programmering Kursusarbejde 2 Grundlæggende Programmering Arne Jørgensen, 300473-2919 klasse dm032-1a 31. oktober 2003 Indhold 1. Kode 2 1.1. hotel.h.................................................... 2 1.2. hotel.cc...................................................

Læs mere

Programmering i C Intro og grundlæggende C 5. marts 2007

Programmering i C Intro og grundlæggende C 5. marts 2007 Programmering i C Intro og grundlæggende C 5. marts 2007 Mads Pedersen, OZ6HR mads@oz6hr.dk Plan for kurset Ma. 5/3: Ma. 19/3: Ma. 2/4: To. 12/4: Formål, intro, grundlæggende Videre, sprogkonstruktioner

Læs mere

JavaScript. nedarvning.

JavaScript. nedarvning. JavaScript er et sprog, der kan give en hjemmeside mere funktionalitet og gøre den interaktiv, så den reagerer på læsernes handlinger. CGI (Common Gateway Interface) har hidtil været de protokoller, man

Læs mere

Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi Roskilde Universitetscenter side 1 af 9 sider Skriftlig eksamen i Datalogi Modul 1 Vinter 1999/2000 Opgavesættet består af 6 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 5% Opgave 2

Læs mere

DM536. Rapport og debug

DM536. Rapport og debug DM536 Rapport og debug Kilder Vigtig.it (Felix Palludan Hargreaves) http://vigtig.it/dm502/howto_report.pdf http://vigtig.it/blog/teaching/#toc-relevant-tips Peter Schneider-Kamp http://imada.sdu.dk/~petersk/dm536/project2.pdf

Læs mere

Kursus navn: Indledende programmering Kursus nr. 02101

Kursus navn: Indledende programmering Kursus nr. 02101 Danmarks Tekniske Universitet Side 1 af 8 sider Skriftlig prøve, den 15. december 2007 Kursus navn: Indledende programmering Kursus nr. 02101 Tilladte hjælpemidler: Alle skriftlige hjælpemidler Vægtning

Læs mere

Generisk programmering - opgave 2 - Doxygen

Generisk programmering - opgave 2 - Doxygen Generisk programmering - opgave 2 - Doxygen Morten Wendelboe Datalogisk Institut, Københavns Universitet Universitetsparken 1, 2100 København Ø morty@diku.dk Resumé. Denne opgave ser på mulighederne for

Læs mere

Flettebreve og Doc2mail

Flettebreve og Doc2mail Flettebreve og Doc2mail Denne vejledning beskriver hvordan du kan sende flettebreve via Doc2mail. I vejledningen er der vedlagt en række skabeloner du kan benytte til dette. Vejledningen er rettet mod

Læs mere

Objektorientering. Programkvalitet

Objektorientering. Programkvalitet 1 PROSA-Bladet nr. 4 1993 Objektorientering = Programkvalitet? Af Finn Nordbjerg, adjunkt ved Datamatikeruddannelsen, Aalborg Handelskole 1. Indledning Objektorientering er blevet et edb-fagets mest udbredte

Læs mere

C++ Gratis PDF-udgave Forlaget Libris 1996-2004

C++ Gratis PDF-udgave Forlaget Libris 1996-2004 C++ Gratis PDF-udgave Forlaget Libris 1996-2004 Gratis PDF-udgave af C++ I 1996 udgav vi for første gang C++ af Kris Jamsa. Første udgave var på bogform, som dengang kostede kr. 228,-. I 1999 udgav vi

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2019 Projekt, del I Institut for matematik og datalogi Syddansk Universitet 27. februar, 2019 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2016 Projekt, del I Institut for matematik og datalogi Syddansk Universitet 29. februar, 2016 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Hvad er Objekter - Programmering

Hvad er Objekter - Programmering Denne guide er oprindeligt udgivet på Eksperten.dk Hvad er Objekter - Programmering En rigtig god gennemgang af hvad objekter er! Hvordan de oprettes og anvendes! Det er helt klart til nybegyndere, som

Læs mere

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { int wmid, wmevent; programmering med

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { int wmid, wmevent; programmering med LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) int wmid, wmevent; PAINTSTRUCT Introduktion ps; til HDC hdc; programmering med switch (message) case WM_COMMAND: wmid = LOWORD(wParam);

Læs mere

Programmering i C. Lektion september 2009

Programmering i C. Lektion september 2009 Programmering i C Lektion 1 8. september 2009 Målgruppe Motivation Indhold Form Materiale 2 / 47 Kursusintroduktion 1 Målgruppe 2 Motivation 3 Indhold 4 Form 5 Materiale Målgruppe Motivation Indhold Form

Læs mere

Anvendelse af metoder - Programmering

Anvendelse af metoder - Programmering Denne guide er oprindeligt udgivet på Eksperten.dk Anvendelse af metoder - Programmering En forhåbentlig rigtig god forklaring på hvad metoder er og hvordan de anvendes. Lidt om private og public, retur

Læs mere

Systemkald DM14. 1. Obligatoriske opgave. Antal sider: 7 inkl. 2 bilag Afleveret: d. 18/3-2004 Afleveret af: Jacob Christiansen, 130282-2111

Systemkald DM14. 1. Obligatoriske opgave. Antal sider: 7 inkl. 2 bilag Afleveret: d. 18/3-2004 Afleveret af: Jacob Christiansen, 130282-2111 DM14 1. Obligatoriske opgave Systemkald Antal sider: 7 inkl. 2 bilag Afleveret: d. 18/3-2004 Afleveret af: Jacob Christiansen, 130282-2111 Side 1 af 5 Intro: Formålet med opgaven at et lave en system kald

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2018 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 20. marts, 2019 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Python programmering. Per Tøfting. MacFest

Python programmering. Per Tøfting. MacFest Python programmering MacFest 2005 Per Tøfting http://pertoefting.dk/macfest/ Indhold Måder at afvikle Python program på Variabler Data typer Tal Sekvenser Strenge Tupler Lister Dictionaries Kontrolstrukturer

Læs mere

Specifikation Abstrakt OO OS-API Rev. 1.7. Specifikation. Abstrakt, objektorienteret operativsystem-api

Specifikation Abstrakt OO OS-API Rev. 1.7. Specifikation. Abstrakt, objektorienteret operativsystem-api Specifikation Abstrakt, objektorienteret operativsystem-api Indhold 1 Indledning... 3 1.1 Introduktion... 3 1.2 Formål... 3 1.3 Overordnede krav... 3 2 Ressourcer i OS-API et... 4 2.1 Tråde... 4 2.2 Timere...

Læs mere

DM01 DM01. 3. Obl. Afl. Jacob Christiansen, 130282, jacob.ch@mail.tdcadsl.dk. D12, Elias 18/3-2003. Side 1 af 11

DM01 DM01. 3. Obl. Afl. Jacob Christiansen, 130282, jacob.ch@mail.tdcadsl.dk. D12, Elias 18/3-2003. Side 1 af 11 DM01 DM01 3. Obl. Afl. Jacob Christiansen, 130282, jacob.ch@mail.tdcadsl.dk D12, Elias 18/3-2003 Side 1 af 11 DM01 Indholdsfortegnelse: BILAG:...2 1 FORMÅL:...3 2 KLASSER:...4 2.1 DILEMMA:...4 2.1.1 METODER:...4

Læs mere

Brugervejledning VFT-Reservedelsstyring

Brugervejledning VFT-Reservedelsstyring Brugervejledning VFT-Reservedelsstyring Forord Online-systemet Online-systemet er et integreret administrationsprogram til brug for blandt andet administration af køb og salg af biler køb og salg af reservedele

Læs mere

IT Support Guide. Installation af netværksprinter (direkte IP print)

IT Support Guide. Installation af netværksprinter (direkte IP print) IT Support Guide Denne guide er hentet på www.spelling.dk Program: Microsoft Windows Vista Program sprog version: ENG (US) Guide emne: Installation af netværksprinter (direkte IP print) Publikationsnr.:

Læs mere

Sitecore - basisvejledning Version 2. September 2010

Sitecore - basisvejledning Version 2. September 2010 Sitecore - basisvejledning Version. September 00 Sådan opretter du en ny artikelside... Sådan omdøber du et artikelnavn så du får vist æ,ø og å... Sådan udgiver (publiserer) du nyt eller redigeret indhold...4

Læs mere

Indholdsfortegnelse resultat- & kritikprogrammet.

Indholdsfortegnelse resultat- & kritikprogrammet. Indholdsfortegnelse resultat- & kritikprogrammet. Ringsekretærers indtastning af resultater og kritikker... 2 Kom i gang Opstart af programmet... 2 En anden bruger er i gang med ringen... 3 Dommer ændringer

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2018 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 13. marts, 2018 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Sproget Rascal (v. 2)

Sproget Rascal (v. 2) Sproget Rascal (v. 2) Til brug i K1 på kurset Oversættere Opdateret 29/11 2004 Abstract Rascal er et simpelt Pascal-lignende imperativt sprog. Dette dokument beskriver uformelt Rascals syntaks og semantik

Læs mere

Lærevejledning. - en introduktion til maskinarkitektur. faraz@butt.dk Faraz Butt mads@danquah.dk Mads Danquah doktor@dyregod.dk Ulf Holm Nielsen

Lærevejledning. - en introduktion til maskinarkitektur. faraz@butt.dk Faraz Butt mads@danquah.dk Mads Danquah doktor@dyregod.dk Ulf Holm Nielsen Lærevejledning - en introduktion til maskinarkitektur faraz@butt.dk Faraz Butt mads@danquah.dk Mads Danquah doktor@dyregod.dk Ulf Holm Nielsen Roskilde Universitetscenter Naturvidenskabelig Basisuddannelse

Læs mere

dcomnet-nr. 6 Talrepræsentation Computere og Netværk (dcomnet)

dcomnet-nr. 6 Talrepræsentation Computere og Netværk (dcomnet) dcomnet-nr. 6 Talrepræsentation Computere og Netværk (dcomnet) Efterår 2009 1 Talrepræsentation På maskinkodeniveau (Instruction Set Architecture Level) repræsenteres ordrer og operander ved bitfølger

Læs mere

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

//Udskriver System.out.println(Hej  + ditfornavn +   + ditefternavn + .); System.out.println(Du er  + dinalder +  aar gammel! Denne guide er oprindeligt udgivet på Eksperten.dk Brugerinput i Java Denne her artikel gennemgår diverse ting ved brug af brugerinput i Java. Den starter med det simple og fortæller derefter skridt for

Læs mere

Guide. Administration af FDF.dk/Nyborg. 1. Udgave 2008. Ide og layout Christoffer S. Rasmussen

Guide. Administration af FDF.dk/Nyborg. 1. Udgave 2008. Ide og layout Christoffer S. Rasmussen Guide Administration af FDF.dk/Nyborg 1. Udgave 2008 Ide og layout Christoffer S. Rasmussen FDF.Dk/NyboRG Den nye hjemmeside for FDF Nyborg er baseret på et bloksystem. Det vil sige at det er super nemt

Læs mere

Regneark II Calc Open Office

Regneark II Calc Open Office Side 1 af 10 Gangetabel... 2 Udfyldning... 2 Opbygning af gangetabellen... 3 Cellestørrelser... 4 Øveark... 4 Facitliste... 6 Sideopsætning... 7 Flytte celler... 7 Højrejustering... 7 Kalender... 8 Dage

Læs mere

Med TI-89 / TI-92 Plus kan du også sammenligne eller manipulere binære tal bit for bit.

Med TI-89 / TI-92 Plus kan du også sammenligne eller manipulere binære tal bit for bit. Kapitel 20: Talsystemer 20 Resumé af talsystemer... 344 Indtastning og omregning af talsystemer... 345 Udførelse af matematiske beregninger med hexadecimale og binære tal... 346 Sammenligning eller manipulation

Læs mere

Automatisering Af Hverdagen

Automatisering Af Hverdagen Automatisering Af Hverdagen Programmering - Eksamensopgave 10-05-2011 Roskilde Tekniske Gymnasium (Kl. 3,3m) Mads Christiansen & Tobias Hjelholt Svendsen 2 Automatisering Af Hverdagen Indhold Introduktion:...

Læs mere

Import-vejledning Fra Dansk Skoledata til UNI Login

Import-vejledning Fra Dansk Skoledata til UNI Login Import-vejledning Fra Dansk Skoledata til UNI Login - For UNI Login brugeradministratorer 1. udgave, april 2007 UNI C 2007 Vermundsgade 5 2100 København Ø Tlf: 35 87 88 89 1 Eksporter fra Dansk Skoledata...

Læs mere

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen. Indledning...2 Variabler...13 Eksempel: 1...13 Eksempel 2:...13 Eksempel 3:...15 Eksempel 4:...16 Metoder...17 Metode (intet ind og intet ud)...17 Metode (tekst ind)...18 Metode (tekst ind og tekst ud)...19

Læs mere

Anklagemyndighedens Vidensbase

Anklagemyndighedens Vidensbase Anklagemyndighedens Vidensbase Indhold 1 OM DENNE VEJLEDNING... 2 2 LOGIN... 3 3 SØGNINGER... 4 3.1 SØG EFTER DOKUMENTER... 4 3.2 NAVIGÉR DIG FREM... 5 3.3 KOMBINÉR SØGNING OG NAVIGATION... 6 3.4 VISNING

Læs mere

30 Objekt-orienteret Programmering i Andre Sprog.

30 Objekt-orienteret Programmering i Andre Sprog. 30 Objekt-orienteret Programmering i Andre Sprog. Abstrakte datatyper i Pascal. Abstrakte datatyper i Modula og Ada. C++ Overordnet organisering Instantiering og initialisering. Interfaces. Nedarvning.

Læs mere

Wipigo Galleri. Brugsforvirring. Venstre side af startbillede efter der er logget ind (Højre side viser det/de gallerier der er oprettet).

Wipigo Galleri. Brugsforvirring. Venstre side af startbillede efter der er logget ind (Højre side viser det/de gallerier der er oprettet). Wipigo Galleri. Brugsforvirring Venstre side af startbillede efter der er logget ind (Højre side viser det/de gallerier der er oprettet). Kategorier/Gallerier/Albums, flere benævnelser for den samme ting.

Læs mere

DATALOGI 1E. Skriftlig eksamen torsdag den 3. juni 2004

DATALOGI 1E. Skriftlig eksamen torsdag den 3. juni 2004 Københavns Universitet Naturvidenskabelig Embedseksamen DATALOGI 1E Skriftlig eksamen torsdag den 3. juni 2004 Opgaverne vægtes i forhold til tidsangivelsen herunder, og hver opgaves besvarelse bedømmes

Læs mere

Vejledning for anvendelse af PensionsIndberetningssystem PI

Vejledning for anvendelse af PensionsIndberetningssystem PI Vejledning for anvendelse af PensionsIndberetningssystem PI PNN PENSION 190503/AMB Indholdsfortegnelse 1. INDBERETNINGER... 3 2. SØG INDBERETNING... 4 3. NY INDBERETNING... 5 4. INDLÆS FIL... 7 5. INDTAST

Læs mere

Alt elektronik heri er købt via http://dx.com, og arduino udviklingssoftware er hentet fra http://arduino.cc.

Alt elektronik heri er købt via http://dx.com, og arduino udviklingssoftware er hentet fra http://arduino.cc. Få-tiden-til-at-gå-[DIGITAL]-ur =============================== Copyright 2013, Richard Jørgensen. Alle ophavsretlige rettigheder frafaldet 2015. (Kopier og brug som du har lyst.) Forord: ===== Denne vejledning

Læs mere

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1. Programmering 1999 Forelæsning 4, fredag 10. september 1999 Klasser og objekter Felter, konstruktorer, this Eksempler på klasser: Time, Appointment Eksempler på metoder i Time og Appointment Klassefelter:

Læs mere

Sådan vedligeholder du UNI Login med data fra KMD Elev

Sådan vedligeholder du UNI Login med data fra KMD Elev Sådan vedligeholder du UNI Login med data fra KMD Elev 1 Indhold 1 Indledning... 3 2 Importer brugerdata... 4 2.1 Automatisk import... 4 2.2 Manuel import... 5 3 Når du har importeret, sker der følgende...

Læs mere

Undtagelseshåndtering i C#

Undtagelseshåndtering i C# Denne guide er oprindeligt udgivet på Eksperten.dk Undtagelseshåndtering i C# I modsætning til C++ kan man i C# ikke skrive et program uden undtagelseshåndtering, så derfor har jeg skrevet denne guide

Læs mere

INDLEDNING 2. Design og layout 3

INDLEDNING 2. Design og layout 3 INDLEDNING 2 Design og layout 3 Skyd genvej... 3 Omdøb skabelonsamling 4 Omdøb brevskabelon 5 Layout 6 Indsæt/Redigér logo 6 Indsæt/Redigér tekst 8 Redigér kolonner 11 Ved vejs ende... 14 Tips & Tricks...

Læs mere

Forelæsning Uge 4 Mandag

Forelæsning Uge 4 Mandag Forelæsning Uge 4 Mandag Algoritmeskabeloner Kan (ved simple tilretningerne) bruges til at implementere metoder, der gennemsøger en arrayliste (eller anden objektsamling) og finder objekter, der opfylder

Læs mere

Dokumentation af programmering i Python 2.75

Dokumentation af programmering i Python 2.75 Dokumentation af programmering i Python 2.75 Af: Alexander Bergendorff Jeg vil i dette dokument, dokumentere det arbejde jeg har lavet i løbet opstarts forløbet i Programmering C. Jeg vil forsøge, så vidt

Læs mere

Lectio. Overgang til Lectio Eksamensmodul. MaCom A/S Vesterbrogade 48, 1. 1620 København V Telefon: 33 79 79 00

Lectio. Overgang til Lectio Eksamensmodul. MaCom A/S Vesterbrogade 48, 1. 1620 København V Telefon: 33 79 79 00 Lectio Overgang til Lectio Eksamensmodul 1992-2008 MaCom A/S MaCom A/S Vesterbrogade 48, 1. 1620 København V Telefon: 33 79 79 00 Telefax: 33 79 79 84 E-mail: mail@macom.dk Internet: www.macom.dk Forord

Læs mere

OPRET OG REDIGER FORMULARER I DYNAMICWEB

OPRET OG REDIGER FORMULARER I DYNAMICWEB OPRET OG REDIGER FORMULARER I DYNAMICWEB Modulet formularer giver dig mulighed for at oprette dynamiske formularer, som enten kan anvendes til kontakt, brugerundersøgelser, quiz eller tilmeldinger. Du

Læs mere

Aftenskole i programmering sæson Flere registreringer. Sæson 2 - Lektion 8

Aftenskole i programmering sæson Flere registreringer. Sæson 2 - Lektion 8 Flere registreringer Sæson 2 - Lektion 8 I sidste uge Vi så hvordan vi kan navigere med en UINavigationController Vi så hvordan vi lavede nogle hjælpe klasser med funktioner vi skulle bruge flere steder

Læs mere

Sproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter 2006. Abstract

Sproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter 2006. Abstract Sproget Six Til brug i rapportopgaven på kurset Oversættere Vinter 2006 Abstract Six er baseret på det sprog, der vises i figur 6.2 og 6.4 i Basics of Compiler Design. Den herværende tekst beskriver basissproget

Læs mere

Egenskaber ved Krydsproduktet

Egenskaber ved Krydsproduktet Egenskaber ved Krydsproduktet Frank Nasser 12. april 2011 c 2008-2011. Dette dokument må kun anvendes til undervisning i klasser som abonnerer på MatBog.dk. Se yderligere betingelser for brug her. Bemærk:

Læs mere

Lær Python dag 1 - modul 1

Lær Python dag 1 - modul 1 Lær Python dag 1 - modul 1 Introduktion, basis python Steffen Berg Klenow Jonas Bamse Andersen Syddansk Universitet Indhold 1. Velkommen 2. Programmering i python 3. Typer, variabler og udtryk 1 Velkommen

Læs mere

Forelæsning Uge 4 Mandag

Forelæsning Uge 4 Mandag Forelæsning Uge 4 Mandag Algoritmeskabeloner findone, findall, findnoof, findsumof Primitive typer (forfremmelse og begrænsning) Identitet versus lighed (for objekter, herunder strenge) Opfølgning på Skildpadde

Læs mere

Bits, bit operationer, integers og floating point

Bits, bit operationer, integers og floating point Denne guide er oprindeligt udgivet på Eksperten.dk Bits, bit operationer, integers og floating point Denne artikel beskriver hvordan data gemmes som bits og hvordan man kan manipulere med bits. Den forudsætter

Læs mere

Vejledning til. DUI-LEG og VIRKEs

Vejledning til. DUI-LEG og VIRKEs Vejledning til DUI-LEG og VIRKEs Medlemssystem version 1.0 Opdateret 1. november 2009 Indholdsfortegnelse Sådan får du en kode til systemet...3 Sådan logger du ind på systemet...3 Forsiden og ændring af

Læs mere

Har du ikke fået oprettet et afdelings-id og PIN-kode til udskrivning på husets printere bedes du tage kontakt til receptionen først:

Har du ikke fået oprettet et afdelings-id og PIN-kode til udskrivning på husets printere bedes du tage kontakt til receptionen først: SOHO/NOHO Printer Installation til Windows (PC) - Version 2.0 Vigtig før du går i gang: Har du ikke fået oprettet et afdelings-id og PIN-kode til udskrivning på husets printere bedes du tage kontakt til

Læs mere

Grundlæggende Programmering ITU, Efterår 1999. Skriftlig eksamen i Grundlæggende Programmering

Grundlæggende Programmering ITU, Efterår 1999. Skriftlig eksamen i Grundlæggende Programmering Skriftlig eksamen i Grundlæggende Programmering ITU, 20. januar 2000 Alle hjælpemidler tilladt, dog ikke datamat. Eksamen er skriftlig, fire timer, og bedømmes efter 13-skalaen. Opgavesættet består af

Læs mere

SWC eksamens-spørgsmål. Oversigt

SWC eksamens-spørgsmål. Oversigt SWC eksamens-spørgsmål Oversigt #1 Typer og variable #2 Aritmetik og logik #3 Klasser (definition, objekter) #4 Klasser (metoder) #5 Klasser (nedarvning, polymorfi) #6 Conditional statements #7 Repetition

Læs mere

Tastevejledning Windows XP

Tastevejledning Windows XP Tastevejledning Windows XP Tastevejledningen dækker den danske udgave af Windows XP. Der er taget udgangspunkt i en standard installation, hvor der ikke er foretaget tilpasninger i skærmopsætning, valg

Læs mere

Den forudsætter kendskab til C++ og lidt kendskab til SQL og MySQL C API.

Den forudsætter kendskab til C++ og lidt kendskab til SQL og MySQL C API. Denne guide er oprindeligt udgivet på Eksperten.dk Brug af MySQL i C++ Denne artikel bygger ovenpå artiklen "MySQL C API" og forklarer hvordan man kan programmere mere objekt orienteret. Den forudsætter

Læs mere

Indholdsfortegnelse. 1. Installation af LØN... 1. 2. Introduktion til LØN... 2. 3. Indtastning af lønseddel... 7. 4. Udskrifter...

Indholdsfortegnelse. 1. Installation af LØN... 1. 2. Introduktion til LØN... 2. 3. Indtastning af lønseddel... 7. 4. Udskrifter... Løn til Windows Indholdsfortegnelse 1. Installation af LØN... 1 2. Introduktion til LØN... 2 2.1. Første start af LØN...2 2.1.1. Ét eller flere distrikter...2 2.1.2. Lønperioder...3 2.1.3. Kartoteker...4

Læs mere

Sammenlign og byt. Et eksempel på dokumentering af et program

Sammenlign og byt. Et eksempel på dokumentering af et program Sammenlign og byt Et eksempel på dokumentering af et program Sammenlign og byt Jeg har valgt, som et eksempel, at dokumentere et meget enkelt program som indlæser to tal, sammenligner dem og udskriver

Læs mere

Klasser og Objekter i Python. Uge 46 Learning Python: kap 15-16, 19-22.

Klasser og Objekter i Python. Uge 46 Learning Python: kap 15-16, 19-22. Klasser og Objekter i Python Uge 46 Learning Python: kap 15-16, 19-22. Klasser og objekter En klasse beskriver en klump af samhørende funktioner og variable En klasse er en beskrivelse. En kage form Klassens

Læs mere

Indhold. Maskinstruktur... 3. Kapitel 1. Assemblersprog...3. 1.1 Indledning...3 1.2 Hop-instruktioner... 7 1.3 Input og output...

Indhold. Maskinstruktur... 3. Kapitel 1. Assemblersprog...3. 1.1 Indledning...3 1.2 Hop-instruktioner... 7 1.3 Input og output... Indhold Maskinstruktur... 3 Kapitel 1. Assemblersprog...3 1.1 Indledning...3 1.2 Hop-instruktioner... 7 1.3 Input og output... 9 Kapitel 2. Maskinkode... 13 2.1 Den fysiske maskine... 13 2.2 Assemblerens

Læs mere

Cecilie Maria Nielsen, Mathias Fornitz Eriksen og Martin Arnetoft klasse 1.6 07-05-2010

Cecilie Maria Nielsen, Mathias Fornitz Eriksen og Martin Arnetoft klasse 1.6 07-05-2010 ROSKILDE TEKNISKE GYMNASIUM Eksamensopgave Kommunikation/it Cecilie Maria Nielsen, Mathias Fornitz Eriksen og Martin Arnetoft klasse 1.6 07-05-2010 Vi har valgt at beskæftige os med opgave 1 fra oplæget.

Læs mere

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne. Exercise 1: Opgave 9.1 på CodeJudge. a) Lav klasserne Cirkel, Rektangel og Kvadrat, som implementerer vedhæftede interface From.java (se CodeJudge). Lav Rektangel før du laver Kvadrat. Kan du bruge nedarvning

Læs mere

På de følgende sider kan du læse om nogle af de overvejelser du bør gøre dig, hvis du påtænker at skifte din bolig ud.

På de følgende sider kan du læse om nogle af de overvejelser du bør gøre dig, hvis du påtænker at skifte din bolig ud. Wennemoes Bolig På de følgende sider kan du læse om nogle af de overvejelser du bør gøre dig, hvis du påtænker at skifte din bolig ud. Ingen bolig passer til vores liv, hele livet. Vi bor alene, vi flytter

Læs mere

Design og funktionel prototype

Design og funktionel prototype Design og funktionel prototype 2.1) Minus scenarie Der bliver sendt nye billeder til rammen og Hans ønsker at se billederne, men billederne rotere for langsomt så Hans går op og bruger touch funktionen

Læs mere

WebGT 3.0 - Graveansøgning. Brugervejledning. 25. september 2012. Udgave 1.0

WebGT 3.0 - Graveansøgning. Brugervejledning. 25. september 2012. Udgave 1.0 WebGT 3.0 - Graveansøgning Brugervejledning 25. september 2012 Udgave 1.0 Indholdsfortegnelse 1 INDLEDNING... 3 1.1 OPRETTELSE SOM BRUGER... 3 1.2 NOTIFICERINGSMAILS... 4 2 OPBYGNING OG SAGSGANG... 5 2.1

Læs mere

//--------------------------------- Definition af porte og funktioner -------------------------

//--------------------------------- Definition af porte og funktioner ------------------------- Temeraturmåler (C-program).txt // Initialiserings-sekvens #include #pragma model=medium #pragma code=0x0000 #pragma xdata=0x4000 #pragma asm=on #pragma parameters=register //#define display P4

Læs mere

Applikationen Klip (dansk)

Applikationen Klip (dansk) Applikationen Klip (dansk) PMH Version 3.0-0315 Indhold 1 Manual 2 1.1 Vejledning................................. 2 1.1.1 Starten.............................. 8 1.1.2 Strækkene mellem posterne...................

Læs mere

Vejledning: Anvendelse af kuber på SLS-data fra LDV i Excel 2007. Målgruppe: Slutbruger

Vejledning: Anvendelse af kuber på SLS-data fra LDV i Excel 2007. Målgruppe: Slutbruger Vejledning: Anvendelse af kuber på SLS-data fra LDV i Excel 2007. Målgruppe: Slutbruger April 2015 Indholdsfortegnelse Indholdsfortegnelse... 2 1 Indledning... 3 1.1 Metode til anvendelse af kuber med

Læs mere

Programmering i C. Lektion september 2009

Programmering i C. Lektion september 2009 Programmering i C Lektion 4 18. september 2009 Pointers Referenceparametre 2 / 19 Pointers 1 Pointers 2 Referenceparametre Pointers Referenceparametre 3 / 19 Husk: En variabel er en navngiven plads i computerens

Læs mere

Athena DIMENSION Varmeanlæg 4

Athena DIMENSION Varmeanlæg 4 Athena DIMENSION Varmeanlæg 4 Juni 2001 Indhold 1 Introduktion.................................. 2 2 Programmets opbygning........................... 2 3 Fremgangsmåde................................ 3

Læs mere

Statistiksøgning. Kom godt i gang med: EG Data Inform A/S. Lautrupvang 12 2750 Ballerup. Dusager 4 8200 Aarhus N. Albert Ginges Vej 10 9800 Hjørring

Statistiksøgning. Kom godt i gang med: EG Data Inform A/S. Lautrupvang 12 2750 Ballerup. Dusager 4 8200 Aarhus N. Albert Ginges Vej 10 9800 Hjørring Kom godt i gang med: Statistiksøgning EG Data Inform A/S Albert Ginges Vej 10 9800 Hjørring Dusager 4 8200 Aarhus N Lautrupvang 12 2750 Ballerup Telefon: 96 23 51 00 Telefon Service Desk: 96 23 51 11 -

Læs mere

Import-vejledning Fra KMD Elev til UNI Login

Import-vejledning Fra KMD Elev til UNI Login Import-vejledning Fra KMD Elev til UNI Login - For UNI Login brugeradministratorer 6. udgave, juli 2008 UNI C 2008 Vermundsgade 5 2100 København Ø Tlf: 35 87 88 89 1 Bestil data fra KMD Elev... 2 2 Indlæsning

Læs mere

Java Klasse nedarvninger

Java Klasse nedarvninger Denne guide er oprindeligt udgivet på Eksperten.dk Java Klasse nedarvninger Et let lille overblik i hvordan klasse nedarvning virker i java Skrevet den 07. dec 2011 af mochners I kategorien Programmering

Læs mere

Få navn på analysenr. i excel-fil og ind i pivottabel med data fra qlikview

Få navn på analysenr. i excel-fil og ind i pivottabel med data fra qlikview Få navn på analysenr. i excel-fil og ind i pivottabel med data fra qlikview Opret en excel-fil med analysenr. og navn. Gemt som dataliste_til_pivottabeller Analysenr. skal stå i nr. orden, og cellen skal

Læs mere

Procedurer og funktioner - iteration og rekursion

Procedurer og funktioner - iteration og rekursion Procedurer og funktioner - iteration og rekursion Procedurer De første procedurer vi så på var knyttet til handlinger, der skulle udføres, fx at klikke på en knap for at lukke en form eller afslutte et

Læs mere

fotografisk kommunikation

fotografisk kommunikation XDANMARKS MEDIE- OG JOURNALISTHØJSKOLE CAMPUS KØBENHAVN Forprøve 2016 fotografisk kommunikation 1/2 Professionsbacheloruddannelsen i Visuel Kommunikation Studieretning: Fotografisk Kommunikation Del 1:

Læs mere

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java Kursus i OOP og Java Kursus i Objektorienteret programmering i Java Åben Dokumentlicens Dette foredragsmateriale er under Åben Dokumentlicens (ÅDL) Du har derfor lov til frit at kopiere dette værk Bruger

Læs mere

Eksamensadministration, EUD, udtrækning af elever Sidst opdateret 16-03-2010/version 1.3 /UNI C/Steen Eske Christensen

Eksamensadministration, EUD, udtrækning af elever Sidst opdateret 16-03-2010/version 1.3 /UNI C/Steen Eske Christensen Eksamensadministration, EUD, udtrækning af elever Sidst opdateret 16-03-2010/version 1.3 /UNI C/Steen Eske Christensen Indhold Ændringer Centrale begreber Generelt Arbejdsgange mv. Vejledningen består

Læs mere

Fig. 1 Billede af de 60 terninger på mit skrivebord

Fig. 1 Billede af de 60 terninger på mit skrivebord Simulation af χ 2 - fordeling John Andersen Introduktion En dag kastede jeg 60 terninger Fig. 1 Billede af de 60 terninger på mit skrivebord For at danne mig et billede af hyppighederne flyttede jeg rundt

Læs mere

#AlleKanKode. Lektion 3 - Operatorer

#AlleKanKode. Lektion 3 - Operatorer #AlleKanKode Lektion 3 - Operatorer Disclaimer / Ansvarsfraskrivelse Alt du deler og siger mm bliver optaget. Lad være med at dele privat oplysninger, adgangskoder, kreditkort oplysninger osv. Andre vil

Læs mere

CANSAT & ARDUINO step by step

CANSAT & ARDUINO step by step CANSAT & ARDUINO step by step Jens Dalsgaard Nielsen SATLAB Aalborg Universitet Danmark jdn@space.aau.dk 1/51 Arduino CANSAT - MÅL At måle ved hjælp af sensor temperatur, tryk, acceleration, CO2, lys,...

Læs mere