[C++] Unendliche Zahlenausgabe

TheShooter

Lt. Junior Grade
Registriert
Juni 2011
Beiträge
370
Hi,
ich bin gerade drauf und drann ein Programm zu schreiben, welches Lineare Funktionen löst. Leider werden die Ergebnisse allerdings mit dem Präfix "#INF" ausgegeben, was meines Wissens nach Infinite, bzw. Unendlich (Irrationale Zahl) bedeuten soll. In einer Beispielrechnung habe ich folgendes gerechnet:

(7-1)) / (4-1) = 6/3 = 2

Nur weiß ich nicht, wie der Compiler jetzt auf eine irrationale Zahl kommt? Das ist 2 ja wohl nicht...

Das Ergebnis von c ist ebenfalls auf dem Papier -1, im Programm allerdings #INF.

Hier der Code + Ausgabe:

Code:
#include <iostream>
#include <string>

using namespace std;

//Initialize variables

double varx [2] = {0,0};
double vary [2] = {0,0};

double m = 0;
double c = 0;
string again = "j";
//Function preloading
void calc();

int main()
{
	while(again == "j")
	{
		cout << "Please enter coordinates to calculate the function term:\n";
		cout << "x1: ";
		cin >> varx[0];
		cout << "x2: ";
		cin >> varx[1];
		cout << "y1: ";
		cin >> vary[0];
		cout << "y2: ";
		cin >> vary[1];
		calc();
		cin >> again;
	}
		
	return 0;
}


void calc()
{
	m = (vary[1] - vary[0]) / (varx[1] - varx[0]);
	c = vary[0] - m * varx[0];
	cout << "m = " << m << endl;
	cout << "c = " << c << endl;
	cout << "Functionterm: f(x) = " << m << "x " << "+ " << c << endl;
}

Ich hatte schon den Verdacht, dass der Compiler irgendwo durch null teilt, allerdings sind meine Eingabeparameter folgende:

un2bena2nntnyz1p.jpg


Wäre dankbar für Hilfe,
Shooter
 
Zuletzt bearbeitet:
Deine Eingabe für x1 und 2 war jeweils 1
Wenn man 1 von 1 abzieht bleiben 0, wenn man durch 0 dividiert...
 
Also ich kriege da kein inf raus, nur wenn varx[1] - varx[0] Null sind, was auch logisch ist.
Mal abgesehen davon ist das alles echt schlechter Style.
 
Dem Programm nach zu urteilen, ist er noch ziemlich am Anfang und versucht die grundlegenden Konzepte zu verstehen. Programmierstil ist in diesem Moment so ziemlich das letzte, um das man sich da einen Kopf macht.
 
(y1 - y0) / (x1 - x0)
(7 - 4) / (1 - 1)
3 / 0
 
Naja so ganz stimmt das nicht, denn wenn man erstmal anfängt etwas schlecht zu machen, ist es schwer wieder aufzuhören. Das ist wie bei einem Hund, dem kann man später auch nicht mehr abgewöhnen auf dem Bett zu schlafen.

Und für 10 Zeilen Code dann 5 globale Variablen ist schon echt hart.
 
In deinem Beispiel ist die X Koordinate von beiden Punkten 1, die Y Koordninate jedoch 4 und 7.
Das wäre eine Gerade parallel zur Y-Achse. Welche Steigung ist das wohl ? Das was der Steigung da am nächsten kommt, wäre wohl unendlich bzw. ist nicht definiert.

Die Geradengleichung wäre in diesem Fall einfach nur F(x)=1

Deswegen funktioniert auch die Berechnung der Steigung in diesem Spezialfall nicht.
 
Zuletzt bearbeitet:
du musst vor calc() in zeile 32 folgendes einfügen:

if(varx[1] - varx[0] == 0)
{
cout << "Some people just want to see the world burn!" <<endl;
break;
}
 
Zuletzt bearbeitet:
redasurc schrieb:
du musst vor calc() in zeile 32 folgendes einfügen:

if(varx[1] - varx[0] == 0)
{
cout << "Some men just want to see the world burn!" <<endl;
}

Also eigentlich heißt es ja "Some men just want to watch the world burn!" *klugscheiß :D
 
Ein TIP zum Programmieren, mit dem du die Ursache bereits alleine rausgefunden hättest:

An der stelle an der du berrechnest, lass dir da doch mal printen was varx[..] und vary etc. ist.
Auch kannst du die berrechnung in teilschritte zerlegen und die zwischenergebnisse printen.

Dann wäre dir aufgefallen, dass du die eingegebenen werte in anderen als den erwarteten variablen hast.
 
Tut mir Leid, ich habe nach dem Schema x1,y1,x2,y2 eingegeben, in dem Programm wird es aber in einer anderen Reihenfolge erfragt. :eek: Was stimmt denn mit dem Steal nicht? Ich habe 2 Arrays, und 2 normale double-Variablen. Zu viel? Geht es denn noch mit weniger? Und wo habe ich bitte 15 globale variablen?

Bis dann,
TheShooter
 
Du scheinst es mit der Mathematik echt nicht so zu haben.
Warum das nicht funktioniert ist ja wie schon sehr gut beschrieben kein Programmierproblem sondern ein Matheproblem und wo steht da etwas von 15 globalen Variablen?
 
Habe das wohl falsch gelesen, es waren 5 globale Variablen in 10 Zeilen. Aber mit weniger geht es doch nicht? Man braucht ja schließlich für m, c, und die jeweiligen Koordinaten verschiedene Variablen, oder? Mein Eingabefehler war blöd, dass muss ich zugeben.
 
An solche Fehler solltest du dich schonmal gewöhnen. Jedenfalls ist so ein Kleinkram bei mir immer dran Schuld, dass meine Programme nicht laufen, wie sie sollen :)

Was die globalen Variablen angeht: man könnte die komplett in die Main packen. Das macht in dem Fall jetzt zwar auch nicht den riesen Unterschied aber man gewöhnt sich schonmal an, dass man den Speicherplatz a) nur dann reserviert, wenn man ihn braucht und b) auch nur von da aus drauf zugegriffen werden kann, von wo aus man zugreifen will.
 
TheShooter schrieb:
Aber mit weniger geht es doch nicht?

Von Konstanten mal abgesehen, solltest du anstreben so gut wie keine globalen Variablen zu verwenden. Wenn du bestimmte Daten in einer Funktion oder einem Objekt haben willst, sollten sie über eine Methode/Konstruktor als Parameter übergeben oder über Setter & Getter geholt/gesetzt werden.

Damit ist später auch anderen Programmierern klar, wo du die Daten an einer bestimmten Stelle her hast. Es kann sonst arg unübersichtlich werden.
 
Jetzt noch nicht, später aber sicher. Und da ist es dann gut, wenn er daran gewöhnt ist, keine globalen Variablen zu verwenden.
 
Auch ohne Klassen gibt es keinen Grund, weshalb dieses Programm auch nur eine einzige globale Variable benötigen sollte. Kann man alles über lokale Variablen und Übergabeparameter erledigen. Es ist nie zu früh, sich einen sauberen Stil anzugewöhnen, denn wenn man sich erst mal gehen läßt, wird es später schwer, sich diese schlechten Angewohnheiten wieder abzugewöhnen.
 
Zurück
Oben