php.de

Zurück   php.de > Webentwicklung > JavaScript, Ajax und mehr

JavaScript, Ajax und mehr dynamisches Scripten und Interaktion auf Clientebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 26.05.2011, 11:23  
Benutzer
 
Registriert seit: 03.04.2011
Beiträge: 89
PHP-Kenntnisse:
Anfänger
Anima ist zur Zeit noch ein unbeschriebenes Blatt
Standard Problem mit Funktion

Guten Tag,

ich habe folgende Funktion programmiert, die mir den Schnittpunkt von zwei linearen Funktionen berechnet:

Code:
function chargeIntersection() {
	var m1 = document.form3.increase1.value;
	var m2 = document.form3.increase2.value;
	var n1 = document.form3.intercept1.value;
	var n2 = document.form3.intercept2.value;
	
	if(m2 > 0) {
		var m1 = m1 - m2;
	}
	else {
		if(m2 < 0) {
			var m1 = m1 + (2 * (-m2) + m2);
		}
	}
	if(n1 > 0) {
		var n2 = n2 - n1;
	}
	else {
		if(n1 < 0) {
			var n2 = n2 + (2 * (-n1) + n1);
		}
	}
	if(m1 == 0) {
		document.form3.intersection.value = "Undefined!";
	} 
	else {
		var n2 = n2 / (m1);
		var x = Math.round(n2 * 100) / 100;
		var y = Math.round(document.form3.increase1.value * x + document.form3.intercept1.value * 100) / 100;
		document.form3.intersection.value = "P("+ x +" | "+ y +")";
	}
}
Allerdings erhalte ich bei jedem Testversuch das Ergebnis "P( NaN | NaN )". Der Algorithmus an sich müsste eigentlich stimmen, da ich das Programm zuerst für meinen Taschenrechner geschrieben hatte und wollte es vorhin in JavaScript implementieren. Keine Ahnung was ich falsch gemacht habe.
Und ja ich weiß, das NaN "not a number" bedeutet.
Anima ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 26.05.2011, 11:29  
Erfahrener Benutzer
 
Benutzerbild von wolf29
 
Registriert seit: 17.03.2010
Beiträge: 1.833
PHP-Kenntnisse:
Fortgeschritten
wolf29 wird schon bald berühmt werdenwolf29 wird schon bald berühmt werden
Standard

Hi.

Mach mal bitte ein Debugging (ggf. zeilenweise), ob die Variablen wirklich befüllt werden (z.B. n2) und bei der Berechnung unten auch "noch" da sind. Hast Du zusätzlich noch eine Überprüfung eingebaut, die kontrolliert, dass z.B. nur Zahlen eingegeben werden dürfen usw.?!

mfg Wolf29

P.S. Könnte für Dich noch interessant sein:

http://de.selfhtml.org/javascript/ob...gig.htm#is_nan
http://de.selfhtml.org/javascript/ob....htm#parse_int
http://de.selfhtml.org/javascript/ob....htm#is_finite
__________________
while (!asleep()) sheep++;

Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.
wolf29 ist offline   Mit Zitat antworten
Alt 26.05.2011, 11:35  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.266
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Ein parseInt() oder parseFloat() bei der var-Deklaration um die Werte sollte eigentlich ausreichen. Denn andernfalls ergibt "3" + "3" eben 33.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 26.05.2011, 11:40  
Benutzer
 
Registriert seit: 03.04.2011
Beiträge: 89
PHP-Kenntnisse:
Anfänger
Anima ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Klappt, es lag an:
var m1 = m1 + (2 * (-m2) + m2);
und
var n2 = n2 + (2 * (-n1) + n1);

Die ganzen If-Abfragen waren sogar unnötig.
Und danke für die Links.

//E.: Neues Problem. Es wird ein komplett anderes Ergebnis ausgerechnet:

