Programmeren in C/Berekeningen: verschil tussen versies

2.865 bytes toegevoegd ,  14 jaar geleden
k
geen bewerkingssamenvatting
kGeen bewerkingssamenvatting
kGeen bewerkingssamenvatting
Je kunt makkelijk rekenen met C. Rekenen wordt gedan met +(optellen), -(aftrekken), *(vermenigvuldiging), /(deling) en %(modulo). De machten en wortels moet je wel met een speciale functie doen.
 
==Gewone berekeningen===
 
==Post* en pre*==
i++ is zowat kenmerkend voor C en al diens derivaten. Eigenlijk wil dit gewoon zeggen ''i=i+1''. Maar door het frequente gebruik hiervan (denk aan een for lus) is deze afkorting ontstaan. Nu zijn er echter enige finesses die bij het gebruik van deze operator horen en soms beginnelingen in de weg liggen. Het betreft hier het verschil tussen preincrement (++i) en postincrement (i++). En de tegenhangers predecrement (--i) en postdecrement (i--). Het verschil tussen post en pre ligt gewoon in de volgorde van gebruik. Bij een preincrement gaat de variabele in waarde verhoogd worden voor deze variabele gebruikt wordt bij een postincrement gebeurt dit pas nadat de variabele gebruikt is. Een kort voorbeeld kan hier natuurlijk veel duidelijk maken:
{{code
|Taal= C
|Titel=
|Code=
<source lang=c>
#include <stdio.h>
}
</source>
}}
 
 
==Modulo==
8 % 3 = 2, 8 -3 -3 = 2
etc.
 
==Willekeurige getallen==
Er is een functie in de header "stdlib.h" die je een willekeurig getal geeft. De functie heet rand() (van het Engelse woord random, dat willekeurig betekent). Hij is simpel te gebruiken:
int i = rand();
Dat getal kan natuurlijk wel heel hoog worden, daarom is het misschien handig te gebruiken met een modulo:
int i = rand() % 5;
om het getal maximaal 4 te laten worden. In dit geval vraag je de rest van een deling van een getal n gedeeld door k, dit kan dus alle getallen opleveren van 0 tot en met k-1.
Beschouw het volgende stuk code:
{{code
|Taal= C
|Titel=
|Code=
<source lang=c>
#include <stdlib.h>
#include <stdio.h>
 
main()
{
int i;
int max=20;
for(i=0;i<5;i++){
printf("%i\n", rand()%20);
}
}
</source>
}}
Wanneer deze code gecompileerd wordt, en een aantal keer uitgevoerd wordt zal deze echter telken male dezelfde random tekenreeks op het scherm getoond worden. Dit is zo omdat er vele sequenties van random getallen beschikbaar zijn, het oproepen van rand() geeft gewoon het volgende getal uit die sequentie terug. Bij het begin van een programma wordt dus telkens dezelfde sequentie van voorafaan afgelopen. Gelukkig is hiervoor een oplossing. Door de functie <i>void srand(unsigned int seed)</i> toe te voegen bij het begin van de code is het mogelijk om een selectie van de randomsequentie te maken. Indien u voor de for los <i>srand(0)</i> zou toevoegen zou u terug hetzelfde resultaat krijgen als het vorige programma (er wordt dus standaard de sequentie gebruikt die samengaan met het nummer nul). Maar nu lost dit het probleem nog niet op. Onder Linux is het bijvoorbeeld mogelijk om de randomgenerator te <i>seeden</i> met de huidige systeemtijd. Dit kan er dan bijvoorbeeld uitzien als in volgende code:
{{code
|Taal= C
|Titel=
|Code=
<source lang=c>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
 
main(){
srand(time(NULL));
int i;
int max=20;
for(i=0;i<5;i++){
printf("%i\n", rand()%20);
}
}
</source>}}
De functie <i>time(NULL)</i> (vereist <i>#include <time.h> </i>) geeft gewoon de huidige systeemtijd in seconden (een grote integer) terug. Andere compilers en omgevingen hebben andere methodes om de random generator te seeden.
Maar een opmerking hier is toch op zijn plaats: in de informatica bestaat niets zoals een perfect willekeurig getal, tenzij hier extra exotische hardware aan toegevoegd wordt. Indien men in deze context bijvoorbeeld weet met welk getal de random generater geseed zal worden zal men alle random getallen op voorhand reeds bepalen. De reden hiervoor is simpel, een computer kan niets anders doen dan reageren volgens een geprogrammeerd patroon op zijn omgeving. Dit kan enkel meer complex gemaakt worden maar nooit uitgesloten worden.
 
[[Categorie:Programmeren in C]]
2.452

bewerkingen

Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.