"Wurzel ziehen" in C++

J

jänz

Aktives Mitglied
Thread Starter
Dabei seit
06.06.2006
Beiträge
420
Reaktionspunkte
2
Guten Abend,

ich mache grade meine ersten Schritte in C++. Also bitte seit gnädig mit mir :D

Ich möchte in mein kleines Testprogramm eine Wurzelfunktion einbinden. Ich habe auch schon gegoogelt und bin auf die Library "<math.h>" gestoßen. Mit der soll es dann ja möglich sein die Wurzel zu ziehen. Jedenfalls funktioniert das bei noch nicht so richtig. Ich weiß grad nicht woran es liegt. Ich hab die Datei math.h in den Ordner Source eingefügt. Ist damit diese Library dem Programm zugeordnet?

So sieht mein Programm aus:

#include <iostream> /* Einbinden von iostream */
#include <math.h>


using namespace std; // std als Standard-Namensbereich definiert

//Hauptfunktion

int main()
{
int a,b,c,d,e;
int sqrt();

cout << "Geben Sie einen Abstand für Sensor A ein ";
cin >> a;
cout << "Geben Sie einen Abstand für Sensor B ein ";
cin >> b;
c=a-b;
d=4+(c*c);
e= sqrt( d );
cout << e << endl;
}

Bitte helft mir :)

Gruß
Jens
 
sqrt(); ist ein Funktionsaufruf. Keine Variable.
Oben die Deklaration von "int sqrt();" ist somit schonmal Unsinn.

Der Aufruf von sqrt(); ansich ist aber okay und müsste auch funktionieren wenn du die Deklaration von oben entfernt hast

Achja, wenn du eine IDE (z.b. XCode) benutzt, muss du externe Header wie math.h garnicht in dein Projektverzeichnis kopieren.
Binde einfach math.h ein (genau so wie du es schon getan hast), dann sucht der Compiler die Bibliothek in den von der IDE (z.b. XCode) zugewiesenen Verzeichnissen für Bibliotheken.
 
Vielen Dank Rupp,

ursprünglich hatte ich das "int sqrt()" auch gar nicht drin, nur ohne hatte es nicht funktioniert. Jedenfalls funktioniert es jetzt, nachdem ich math.h in die richtige Bibliothek von xcode kopiert habe. Danke für den Tipp :)
 
Hallo

Du kannst auch die Zahl hoch 1/2 rechnen, also z.B. 10^0,5

Vielleicht hilf dir das weiter. War bei Visual Basic einfacher als der Wurzelbefehl.

gruß Bombard
 
Stimmt, so hätte ich das Problem auch umgehen können. Das mir das nicht eingefallen ist :confused: War der Mathe-LK wohl umsonst :rolleyes:

Naja, jetzt muss ich mich mal ein bisschen weiter einarbeiten, weil ich immoment nur ganze Zahlen rausbekomme beim Wurzelziehen...
 
Wenn Du Dein Ergebnis - also e - auf int castest, ist das mit den ganzen Zahlen auch kein Wunder.... nimm float oder double, dann klappt es auch.

Mein c++ ist wat länger her, kann sein, dass Du die Eingabe auch noch als float oder double nehmen musst.
 
Zuletzt bearbeitet:
Ihr seit immer so schnell :D So schnell hab ich gar nicht die Seiten in meinem "c++ Buch" umgeblättert, um herauszufinden, was ich für einen Datentyp verwenden muss. Mit float klappt es jetzt auch :)
 
Ich sag mir auch immer: Kaum macht man es richtig schon klappt es. Ein Teufelskreis :-D
 
AAAHH Wer empfielt da bitte Float???

Gleitkomma sind inherent fehlerbehaftet. Float hat nur 32Bit, signed bleiben damit nur 16 Bit für positive, 15Bit für negative Zahlen. Schon die erste Operation hat somit eine hohe Ungenauigkeit. Wenn Gleitkomma, dann bitte *IMMER* Double!
 