Code:
function chargeIntersection() {
	var m1 = parseFloat(document.form3.increase1.value);
	var m2 = parseFloat(document.form3.increase2.value);
	var n1 = parseFloat(document.form3.intercept1.value);
	var n2 = parseFloat(document.form3.intercept2.value);
	var saveVar = new Array(m1, n1);
	
	var m1 = m1 - m2;
	var n2 = n2 - n1;

	if(m1 == 0) {
		document.form3.intersection.value = "Undefined!";
	} 
	else {
		var n2 = n2 / (m1);
		var x = Math.round(n2 * 100) / 100;
		var y = Math.round(saveVar[0] * x + saveVar[1] * 100) / 100;
		document.form3.intersection.value = "P("+ x +" | "+ y +")";
	}
}
Ich habe die Standartwerte zuvor extra in einem Array zwischengespeichert, die dann weiter unten für die Berechnung von y genutzt werden. Aber aus welchem Grund auch immer erhalte ich für y ein völlig falsches Ergebnis. Nehmen wir mal folgende Funktionsgleichungen:

y = -7 * x - 9
y = -5 * x - 8

Die JavaScript-Funktion rechnet mir aus:
P(-0,5 | -8,96 )

Mein Taschenrechnerprogramm rechnet mir aus:
P(-0,5 | -5,5)

Die Probe:
y = -7 * (-0,5) - 9
y = 3,5 - 9
y = -5,5

Das Taschenrechnerprogramm hatte also recht und das JS-Programm hat irgendwelche Ergebnisse zusammengerechnet. Woran liegt das?
Ich habe alle Variablen bei der Deklaration mit parseFloat überprüft.

Geändert von Anima (26.05.2011 um 12:11 Uhr).
Anima ist offline   Mit Zitat antworten
Alt 26.05.2011, 15:26  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

du rechnest falsch ...

mach mal eine Klammer um die Addition für den y-Wert, bevor du mal 100 und durch 100 rechnest ...

Code:
var y = Math.round((saveVar[0] * x + saveVar[1]) * 100) / 100;
das hier sollte dein Problem beheben

merke in Summen und Differenzen kürzen nur die Intelligenzen (und beachten dabei Punkt vor Strichrechnung, was du oben verpeilt hast)
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 26.05.2011, 17:10  
Erfahrener Benutzer
 
Registriert seit: 28.05.2008
Beiträge: 2.094
PHP-Kenntnisse:
Fortgeschritten
rudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nett
Standard

Das Ganze noch formatiert:
PHP-Code:
function chargeIntersection() {
    var 
$form document.form3,
        
m1 parseFloat$form.increase1.value ),
        
m2 parseFloat$form.increase2.value ),
        
n1 parseFloat$form.intercept1.value ),
        
n2 parseFloat$form.intercept2.value ),
        
saveVar = [ m1n1 ],
        
xy;
    
    
m1 -= m2;
    
n2 -= n1;

    if(
m1 == 0) {
        
$form.intersection.value "Undefined!";
        return;
    } 
    
    
n2 n2 m1;
    
Math.roundn2 100 ) / 100;
    
Math.round( ( saveVar[0] * saveVar[1] ) * 100 ) / 100;
    
$form.intersection.value "P(" " | " ")";

Da fehlt halt noch jede Fehlerbehandlung (ein Knoten könnte null sein oder parseInt könnte dir NaN zurückliefern ). Variablen zu redeklarieren sieht grausig aus.

Grüße


Basti
__________________
++++ Wieder einer ins Netz gegangen: Phishers Fritz zufrieden ++++
Blog
rudygotya ist offline   Mit Zitat antworten
Alt 28.05.2011, 13:08  
Benutzer
 
Registriert seit: 03.04.2011
Beiträge: 89
PHP-Kenntnisse:
Anfänger
Anima ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Danke, ich stehe vor einem weiteren Problem:
Ich versuche gerade ein Stück Text rot zu markieren, wenn dort ein Fehler aufgetreten ist. Also: wenn Error, da invalider Wert im Input -> markiere Text über dem Input rot. Wie das geht, habe ich mir schon durchgelesen, aber aus irgendeinem Grund wird der Textabschnitt nicht rot gefärbt. Hier mein HTML-Code Abschnitt:

Code:
		<form name="form1">
			<table>
				<tr>
					<td name="error1">P1 (x) = <br> <input type="text" name="point1x"></td>
					<td>P1 (y) = <br> <input type="text" name="point1y"></td>
				</tr>
				<tr>
					<td name="error2">P2 (x) = <br> <input type="text" name="point2x"></td>
					<td>P2 (y) = <br> <input type="text" name="point2y"></td>
				</tr>
				<tr>
					<td>Funktionsgleichung: <br> <input type="text" name="equation" disabled></td>
				</tr>
				<tr>
					<td><input type="button" value="Berechnen" onclick="chargeEquation()"> <input type="reset" value="Zurücksetzen"></td>
				</tr>
				<tr>
					<td><input type="button" value="Zufallswerte" onclick="randValuesForEquation()"></td>
				</tr>
			</table>
		</form><br>
Ich habe also beiden <td> Tags das Attribut name gegeben und den Attributwert auf error1 und error2 gesetzt, damit JS, die Stelle finden kann.
Und hier der JS-Code:

Code:
function chargeZeros() {
	var increase = document.form2.increase.value;
	var intercept = document.form2.intercept.value;
	var error1 = document.form2.error1;
	var error2 = document.form2.error2;
		
	if(increase == 0 || increase == 0 && intercept == 0) {
		// show errors
		error1.style.color = "#CC0000";
		error2.style.color = "#CC0000"; 
		document.form2.zero.value = "Undefined";
	}
	else {
		if(intercept == 0) {
			document.form2.zero.value = "x = 1";
		}
		else {
			var zero = -intercept / increase;
			document.form2.zero.value = "x = "+ Math.round(zero * 100) / 100;
		}
	}
}
Oben habe ich zwei Variablen deklariert und diese dann weiter unten bei der If-Abfrage verwendet. Will aber aus welchem Grund auch immer nicht klappen. Hat jemand 'ne Idee?
Anima ist offline   Mit Zitat antworten
Alt 28.05.2011, 13:33  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Lerne, mit der JavaScript-Fehlerkonsole zu arbeiten.

TD-Elemente haben kein name-Attribut, und Elemente des Formulars sind sie auch nicht.
Greife bspw. über eine ID auf sie zu.

Und statt direkt per JavaScript Styles zu ändern, solltest du lieber dynamisch eine Klasse setzen, und die eigentliche Fehler-Formatierung dann im Stylesheet vornehmen.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
mail funktion problem preikarm PHP Tipps 2010 2 27.01.2010 21:32
Tabellen Problem mit Funktion Schadstoff PHP Tipps 2009 5 04.06.2009 20:12
clearInterval problem (in funktion) railon JavaScript, Ajax und mehr 3 27.05.2009 00:35
JS: Einführung - Javascript im Schichtenmodell nikosch Tutorials 4 11.04.2009 17:06
Problem: UPDATE-Abfrage in externer Funktion cheaterfritz PHP Tipps 2009 5 03.04.2009 14:56
[Erledigt] Problem mit ereg Funktion! Horvi PHP Tipps 2008 7 20.05.2008 14:29
Problem beim Aufruf einer Funktion elwood PHP Tipps 2008 6 30.08.2007 12:54
Problem mit Funktion Kein Genie PHP Tipps 2007 33 12.03.2007 15:10
(schnellere) Funktion zum Zusammenfassen von CSS PHP-Fortgeschrittene 21 08.08.2005 16:47
[Erledigt] Problem bei Massenmails versenden mit der Funktion mail PHP-Fortgeschrittene 3 19.01.2005 13:36
problem mit der "die" funktion aircrash PHP Tipps 2005 2 08.01.2005 19:44
Problem mit Umsetzung einer Funktion Datenbanken 1 20.12.2004 14:37
problem mit update funktion aircrash PHP Tipps 2004-2 3 17.11.2004 16:55
Problem mit Funktion PHP Tipps 2004 3 17.07.2004 14:30
Problem mit mail() - Funktion PHP Tipps 2004 2 06.07.2004 18:21


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:07 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum