// Voor LLONG_MAX
lange lange faculteit(int n) {
als (n <0) {
fprintf(stderr, "Fout:Faculteit is niet gedefinieerd voor negatieve getallen.\n");
uitgang(1); // Sluit af met een foutcode
}
als (n ==0) {
retour 1;
}
lang lang resultaat =1;
voor (int i =1; ik <=n; i++) {
if (LLONG_MAX / result
fprintf(stderr, "Fout:Factorial overschrijdt de maximale lange lange waarde.\n");
uitgang(1);
}
resultaat *=ik;
}
resultaat retourneren;
}
int hoofd() {
int num;
printf("Voer een niet-negatief geheel getal in:");
if (scanf("%d", &num) !=1) {
fprintf(stderr, "Fout:ongeldige invoer.\n");
retour 1; // Sluit af met een foutcode
}
lang lang feit =faculteit(num);
printf("Factoriaal van %d =%lld\n", num, feit);
retour 0;
}
```
Deze code compileren en uitvoeren:
1. Opslaan: Sla de code op als een `.c`-bestand (bijvoorbeeld `factorial.c`).
2. Compileren: Open een terminal en gebruik een C-compiler (zoals GCC) om de code te compileren:
``` bash
gcc faculteit.c -o faculteit
```
3. Uitvoeren: Voer het gecompileerde programma uit:
``` bash
./faculteit
```
Het programma vraagt u een getal in te voeren.
Verbeteringen en uitleg:
* Foutafhandeling: De code bevat controles op:
* Negatieve invoer: Het verwerkt expliciet negatieve invoer, die niet is gedefinieerd voor faculteiten.
* Overloop: Het voorkomt een potentiële overflow door te controleren of de volgende vermenigvuldiging de maximale waarde zou overschrijden die een 'long long' geheel getal kan bevatten ('LLONG_MAX'). Het gebruik van 'long long' geeft een groter bereik dan 'int' of 'long'.
* Ongeldige invoer: Het controleert of `scanf` met succes een geheel getal heeft gelezen.
* `lang lang` Gegevenstype: Het gebruik van 'long long' biedt een groter bereik voor de factoriële berekening, waardoor u faculteiten van grotere getallen kunt berekenen voordat u overflow tegenkomt. Maar zelfs ‘lang lang’ kent grenzen. Factorials groeien extreem snel.
* Foutmeldingen wissen: De foutmeldingen informeren de gebruiker over het specifieke probleem dat zich heeft voorgedaan.
* Exitcodes: Het programma gebruikt de juiste exitcodes (0 voor succes, 1 voor fouten), wat een goede gewoonte is voor programma's die vanuit andere scripts of programma's kunnen worden aangeroepen.
Vergeet niet dat faculteiten ongelooflijk snel groeien. Zelfs 'lang lang' zal overstromen voor relatief kleine invoer (bijvoorbeeld 21!). Voor willekeurig grote faculteiten zou je een gespecialiseerde rekenkundige bibliotheek met willekeurige precisie moeten gebruiken.