1. Grunnleggende C++ 1.1. Introduksjon til kurset og til C++ Innhold



Like dokumenter
Grunnleggende C++ Introduksjon til kurset og til C++

2. Pekere og referanser.

1. Introduksjon. Pekere og referanser.

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

Pekere og referanser.

Kapittel 1 En oversikt over C-språket

TDT4102 Prosedyre og Objektorientert programmering Vår 2015

Debugging. Tore Berg Hansen, TISIP

Del 1 En oversikt over C-programmering

Kontinuasjonseksamensoppgave i IMT1082 Objekt-orientert programmering

Programmeringsspråket C

Kontinuasjonseksamensoppgave i IMT1082 Objekt-orientert programmering

HØGSKOLEN I SØR-TRØNDELAG

Programmering i C++ Løsningsforslag Eksamen høsten 2005

2 Om statiske variable/konstanter og statiske metoder.

Eksamen. Objekt-orientert programmering KLASSE(R): 02HIND* 02HDMU* 02HINE* 02HING* 01HINGA 02HSIV5 02HGEOMAA

Kontinuasjonseksamen

Eksamen. Grunnleggende programmering. EKSAMENSDATO: 6.desember 2016 TID: 16:00 20:00. (kalkulator er ikke tillatt)

Høgskolen i Gjøvik Institutt for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

Del 4 Noen spesielle C-elementer

Eksamensoppgave i IMT1082 Objekt-orientert programmering

Kontinuasjonseksamen

HØYSKOLEN I OSLO, AVDELING FOR INGENIØRUTDANNING

TDT4102 Prosedyreog objektorientert programmering Vår 2016

Inn og ut i C/C++ 1. Inn og ut i C/C++

HØGSKOLEN I SØR-TRØNDELAG

E K S A M E N. Grunnleggende datakunnskap og programmering 02HIND*, 02HINE*, 02HDMU*, 02HING*, 02HGEOMAA, 02HSIV5

E K S A M E N 96HINDA / 96HINDE (1 AA / AE)

Programmeringsspråket C

Enkle generiske klasser i Java

Kontinuasjonseksamensoppgave i IMT1031(F) Grunnleggende programmering

HØGSKOLEN I SØR-TRØNDELAG

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

Høgskolen i Gjøvik. Eksamen. Objekt-orientert programmering 98HINDA / 98HINDB / 98HINEA 98HDMUA / 98HDMUB

Innhold Innledning 1. 5 Løkke som kontrollstruktur Et program med løkke som kontrollstruktur 132. vii

Kontinuasjonseksamen

Kapittel 1. Datamaskiner og programmeringsspråk. 1.1 Programmering

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

E K S A M E N. Grunnleggende programmering 03HBIND*, 03HBINFA, 03HBINE*, 03HBMETEA, 03HBMEMAA, 03HBGEOA

K O N T I N U A S J O N S E K S A M E N

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk. Eksamen. Objekt-orientert programmering

Kontinuasjonseksamen

Kontinuasjonseksamen

E K S A M E N. Grunnleggende datakunnskap og programmering 99HINDA / 99HINDB / 99HINEA 99HDMUA / 99HDMUB / 99HINGA

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk. Eksamen. Objekt-orientert programmering

Programmeringsspråket C

KONTINUASJONSEKSAMEN

E K S A M E N. Grunnleggende datakunnskap og programmering. EKSAMENSDATO: 5. desember HIND*, 01HINE*, 01HDMU*, 01HING* TID:

KONTINUASJONSEKSAMEN

Kontinuasjonseksamen

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 v2008

Argumenter fra kommandolinjen

Kontinuasjonseksamen

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

1. Å lage programmer i C++

Plan for dagen. Vprg 4. Dagens tema - filbehandling! Strømmer. Klassen FilLeser.java. Tekstfiler

INF 1000 høsten 2011 Uke september

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Eksamen. Objekt-orientert programmering

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 v2009

Eksamensoppgave i IMT1082 Objekt-orientert programmering

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

Velkommen til INF2100

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 h2006

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Kontinuasjonseksamen

Forelesning inf Java 4

Kontinuasjonseksamen

Kontinuasjonseksamen

Bakgrunnen for INF2100. Velkommen til INF2100. Prosjektet. Hva gjør en kompilator?

