Programmeeropdracht 1

De eerste opdracht dan maar. 8) Het is niet zo'n moeilijke opdracht en is meer bedoeld als een test voor de belangstelling hiervoor.

[b:c112ccffbe]Welke taal?[/b:c112ccffbe]
Je mag elke taal gebruiken, mits deze ook door andere mensen op dit forum te gebruiken is. Als je een taal gebruikt die niet standaard op de mac staat gebruikt, geef dan even een link erbij naar de website waar je de compiler te downloaden is.

[b:c112ccffbe]De opdracht[/b:c112ccffbe]
Rekeningnummers

Om typefouten te verkomen, wordt er in Nederland de elfproef gedaan met rekeningnummers. Dit betekend dat de nummers in een rekeningnummer vermenigvuldigd worden met 9 terug naar 1 en als de som van die getallen gedeeld door 11 een geheel getal is, dan is het een geldig rekeningnummer.
Bijvoorbeeld:

Rekeningnummer: 12 34 56 789
Som: 19 + 28 + 37 + 46 + 55 + 64 + 73 + 82 + 9*1 = 165

165/11 is een geheel getal.

12 34 56 789 is dus een geldig rekeningnummer.

De opdracht luidt:

Schrijf een programma die als invoer een rekening nummer krijgt en een rekeningnummer test of het een geldig of ongeldig nummer is.

Bonusopdracht:

Bedenk een manier om te berekenen hoeveel verschillende rekeningnummers gemaakt kunnen worden met negen cijfers, die voldoen aan de elfproef.

[b:c112ccffbe]Inleveren[/b:c112ccffbe]
Stuur de opdracht per PB naar mij en op de uiterlijke inleverdatum zet ik ze in dit draadje.

[b:c112ccffbe]Enkele tips[/b:c112ccffbe]

  • Een goed uitgewerkt programma dan niet werkt is mooier om te zien dan een snelle ‘hack’ die het wel doet.
  • Gebruik genoeg comments in je code zodat het voor andere, en voor jezelf duidelijk is wat je code doet.
  • Het is geen wedstrijd! Er wordt geen prijs uitgereikt voor snelste of beste inzending!

[b:c112ccffbe]Inleverdatum[/b:c112ccffbe]
Over 2 weken, dus woensdag 22 maart.

Veel succes!

Haha erg slim van je, je huiswerk van school posten als huiswerk voor het forum :P

[quote:fb18973e53="apollo51"]Haha erg slim van je, je huiswerk van school posten als huiswerk voor het forum :P[/quote:fb18973e53] Ben daar maar niet bang voor. Doe niks in de informatica. Programmeren doe ik gewoon om af en toe de tijd door te komen.

/* Opdracht: Rekeningnummers (Zonder extra opdracht) Programmeertaal: C++ Compiler: Apple Xcode Naam: Thomas Wiggers Forum: apollo51 */

#include <iostream>
#include <curses.h>
#include <math.h>

using namespace std;

int main (int argc, char * const argv[]) {
//Variabelen
int totaal=0,i=0; //Totaal van de 11 proef, Teller
float uitkomst=0.0;

//Code
cout &lt;&lt; "Voer een 9 cijferig rekeningnummer in en druk op enter: ";
	
	//Pas de 11 proef toe
	for(i=9;i&gt;0;i--){
		totaal=totaal+(getchar()-48)*i; //ASCII-48=getal
	}

//Print het resultaat
uitkomst=(float)totaal/11;

cout &lt;&lt; totaal &lt;&lt; "/11=" &lt;&lt; uitkomst &lt;&lt; "n";

if(totaal/11==uitkomst){
	//Geheel getal
	cout &lt;&lt; "Dit rekeningnummer klopt.n";
}else{
	//Geen geheel getal
	cout &lt;&lt; "Dit rekeningnummer klopt NIET!n";
}

return 0;

}

Misschien is het handig om code ook tussen de [code:1:e999a495d6]Code tags[/code:1:e999a495d6] te plaatsen?

Leuke opdracht, maar ik doe het alleen voor een prijs. Misschien is het wat om een soort "Hall of Fame" voor dit subforum te maken?

Ey apollo, bedankt voor je bijdrage. We zouden een hall of fame kunnen maken, maar dan heb je meteen een jury nodig enzo. Als bij deze opdracht genoeg interesse is, kunnen we misschien een hall of fame maken

Op de commandline (1 regel): [code:1:f2f9c52dec] perl -e 'for ($i=0; $i < 9; $i++) { $totaal = $totaal + substr(@ARGV[0],$i,1)*(9-$i);} $totaal%11==0 ? print "goed" : print "fout";' 123456789 [/code:1:f2f9c52dec]

Zo onleesbaar is perl toch niet :stuck_out_tongue:

[quote:ca02512d44="Marc29"]Op de commandline (1 regel): [code:1:ca02512d44] perl -e 'for ($i=0; $i < 9; $i++) { $totaal = $totaal + substr(@ARGV[0],$i,1)*(9-$i);} $totaal%11==0 ? print "goed" : print "fout";' 123456789 [/code:1:ca02512d44]

Zo onleesbaar is perl toch niet :P[/quote:ca02512d44]

hahahaha :smiley: :smiley: :stuck_out_tongue:

Deze is in Python, en lijkt te werken: [code:1:06344f4abf]#! /usr/bin/env python

Importeren benodigde modules: string om te kijken of iets wel een getal is, sys om het rekeningnummer van de commandoregel op te kunnen halen

import string, sys

Rekeningnummer initialiseren om latere variabele-fouten tegen te gaan

rekeningNummer = ""

Controle of er wel een rekeningnummer opgegeven is; zo niet, geef dan waarschuwing

try:
rekeningNummer = sys.argv[1]
except IndexError:
print "Gebruik: " + sys.argv[0] + " rekeningnummer"

Als er wel een rekeningnummer is gaan we verder

if rekeningNummer:

# Huidig controlegetal is 9 en totaal = 0
controleGetal = 9
totaal = 0

# Haal een voor een de getallen uit het nummer
for getal in rekeningNummer&#58;

	# Is het wel een getal?
	if getal in string.digits&#58;

		# Vermenigvuldig het getal met het controlegetal en tel het op bij het totaal
		totaal = totaal + int&#40;getal&#41; * controleGetal

		# Trek 1 af van controlenummer
		controleGetal = controleGetal - 1

# Kijk of het nummer geldig is door staartdeling te doen; rest moet 0 zijn
if divmod&#40;totaal, 11&#41;&#91;1&#93; == 0&#58;
	geldig = &quot;geldig&quot;
else&#58;
	geldig = &quot;ongeldig&quot;

# Druk uitkomst af
print rekeningNummer + &quot; is een &quot; + geldig + &quot; rekeningnummer.&quot;[/code:1:06344f4abf]</p>

Die perl kan nog iets korter en mooier ;-) [code:1:0dafb0407b] perl -e 'for ($i=0; $i < 9; $i++) { $totaal += substr(@ARGV[0],$i,1)*(9-$i);} $totaal%11==0 ? print "goedn" : print "foutn";' 123456789 [/code:1:0dafb0407b] [list:0dafb0407b]"$totaal +=" gebruiken i.p.v. $totaal = $totaal + ... "n" in je strings gebruiken zodat meteen naar de volgende lijn wordt gegaan.[/list:u:0dafb0407b]

Het is mss fijn om elkaar tips te geven over het geschreven programma bij:
Hoe kan iets sneller worden uitgevoerd, minder geheugen worden gebruikt,…
(iedereen kan er maar van bijleren)

Ey leuk, Perl. Hier zijn altijd van die korte oplossingen mogelijk. Jakko, leuk gedaan met python, wat me wel opvalt is de manier waarop je de banshee hebt gedefineerd. Goed gedocumenteerd ook.

Ik had vanmiddag een tussenuur, dus hier is m’n bijdrage in C:

[code:1:eb526eb6e1]
/*

  • rekeningnummers.c

*/

#include <stdio.h>

int main (void) {

int stop, count, multiplier, sum;
int rekening_nummer&#91;9&#93;;

printf &#40;&quot;Geef een rekeningnummer en druk op &#91;Enter&#93;&#58; &quot;&#41;;
count = 0;
stop = 0;
while &#40;stop != 1&#41; &#123;
	rekening_nummer&#91;count&#93; = getchar&#40;&#41;;
	if &#40;rekening_nummer&#91;count&#93; == 'n'&#41;
		stop = 1;
	if &#40;count == 8&#41;
		stop = 1;
	count++;
&#125;

count = 0;
multiplier = 9;
sum = 0;
while &#40;count &lt; 9&#41; &#123;
	sum = sum + &#40;&#40;rekening_nummer&#91;count&#93; - 48&#41; * multiplier&#41;;
	count++;
	multiplier--;
&#125;
printf&#40;&quot;%i&quot;,sum&#41;;

if &#40;sum % 11 == 0&#41;
	printf &#40;&quot;Geldig nummer!n&quot;&#41;;
else
	printf &#40;&quot;Ongeldig nummer!n&quot;&#41;;

}

[/code:1:eb526eb6e1]

