Rolf B: Ergebnisse aus einer Schleife addieren und zusammenausgeben

Beitrag lesen

Hallo Therry,

okay. So langsam steige ich da durch 😀

(Edit: Als Mudgard gepostet hat, war ich gerade am Schreiben. Boah ey, so lange?!)

Du überlegst an

, es in eienr einzigen Funktion zu haben.

Das ist eigentlich nicht der Weg. Eine Funktion - eine Aufgabe, das ist eigentlich das Prinzip, dem man folgen sollte. Mehrere Funktionen, die klein, gemein und wiederverwendbar sind, sind besser als ein Fettsack, der nur ein Ding kann.

Der übliche SelfHTML Vorschlag wäre: mach's ganz anders. Hm. Ich will Dich nicht ärgern.

Hauptfehler ist: Wenn jemand ein A-Feld ändert, füllst Du zwar aWerte auf, aber summierst es nicht und gibst es auch nicht aus. Da fehlt Code.

Ein kleiner Fehler ist: Das Summenfeld sollte kein oninput haben. Es sollte auch eigentlich kein input Element, sondern ein output Element sein, da soll doch niemand was eingeben können. Wenn es einen Rahmen haben soll, kannst Du das im CSS mit border:1px solid black ändern.

Die "Bescheidenheit der Summierung" kann man durch Aufaddieren in einer Schleife lösen. Ganz grob geht es so:

let summe = 0;
for (let i=0; i<=10; i++) {
   let wert = document.getElementById("a_"+i).valueAsNumber;
   if (!isNaN(wert))
      summe = summe + wert;
}

Nicht kopieren, das geht besser. Ich muss dafür nur eben was erklären. Wenn in einem input-Feld nichts steht, liefert valueAsNumber NaN. In diesem Fall möchtest Du mit dem Wert 0 rechnen. Es gibt in JavaScript einen Trick zum Umgang mit booleschen Werten (also true und false, die bei Vergleichen entstehen). JavaScript interessiert sich nicht für true und false, sondern für "sowas wie true" oder "sowas wie false". Auf gut Englisch: truthy oder falsy. Jeder Wert in JavaScript, wirklich jeder, ist entweder truthy oder falsy, und es gibt genaue Regeln, die das festlegen. Bei Zahlen ist es so, dass NaN und 0 falsy sind, alles andere ist truthy.

Der zweite Trick sind die logischen Operatoren für AND und OR, in JavaScript: && und ||, die boolesche Werte entgegennehmen und mit UND oder ODER zu einem neuen booleschen Wert verknüpfen. Korrektur: sie tun das nicht. Sie erwarten boolesy-Werte, also etwas, was truthy oder falsy ist, und geben dann einen von beiden zurück. Details in unserem Wiki.

Bei a || b ist es so, dass a zurückgegeben wird, wenn es truthy ist, sonst b.

Für uns heißt das: statt mühsam mit isNaN(wert) abzufragen, kannst Du einfach (wert || 0) schreiben, um NaN zu 0 zu machen.

Was auch hilft, ist eine bessere Verteilung des Codes. Meinen Vorschlag einer Zugriffsfunktion für die Felder halte ich immer noch für gut. Ich zeig's Dir mal:

function Rechner1() {
	for (let i=1; i<=10; i++) {
		schreibeWert("a", i, leseWert("e", i) * 12);
	}

	berechneSumme();
}

function Rechner2() {
	for (let i=1; i<=10; i++) {
		schreibeWert("e", i, Math.round(leseWert("a", i) / 12));
	}	

	berechneSumme();
}

function berechneSumme() {
	let summe = 0;
	for (let i=1; i<=10; i++) {
		summe = summe + leseWert("a", i);     // Frage: Runden?!
	}
	document.rechner["ausgabe"].value = summe;
}

function leseWert(typ, nr) {
	return document.rechner[typ + "_" + i].valueAsNumber || 0;
}

function schreibeWert(typ, nr, wert) {
	document.rechner[typ + "_" + i].value = wert;
}

Die Funktionen Rechner1 und Rechner2 werden aufgerufen, um vorwärts oder rückwärts zu rechnen. Bei Rechner1 habe ich round weggelassen, durch * 12 können keine Nachkommastellen entstehen.

Das Ermitteln eines Feldwertes und das Ersetzen eines NaN Wertes durch 0 ist in leseWert gekapselt. Dadurch musst Du Dich sonst nirgend mehr um NaN kümmern. Die Funktion bekommt als ersten Parameter ein "e" oder "a", und als zweiten Parameter die gewünschte Zeilennummer. Daraus baut sie den Feldnamen zusammen und liest den Wert aus.

Das Gegenstück ist schreibeWert, die bekommt typ, nummer und neuen Wert und schreibt ihn als value ins input-Element.

Und schließlich noch eine eigenständige Funktion berechneSumme. Die holt sich die Werte aus den a-Feldern und ist damit von den vorigen Berechnungen unabhängig. Entkopplungen dieser Art können das Leben deutlich vereinfachen.

Ich speichere jetzt erstmal und schreibe dann noch was zur Verbesserung der Rechnerei.

Rolf

--
sumpsi - posui - obstruxi