UNIVERSITETET I OSLO

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

2 Om statiske variable/konstanter og statiske metoder.

1. Å lage programmer i C++

Hittil har programmene kommunisert med omverden via tastatur og skjerm Ønskelig at data kan leve fra en kjøring til neste

KONTINUASJONSEKSAMEN

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

Øving 0 - Xcode TDT4102

TOD063 Datastrukturer og algoritmer

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

1 ØVING I WINDOWS FRA CHRISTIAN ANDOLO

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

KONTINUASJONSEKSAMEN

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk. Eksamen. Objekt-orientert programmering

Bygg et Hus. Steg 1: Prøv selv først. Sjekkliste. Introduksjon. Prøv selv

Bruk av class Scanner, FileWriter og Formatter som alternativ til EasyIO i INF1000.

Kontinuasjonseksamen

Shellscripting I. Innhold

Bli Kjent med Datamaskinen Introduksjon ComputerCraft PDF

1. NetBeans IDE: Lage en enkel mobilapplikasjon

Kontinuasjonseksamen

Transkript:

Avdeling for informatikk og e-læring, Høgskolen i Sør-Trøndelag 1. Grunnleggende C++ Else Lervik 12.08.2013 Lærestoffet er utviklet for faget IFUD1048 C++ for programmerere med grunnlag i lærestoff fra LV195D Objektorientert programmering i C++ 1. Grunnleggende C++ Resymé: Leksjonen introduserer studentene til kurset og til C++. Etter å ha gått gjennom leksjonen skal de være i stand til å skrive enkle C++-programmer. De skal kunne bruke kontrollstrukturer, endimensjonale tabeller, nullterminerte tekststrenger og datafiler. Innhold 1.1. INTRODUKSJON TIL KURSET OG TIL C++... 1 1.2. NULLTERMINERTE TEKSTSTRENGER... 4 1.3. ENKEL FILBEHANDLING... 5 1.4. Å BRUKE << OG GETLINE() OM HVERANDRE... 7 Referanser til læreboka P. Deitel & H. Deitel: C++11 for Programmers, ch. 1, 2, 4, 5, 6.1-6.7 (funksjoner), 8.5 (tabeller), 8.10 (nullterminerte strenger), 14.1-14.5 (sekvensiell behandling av tekstfiler). Standardbibliotek - oppslagsstoff: Behandling av char, se ch. 20.7 Behandling av nullterminerte strenger, se ch. 20.8 og 20.10 Omforming fra tall til tekst, se ch. 20.9 1.1. Introduksjon til kurset og til C++ Velkommen til C++ for programmerere! I løpet av semesteret skal vi arbeide oss gjennom størstedelen av den standardiserte delen av C++. Fra før regner vi med at du har god kunnskap om objektorientering generelt og også erfaring fra et objektorientert programmeringsspråk, for eksempel C# eller Java. Ettersom de fleste utdanninger nå baserer seg på Java som programmeringsspråk, vil referansene i dette kurset gå til Java. Du har ikke bare erfaring med programmering, du har også erfaring med å lære å programmere. Og du vet at det eneste som nytter er å kode, lage kode, endre kode og prøve ut kode. Men i tillegg er det viktig å forstå hva som skjer. Å lære C++ handler ikke bare om å lære ny syntaks, det er også viktig å skjønne på hvilke områder C++ er fundamentalt

