Archief - [PROG]JAVA: NaN (not a number) opvangen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

maxdevis

Legacy Member
Ik heb een array die door de gebruiker gevuld wordt.
Hij kan dit ook vroegtijdig stopzetten.
Nadien wordt het gemiddelde berekend, ook als hij nog niet heeft ingevuld.
De uitkomst van het gemiddelde wordt weggeschreven naar het scherm.
Maar als hij niets heeft ingevuld, dan is de uitkomst NaN.

Hoe kan ik dit opvangen?
ik denk momenteel aan 2 opties:
- checken of er iets is geschreven in de array
- checken of de uitkomst van het gemiddelde NaN is.

maar hoe doe ik dat?

forloRn_

Legacy Member
Je krijgt NaN als resultaat omdat je 0 deelt door 0. Hou gewoon een Boolean filled bij die initieel op false staat, en op true wordt gezet wanneer er een element in de array wordt geschreven.

Checken of de uitkomst NaN is, is niet verstandig omdat je al op voorhand kan weten of je gemiddelde geldig is, en omdat NaN nog in andere omstandigheden kan voorkomen.

MilM

Legacy Member
Gewoon de lengte van uw array controleren met een if else lus.

if (lengte == 0)
System...... ("geen cijfers ingegeven);
else
System.......(gemiddelde);

Het is een opgave voor school ? Dunno hoe invoer gebeurt, maar er is de mogelijkheid dat de gebruiker geen getallen ingeeft.
Dat kun je eventueel ook opvangen (zal een error geven wanneer je bv een stirng in een array van doubles wilt steken)

killgore

Legacy Member
nope

gewoon bij u optelling van alle variabelen in de array controleren of de totale som niet 0 is, want zelfs ingevuld kan dit nog zijn he ;).

maxdevis

Legacy Member
killgore zei:
nope

gewoon bij u optelling van alle variabelen in de array controleren of de totale som niet 0 is, want zelfs ingevuld kan dit nog zijn he ;).

mja, het zijn temperaturen, dus het kan zijn dat de som natuurlijk 0 is.

MilM

Legacy Member
killgore zei:
nope

gewoon bij u optelling van alle variabelen in de array controleren of de totale som niet 0 is, want zelfs ingevuld kan dit nog zijn he ;).

Dat is toch niet erg als de som 0 is ?
En er kan zoveel fouten gebeuren bij de invoer, maar hij zegt dat het komt omdat de gebruiker geen ingegeven heeft.

MilM

Legacy Member
maxdevis zei:
mja, het zijn temperaturen, dus het kan zijn dat de som natuurlijk 0 is.

Daar moet je niet naar kijken.
Als de som 0 is, is dat namelijk geen uitzondering.
Gewoon behandelen als de andere gevallen.

Controleer gewoon of uw aray niet leeg is.
En indien dit ook tot de opgave behoort, of er wel geldige getallen worden ingegeven (een geen letters bv)

Dus gewoon

if(arraynaam.length == 0)
... (print een zinneke op het scherm)

Die NaN komt gewoon omdat je waarschijnlijk (zoals hierboven gezegd) deelt door het aantal elementen, terwijl dit 0 is als er geen opgegeven zijn en delen door 0 mag niet.

killgore

Legacy Member
MilM zei:
Dat is toch niet erg als de som 0 is ?
En er kan zoveel fouten gebeuren bij de invoer, maar hij zegt dat het komt omdat de gebruiker geen ingegeven heeft.

excuus, tis idd die lengte, zat om 1 of andere reden omgekeerd te redeneren :/.

maxdevis

Legacy Member
enkel nog een klein probleempje dat ik misschien best op voorhand had gezegd:
het is een 2 dimensionele array, waarbij de eerste dimensie de dagen van de maand is en de tweede het aantal keer dat je een temperatuur invoert per dag.
dus de arraylengte wordt op voorhand bepaald door de gebruiker

MilM

Legacy Member
Bedoel je dat je op voorhand declareert of op voorhand ook al beslist hoeveel tijdsmetingen er gedaan worden ?

Een 2d array is in feite gewoon een array van arrays.

Hoe geven de gebruikers de temperaturen op ?

maxdevis

