Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

Relevanta dokument
Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

C++ Slumptalsfunktioner + switch-satsen

Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

TDIU01 - Programmering i C++, grundkurs

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Användarhandledning Version 1.2

TDIU01 - Programmering i C++, grundkurs

TDIU01 (725G67) - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs

Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

Funktionens deklaration

Programmering i C++ EDAF hp. EDAF30 (Föreläsning 2) HT / 18

Föreläsning 4: Filer och strömmar

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

C++ - En introduktion

Introduktion till algoritmer - Lektion 1 Matematikgymnasiet, Läsåret Lektion 1

Kapitel 5. Strömmar. Utmatning

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

Programmeringsteknik med C och Matlab

C-programmering, föreläsning 2 Jesper Wilhelmsson

Föreläsning 1: Momstabellen i C++

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

TDDC76 - Programmering och Datastrukturer

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs Verónica Gaspes. IDE-sektionen.

C++ Lektion Tecken och teckenfält

Inledande programmering med C# (1DV402) Summera med while"-satsen

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Objektorienterad Programmering (TDDC77)

Programmeringsteknik med C och Matlab

Lektion 1 - Steg 1. Introduktion. Hello World

En villkorssats är den konstruktion som finns i C++ för att göra en selektion av två alternativa sekvenser. Formen för if satsen är

DD2387 Programsystemkonstruktion med C++ Tentamen 2

*Pekarvärden *Pekarvariabler & *

Introduktionslaboration

Objektorienterad programmering Föreläsning 2

Introduktion till algoritmer - L0 - Grunder i C++ Matematikgymnasiet, Läsåret L0 - Grunder i C++

OBS! All teori i detta och följande dokument kompletteras med genomgångar på lektionerna. Så det är viktigt att närvara och göra egna anteckningar.

Objektorienterad Programmering (TDDC77)

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Tentamen EDAF30 Programmering i C++

Övningsuppgifter till föreläsning 2 Variabler och uttryck

Klassdeklaration. Metoddeklaration. Parameteröverföring

LÖSNINGSFÖRSLAG TILL Tentamen i objektorienterad programmering i C++ I

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

TDIU01 Programmering i C++

TDDC76 - Programmering och Datastrukturer

Att använda pekare i. C-kod

Programmering i C++ EDA623 Strömmar och filer. EDA623 (Föreläsning 9) HT / 19

Anteckningar 1: Grundläggande saker

HI1024 Programmering, grundkurs TEN

Tentamen i. för D1 m fl, även distanskursen. lördag 26 februari 2011

729G04 Programmering och diskret matematik. Python 3: Loopar

Variabler och konstanter

TDDC76 - Programmering och Datastrukturer

Numeriska Metoder och Grundläggande Programmering för P1, VT2014

Vilken skillnad gör det var du placerar det? Prova båda.

Skizz till en enkel databas

Introduktion till Datalogi DD1339. Föreläsning 3 29 sept 2014

TDIU01 - Programmering i C++, grundkurs

Tentamen OOP

MMA132: Laboration 2 Matriser i MATLAB

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

Tentamen i Programmering grundkurs och Programmering C

Chapter 3: Using Classes and Objects

JavaScript Block Editor:

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Administration. EDAf30: Programmering i C++, 7.5 hp Obligatoriska moment

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Del6 Strömmar Ämnesområden denna föreläsning:

Introduktionslaboration

[] Arrayer = Indexerad variabel

Enkla datatyper minne

Strängar. Strängar (forts.)

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

Kursmaterial för laborationer i

HI1024 Programmering, grundkurs TEN

Lite mer om Javas stöd för fält. Programmering. Exempel: vad är det största talet? hh.se/db2004. Fält samt Input/Output

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Föreläsning 6: Metoder och fält (arrays)

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

Backcode. Jonathan Crusoe TDP019 Projekt: Datorspråk Linköpings universitet

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Föreläsning 3: Typomvandling, villkor och val, samt textsträngar

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Strömmar och strängar

Programmeringsteknik I

Beräkningsvetenskap föreläsning 2

F4. programmeringsteknik och Matlab

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

SF1900 Sannolikhetsteori och statistik, HT 2017 Laboration 1 för CINEK2

PROGRAMMERING-Java Omtentamina

En kort text om programmering i C.

Transkript:

Grunderna i C++ ARK 385: Virtuella Verktyg i en Materiell värld AT Arkitektur & Teknik Chalmers Tekniska Högskola 2009 - Kursen skapades (3 förel.) 2010-6 förel. + 2 projekt 2011-8 förel. Helt omarbetade övningar & Arkitektur Teknik - Chalmers T A Tekniska Högskola i j Skapad av Matz Johansson BergströmLIMY matz.johansson@chalmers.se

Innehållsförteckning I 1 Wrap-up Vad lärde vi oss förra gången Frekventa frågor Vad vi går igenom idag 2 Funktioner Slumptal Slumptal forts. Exempelkod For-loop Exempelkod Avslutning om Scope Skriva till fil Uppsnabbningar Avlusning av cout och filutskrift Övningar Matz JB (AT Arkitektur & Teknik, Chalmers) Grunderna i C++ 2011 2 / 22

Wrap-up Vad lärde vi oss förra gången Vad lärde vi oss förra gången? ˆ Att skriva funktioner ˆ Användbara funktioner ˆ Lite om block och scope (räckvidd) ˆ While ˆ Endimensionella fält Matz JB (AT Arkitektur & Teknik, Chalmers) Grunderna i C++ 2011 4 / 22

Wrap-up Frekventa frågor Frågor från förra gången Irriterande parenteser i Code:Blocks -Titta i referensbladet under avsnitt 13.2. Returnera fält, som i Matlab? - Detta går, men man använder sig då av pekare, vilket vi inte kommer gå igenom. Pekararitmetik är komplicerat, tips vore att använda sig av STL biblioteket och vector om man vill. Vi kommer inte använda fält eller vektorer som returtyper utan använder globala fält. Matz JB (AT Arkitektur & Teknik, Chalmers) Grunderna i C++ 2011 5 / 22

Wrap-up Vad vi går igenom idag Vad lär vi oss idag? Idag: ˆ Slumptal ˆ for-loopar ˆ Skrivning till fil Matz JB (AT Arkitektur & Teknik, Chalmers) Grunderna i C++ 2011 6 / 22

Avlusning C++ är ofantligt stort och utvecklas ständigt. Saker som gick att utföra i tidigare versioner kan vara olagliga i nästa. Implementationerna av C++ standarden kommer alltid att vara ett steg efter, man kan se standardena som ett mål. Vi använder ( enligt g++ - -version) 4.4.1 (22 Juli 2009), senaste är 4.4.6 (18 April 2011). Kompilatorn tillåter en användare att skriva mycket konstigt i C++kod. Det finns faktiskt tävlingar i C++ och C IOCCC (The International Obfuscated C Code Contest) som går ut på att skriva ett specifikt program så krångligt som möjligt, www. Dessa program är fruktansvärt svåra att läsa. Det tillhör dock god programmeringssed att exempelvis alltid returnera ett värde för funktioner (utan void). Använda makro för antalet element i ett fält Använda EXIT SUCCESS och EXIT FAILURE (definierat i cstdlib som 0 respektive 1). Koden blir tydligare för er själva och andra. Matz JB (AT Arkitektur & Teknik, Chalmers) Grunderna i C++ 2011 8 / 22

Avlusning Vi kan se ett enkelt exempel på hur illa man kan skriva i C++. # include<s t d l i b > # include <i o s t r e a m > using namespace std ; int main ( ) { int cout =1; cout << 2 ; } std : : cout << cout ; Förkortad version av ett program. cout blir här en variabel som vi bitshiftar men inte tilldelar till någon variabel, så värdet slängs, cout har fortfarande värdet 1. Det skrivs alltså inte ut nåt till konsolen. Vi skriver till slut ut värden på variabeln cout med namnrymden standard. Matz JB (AT Arkitektur & Teknik, Chalmers) Grunderna i C++ 2011 9 / 22

Avlusning Vi har tidigare sett problem med C++, Matlab är inte helt förskonad från konstiga resultat heller. Skriver vi in följande i prompten: >>1E-16 + 1 Testa själva. Detta har att göra med flyttalsstandarden och maskinnoggrannheten. Vi kommer inte gå in på detta närmare. Skriver man följande i C++: int i ; cout <<i ; Vad blir resultatet? OBS: Initierar man inte en variabel med ett värde vet man inte säkert vilket värde den har, detta är skräp, för den nyfikne se: www Matz JB (AT Arkitektur & Teknik, Chalmers) Grunderna i C++ 2011 10 / 22

Funktioner Slumptal Vi visade att oinitierade variabler innehöll skräp. Detta ger antydan till att ett värde på en oinitierad variabel är slumpmässig, så är inte fallet. Att generera slumptal är svårare än man tror. Det finns många beräkninsmetoder att generera slumptal, dessa kan delas in i två kategorier: True random number generators (TRNGs) och Pseudo random number generators (PRNGs). PRNG grundar sig i att det finns en kod som genererar tal som ser slumpmässiga ut. För att få nya slumptal varje gång man kör programmet används ett seed som är unikt för varje körning, för att ändra sekvensen. I C++ finns en slumptalsfunktion som heter rand(). Rand skapar inte äkta slumptal, utan är en PRNG. Fördelen med en PRNG är snabbare generering av slumtal som ofta är lämpligt för enklare program. Det finns dock brister i PRNG som gör det olämpligt att använda den i seriösa tillämpningar som exempelvis kryptering och onlinespel. En sida där man skapar äkta slumptal (TRNG): www. Matz JB (AT Arkitektur & Teknik, Chalmers) Grunderna i C++ 2011 11 / 22

Funktioner Slumptal forts. srand() är seedfunktionen som tar som argument time(null) som i sin tur returnerar antalet sekunder som har passerat sedan 1 Jan, 1970. Detta värdet är olika varje gång man anropar funktionen och ger därför en unik sekvens av slumptal varje gång. rand ger ett tal s [0, RAND MAX]. RAND MAX är ett makro i cstdlib som är definierad som 0x7FFF (hexadecimalt), alltså s [0, 32767]. Vill man generera ett slumptal s [a, b] så kan man skriva Se även: www (rand()/rand MAX ) (b a) +a }{{} [0,1] }{{} [0,b a] } {{ } [a,b] Intressant artikel om slumptal och Lavalampor: www Matz JB (AT Arkitektur & Teknik, Chalmers) Grunderna i C++ 2011 12 / 22

Funktioner Exempelkod Ett enkelt exempelprogram och utskrift: # include <time. h>//obs. h // utlämnat d e t a l j e r int main ( ) ; { srand ( time ( NULL ) ) ; // s e e d cout << rand ( ) ; // s k r i v e r ut s l u m p t a l } Slumptal i C++. Matz JB (AT Arkitektur & Teknik, Chalmers) Grunderna i C++ 2011 13 / 22

Funktioner Exempelkod Följande visar ett komplett program, som exempel på användning av slumptalsfunktionen. # include <c s t d l i b > # include <i o s t r e a m > # include <time. h> using namespace std ; int main ( ) { int i=0; srand ( time ( NULL ) ) ; // s e e d while ( i <100) { cout << rand ( ) % 100 << endl ; i++; } } return 0 ; Matz JB (AT Arkitektur & Teknik, Chalmers) Grunderna i C++ 2011 14 / 22

For-loop for-loop Vi har redan använt While för att upprepa kod. En version av While är For loop, detta är ungefär samma som i Matlab. For-loopen, liksom while, upprepar kod till dess ett villkor inte längre är uppfyllt. Så fort villkoret inte är sant längre kommer snurran att avbrytas och programmet hoppar ur loopen. kod; for(kod;villkor;kod) { False True [kod;] } kod; Matz JB (AT Arkitektur & Teknik, Chalmers) Grunderna i C++ 2011 15 / 22

For-loop Följande visar hur man kan konvertera mellan while och for: int i=0; While ( i <100) { cout << i << endl ; } i++; Loop med while. for ( int i=0; i <100; i++) { cout << i << endl ; } Samma loop med en for. Matz JB (AT Arkitektur & Teknik, Chalmers) Grunderna i C++ 2011 16 / 22

Avslutning om Scope Några avslutande ord om scope I samtliga exempel och övningar har vi sett using namespace std;. Detta har med namnrymd (scope) att göra. namespace lades till i C++ för att förhindra att bibliotek har samma namn på variabler så dessa skulle överskuggas. Man använder namespaces som ett sätt att påminna programmeraren att man faktiskt använder en visst namnrymd/scope, dvs. std i detta fall. Om man vill så kan man skriva sitt egna namespace väldigt enkelt: namespace Matz { double pi = 3. 1 4 ; } namespace Elev { double pi = 4* atan ( 1 ) ; } int main ( ) { cout << Matz : : pi Elev : : pi ; } Annars hade man varit tvungen att skriva std::cout. Detta är tror jag anledningen till att Code::Blocks heter som det gör. För ytterliga information, se: www Matz JB (AT Arkitektur & Teknik, Chalmers) Grunderna i C++ 2011 17 / 22

Skriva till fil Skriva till fil För att skriva data till en fil kan man skapa en ström. En ström är en sorts länk till en fil, samma som cout och cin är en länk till konsolfönstret (stdout, stdin). När en ström skapas kommer en fil att skapas där.exe-filen befinner sig. Man kan låta filnamnet vara en fil i en godtycklig mapp, exempelvis: c:\\annat\\data\\test.txt, notera två \! # include <f s t r e a m >// i n n e h å l l e r o f s t r e a m ofstream namn ( " filnamn " ) ; // kan v a r a g l o b a l namn << " skriv detta till fil " ;... namn. close ( ) ; // s t ä n g strömmen Exempelkod med filström. Notera att namn kan vara ett vanligt namn. OBS: namn fungerar nu på samma sätt som cout, skillnaden är att vi nu skriver till en fil. OBS: Skriver man till \\file01... så måste man ha escape character (\) före varje \, alltså fil path skall vara: \\\\file01... Matz JB (AT Arkitektur & Teknik, Chalmers) Grunderna i C++ 2011 18 / 22

Skriva till fil Uppsnabbningsmetoder för skrivning till fil Diskhastighet: Det första man skall tänka på är att skriva till en snabb disk. Diskar är relativt långsamma, att skriva 73MB data till M: tar 6 sekunder medan det tar 4.18 sekunder på C: (2011). Skriv mindre: En enkel åtgärd för att snabba upp skrivning till fil är att skriva färre tecken i, vi behöver allmänt inte skriva samtliga 16 decimaler utan kan nöja oss med mellan 5-10 decimaler, detta kan man specifiera detta med: out<<setprecision(5); Buffertmetoden: När vi skriver till fil inne i en loop kommer varje loop att begära diskaccess, om vi istället använder en buffert och skriver allting till fil efter loopen så kan vi snabba upp koden med ungefär 27% # include<sstream > stringstream buffert ; // d e k l a r e r a s f ö r s t buffert << " hej " ; // s k r i v t i l l b u f f e r t out << buffert. str ( ) ; // e f t e r loop, s k r i v a l l t i n g t i l l f i l out. close ( ) ; i Det går också att skriva direkt till Maltabs binära filformat, via biblitek. Matz JB (AT Arkitektur & Teknik, Chalmers) Grunderna i C++ 2011 19 / 22

Skriva till fil Uppsnabbningsmetoder för skrivning till fil... More computing sins are committed in the name of efficiency (without necessarily achieving it) than for any other single reason - including blind stupidity. - W.A. Wulf endl vs. \n: Som nybörjare är det lätt att använda endl för nyrad men om man skriver detta till fil eller skärm i en loop, så kommer det gå mycket långsamt. Tester visar att endl är mellan 1.23 till 3 ggr långsammare än nyradstecken. OBS: För buffertmetoden får vi ingen uppsnabbning. Anledningen till att det är snabbare att använda nyradstecknet är att endl tvingar skrivning till fil, om man gör detta inne i en loop så utförs denna skrivning för varje loop. Gör vi allting rätt, dvs. använder buffertmetoden, skriver med nyradstecken, 5 decimaler så kan vi få minst 56% snabbare kod jämfört med om vi gör allting fel, vilket är bra om vi skriver stora filer. Matz JB (AT Arkitektur & Teknik, Chalmers) Grunderna i C++ 2011 20 / 22

Skriva till fil Avlusning av cout int i ; cout << i=i+1 << endl ; Även om << har lägre prioritet än = så fungerar inte detta, cout väntar sig <<. För att lösa detta måste man skriva: int i ; cout << ( i=i+1) << endl ; Vi kan skriva i++ istället: int i ; cout << i++ << endl ; eftersom det är tilldelning (=) som ställer till det för cout. Detta felet uppstår för skrivning till fil också. Matz JB (AT Arkitektur & Teknik, Chalmers) Grunderna i C++ 2011 21 / 22

Övningar Övningar ˆ Ni behöver inte logga in för att hämta ner från kurshemsidan www ˆ ˆ Öppna Instruktioner till Övning 3.pdf (under Övningar/3/) Öppna Referensblad.pdf (under Extra/) ˆ Om ni undrar något så kolla i referensbladet, där står allt ni behöver veta. ˆ Är jag upptagen så kolla på ledtrådarna, annars kan ni skriva upp er på tavlan så tar jag er i tur och ordning. Ni som är snabba får gärna hjälpa övriga. Matz JB (AT Arkitektur & Teknik, Chalmers) Grunderna i C++ 2011 22 / 22