1. Grunnleggende C++ side 2 av 10 forskjellig fra det språket du er vant med. På hvilke måter C++ oppfører seg forskjellig fra det du er vant med. Kurset vektlegger det som skiller C++ fra Java. C++ har for eksempel en klasse string som ligner noe på Java-klassen med samme navn, og den vil vi selvfølgelig bruke. Men vi begynner med såkalte nullterminerte strenger som er en arv fra C, og som du heller ikke kan klare deg helt uten i C++. Det er mye vanskeligere enn å bruke klassen string, men så må du huske at dette er et kurs som skal lære deg det i C++ som ikke er som i Java Og det er også slik at sannsynligheten for at ditt møte med C++ i arbeidslivet like gjerne blir å oppdatere eksisterende programvare som å lage ny. Ferdige klassebiblioteker (inkl. string) kom med standarden av 1998, og det gikk enda noen år før de første implementasjonene kom. Alle først skal vi imidlertid se litt på tabeller i C++. Du vil oppdage at C++ ikke passer på deg i like stor grad som Java. Ta en titt på følgende program: include refererer til biblioteker #include <iostream> innlesing/utskrift using namespace std; bruker standard navnerom, se cout nedenfor int main() { int a; int b[3]; en heltallstabell med 3 elementer double c; cout << "a = " << a << ", c = " << c << endl; kan skrive std::cout for (int i = 0; i < 5; i++) { cout << "i = " << i << " tabellelement: " << b[i] << endl; return 0; pga at main() er av typen int, kan sløyfes Hvis du er Java-programmerer, legger du kanskje aller først merke til at main() ikke inngår i en klasse. Det betyr at du kan skrive C++-program uten å bruke klasser; det kan mest sammenlignes med å lage bare klassemetoder i Java. Koden refererer ikke til objekter. Vi definerer de enkle variablene a og c, samt en tabell b med tre elementer. Uten å initiere variablene, skrives de ut. Utskriften blir som følger: a = 0, c = 0 i = 0 tabellelement: 6630464 i = 1 tabellelement: 3339328 i = 2 tabellelement: 6630464 i = 3 tabellelement: 1139490732 i = 4 tabellelement: 3339140 Kompilatoren (Visual Studio 12) gir advarsler for linje 7, linjen der a og c skrives ut: warning C4700: uninitialized local variable 'c' used warning C4700: uninitialized local variable 'a' used Hvilke konklusjoner kan vi trekke fra dette? Advarslene gjelder variabler som ser ut til å ha fått en fornuftig verdi uten at vi har initiert dem, dvs. «unødvendige» advarsler, i alle fall i dette eksemplet.

1. Grunnleggende C++ side 3 av 10 Utskriften viser at tabell-elementene ikke er initiert til noen bestemt verdi. Vi får ingen meldinger selv om vi skriver ut b[3] og b[4], som ligger utenfor minneområdet til tabellen. Dette lille eksemplet bør vise at vi må være påpasselige med alltid å initiere variabler, og vi må også selv passe på at vi ikke beveger oss utenfor det området i minnet som er satt av til en tabell. C++-tabeller er ikke objekter, og de lages ikke med new, slik du er vant med. En tabell er rett og slett en samling variabler av samme type, som ligger ved siden av hverandre i minnet. Tabellen kjenner ikke sin egen lengde. Den enkelte variabelen når du ved å bruke indeksen, slik du er vant med fra Java. Navnet på tabellen gir deg adressen til begynnelsen av minneområdet. (Les mer i læreboka, kap. 8.5.) I C++ 98 fikk vi klasse-templaten vector, og i C++ 11 fikk vi array. Førstnevnte ligner på ArrayList i Java, mens array i praksis fungerer som en Java-tabell, det vil si at tabellen er pakket inn i et objekt som kjenner sin egen lengde. Inntil videre skal vi imidlertid jobbe med «rå-tabellene», det vil si tabeller slik de alltid har vært, både i C og i C++. Du vil nok oppdage at det kan være mye vanskeligere å finne feil i et C++-program enn i et Java-program. En av årsakene er selvfølgelig at det er nytt, men på grunn av forhold som påpekt foran, er det objektivt sett mye vanskeligere. Og da har vi ennå ikke begynt å se på pekere Du bør bruke litt tid på å lære deg å bruke debuggeren i det verktøyet du bruker. Det vil spare deg for masse tid og bekymringer senere. At du er nettstudent og kanskje ikke har noen å spørre direkte der du sitter og jobber, kan også være med på å gjøre C++-hverdagen frustrerende. Det er da viktig å benytte diskusjonsforumet i ItsLearning. Jeg håper at dere vil bruke dette jevnlig. Dere er dessuten velkommen til å sende e-post til faglærer/veileder. Sitt iallfall ikke og slit med den samme feilen i timesvis, legg akkurat det problemet til side (ved for eksempel å kommentere det bort) og prøv heller å løse en annen del av oppgaven, dersom mulig. Lærebok og utviklingsmiljø På lærebokas hjemmeside http:www.deitel.com/books/cpp11fp finner du blant annet eksemplene i læreboka. Ta også en titt på Before You Begin under Additional Resources, hvor du blant annet finner korte oppskrifter for kompilering, lenking og kjøring i Visual Studio Express 2012 og i Linux-kompilatoren g++. Som student ved HiST har du (pr dags dato 08.08.13) rett til fri tilgang til Microsoft Visual Studio. Kontakt undertegnede dersom du trenger dette. Jeg har laget et lite notat med tips om hvordan du bruker Visual Studio i kurs av denne typen. Her finner du blant annet hva du skal gjøre for å unngå at kommandovinduet lukker seg umiddelbart etter kjøring. Til tross for tittelen, C++ for Programmers, vil nok de fleste mene at boka bruker vel mye plass på grunnleggende ting, som for eksempel kontrollstrukturer. Men så får dere bare skumlese dette. Jeg har laget en oversikt over de enkelte kapitlene i boka, med sammenligninger med Java, og også referanser til de enkelte leksjonene i dette kurset. Kurset følger en annen rekkefølge enn boka. Leksjonene blir nok primærkilden deres, men det er ikke plass til alt der, så dere trenger boka for å få det fullstendige bildet. Les kapittel 1 i læreboka.

1. Grunnleggende C++ side 4 av 10 1.2. Nullterminerte tekststrenger CppProgram.cpp include refererer til biblioteker #include <iostream> innlesing/utskrift #include <cstring> strengbehandling #include <cctype> char-behandling using namespace std; bruker standard navnerom int main() { ikke void her! char tekst[5]; en streng med maks lengde 5 cout << "Skriv et ord: "; utskrift, bruker <iostream> cin >> tekst; innlesing, bruker <iostream> for (int i = 0; i < strlen(tekst); i++) { strlen() fins i <cstring> tekst[i] = toupper(tekst[i]); gjør om til store bokstaver, bruker <cctype> cout << "Bare store bokstaver: " << tekst << endl; for (int j = 0; j < strlen(tekst); j++) { tekst[j] = tolower(tekst[j]); gjør om til små bokstaver, bruker <cctype> cout << "Bare små bokstaver: " << tekst << endl; return 0; nødvendig pga at main() er av typen int /* Kjøring av programmet: Skriv et ord: test Bare store bokstaver: TEST Bare små bokstaver: test */ Sørg for at du får til å kompilere og kjøre dette programmet. Kildekoden finner du sammen med leksjonen. Du får et par advarsler ved kompilering, de skal vi komme tilbake til. Studer koden sammen med kommentarene som kort forklarer hva som skjer på de enkelte linjene. Programmet leser inn et ord og lagrer det i en såkalt nullterminert tekststreng (char tekst[5]). Prøv ut hva som skjer dersom du leser inn et ord med lengde større eller lik 5. Det går sikkert helt greit, kjøresystemet forsyner seg bare av den plassen som ligger utenfor tabellområdet. Men det går bare bra så lenge det ikke ligger andre data der, og det har du ingen kontroll med. Strenger lagres i char-tabeller, og avslutningen av strengen markeres med tegnet \0. I tabellen char tekst[5] er det derfor plass til en tekst med maks lengde 4. Programmet bruker tre biblioteksfunksjoner (en funksjon i C++ er det samme som en metode i Java), strlen(), toupper() og tolower(). Funksjonene anropes uten at de kvalifiseres med objekt- eller klassenavn. I praksis fungerer de som klassemetoder i Java. Biblioteksfunksjonene er deklarert i filene iostream, cstring og cctype, og disse tas inn via preprosessordirektivet include. Symbolet # forteller at nå kommer det en