So, ich hab das Programm noch ein bissl erweitert. Funktioniert auch alles super. Jetzt habe ich schon dafür gesorgt, dass bei einer falschen Eingabe(falsche zahl) das das Programm reagiert. Wenn ich jedoch einen Buchstaben eingebe stürzt das programm ab. Wie kann ich das ändern? Ich bin dankbar für jeden Tipp, wenn ich das Programm grundsätzlich "falsch" aufegbaut habe, dann kann ich diese Fehler driekt am Anfang ausmerzen :)

Hier der Code:


#include <iostream>
#include <math.h>
#include <iomanip>


using namespace std; // std als Standard-Namensbereich definiert
double a,b,c,d; //Globale Variabeln
void Streckenberechnung_a (void); //Festlegung der Prototypen
void Streckenberechnung_b (void); //Festlegung der Prototypen
void Geschwindigkeitsberechnung (void); //Festlegung der Prototypen

int main() //Hauptfunktion
{
Streckenberechnung_a();
}

void Streckenberechnung_a (void) //Funktion Streckenberechnung A
{
cout << "Geben Sie einen Abstand für Sensor A ein: ";
cin >> a;
if((a<=300) && (a>=80))
{
Streckenberechnung_b(); //Übergang zur Funktion "Streckenführung_b"
}
else
{
cout << "Der Wert muss zwischen 80 und 300mm liegen" <<endl;
Streckenberechnung_a(); //Restarten der Funktion
}
}

void Streckenberechnung_b (void) //Funktion Streckenberechnung B
{
cout << "Geben Sie einen Abstand für Sensor B ein: ";
cin >> b;
if((b>=80) && (b<=300))
{
c=a-b;
c=400+(c*c);
c=sqrt( c );
cout << "Die zurückgelegte Strecke beträgt:" <<setw(10) << c << " mm" << endl;
Geschwindigkeitsberechnung(); //Übergang zur Funktion "Geschwindigkeitsberechnung"
}
else
{
cout << "Der Wert muss zwischen 80 und 300mm liegen" <<endl;
Streckenberechnung_b(); //Restarten der Funktion
}
}
void Geschwindigkeitsberechnung (void) //Funktion Geschwindigkeitsberechnung
{
cout << "Geben Sie den zeitlichen Abstand zwischen beiden Messungen in ms ein: ";
cin >> d;
if(d>0)
{
d=d*0.001; // Umwandlung der Zeit in s
d=1/d;
c=c*0.001; // Umwandlung der Strecke in m
c=d*c; // Berechnung der Geschwindigkeit in m/sec
c=c*3.6; // Umwandlung in km/h
cout<< "Die Geschwindigkeit des Balles beträgt:" <<setw(10) << c << " km/h" << endl;
Streckenberechnung_a(); //Übergang zur Funktion "Streckenführung_a" bzw. Neustart des Programms
}
else
{
cout << "Bitte geben Sie eine Zahl >0 ein" << endl;
Geschwindigkeitsberechnung(); //Restarten der Funktion
}
}
 
Du weißt aber, dass du gerade C mit der Syntax von C++ programmierst?
 
Naja, im Moment ist das alles sehr prozedural. Wenn du wirklich gerade erst programmieren ansich lernst, ist das ok. Schau dir aber trotzdem mal Klassen an (Allgemein für alle Objektorientierten Programmiersprachen und *danach* speziell für C++).
 
Hi,

bitte nicht math.h includen, sondern wenn Du C++ benutzt:

Code:
#include <cmath>
sowie
Code:
#include <cstdlib>

Alle C-Standardfunktionen sind dann in den Namensraum std gewandert (in Deinem Falle std::sqrt) und bringen Überladungen für die gebräuchlichsten eingebauten Datentypen mit. Last but not least schreibt der ISO C++ Standard das vor :)
Auch solltest Du Dich unbedingt mit der STL vertraut machen, hier lernst Du, was schönes und gutes C++ ist.
Hier noch ein meiner Meinung nach sehr gutes Buch zur STL:

[ISBN]0201379260[/ISBN]

Beste Grüße, SMJ
 
Zuletzt bearbeitet:
Zurück
Oben Unten