hoofdstuk 10
hoofdstuk 10
hoofdstuk 10
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Voorbeelden<br />
Sorteren<br />
Schrijf een programma dat een rij gehele getallen sorteert<br />
• een eerste functie leest de rij gehele getallen;<br />
• een tweede functie sorteert deze getallenrij van klein naar groot;<br />
• een derde functie drukt de gesorteerde rij af.<br />
Voorbeeld: n = 5<br />
0 1 2 3 4<br />
8 4 6 2 5<br />
i = 0 ↑<br />
2 4 6 8 5<br />
i = 1 ↑<br />
2 4 6 8 5<br />
i = 2 ↑<br />
2 4 5 8 6<br />
i = 3 ↑<br />
2 4 5 6 8<br />
# intsort.py: sorteren van een rij getallen<br />
”””<br />
methode : sorteren door invoegen<br />
”””<br />
import numpy<br />
def l e e s r i j (x ,m) :<br />
kleinste element zoeken in de resterende d e e l r i j<br />
en toevoegen aan de gedeeltelijk gesorteerde d e e l r i j<br />
print ’ Geef een aantal gehele getallen ’<br />
for i in range (m) :<br />
invoer = raw input ( str ( i )+ ’ : ’ )<br />
x [ i ] = int ( invoer )<br />
def drukrij ( r ,m) :<br />
for i in range (m) :<br />
print<br />
print r [ i ] ,<br />
def zoekindexkleinste (a , n , vanaf ) :<br />
indexkl = vanaf<br />
for i in range ( vanaf+1,n) :<br />
if a [ i ] < a [ indexkl ] :<br />
indexkl = i<br />
return indexkl<br />
def s o r t e e r r i j ( r , n) :<br />
for i in range (n−1) :<br />
indexkleinste = zoekindexkleinste ( r , n , i )<br />
if r [ indexkleinste ] != r [ i ] :<br />
hulp = r [ i ]<br />
r [ i ] = r [ indexkleinste ]<br />
r [ indexkleinste ] = hulp
#hoofdprogramma<br />
invoer = raw input ( ’ Geef aantal : ’ )<br />
m = int ( invoer )<br />
a = numpy. zeros ( [m] , int )<br />
l e e s r i j (a ,m)<br />
b = l i s t (a)<br />
s o r t e e r r i j (a ,m)<br />
drukrij (a ,m)<br />
b . sort ()<br />
drukrij (b ,m)<br />
docstring: een triple-quoted string, ev. over meerdere lijnen ("""...""")<br />
uitgebreidere commentaar waarbij niet elke lijn met het commentaarsymbool (#) moet<br />
beginnen.<br />
Schrijf een programma dat<br />
Binair zoeken<br />
• met een eerste functie een aantal gehele getallen inleest (maximum 20), die<br />
gesorteerd van klein naar groot ingegeven worden; eindigen met CTRL Z ;<br />
• met een tweede functie een bijkomend geheel getal inleest;<br />
• met een derde functie bepaalt of het laatst ingelezen getal in de rij voorkomt of<br />
niet (dit moet zo efficiënt mogelijk gebeuren);<br />
• in het hoofdprogramma afdrukt of het getal aanwezig was of niet, en, zo ja op<br />
welke plaats in de rij.<br />
Voorbeeld: n = <strong>10</strong><br />
0 1 2 3 4 5 6 7 8 9<br />
x = 74 17 23 37 42 59 61 68 74 85 96<br />
↑l ↑m<br />
↑r<br />
↑l ↑m ↑r<br />
↑l ↑m ↑r<br />
↑l ↑r<br />
0 1 2 3 4 5 6 7 8 9<br />
x = 40 17 23 37 42 59 61 68 74 85 96<br />
↑l ↑m<br />
↑r<br />
↑l ↑m ↑r<br />
↑l↑m ↑r<br />
↑l ↑r<br />
# binzoek.py: binair zoeken in een gesorteerde rij getallen<br />
import numpy<br />
AANTAL = 50<br />
def l e e s r i j (a) :<br />
print ’ Geef een aantal gehele getallen ’<br />
i = 0<br />
while i < AANTAL :<br />
try :<br />
invoer = raw input ( str ( i )+ ’ : ’ )<br />
a [ i ] = int ( invoer )<br />
if i > 0 and a [ i ] < a [ i −1] :<br />
else :<br />
print ’ vorige twee getallen niet in gesorteerde volgord<br />
i += 1<br />
except EOFError :
eturn i<br />
print<br />
break<br />
def drukrij ( r ,m) :<br />
for i in range (m) :<br />
print<br />
print r [ i ] ,<br />
def binzoek ( r , n , x) :<br />
links = 0<br />
rechts = n−1<br />
if x < r [ links ] : return 0<br />
if x > r [ rechts ] : return n<br />
while links != rechts :<br />
midden = ( links + rechts )/2<br />
if r [ midden ] < x :<br />
else :<br />
return links<br />
#hoofdprogramma<br />
links = midden + 1<br />
rechts = midden<br />
a = numpy. zeros ( [AANTAL] , int )<br />
n = l e e s r i j (a)<br />
drukrij (a , n)<br />
invoer = raw input ( ’ Geef het te zoeken getal : ’ )<br />
zoekgetal = int ( invoer )<br />
index = binzoek (a , n , zoekgetal )<br />
if index < n and a [ index ] == zoekgetal :<br />
print zoekgetal , ’ i s aanwezig op plaats ’ , index , ’ ( vanaf 0) ’<br />
else :<br />
print zoekgetal , ’ i s niet aanwezig ( ’ , index , ’ ) ’<br />
if index == 0 :<br />
print zoekgetal , ’ i s kleiner dan eerste getal ’<br />
elif index == n :<br />
else :<br />
print zoekgetal , ’ i s groter dan laatste getal ’<br />
print zoekgetal , ’ kan toegevoegd worden op plaats ’ , index<br />
Een adressenbestand<br />
Schrijf een programma dat een aantal bewerkingen kan uitvoeren op adresgegevens.<br />
De invoer is een tekstbestand met per lijn een naam, voornaam, straat+nr, postcode,<br />
gemeente en telefoonnummer.<br />
De bewerkingen zijn: het inlezen van het bestand in een dictionary (sleutel is de tuple<br />
gevormd uit naam en voornaam), het maken van een gesorteerde lijst, het zoeken van<br />
een element op basis van naam en voornaam, het toevoegen van een element, het<br />
verwijderen van een element, het maken van een op postcode gesorteerde lijst en het<br />
bewaren van de gegevens op een tekstbestand.<br />
Een voorbeeld van een gegeven tekstbestand:<br />
Drieskens;Marc;Vendelstraat 15;3012;Wilsele;016/563227<br />
Leupe;Dirk;Bergstraat 56;2500;Lier;03/4577001<br />
Ooms;Willy;Voort 27;23<strong>10</strong>;Rijkevorsel;03/3124519
#adres.py: beheer van adressen<br />
def inlezen () :<br />
naw = dict ()<br />
try :<br />
except :<br />
fin = open( ’ adres . txt ’ , ’ r ’ )<br />
print ’ bestand kan niet geopend worden ’<br />
exit (1)<br />
while True :<br />
r l i j n = fin . readline ()<br />
if r l i j n == ’ ’ :<br />
break ;<br />
l i j n = r l i j n . strip () # einde lijn teken verwijderen<br />
velden = l i j n . s p l i t ( ’ ; ’ )<br />
velden [ 3 ] = int ( velden [ 3 ] ) # postcode omzetten naar int<br />
naw [ ( velden [ 0 ] , velden [ 1 ] ) ] = velden [ 2 : ]<br />
fin . close ()<br />
print ’ aantal adressen ’ , len (naw)<br />
return naw<br />
def druk (n) :<br />
if n in naw :<br />
else :<br />
geg = naw [ n ]<br />
def l i j s t (naw) :<br />
print ’%−18s : %−18s %4d %−18s %s ’ % \<br />
(n[0]+ ’ ’+ n [ 1 ] , geg [ 0 ] , geg [ 1 ] , geg [ 2 ] , geg [ 3 ] )<br />
print ’ geen gegevens over ’ , n<br />
namen = naw . keys ()<br />
namen . sort ()<br />
for n in namen :<br />
return<br />
druk (n)<br />
def zoeken (naw) :<br />
naam = raw input ( ’Naam: ’ )<br />
vnaam = raw input ( ’Voornaam : ’ )<br />
druk ((naam,vnaam))<br />
return<br />
def p o s t l i j s t (naw) :<br />
namen = naw . keys ()<br />
spwt = naw . values ()<br />
elem = [ ]<br />
for q in spwt :<br />
elem . append (q [ 1 ] ) # postcode<br />
comb = zip ( elem , namen)<br />
comb. sort ()<br />
for p , n in comb :<br />
return<br />
druk (n)<br />
def toevoegen(naw) :<br />
naam = raw input ( ’Naam: ’ )<br />
vnaam = raw input ( ’Voornaam : ’ )<br />
straat = raw input ( ’ Straat : ’ )<br />
postco = raw input ( ’ Postcode : ’ )<br />
postcode = int ( postco )<br />
gemeente = raw input ( ’Gemeente: ’ )<br />
telefoon = raw input ( ’ Telefoonnr : ’ )<br />
naw [ ( naam, vnaam ) ] = ( straat , postcode , gemeente , telefoon )<br />
return
def verwijderen (naw) :<br />
naam = raw input ( ’Naam: ’ )<br />
vnaam = raw input ( ’Voornaam : ’ )<br />
if (naam,vnaam) in naw :<br />
else :<br />
return<br />
del naw [ ( naam,vnaam ) ]<br />
print (naam,vnaam) , ’ niet aanwezig in dictionary ’<br />
def bewaren (naw) :<br />
try :<br />
except :<br />
f u i t = open ( ’ nadres . txt ’ , ’w’ )<br />
print ’ bestand kan niet gemaakt worden ’<br />
return<br />
for n in naw :<br />
geg = naw [ n ]<br />
r = l i s t (n) + l i s t ( geg )<br />
r [ 3 ] = str ( r [ 3 ] ) # postcode omzetten naar string<br />
print r<br />
s = ’ ; ’<br />
l i j n = s . join ( r ) + ’ \n ’<br />
f u i t . write ( l i j n )<br />
f u i t . close ()<br />
#hoofdprogramma<br />
print ’ Beheer van een adressenbestand ’<br />
while True :<br />
print ’ (0) : stoppen ’<br />
print ’ (1) : inlezen van het bestand ’<br />
print ’ (2) : gesorteerde l i j s t ’<br />
print ’ (3) : element zoeken ’<br />
print ’ (4) : element toevoegen ’<br />
print ’ (5) : element verwijderen ’<br />
print ’ (6) : gegevens bewaren ’<br />
print ’ (7) : op postcode gesorteerde l i j s t ’<br />
keuze = raw input ( ’Keuze : ’ )<br />
k = int ( keuze )<br />
if k == 1 : naw = inlezen ()<br />
elif k == 2 : l i j s t (naw)<br />
elif k == 3 : zoeken (naw)<br />
elif k == 4 : toevoegen(naw)<br />
elif k == 5 : verwijderen (naw)<br />
elif k == 6 : bewaren (naw)<br />
elif k == 7 : p o s t l i j s t (naw)<br />
else : break<br />
print ’ Dank u wel ’