Inleiding programmeren in C++ Life Science & Technology 9 februari 2004 http://www.liacs.nl/home/kosters/lst Universiteit Leiden.

Download Report

Transcript Inleiding programmeren in C++ Life Science & Technology 9 februari 2004 http://www.liacs.nl/home/kosters/lst Universiteit Leiden.

Inleiding programmeren in C++
Life Science & Technology
9 februari 2004
http://www.liacs.nl/home/kosters/lst
Universiteit Leiden
Week 4
• Inhoud
– Functies (vervolg) en arrays
• Doel
– Leren omgaan met functies en arrays in C++
• Materiaal
– Ammeraal Hoofdstuk 5.1
– Dictaat Hoofdstuk 3.6 en opgaven 29/35
– De tweede programmeeropgave
• Werkcollege
– Fabriceer een menu-programma; opties: eerst alleen een coutstatement, daarna Opgave 20 a en b, en dan de “elf-proef” (zie
hints bij tweede programmeeropgave)
Lessen uit de eerste programmeeropgave
• Infoblokje
– meldt “overal” duidelijk namen van de auteurs
– stel duidelijke vragen
• Layout
– consequent
– inspringen binnen functies, if, for en while
• Diversen
– constantes: jaar - 150 in plaats van 1854
– gebruik else
– ontwerp if-statements (eerst if ( maand < 1 ) …)
Opgave 9
zonder functies
#include <iostream>
using namespace std;
int main ( ) {
int n;
int res;
}
// in te lezen getal
// voor het resultaat: n!
cin >> n; // eigenlijk eerst testen of niet n < 0
res = 1;
// "lege product”
while ( n > 0 ) {
res = res * n;
n--;
} // while
cout << res << endl;
return 0;
// main
Opgave 9
functie met while
#include <iostream>
using namespace std;
int faculteit1 (int getal) {
int res = 1;
// "lege product"
while ( getal > 0 ) {
res = res * getal;
getal--;
} // while
return res;
} // faculteit1
int main ( ) {
int n;
}
aanroep
int functie
// in te lezen getal
cin >> n;
// eigenlijk eerst testen of niet n < 0
cout << faculteit1 (n) << endl;
return 0;
// main
Opgave 9
functie met for
#include <iostream>
using namespace std;
int faculteit2 (int getal) {
int res;
// for-loop met rare initialisatie:
for ( res = 1; getal > 0; getal-- ) {
res = res * getal;
} // for
return res;
} // faculteit2
int main ( ) {
int n;
}
// in te lezen getal
cin >> n;
if ( n < 0 ) return 1;
cout << faculteit2 (n) << endl;
return 0;
// main
Opgave 9
functie met for: variant
#include <iostream>
using namespace std;
int faculteit3 (int getal) {
int res = 1; int i;
}
for ( i = 1; i <= getal; i++ ) {
res = res * i;
} // for
return res;
// faculteit3
int main ( ) {
int n;
}
// in te lezen getal
cin >> n;
if ( n < 0 ) return 1;
cout << faculteit3 (n) << endl;
return 0;
// main
Opgave 8
void wissel (int & x, int & y) {
int temp;
// en NIET: x = y; y = x; !!!
temp = x;
x = y;
y = temp;
} // wissel
int main ( ) {
int a, b, c;
// drie getallen
...
if ( a > b )
wissel (a,b);
if ( b > c )
wissel (b,c);
if ( a > b )
wissel (a,b);
... nu geldt a <= b <= c ...
} // main
aanroep
void functie
Opgave 8
void wissel (int & x, int & y) {
int temp;
}
temp = x;
x = y;
y = temp;
// wissel
void sorteer (int & eerste, int & tweede, int & derde) {
if ( eerste > tweede )
wissel (eerste, tweede);
if ( tweede > derde )
wissel (tweede, derde);
if ( eerste > tweede )
wissel (eerste, tweede);
} // sorteer
Opgave 10
// zet aantal spaties op beeldscherm
void spaties (int aantal) {
int i;
for ( i = 0; i < aantal; i++ )
cout << ” ”;
} // spaties
// zet aantal kar’s op beeldscherm
void kars (int aantal, char kar) {
int i;
for ( i = 0; i < aantal; i++ )
cout << kar;
} // kars
Opgave 11
void verwerkgetallenrij ( ) {
int kleinste, grootste = 0, aantal = 0, som = 0, getal;
cout << ”Getal? ..”;
cin >> getal;
while ( getal > 0 ) {
aantal++;
som += getal;
if ( getal > grootste )
grootste = getal;
if ( aantal == 1 || getal < kleinste )
kleinste = getal;
cout << ”Getal? ..”;
cin >> getal;
} // while
if ( aantal > 0 )
cout << ”Kleinste: ” << kleinste
<< ”Grootste: ” << grootste
<< ”Gemiddelde: ” << (double) som /aantal;
} // verwerkgetallenrij
Inleiding array’s
• Een array is een rij “objecten” (bijvoorbeeld een rij
getallen, karakters of strings)
• Deze rij wordt aangeduid met één variabele-naam
• Elk element in de rij wordt aangeduid met een volgnummer
(de index), te beginnen bij 0
int a[100];
// declaratie van een rij van 100 integers
a[0] = 2;
a[27] = 7;
a[99] = a[27] + 16;
// te gebruiken zijn: a[0], a[1], ..., a[99]
// a[100] = 3; levert narigheid! a[-1] = 5; ook
Inleiding array’s (2)
const int MAX = 10;
int A[MAX];
// mag geen variabele zijn!
// dus NIET: int n; cin >> n; int A[n];
• Zo worden MAX integers gedeclareerd
– A[0], A[1], ... , A[MAX-1]
• Denk om de arraygrenzen
for ( int i = 0; i < MAX; i++ )
A[i] = 5 * i;
for ( int j = 0; j < MAX-1; j++ )
A[j] = A[j+1];
Initialiseren van array’s
• Initialiseren kan alleen gelijktijdig met de declaratie
double B[5] = {42, -3.14, 1e6, 0, 37};
char str[10] = "feestje"; // str[7] wordt '\0'
• Een string als array van char is een oude C-stijl-string
– 0-byte markeert het einde van de string
– vaste, maximale lengte
• In C++ is het type string beschikbaar (in <string>)
– lengte is variabel
– toekenning gehele string wel altijd mogelijk
Array’s en adressering
int A[50];
• A (dus zonder index) is eigenlijk het adres van het eerste
(nulde) element in het array: “waar staat het array?”
• De index geeft aan hoeveel keer de lengte van het element
(in dit geval de lengte van een int) bij dit adres moet
worden opgeteld, om bij het array-element te komen
int A[3];
int B[3] = {4, 6, 13};
...
A = B;
// ????
A
4, 6, 13
B
• Niet doen! Het adres wordt gekopieerd …
Array’s en functies
const int MAX=100;
void drukAf (int rij[MAX]) {
for (int i = 0; i < MAX; i++) {
cout << rij[i];
} // for
} // drukAf
beginadres van het
array wordt by
value doorgegeven
(op te vatten als het
gehele array)
void drukGetalAf (int getal) {
cout << getal << endl;
} // drukGetalAf
int main ( ) {
int getallen[MAX];
...
drukAf (getallen);
drukGetalAf (getallen[17]);
}
return 0;
// main
beginadres van het array
één array-element
Array’s en functies (2)
inhoud van de array
niet wijzigbaar
lengte is variabel
maar lengte moet
wel bekend zijn
int minimum (const int rij[ ], int lengte) {
int klein = rij[0];
for ( int i = 1; i < lengte; i++ ) {
if ( rij[i] < klein )
klein = rij[i];
} // for
return klein;
} // minimum
int main ( ) {
int getallen[MAX];
...
cout << "Laagste getal: " << minimum (getallen, MAX);
...
return 0;
} // main
Meerdimensionale array’s
• Een array is een rij
• Een meerdimensionaal array is een tabel of matrix
• Het is een array van array’s
// declaratie van een meerdimensionaal array
int tabel[10][20]; // 10 rijen, 20 kolommen
int kubus[20][10][30];
// gebruik van de elementen
tabel[7][12] = 27;
kubus[13][6][22] = 167;
• Denk om de array-grenzen!
•
•
tabel[0][0] ... tabel[9][19]
kubus[0][0][0] ... kubus[19][9][29]
Voorbeeld van een 2-dimensionaal array
int A[2][3];
A[0][0] = 5; A[0][1] = 7; A[0][2] = -6;
A[1][0] = 78; A[1][1] = -2; A[1][2] = 0;
geeft:
5
78
7
-2
-6
0
rij 1
kolom 2
Let op: ook al bestaat A[3][5] niet, met A[3][5] = 11; wijzig je iets
op de 15-de (3 maal 5) geheugenplek vanaf “het begin”.
Meerdimensionale array’s (2)
const int RIJ = 10, KOLOM = 10;
dimensies eenmalig definieren
array-elementen
niet wijzigbaar
void drukaf (const int mx[RIJ][KOLOM]) {
for ( int i = 0; i < RIJ; i++ ) {
for ( int j = 0; j < KOLOM; j++ ) {
cout << mx[i][j] << ' ';
} // for-j
cout << endl;
} // for-i
} // drukaf
void vul (int mx[RIJ][KOLOM]) {
for ( int i = 0; i < RIJ; i++) {
for (int j = 0; j < KOLOM; j++) {
mx[i][j] = i+j;
} // for-j
} // for-i
} // vul
array-elementen wijzigbaar
int main ( ) {
int matrix[RIJ][KOLOM];
vul (matrix);
drukaf (matrix);
}
return 0;
// main
Variabel aantal rijen
int somarray (const int mx[ ][KOLOM], int rijen) {
int som = 0;
}
for ( int i = 0; i < rijen; i++ ) {
for ( int j = 0; j < KOLOM; j++ ) {
som += mx[i][j];
} // for-j
} // for-i
return som;
// somarray
int main ( ) {
int kleinematrix[20][KOLOM];
int grotematrix[100][KOLOM]
...
cout << somarray (kleinematrix, 20) << endl;
cout << somarray (grotematrix, 100) << endl;
return 0;
} // main
variabel aantal rijen,
aantal kolommen moet
bekend zijn
hier mag ook
10 staan, of 15