A Practicum.

advertisement
A
Practicum.
A.1
Editeren en uitvoeren
Om de applicatie te starten : dubbel klik op het Spyder icoon.
Het basisscherm bevat twee deelvensters met bovenaan drie lijnen; links kan een programma
ingetikt worden; rechts is een venster voorzien waarin de interpreter opgestart is. In dit rechtse
venster wordt een tabblad bijgecreëerd wanneer een programma uitgevoerd wordt. Eventuele
foutmeldingen worden daar ook getoond .
1. De eerste lijn geeft de naam van het programma: Spyder.
2. Op de tweede lijn: een aantal menu-knoppen: File, Edit, ..., Run, ...
3. Op de derde lijn: een aantal iconen.
Door op één van de menu-knoppen op de tweede lijn te klikken, verschijnt er een submenu. Om
een programma in te tikken en te laten uitvoeren, kan volgende sequentie gebruikt worden:
1. File : New file
2. Vervang bij author het woord student door uw naam.
3. Tik het programma in. Voor de indentatie, gebruik indien nodig de Tab toets. Met de
Backspace kan terug naar een vorig indentatie-niveau gegaan worden.
4. File : Save as en kies een eigen bestandsnaam.
5. Run : Run
In het rechtse venster wordt een nieuw tabblad actief. Bij (syntax-)fouten worden deze hier
gemeld. In dit venster kan de invoer gegeven worden en wordt ook de uitvoer getoond.
6. Bij eventuele syntax-fouten (melding in tabblad van rechts deelvenster): verbeter deze en
herhaal vorige stap tot je een succesvolle uitvoering hebt.
7. De applicatie beëindigen kan met File : quit
Deze acties kunnen ook via de iconen van de derde lijn gestart worden:
1.
2.
3.
4.
5.
6.
7.
8.
New: om een nieuw programma beginnen in te tikken (voorlopig geen bestandsnaam);
een bestand laden in de editor;
ingetikte tekst (bronprogramma) in een bestand bewaren;
niet nodig (alleen voor programma’s bestaande uit meerdere bronbestanden);
knoppen voor commentaar en indentatie;
knoppen voor zoeken en vervangen van tekstdeeltjes;
uitvoeren van het programma (groen driehoekje);
debuggen van het programma (voor gevorderden).
Een bronbestand afdrukken kan met File, Print; kies hierbij HP LaserJet 400 op rodin.
Belangrijke opmerking. De quotering voor het labo is gebaseerd op permanente evalutie.
Aanwezigheid in het labo is dus verplicht; op het einde van het semester een aantal listings afgeven
is NIET voldoende. Aanwezigheid is echter niet voldoende: een labo moet voorbereid worden en
tijdens het labo moet een zekere vorm van activiteit ontplooid worden.
Een labo voorbereiden wil zeggen: het bijhorende hoofdstuk bestudeerd hebben (door bijvoorbeeld
onder andere aandachtig het hoorcollege gevolgd te hebben) en door op papier reeds een aanzet
van een programma gemaakt te hebben.
1
A.2
Practicumzitting 1: eenvoudige berekeningen.
1. Schrijf een programma dat drie getallen inleest, grote basis (B), kleine basis (b) en hoogte
(h) van een trapezium, de oppervlakte van de trapezium berekent B+b
2 ∗ h, en het resultaat
uitschrijft.
2. Schrijf een programma dat twee getallen inleest, zijde (z) en hoogte (h) van een piramide
met vierkantig grondvlak, het volume van de piramide berekent 31 ∗ z 2 ∗ h, en het resultaat
uitschrijft.
3. Schrijf een programma dat
• twee gehele getallen inleest en het product van deze twee getallen berekent;
• twee volgende gehele getallen inleest en het product van deze twee getallen berekent;
• de eindsom berekent van deze twee producten;
• een reëel getal inleest om daarmee het percentage op de som te berekenen;
• de eindsom, het percentage en de som van deze eindsom en percentage uitschrijft.
A.3
Enkele kleine opgaven.
Practicumzitting 2:
1. Lees vier gehele getallen a, b, c en d. Bereken
• of a kleiner is dan d;
• of (a + 1) groter is dan c;
• of a gelegen is in het interval [b, c];
• of d gelegen is buiten het interval [b, c];
• of a kleiner is dan b en c of d groter is dan b en c.
2. Lees drie positieve gehele getallen en ga na of deze getallen een pythagorisch drietal vormen:
a2 = b2 + c2 . De volgorde waarin de getallen ingelezen worden, is willekeurig.
3. Lees een jaartal in en test of dit een schrikkeljaar is of niet. Een schrikkeljaar is een jaartal
deelbaar door 4 maar niet door 100, of deelbaar door 400.
4. Lees een bedrag in eurocent in (een geheel getal). Bereken het aantal biljetten (e 20 en e 5)
en het aantal muntstukken (e 1, 10 cent, 5 cent en 1 cent) dat je nodig hebt om dit bedrag
uit te betalen.
5. Lees twee positieve getallen tussen 20 en 99 in. Om het product van deze twee getallen te
berekenen kan de Vedische methode (of kruisvermenigvuldiging) gebruikt worden:
• bereken de cijfers van eenheden van beide getallen en vermenigvuldig deze;
het cijfer van de eenheid van dit getal is de eenheid van het product; het cijfer van
het tiental van dit getal wordt overgedragen;
• bereken ook de cijfers van de tientallen van beide getallen; maak de som van het
product van het tiental van het ene getal en de eenheid van het andere getal, het
product van het tiental van het andere getal en de eenheid van het eerste getal en
het cijfer dat overgedragen is van de vorige stap;
het cijfer van de eenheid van dit getal is het tiental van het product; het cijfer van
het tiental van dit getal wordt overgedragen;
• bereken het product van tientallen van beide getallen en tel hierbij het overdragen
cijfer van de vorige stap op;
dit resultaat vormt het honderdtal en eventueel duizendtal van het product.
Voorbeeld: product van 57 en 83:
• eenheden 7 en 3 : product 21, dus eenheid 1 en over te dragen 2
• tientallen 5 en 8, eenheden 7 en 3 : 5 × 3 + 7 × 8 + 2 of 73 dus tiental 3 en over te
2
dragen 7
• tientallen 5 en 8 : product 40 + 7 of 47
• uiteindelijk product : 4731
5
8
7
3
21
5 7
8 3
73 1
5 7
8 3
4 7 3 1
Practicumzitting 3:
Pn
1. Lees twee getallen m en n in (met m ≤ n) en bereken i=m i2 .
Uitbreiding:
• bereken l = (n − m)/2;
• bereken de totale som in twee opeenvolgende lussen:
− van i = m tot m + l: m.b.v. een for-lus;
− van i = m + l + 1 tot n: m.b.v. een while-lus.
2. Genereer de rij van Fibonnacci. De eerste term is gelijk aan 0. De tweede term is gelijk
aan 1. Vanaf de derde term is elke term gelijk aan de som van de twee voorgaande termen.
Bereken ook telkens het quotiënt Fn /Fn−1 . Het programma stopt wanneer het verschil van
het huidige quotiënt met het
vorige quotiënt kleiner geworden is dan 1.0e-4. (Dit quotiënt
√
is gelijk aan 2 cos 36◦ of 1+2 5 .)
3. Lees 3 getallen in: de lengtes van twee zijden a en b van een willekeurige driehoek en de
grootte van de ingesloten hoek γ (in graden). Bereken uit deze drie getallen de lengte
van de derde zijde (c2 = a2 + b2 − 2ab cos γ) en de grootte van de twee andere hoeken
(a/ sin α = b/ sin β = c/ sin γ).
Practicumzitting 4:
1. Opgave op operatoren en controle structuren.
2. Lees twee getallen n (met maximumwaarde 5) en x in en een getallenrij an an−1 an−2 . . . a2 a1 a0 .
Bereken hieruit
y = an xn + an−1 xn−1 + . . . + a1 x + a0
Maak hierbij gebruik van de methode van Horner:
y = (. . . ((an x + an−1 )x + an−2 )x + . . . + a1 )x + a0
A.4
Practicumzitting 5: eenvoudige algoritmes.
1. Schrijf een programma om na te gaan of een getal een priemgetal is. Bouw het programma
op met behulp van functies:
− lees om het getal in te lezen;
− priem om na te gaan of dit getal een priemgetal is (test of het getal 2 en de oneven
getallen tussen 3 en n/2 delers zijn);
− schrijf de conclusie in het hoofdprogramma uit.
− Uitbreiding: een Stern-priemgetal is een priemgetal dat niet gelijk is aan de som van
een kleiner priemgetal en het dubbel van het kwadraat van een geheel getal (verschillend
van 0). Voeg een functie stern toe die nagaat of een gevonden priemgetal een Sternpriemgetal is.
2. Schrijf een programma dat de n nde machtswortels berekent van een complex getal. Het
complex getal en de waarde voor n moeten ingelezen worden.
− in een eerste functie wordt het complex getal (a + bj) omgezet naar zijn modulus r en
argument θ:
p
b
r = a2 + b 2
en
θ = arctan
a
3
− een tweede functie berekent de verschillende wortels in poolcoördinaten:
tk =
√
n
r
en
φk =
θ + 2kπ
n
met k = 0, 1, · · · , n − 1
de poolcoördinaten worden terugomgezet naar cartesische coördinaten ck + dk j:
ck = tk cos φk
en
dk = tk sin φk
met k = 0, 1, · · · , n − 1
− de lijst met wortels wordt in het hoofdprogramma afgedrukt.
A.5
Practicumzitting 6: numeriek integreren: de regel van Simpson.
Bereken de bepaalde integraal van f (x) tussen a en b met behulp van de regel van Simpson.
De x-as tussen a en b wordt verdeeld in 2n gelijke stukken met h = (b − a)/2n en x0 = a, x2n = b.
I=
Z
a
b
f (x)dx
=
h
(f (x0 ) + f (x2n )
3
+4(f (x1 ) + f (x3 ) + f (x5 ) + . . . + f (x2n−1 ))
+2(f (x2 ) + f (x4 ) + f (x6 ) + . . . + f (x2n−2 ))
Test de procedure met een aantal functies:
f (x) = sin2 (x)
f (x) = exp(−x2 )
f (x) = exp(x) cos(x)
met a = 0.0 en b = 1.0
met a = −1.0 en b = 1.0
met a = 0.0 en b = 1.0
Ontwikkel dit programma via stapsgewijze verfijning:
1. Eenvoudig begin:
− Schrijf een functie men naam fun(x) waarin de waarde van de opgegeven functie berekend wordt voor een gegeven argument x. Deze waarde wordt via return teruggegeven.
− Schrijf een main functie waarin de waarden van a en b ingelezen worden.
In deze functie wordt de som berekend van de functiewaarde van a en de functiewaarde
van b in de variabele resultaat. De resultaat wordt uitgegeschreven.
2. Eerste uitbreiding:
− Declareer een variabele n in de main functie met waarde gelijk aan 8.
− Bereken de stap h = (b−a)
2×n .
− Bereken in de variabele onevensom de som van de functiewaarden in x tussen a + h en
b − h dmv. een iteratie-statement waarbij x telkens met h verhoogd wordt.
− Schrijf naast resultaat de resulterende onevensom uit.
3. Tweede uitbreiding:
− Verander de lus waarin onevensom variabele berekend wordt door bij x telkens 2 × h
bij te tellen.
− Voeg een tweede lus bij om in de variabele evensom de som van de functiewaarden x
tussen a + 2h en b − 2h te berekenen waarbij x telkens met 2 × h verhoogd wordt.
− Schrijf naast resultaat de resulterende onevensom en evensom uit.
4. Derde uitbreiding:
bereken h3 × (resultaat + 4 × onevensom + 2 × evensom) en schrijf deze waarde uit.
5. Tot slot
Voeg een overkoepelende while-lus toe waarin n telkens verdubbeld wordt; de stopvoorwaarde voor deze lus is afhankelijk van de absolute waarde van het relatief verschil van de
huidige benaderende waarde voor de integraal en de vorige benaderende waarde (wanneer
dit verschil kleiner is dan ǫ = 1.0e − 4, mag er gestopt worden).
4
A.6
Practicumzitting 7: een-dimensionale arrays.
1. Recamán reeks. De n-de term wordt berekend uit de voorgaande term door van deze voorgaande term n af te trekken of n bij op te tellen. Eerst wordt de aftrekking geprobeerd. Als
dit resultaat een positief getal is dat nog niet in de reeks voorkomt, is de n-de term gevonden.
In het andere geval wordt in plaats van de aftrekking de optelling met n uitgevoerd om de
n-de term te bepalen. De 0-de term van de reeks is gelijk aan 0.
Schrijf een programma dat deze reeks berekent. De berekende elementen van de reeks worden
in een ééndimensionale array van maximaal 100 elementen gestockeerd. Deel het programma
op in een aantal korte functies.
2. Lees een rij van maximaal 30 gehele getallen in een één-dimensionale array. Sluit de invoer
van getallen af met het getal 0.
Bepaal voor elk element uit de rij hoeveel kleinere getallen er in de rij op dat element volgen
(definieer hiervoor een functie).
3. Test of random van python willekeurige getallen genereert. Creëer een array telling van
10 elementen waarin het aantal keer dat een cijfer gegenereerd wordt, kan geteld worden.
Initialiseer elke element van deze array op 0. Lees een geheel getal N in.
Schrijf een functie die een rij van N willekeurige getallen tussen 0 en 9 genereert (zie voorbeeld
p. 22) en voor elk gegenereerd getal het overeenkomende element in de array telling met
1 verhoogt.
Schrijf als resultaat een tabel uit met voor elk cijfer het bijhorende aantal uit de array
telling.
A.7
Practicumzitting 8: beoordeling van testen.
Een groep van N (met N ≤ 20) onderdelen wordt onderworpen aan M (met M ≤ 15) testen. Per
test zijn er drie mogelijke vaststellingen:
0 : geen fout;
1 : een lichte fout;
3 : een zware fout.
Deze informatie moet per onderdeel en per test ingegeven worden door middel van een drietal:
onderdeelnummer testnummer
testresultaat
Wanneer het testresultaat gelijk is aan nul, moet het corresponderende drietal niet ingegeven
worden. De invoer kan afgesloten worden met het drietal < 000 >.
Op basis van de verschillende testresultaten per onderdeel kan het onderdeel beoordeeld worden:
slecht: één of meer zware fouten en/of drie of meer lichte fouten;
goed: de andere gevallen.
De verwerking moet resulteren in volgende uitvoer:
1. Per onderdeel: een lijn met het onderdeelnummer, de resultaten van elke test en de beoordeling.
2. Per test: een lijn met het aantal onderdelen zonder fouten, het aantal met lichte en het
aantal met zware fouten
Voorbeeld:
Invoer
5 3
4 1 1
5 3 3
3 2 3
2 3 1
3 3 1
4 3 1
1 2 3
0 0 0
Uitvoer
1
2
3
4
5
1
0
0
0
1
0
2
3
0
3
0
0
3
0
1
1
1
3
slecht
goed
slecht
goed
slecht
1
2
3
5
0
4
3
1
1
1
0
3
3
0
2
1
Merk op. Deze matrix moet eerst op 0 geinitialiseerd worden.
Tip. Construeer tijdens invoer een matrix met op de i-e rij en de j-e kolom het resultaat van de
j-e test op onderdeel i (mat[onderdeelnummer][testnummer] = resultaat).
A.8
Practicumzitting 9.
1. Opgave op het gebruik van functies en arrays.
2. Afwerken van beoordelen van testen.
A.9
Practicumzitting 10: strings.
Schrijf een programma met functies die twee strings inleest. De twee in te lezen strings bevatten
tekens in alfabetische volgorde. Daarna worden twee functies opgeroepen:
1. De eerste functie (telklinker) heeft als argument een ingelezen string. Deze functie telt
het aantal klinkers (aeiou) in deze string en geeft dit aantal als resultaat terug.
2. De tweede functie (meng) heeft twee argumenten: de twee inlezen strings. Deze functie
mengt de twee strings in een nieuwe string. Tijdens het mengen worden de twee strings
element per element afgegaan en toegevoegd aan de nieuwe string zodanig dat de elementen
in deze nieuwe string ook in alfabetische volgorde staan. De resulterende string wordt
teruggegeven aan het hoofdprogramma. (Kan het programma efficiënter gemaakt worden
door tijdens het mengen voor het resultaat een andere datastructuur te gebruiken, die dan
achteraf omgezet wordt in een string?)
3. Pas de functie meng aan zodat de klinkers uit de twee strings niet opgenomen worden in de
nieuwe string.
Het resultaat (totaal aantal klinkers in de twee strings en de resulterende string) wordt afgedrukt
in de functie drukres.
Voorbeelden: invoer:
invoer:
dipqs
bcortxy
uitvoer:
2
b c d i o p q r s t x y
b c d p q r s t x y
adpquv
cepxyz
uitvoer:
3
a c d e p p q u v x y z
c d p p q v x y z
Tip. Gebruik één lus om de nieuwe lijst op te bouwen en waarin de twee gegeven strings afgegaan
worden, elk met een eigen teller, bijvoorbeeld i en j.
A.10
Practicumzitting 11: bestand met woorden.
Gegeven een tekstbestand met naam woorden.txt met per lijn een woord. Schrijf een aantal
functies:
1. lees() leest de woorden van het tekstbestand en voegt de woorden met een lengte meer
dan drie toe aan een lijst; resultaat van deze functie is de lijst met woorden;
2. is_palindroom(w) test of een woord een palindroom is, d.i. het woord en het omgekeerde
woord zijn gelijk aan elkaar, bijv. negen;
3. caesar(w,s) vervangt elke letter in het woord w door de s-e volgende letter; indien hierbij
voorbij de letter ’z’ geteld wordt, wordt van voorafaan verder gegaan; (uitbreiding: bij
negatieve s wordt naar voor geteld);
Schrijf een hoofdprogramma:
1. via de functie lees() wordt een lijst met woorden gemaakt;
2. er wordt een tekstbestand resultaat.txt gecreëerd;
3. voor elk woord in de lijst wordt nagegaan of dit een palindroom is; indien dat zo is, wordt
dat woord toegevoegd aan het resultaatbestand;
6
4. er wordt een getal inlezen dat als verschuivingswaarde gebruikt wordt;
5. voor elk woord in de lijst wordt nagegaan of de caesar-codering met de ingelezen verschuivingswaarde zelf een woord is (dus voorkomt in de lijst van woorden); indien dat zo is,
wordt het woord en zijn caesar-codering toegevoegd aan het resultaatbestand;
6. het resultaatbestand wordt afgesloten.
Uitbreiding: lees de caesar-coderingen van het resultaatbestand en bereken op basis van deze
coderingen de gebruikte verschuivingswaarde.
A.11
Practicumzitting 12: plaatsreservatie.
In een ruimte zijn een aantal rijen (maximum 6, dus aanduiding tussen letters ’a’ en ’f’) met per
rij een aantal zitplaatsen (maximum 9) beschikbaar. De effectieve grootste rijletter en het effectief
aantal zitplaatsen moeten ingelezen worden, bijvoorbeeld rijen tot en met letter ’b’ met elk drie
zitplaatsen.
1. Het programma roept een functie reserveren op. In deze functie wordt opeenvolgend
plaatsindicaties gevraagd. Een plaatsindicatie is een string die bestaat uit twee tekens:
eerste teken is een letter en geeft de rij aan; tweede teken is een cijfer en geeft de plaats in
de rij aan. Bijvoorbeeld, ’b6’ duidt de 6e plaats in de tweede rij aan. Indien de plaats vrij
is, wordt de naam gevraagd (een string) en ingevuld op de aangegeven plaats. Indien de
plaats reeds bezet is, wordt dit door de functie gemeld.
Tip: gebruik als datastructuur een dictionary: de plaatsindicatie is de sleutel; de naam de
waarde.
Wanneer de invoer beëindigd wordt met het intikken van het EOF teken ( Ctrl Z Enter ),
genereert het programma een gesorteerde tabel (op sleutel) met de reservaties:
plaatsindicatie
naam
Voeg een functie bewaren() toe, die de reservaties wegschrijft op een bestand reservatie.txt.
Zo’n lijn in dit bestand bevat
plaatsindicatie
naam
Als extra wordt op de eerste lijn de maximale rijletter en maximale plaatsnummer weggeschreven.
2. Voeg een functie inlezen() toe die het bestand reservatie.txt leest en invult in de dictionary, indien dit bestand bestaat. Indien het bestand niet bestaat, stopt het programma.
Voeg een functie schema() toe die de reservaties afdrukt per rij.
Tip: splits de sleutel in een letter en een cijfer, zodat per rij (overeenkomend met een letter)
de verschillende plaatsen kunnen afgedrukt worden, met een veldbreedte van 10. Indien er
op een specifieke plaats in een rij geen naam ingevuld is, druk dan 10 spaties af.
123456789012345678901234567890
marianne jos
janneke
marie-rose
3. Plaatsreservatie met gelijkmatige gewichtsverdeling.
Het effectieve aantal zitplaatsen op een rij is even. In plaats van de plaatsindicatie in te
lezen, moet bij een reservatie het gewicht van de persoon in kwestie opgevraagd worden. Op
basis daarvan moet een plaats gezocht zodat het totale gewicht van de linkerkant ongeveer
gelijk blijft aan het totale gewicht van de rechterkant.
Het waardeveld in de dictinary is nu een tuple. Elk tuple bevat twee velden: een string voor
de naam van de persoon, en een float voor het gewicht.
Bij het einde van het programma worden de reservaties afgedrukt zoals in vorige oefening
en ook de totale massa van de linkerkant en de rechterkant.
7
Uitbreiding: het aantal rijen is even en er moet ook rekening gehouden worden met een
gelijkmatige gewichtsverdeling tussen voor- en achterkant.
A.12
Extra oefening: lineaire regressie.
1. Maak een tekstbestand met een aantal meetpunten: op elke lijn twee reële getallen.
2. Schrijf een programma dat het tekstbestand leest en de getallen stockeert in twee arrays: x
en y. Het aantal meetpunten is n. Bereken dan de lineaire regressie: y = ax + b
P
P P
P P
P
P
n xy − ( x)( y)
( y)( x2 ) − ( x)( xy)
P
P
P
P
a=
b=
n x2 − ( x)2
n x2 − ( x)2
Creëer een tekstbestand met per lijn drie getallen: de meetpunten xi en yi en de bijhorende
berekende waarde yi′ = axi + b.
3. Schrijf een programma dat het tekstbestand leest en
P een tabel afdrukt met per lijn de drie
getallen. Bereken ook de totale kwadratische fout (yi − yi′ )2 .
8
Download