1. Grunnleggende C++ side 5 av 10 preprosessordirektivet, og slike kommandoer utføres før kompilering («pre» «processing»). I dette tilfellet settes innholdet i de nevnte filene inn i koden («inkluderes») på den plassen der direktivet står, slik at funksjonsdeklarasjonene blir med i kompileringen. Tilbake til advarselen som kommer ved kompilering warning C4018: '<' : signed/unsigned mismatch Dette gjelder linjene som ser slik ut: for (int i = 0; i < strlen(tekst); i++) { Returtypen fra strlen() er size_t. Og hva er så det? Det er et synonym for en ikke-negativ heltallstype, eksempelvis unsigned int eller unsigned short. Eksakt hvilken type som brukes er kompilatoravhengig og definert i en av include-filene. Slå opp på data types i indeksen i læreboka for å lære mer om de ulike C++-datatypene. En oversikt finner du i vedlegg, side 779. Du kan unngå advarselen ved å skrive om setningen: for (size_t i = 0; i < strlen(tekst); i++) { Men det er nok slik at de aller fleste C++-programmere lever godt med denne advarselen og bruker int i eksempler som dette. Dog er læreboka ganske flink til å bruke size_t. Lek deg gjerne litt med dette programmet før du går videre. Gjør endringer og utvidelser. Les kapittel 2, 4, 5, 6.1-6.7 (funksjoner, håper du klarer å lese eksemplet selv om det er en klasse) og 8.10 (nullterminerte strenger) i læreboka. Standardbibliotek oppslagsstoff: Behandling av char, se ch. 20.7 Behandling av nullterminerte strenger, se ch. 20.8 og 20.10 Omforming fra tall til tekst, se ch. 20.9 1.3. Enkel filbehandling Følgende program leser tall fra en datafil. Programmet leser fram til filslutt. Studer kommentarene. -------------------------------------------------------------------- tallfil.cpp Programmet leser tall fra fil og skriver summen av tallene til skjermen. #include <fstream> #include <iostream> #include <cstdlib> using namespace std; int main() { const char filnavn[] = "tallfil.dat"; ifstream innfil; definerer filvariabel innfil.open(filnavn); åpner filen if (!innfil) { innfil kan brukes som et logisk uttrykk cout << "Feil ved åpning av innfil." << endl; exit(exit_failure); uthopp fra programmet

1. Grunnleggende C++ side 6 av 10 int tall; int sum = 0; innfil >> tall; leser et "ord" fra filen while (!innfil.eof()) { leser fram til filslutt sum += tall; innfil >> tall; cout << "Summen er " << sum << endl; innfil.close(); return 0; /* Eksempel på kjøring: Datafil: 3 4 5 5 17 Utskrift: Summen er 34 */ Hvor skal filen det leses fra plasseres? Og hvor havner filen du skriver til i neste program? I Visual Studio er standard filplassering i prosjektmappen. Hvis prosjektet ligger på C:\Temp\CppForProg\ finner du datafilene i undermappen CppForProg. Du kan sette opp absolutte sti i et filnavn ved å bruke /, det fungerer også i Windows, eksempel: const char filnavn[] = "c:/temp/toerpot.dat"; Neste program viser utskrift til fil. Formateringen setw(4) betyr at tallet etterpå skrives ut høyrejustert over fire kolonner. ------------------------------------------------------------------- toerpot.cpp Programmet skriver toerpotenser til fil. Alle toerpotenser mindre enn halvparten av maksimalverdien til "long int" skrives ut. #include <climits> #include <cstdlib> #include <fstream> #include <iomanip> #include <iostream> using namespace std; int main() { const char filnavn[] = "toerpot.dat"; ofstream utfil; utfil.open(filnavn); if (!utfil) { cout << "Feil ved åpning av utfil." << endl; exit(exit_failure);

1. Grunnleggende C++ side 7 av 10 long int toerpotens = 1L; int potens = 0; while (toerpotens <= LONG_MAX / 2L) { potens++; toerpotens *= 2L; utfil << "2 opphøyd i " << setw(4) << potens << " er " << toerpotens << endl; utfil.close(); return 0; /* Filen ser slik ut: 2 opphøyd i 1 er 2 2 opphøyd i 2 er 4 2 opphøyd i 3 er 8... 2 opphøyd i 28 er 268435456 2 opphøyd i 29 er 536870912 2 opphøyd i 30 er 1073741824 */ Vi ser at vi leser og skriver mot fil akkurat på samme måte som vi leser og skriver mot tastatur og skjerm. Dette temaet er behandlet i kapittel 14.1-14.5 i læreboka. 1.4. Å bruke << og getline() om hverandre Dette er ikke noe du trenger i øvingen i dag, men det tas med her da det ofte er en aktuell problemstilling som medfører mye frustrasjon Vi bruker << til å lese inn ett ord (fra tastatur eller fra datafil). Ordet tolkes som tall eller tekst i henhold til datatypen til variablene vi leser inn i. Vi bruker funksjonen getline() for å lese inn en linje. Eksempel: char tekst[100]; cout << Skriv en tekst: ; cin.getline(tekst, 100); maks 100 tegn leses inn, inkl. \0 Inndataene vil gjerne være en blanding av tall og tekst. Tallene, ofte flere pr. linje, ønsker vi å lese inn med cin >>, mens vi vil lese inn teksten linjevis med cin.getline( ). >> hopper over ordskiller, inkludert linjeskift. Funksjonen getline( ) søker etter linjeskift og avslutter innlesingen når et slikt påtreffes. Linjeskiftet leses altså ikke inn. Øverst på figur 1 (neste side) er det vist hva som skjer hvis programmet etter å ha lest inn et tall (Alder) med cin >>, leser inn en tekst (Stilling) med cin.getline( ). Pilene viser hvor langt i inn-bufferet programkontrollen er kommet etter at de to setningene er utført. Stilling blir tom. Funksjonen ignore( ) gjør det mulig å hoppe over tegn i inn-bufferet. Funksjonskallet cin.ignore(10, '#');

1. Grunnleggende C++ side 8 av 10 betyr at vi vil at programmet skal hoppe over tegn i inn-bufferet fram til og med tegnet '#', men ikke mer enn 10 tegn. Første argument angir maksimalt antall tegn som skal hoppes over. Andre argument er stopptegnet. Datatypen er int, men det går bra å sende inn char her. Prototypen til ignore( ) ligger på <iostream>. I eksemplet på figuren vil vi at programmet skal hoppe over tegn fram til og med linjeskift. Funksjonskallet cin.ignore(linjelengde, '\n'); medfører at programmet hopper over resten av linja (maksimalt Linjelengde tegn). Alt som står fram til og med linjeskift hoppes over (kanskje er det ingenting, kanskje noen blanke, kanskje tall og tekst). Uten bruk av ignore( ) : Etter cin >> Alder; 5 \n F r i s ø r \n Etter cin.getline(stilling, Linjelengde); Med ignore( ) : Etter cin >> Alder; Innbuffer Innbuffer 5 \n F r i s ø r \n Etter cin.ignore( Linjelengde, \n ); Etter cin.getline(stilling, Linjelengde); Figur 1: Effekten av ignore()-funksjonen Programmet nedenfor viser eksemplet fra figuren satt inn i en sammenheng. ------------------------------------------------------------------- person.cpp

1. Grunnleggende C++ side 9 av 10 Prøver getline() og ignore() #include <iostream> using namespace std; const int Linjelengde = 81; int main() { char Navn[Linjelengde]; char Adr[Linjelengde]; int Alder; char Stilling[Linjelengde]; cout << "Navn: "; cin.getline(navn, Linjelengde); cout << "Adresse: "; cin.getline(adr, Linjelengde); cout << "Alder: "; cin >> Alder; cin.ignore(linjelengde, '\n'); cout << "Stilling: "; cin.getline(stilling, Linjelengde); cout << Navn << endl << Adr << endl << Alder << endl << Stilling << endl; return 0; /* Kjøring av programmet: Uten ignore() Navn: Kari Ås Adresse: Storgt 17, 7000 Trondheim Alder: 26 Stilling: Kari Ås Storgt 17, 7000 Trondheim 26 Med ignore() Navn: Kari Ås Adresse: Storgt 17, 7000 Trondheim Alder: 25 Stilling: Frisør Kari Ås Storgt 17, 7000 Trondheim 25 Frisør */ Programmet er kjørt med og uten ignore( )-setningen. Det første eksemplet viser kjøring uten ignore( ). Etter ledeteksten Stilling: begynner utskriften. Setningen cin.getline(stilling, Linjelengde);

1. Grunnleggende C++ side 10 av 10 fører bare til at tegnet '\n' i inn-bufferet hoppes over. (Se øverst på figuren). Stilling blir en tom tekststreng, noe vi ser av at kjøreutskriften ikke viser noe etter at alderen (26) er skrevet ut. 1 1 Vi må bruke ignore( ) foran getline( ) hvis >> er brukt. Bruker vi ignore( ) en gang for mye risikerer vi å miste ei hel linje med data. Løsningen på dette er å kontrollere hvilket tegn som er det neste og så hoppe over det bare hvis det er en blank. Løkka while (isspace(cin.peek())) cin.ignore(); sørger for at blanke (og ikke andre tegn) hoppes over.