13.09.2013 Views

hoofdstuk 10

hoofdstuk 10

hoofdstuk 10

SHOW MORE
SHOW LESS

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 ’

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!