Oplossing: oefenzitting 2 Deze oefenzitting behandelt herhalingsopdrachten BVP 2006-2007 1. Opwarmer a) 10 i= 0 i *( i + 1) = 440 b) int som = 0; for (int i = 5; i <= 50; i = i + 5) { som = som + i; c) double som = 0; int i =1; while (i <= 100) { som = som + (1.0/i); i++; Volgende som wordt berekend: 1 + 1/2 + 1/3 + 1/4 + + 1/100 Als je het resultaat vergelijkt met de uitkomst van de tweede lus, 1/100 + 1/99 + + ½ + 1 dan merk je een klein verschil. Dat komt omdat getallen van het type double en float afgerond worden op een nauwkeurigheid van respectievelijk 7 en 15 cijfers. Hoewel de twee sommen in theorie hetzelfde resultaat geven, is er in de praktijk een klein verschil omdat het totaal van de afrondingsfout voor beide sommen verschillend is. 2. Geordende getallen? public class GeordendeGetallen { System.out.println("Geef het eerste getal."); int huidig = scan.nextint(); int vorig = huidig-1; int vorigvorig = vorig-1; boolean is_geordend = true; while (huidig!= 0 vorig!= 0) { if (vorig < vorigvorig) is_geordend = false; vorigvorig=vorig; vorig = huidig; System.out.println("Geef het volgende getal."); huidig = scan.nextint(); if( is_geordend) { System.out.println("De getallen zijn geordend."); else { System.out.println("De getallen zijn niet geordend."); 1
Alternatieve oplossing: int getal = scan.nextint(); int voriggetal; boolean geordend = true, nietgeordendtenzijvolgendeooknul = false; do { voriggetal = getal; getal = scan.nextint(); if (nietgeordendtenzijvolgendeooknul) geordend &= (getal == 0); if (getal < voriggetal) { if (getal == 0) nietgeordendtenzijvolgendeooknul = true; else geordend = false; while (getal!= 0 voriggetal!= 0); System.out.print("De rij was "); if (!geordend) System.out.print("niet "); System.out.println("geordend"); 3. Priem class Priem { public static void main(string args[]) { System.out.println("Geef een positief geheel getal."); int getal = scan.nextint(); int deler = 2; boolean ispriem = true; while (ispriem && deler * deler <= getal) { if (getal % deler == 0) { ispriem = false; deler++; if (ispriem) System.out.println(getal + " is een priemgetal."); else System.out.println(getal + " is geen priemgetal."); 2
4. Benadering door reeksontwikkeling class Reeksontwikkeling { final double EPSILON = 1.0e-7; double bgtg, x, term; int n = 1; System.out.println("We berekenen bgtg(x) d.m.v. een reeksontwikkeling:"); System.out.print("\tGeef een waarde voor x : "); x = scan.nextdouble(); term = x; bgtg = x; do{ n += 2; term = - term * x * x ; bgtg += term/n; System.out.println("n = " + n + " bgtg = " + bgtg); while (Math.abs(term/n) > EPSILON); System.out.println("\nEr zijn " + n + " iteraties uitgevoerd."); System.out.println("Het resultaat is bgtg("+ x +") = " + bgtg); System.out.println("De juiste bgtn waarde is " + Math.atan(x)); 5. Schrijf piramide public class Piramide { System.out.println("Geef de hoogte van de piramide."); int hoogte = scan.nextint(); for (int i = 0; i < hoogte; i++) { for (int j = 0; j < (hoogte - i); j++) { System.out.print(" "); for (int j = 0; j < (i * 2 + 1); j++) { System.out.print("# "); 3
6. Verwerking studentenresultaten class StudentenResultaten { int n = 0; int meer70 = 0; int minder50 = 0; int tekorten2 = 0; System.out.print("Wil u nog resultaten invoeren? [ja/nee] "); while (scan.next().equalsignorecase("ja")) { n++; System.out.println("Geef de resultaten student " + n); int tekorten= 0; int som = 0; for (int i = 0; i < 10; i++) { int resultaat = scan.nextint(); som += resultaat; if (resultaat <10) tekorten++; System.out.println("Som :" + som); int percentage = som / 2; System.out.println("Percentage: " + percentage); if (percentage > 70) meer70++; if (percentage < 50) minder50++; if (tekorten > 2) tekorten2++; System.out.print("Wil u nog resultaten invoeren? [ja/nee] "); System.out.println(meer70+" student(en) hebben meer dan 70%"); System.out.println(minder50+" student(en) hebben minder dan 50%"); System.out.println(tekorten2+" student(en) hebben meer dan 2 tekorten"); 7. Speelkaartcombinaties public class EenenTwintig { for (int klaveren=1;klaveren<=13;klaveren++) for (int schoppen=1;schoppen<=13;schoppen++) for (int ruiten=1;ruiten<=13;ruiten++) System.out.println("Het aantal combinaties is "+aantal); De binnenste if-opdracht wordt 13 4 = 28561 keer uitgevoerd. We kunnen dat aantal verminderen door de voorwaarde in de binnenste lussen strenger te maken. Bijvoorbeeld, als harten+klaveren>19 dan kunnen we hoe dan ook geen combinatie meer vinden. We krijgen dan het volgende programma: for (int klaveren=1;klaveren<=13&&klaveren+harten<=19;klaveren++) for (int schoppen=1;schoppen<=13&&klaveren+harten+schoppen<=20;schoppen++) 4
for (int ruiten=1;ruiten<=13&&klaveren+harten+schoppen+ruiten<=21;ruiten++) Wat je zou kunnen herschrijven als: for (int klaveren=1;klaveren<=math.min(13,19-harten);klaveren++) for (int schoppen=1;schoppen<=math.min(13,20-klaveren-harten);schoppen++) for (int ruiten=1;ruiten<=math.min(13,21-klaveren-harten-schoppen);ruiten++) Hier wordt de binnenste opdracht 5705 keer uitgevoerd. Voor elke keer dat de binnenste lus doorlopen wordt, zal de if-opdracht hoogstens één keer slagen. Daarom kunnen we het programma nog verder vereenvoudigen: for (int klaveren=1;klaveren<=math.min(13,19-harten);klaveren++) for (int schoppen=1;schoppen<=math.min(13,20-klaveren-harten);schoppen++) { int ruiten=21-klaveren-harten-schoppen; if (ruiten>=1&&ruiten<=13) aantal++; Hier wordt de binnenste opdracht slechts 1035 keer uitgevoerd. 5