Legacy Member
code zei:
public class Neerslag {

private int dagenMaand;
private int [][] gegevensArray;

public Neerslag(int dagenMaand)
{
this.dagenMaand = dagenMaand;
gegevensArray = new int [this.dagenMaand][4];
}
dagenMaand wordt in het begin van het programma gevraagd:
code zei:
public static int setDagenMaand()
{
Object [] aantalDagen = {4,28,29,30,31};
Integer dagen = (Integer)JOptionPane.showInputDialog(null, "Hoeveel dagen heeft je maand?","Neerslag",JOptionPane.PLAIN_MESSAGE,null,aantalDagen,aantalDagen[2]);
return dagen;
}

maxdevis

Legacy Member
MilM zei:
Bedoel je dat je op voorhand declareert of op voorhand ook al beslist hoeveel tijdsmetingen er gedaan worden ?

wat is het verschil tussen deze twee?

MilM

Legacy Member
Je zei dat het probleem bij het gemiddelde van de temperaturen lag ?
Want je toont de code van de dagen.

maxdevis zei:
wat is het verschil tussen deze twee?

Wel, je declareert nu op voorhand al plaats voor 4 tijdsmetingen op elke dag.
Maar je zegt dat ze niet alle 4 hoeven in te vullen.

Hoe werkt dat precies ?
Vraag je nog aan de gebruiker hoeveel tijdsmetingen er zijn of niet ?
En verplicht je hem om die tijdsmetingen op te geven of hoe vraag je die ?

Met mijn post hierboven bedoelde ik het volgt.
Als er verplicht 4 tijdsmetingen per dag moeten opgegeven worden, dan kun je dat op voorhand declareren.

Wanneer het bv zo is, dat je nog aan de gebruiker een combobox vraagt met hoeveel tijdsmetingen er zijn voor een bepaalde dag (van 0 tot 4 bv), dan hoef je dat op voorhand niet te declareren.

Een 2d array is namelijk gewoon een array van arrays.

Dan kun je een als volgt een array aanmaken.

private int[][] gegevensarray = new int[this.dagenMaand][];

zonder dus een tweede waarde mee te geven van lengte van die 2D array.

Wanneer uw dagenMaand = 31 bv, dan betekent dit dat je in uw array plaats hebt voor 31 arrays van int.
Dus dan gewoon bekijken als een 1dimensionale array van andere arrays

En wanneer je dan het aantal dagen vraagt van bv de 5dag en dit blijkt 3 te zijn, maak je een 1dimensionale array aan van lenge 3 en steek je die in deze tabel.

int[] tijdsmetingen = new int[resultaat];

En dan bv gegevensarray[4] = tijdsmetingen.

Ik weet niet of je de uitleg wat snapt :p
Dan heb je namelijk geen evenlange arrays.
Bv kun je op dag 5 een array hebben van lengte 3, maar op dag 7 één van lengte 4.

Nu kom, ik weet niet ofdat van toepassing is voor uw programma, aangezien de gebruiker dan per dag telkens opgeeft hoeveel tijdsmetingen er zijn.

Mss toch eens de code tonen hoe gebruikers die tijdsmetingen opgeven.

Je hebt een 2d array van ints en je declareert op voorhand.
Dus uw lengte is zoiezo niet 0, je deelt dus ook nooit door 0.
Normaal, wanneer je geen waarde opgeeft aan een element in die array, zal dit gewoon 0 zijn.
Nog zoiets waar je mee moet opletten, want als de gebruiker 2 waarden zou opgeven, dan zijn de eerste twee slechts ingevuld en zouden uw laatste 2 waarde 0 hebben en klopt uw gemiddelde niet.

Dus ik zie ook niet direct hoe je aan die NaN komt. Uw methode retourneert mss 'null', maar ik denk niet dat je een 'null' in een int kunt steken (aangezien de 'null' bij int een 0 is)

MilM

Legacy Member
Da maakt het idd een stuk gemakkelijker :p
Alé, als je op voorhand niet weet hoe lang uw tabel zal zijn toch.

ArrayList is een voorbeeld van een collectie.

maxdevis

Legacy Member
mja
in c# gebruikte ik ook altijd arraylists voor dat soort dingen,
maar nu is hier echt de opdracht om gebruik te maken van array's.

heb het nu zo opgelost:
http://www.belgiumthrills.be/michiel/

maar ik vind het zelf nogal slorig.
ik denk dat ik nog eens helemaal van nul ga beginnen.

in ieder geval bedankt voor de eye-openers
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan