#klooienmetcomputers

BSN-nummers controleren?

Arnout van Kempen over rommelen in een digitale wereld.

Op GitHub heb ik een bestandje gezet, BSN.txt met daarin 999 regels, random gegenereerd door Excel. Iedere regel heeft hetzelfde formaat: een driecijferig regelnummer, een bsn-nummer van het formaat xxxx-xx-xxx en een code van vijf hoofdletters. Die drie velden zijn van elkaar gescheiden door spaties of tabs. De uitdaging voor de liefhebbers is: schoon dit bestand op, door alle regels eruit te halen waar een ongeldig bsn-nummer staat, en zet de resterende regels in een bestand BSN-clean.txt met alle goede regels, met de velden gescheiden door één spatie. Zet op het scherm alle regelnummers waar een ongeldig bsn-nummer in staat.

De oplossing staat op GitHub onder de naam 025-bsn.c

Wie het zelf wil proberen, inclusief het zoeken naar zaken die nog niet besproken zijn in deze rubriek moet nu stoppen met verder lezen. Succes!

Voor wie wel nog hulp wil bij de nieuwe onderwerpen:

De geldigheid van een bsn-nummer kan worden bepaald door ieder cijfer uit het nummer te vermenigvuldigen met de positie van het nummer, dat te sommeren, met als uitzondering het laatste cijfer dat niet met 1 maar met -1 moet worden vermenigvuldigd, en dat resultaat te delen door 11. Als het deelbaar is door 11, is het een geldig bsn-nummer.

Het openen van een bestand om te schrijven werkt hetzelfde als het openen om te lezen, alleen krijgt het nu als attribuut een 'w' mee, in plaats van een 'r', dus FILE * fopen(<bestand>,”w”);

Het lezen van een regel uit een bestand kan met fgets(<string>,<lengte string>,* FILE). Als dat een NULL oplevert is het einde van het bestand bereikt.

De functie char * strtok(<string>,” \t”) levert een string op naar het eerste veld in een string, tot een scheidingsteken, in dit geval spatie of tab. Door <string> te vervangen door NULL krijg je het volgende veld, en dat kan je herhalen.

Als char c = '5' dan is  int i=c-'0' het getal 5.

5/2==2 (want 5 en 2 zijn int). 5%2=1. % levert je dus de 'rest' van een deling van ints.

Schrijven naar een bestand werkt exact hetzelfde als printen naar het scherm, met een kleine aanpassing: je gebruikt fprintf(FILE *,…) in plaats van printf(…)

Succes!

Wie mee wil doen met #klooienmetcomputers kan dat doen via GitHub. Maak een account op www.github.com en zoek naar Abmvk/kmc. Het account Abmvk volgen kan ook. Lezers zijn vrij te gebruiken wat ze willen en om zelf zaken toe te voegen of aan te passen, vragen te stellen of commentaar te leveren.

Arnout van Kempen di CCO CISA is Senior manager Risk & Compliance bij Baker Tilly. Hij schrijft op persoonlijke titel. Hij is lid van de Commissie Financiële verslaggeving & Accountancy van de AFM en lid van de signaleringsraad van de NBA. Daarnaast is hij diaken van het bisdom 's-Hertogenbosch.

Gerelateerd

reacties

Reageren op een artikel kan tot drie maanden na plaatsing. Reageren op dit artikel is daarom niet meer mogelijk.

Aanmelden nieuwsbrief

Ontvang elke werkdag (maandag t/m vrijdag) de laatste nieuwsberichten, opinies en artikelen in uw mailbox.

Bent u NBA-lid? Dan kunt u zich ook aanmelden via uw ledenprofiel op MijnNBA.nl.