Ik zie dat er nog geen oplossingen voor de bonusopdracht zijn… :o

Die bonusopdracht is gewoon een stukje combinatoriek. Ik heb het wel gehad, maar ben het redelijk kwijt hoe je het ook alweer op moest lossen... (wiskunde zakt erg snel weg :( )

  • boek erbij pakt

[edit]
Nah, ok, ik ben wiskundig gezien te incapabel geworden om dit nog uit te rekenen. Waarschijnlijk als iemand het hier neerzet dat ik denk ‘dúh’. Maar zo 1.2.3 uit mezelf niet :slight_smile:

Dat perl gedoe: [code:1:024594ed44]perl -e 'for ($i=0; $i < 9; $i++) { $totaal += substr(@ARGV[0],$i,1)*(9-$i);} $totaal%11==0 ? print "goedn" : print "foutn";' 123456789 [/code:1:024594ed44] heeft nog wel enkele nadelen.

Door valgrind sturen geeft

[code:1:024594ed44]==14320== LEAK SUMMARY:
==14320== definitely lost: 133542 bytes in 13 blocks.
==14320== indirectly lost: 109288 bytes in 602 blocks.
==14320== possibly lost: 0 bytes in 0 blocks.
==14320== still reachable: 0 bytes in 0 blocks.
==14320== suppressed: 0 bytes in 0 blocks.
[/code:1:024594ed44]
In een bank perl gebruiken is dus niet echt aan te raden, als je je Computer niet iedere dag wilt herstarten.

[quote:81f021ed2d="Elmo1608"]Jakko, leuk gedaan met python, wat me wel opvalt is de manier waarop je de banshee hebt gedefineerd. Goed gedocumenteerd ook.[/quote:81f021ed2d] Hoe ik de wat gedefiniëerd heb? ("Banshee" is voor mij een RPG-monster …) O, en normaal staat er lang niet zoveel commentaar in scriptjes die ik schrijf — nu leek het me alleen wel handig :)

dat [code:1:646ed7e364]#! /usr/bin/env python[/code:1:646ed7e364] is de banshee. Waarom is dat zo gedaan en niet gewoon [code:1:646ed7e364]#! /usr/bin/python[/code:1:646ed7e364]?

Ik dacht altijd dat [code:1:117d4aa051]#![/code:1:117d4aa051] shebang heette en niet banshee :?

Oja :P

Mijn inbreng mbv AppleScript:

[code:1:0ccc430253]
display dialog "Voer het rekenignummer in:" default answer "0"
– vraag de gebruiker om het getal

set nummer to the text returned of the result as integer
– het getal wordt in de variabele nummer gezet

set total to 0
– total is het resultaat van de elfproef

set a to nummer
– a wordt ook het nummer, maar wordt steeds verminderd

set i to 1
– i is een teller

repeat while 10 ^ (i - 1) ≤ nummer
set total to total + (a mod 10) * i
– bij het totaal wordt a mod 10 (de rest van a bij deling door 10, dus het laatste getal) * i (i telt op, het werkt van achter naar voor, dus 1, 2, 3) opgeteld

set a to &#40;a div 10&#41;
-- a wordt gedeeld door 10, en het deel achter de komma wordt weggehaald, zodat het in de volgende loop met het volgende getal begin

set i to i + 1

end repeat

if ((total mod 11) = 0) then
– mod geeft hier weer de rest bij deling door 11, als het nul is is het deelbaar door 11

display dialog &#40;nummer as string&#41; &amp; &quot; is een geldig rekeningnummer, de elfproefwaarde is &quot; &amp; &#40;total as string&#41; &amp; &quot;.&quot;

else
display dialog (nummer as string) & " is geen geldig rekeningnummer, de elfproefwaarde is " & (total as string) & "."
end if
[/code:1:0ccc430253]

[quote:600bdb273d="Elmo1608"]dat [code:1:600bdb273d]#! /usr/bin/env python[/code:1:600bdb273d] is de banshee.[/quote:600bdb273d] Weer wat geleerd :) (Ik ben nogal autodidact waar het op programmeren aankomt, dus de terminologie ontgaat me nog wel eens.)

[quote:600bdb273d=“Elmo1608”]Waarom is dat zo gedaan en niet gewoon

[code:1:600bdb273d]#! /usr/bin/python[/code:1:600bdb273d]?[/quote:600bdb273d]
Geen idee, eigenlijk. Ik heb het uit een oud scriptje gekopiëerd omdat ik altijd vergeet wat er precies moet staan; vermoedelijk heb ik het in dat andere script weer ergens anders vandaan, en zo blijft de “fout” doorgaan :slight_smile: