sqrt() und pow() könne nicht compiliert werden
-
Tach alle zusammen,
Ich lerne nun seit 2 einhalb wochen c++ und dachte ich programmier mal nen Taschenrechner. plus minus mal geteilt war auch kein problem aber gestern wollte ich sqrt() und pow() einbauen:
#include <math.h> #include "stdafx.h" #include <iostream> using namespace std; int main() { float a; float b; int c; char d; cout << "<----Taschenrechner Version 1.02---->" <<endl; Auswahl:; cout << "Addition = 1, Subtraktion = 2, Multiplikation = 3, Division = 4, Quadrieren = 5, Potenzieren = 6"<<endl; cin >> c; if (c == 5) { double a; double b; cout << "Bitte geben sie die zu quadrierende Zahl ein" <<endl; cin >> a; b = sqrt(a); cout << "Quadratzahl von " << a << " = " << b <<endl; goto Auswahl2; } if (c==6) { double a; double b; double c; cout << "Bitte geben sie die zu potenzierende Zahl ein "<<endl; cin >> a; cout << "Bitte geben sie die Potenz ein "<<endl; cin >> b; c = pow(a, b); cout << "Ergebnis: " << c <<endl; goto Auswahl2; }jedoch kommt beim compilieren die fehlermeldung:
1>------ Build started: Project: Taschenrechner, Configuration: Release Win32 ------ 1>Compiling... 1>Taschenrechner.cpp 1>.\Taschenrechner.cpp(28) : error C3861: 'sqrt': identifier not found 1>.\Taschenrechner.cpp(42) : error C3861: 'pow': identifier not found 1>.\Taschenrechner.cpp(86) : fatal error C1075: end of file found before the left brace '{' at '.\Taschenrechner.cpp(11)' was matchedIch hab schon gegoogelt und gesufut, habe aber nichts finden können. Kann mir jemand weiterhelfen?
-
Bind mal cmath statt math.h nach stdafx ein.
-
Fahrstuhlmusik schrieb:
Ich lerne nun seit 2 einhalb wochen c++...
Dann ersetz bitte deinen Lehrer, deine Tutorials oder deine Bücher. Und benutze bitte die C/C++ Tags für den Code...
#include "stdafx.h" // 0. Wenn du schon mit precompiled Headern arbeiten willst, müssen // diese soviel ich weiß das erste include sein. // (Hat aber nichts mit dem Standard zu tun, und ist Compilerabhängig). #include <cmath> // 1. Nicht <math.h> unter C++ #include <iostream> using namespace std; // Anmerkung: Bitte NIEMALS in Headern verwenden int main() { // 2. Sinnvolles Einrücken hilft auch, Fehler zu vermeiden float a; // 3. Sprechende Namen wären sinnvoll float b; // 4. Variablen sollte man dann deklarieren wann man sie braucht //... Auswahl:; // 5. NIEMALS Sprungmarken und goto verwenden. Dies ist sehr schlechter // Programmierstil und lässt sich immer besser lösen! // (Mittels Schleifen wie for/do while/while...) // ...cu André
-
1.)
using namespace std; // Anmerkung: Bitte NIEMALS in Headern verwendenok wo dann?
2.)benutzte visual c++ 2005 und da wurde
#include "stdafx.h"vorgegeben
3.)Ich lerne nach dem buch C++ primer 5th edition und da wurde gesagt, dass man immer double benutzen soll...
ok, das goto war jetzt nur ne schnelle notlösung (im buch wurde davor auch gewahrnt), werde es ändern
-
Fahrstuhlmusik schrieb:
1.)
using namespace std; // Anmerkung: Bitte NIEMALS in Headern verwendenok wo dann?
Nur in den Dateien mit dem Code (.c, .cpp etc.)
Die Aussage zu doubles ist Quatsch.
-
hmm, ich hab nur eine datei wo ich reinschreibe und das ist die aus der ich gepostet habe...
-
da ist es an sich ok
viele (vor allem fortgeschrittene) sagen dass es unschön oder so ist using namespace zu benutzen
aber das ist an sich jedem selbst überlassen...ich benutze in cpp eig immer die using namspace variante und in headern halt std:: ...
aber das soll dich in so einem frühen stadium eigendlich nicht jucken
-
Skym0sh0 schrieb:
viele (vor allem fortgeschrittene) sagen dass es unschön oder so ist using namespace zu benutzen
Es ist nicht per se unschön. Man man weiß, dass man mit Sicherheit keine Konflikte bekommen wird, ist es völlig in Ordnung. Generell sollte man es einfach so lokal wie möglich machen.
-
Fahrstuhlmusik schrieb:
1.)
using namespace std; // Anmerkung: Bitte NIEMALS in Headern verwendenok wo dann?[/quote]
Grundsätzlich, da du noch am Anfang des Buches zu sein scheinst:
Normalerweise trennt man Deklaration und Definition in zwei Dateien auf. Ersteres steht dann in dem Header (h/hpp...), letzteres im Source (cpp...).
Kleines Beispiel:
// A.h // Nachfolgend siehst du "Includeguard", darüber wirst du noch stolpern #ifndef A_HEADER #define A_HEADER #include <string> // Hier bitte kein using namespace class A { public: static void ausgeben( std::string const & text); }; #endif// A.cpp #include "A.h" #include <iostream> // Nach den includes im Source ist using namespace (meist) unproblematisch using namespace std; static void A::ausgeben( string const & text) { cout << text; }// main.cpp #include "A.h" int main() { A::ausgeben("Hallo Welt"); }Der Hintergrund ist der, das du sonst den Namensraum global sichtbar machst, und damit das Konzept der Namensräume unterläufst. Dadurch sind unnötige Namenskonflikte früher oder später kaum mehr auszuschließen.
Fahrstuhlmusik schrieb:
2.)benutzte visual c++ 2005 und da wurde
#include "stdafx.h"vorgegeben
Ganz davon abgesehen das ich an deiner Stelle auf den 2008er wechseln würde...
Leg mal bitte ein neues Konsolenprojekt (Win32 Console Application) an, und wähle dort "empty project" aus. Mit Sicherheit wird dann kein "stdafx.h" verwendet...Fahrstuhlmusik schrieb:
3.)Ich lerne nach dem buch C++ primer 5th edition und da wurde gesagt, dass man immer double benutzen soll...
Das glaube ich nicht, nenn mir bitte mal die Stelle im Buch.
Fahrstuhlmusik schrieb:
ok, das goto war jetzt nur ne schnelle notlösung (im buch wurde davor auch gewahrnt), werde es ändern
Warnungen sollte man immer beachten

cu André
-
Fahrstuhlmusik schrieb:
[cpp]
{
double a;
double b;
cout << "Bitte geben sie die zu quadrierende Zahl ein" <<endl;
cin >> a;
b = sqrt(a);
cout << "Quadratzahl von " << a << " = " << b <<endl;
}[/code]noch ne kleine Anmerkung, die jetzt eher fachlicher Natur ist (also nichts mit der Programmierung an sich zu tun hat):
"sqrt" ist die Abkürzung für square root, also Quadratwurzel. Du behandelst es aber so als würdest du damit quadrieren...
-
ok danke compilieren hat jetzt geklappt.
1.) ist die 2008er version nicht kostenpflichtig? Ausserdem habe ich die 2005 aus nem FAQ aus diesem forum...
2.) im buch auf den seiten 52-54 wird pow() und sqrt() recht ausfürhlich behndelt, und es wurde immer double genommen...
3.) Bis ich zu includeguard komme benutze ich using namespace noch in der source-datei, dein beispiel ist mir ein bisschen kompiliziert...
-
Fahrstuhlmusik schrieb:
1.) ist die 2008er version nicht kostenpflichtig? Ausserdem habe ich die 2005 aus nem FAQ aus diesem forum...
Die 2008er Express Version ist frei erhältlich. Allerdings ohne MFC, die waren meines Wissens in der 2005er noch dabei.
2.) im buch auf den seiten 52-54 wird pow() und sqrt() recht ausführlich behndelt, und es wurde immer double genommen...
viele Funktionen sind für float und double überladen. Es geht also beides.
3.) Bis ich zu includeguard komme benutze ich using namespace noch in der source-datei, dein beispiel ist mir ein bisschen kompiliziert...
in der Source-Datei ists auch nicht weiter schlimm, vorausgesetzt es steht erst NACH allen #includes. Und so kompliziert ist das Beispiel wirklich nicht, wenn man sich mal kurz mit beschäftigt

-
was ist ien MFC?

in der Source-Datei ists auch nicht weiter schlimm, vorausgesetzt es steht erst NACH allen #includes. Und so kompliziert ist das Beispiel wirklich nicht, wenn man sich mal kurz mit beschäftigt
ich guck mal
-
Fahrstuhlmusik schrieb:
was ist ien MFC?

Microsoft Foundation Classes, aber die wirst du wahrscheinlich nicht gerade brauchen...
-
wenn du deinen Rechner mal fertig hast kannst du ihn mir ja mal zeigen
würde mich interessieren da ich persönlich momentan genau so einen Rechner auch Programmieren tu 
bzw hoffentlich bis Weihnachten fertig bin

gruß
-
Naja die grundfunktion (+,-,*,/), wurzeln ziehen und potenzieren kann er, jedoch ist der code etwas unordentlich und es sind immer noch goto's vorhanden (im buch stand noch nicht wie ich auf andere teile des programms verweise ohne goto zu benutzen). Ich hoffe das ich bis weihnachten an dem kapitel angelangt bin, dann kann ich dir den code mal schicken.
-
Um gotos zu entfernen sind if und while sehr nützlich.

-
aber wie kann man mit if oder while vom programmende an den programmanfang verweisen? Gibts da anweisungen die ich noch nicht kenne?
-
Fahrstuhlmusik schrieb:
aber wie kann man mit if oder while vom programmende an den programmanfang verweisen? Gibts da anweisungen die ich noch nicht kenne?
In der Regel springt man ja nicht wild im Programm hin und her, sondern es sollte eine klare Struktur zu erkennen sein. Wenn der Code zwischen "Programmanfang" und "Programmende" in irgendeiner Form mehrmals ausgeführt werden soll, dann wäre eine Schleife das Mittel der Wahl. Das kann eine while-Schleife sein, do/while, oder auch eine for-Schleife, je nachdem, was sich in dem Fall anbietet.
Ohne goto geht es jedenfalls immer, und es gibt sogar Programmiersprachen, die einen goto-Befehl gar nicht erst anbieten.
-
Du kannst doch Teile deines Codes in eine while-Schleife packen. Dann wird der Code solange wiederholt bis die Bedingung nicht mehr zutrifft. Das ist doch sowas wie ein zurückspringen an den Anfang. Z.Bsp. sowas:
int c; do { cout << "Addition = 1, Subtraktion = 2, Multiplikation = 3, Division = 4, Quadrieren = 5, Potenzieren = 6"<<endl; cin >> c; //hier dann dein Code am besten in einem swich } while(c>0 && c<7); //Weitermachen wenn die Eingabe gültig war
-
hm, ich hab jetzt folgendes geschrieben(code ist ein bisschen lang, aber wenn ich was wegnehme könnt ihr mir villeicht nicht mehr helfen, oder soll ich in als eine Datei anhängen?):
//überarbeitete Version des myfirstprog Taschenrechner // #include <iostream> #include <cmath> using namespace std; int main() { int Aktion; cout<<"Willkommen zur ueberarbeiteten Version des Taschenrechners aus dem Programm"<<endl; cout<<"myfirstprog."<<endl; cout<<"Diese Version soll mehr funktionen beinhalten, besser zu bedienen sein,"<<endl; cout<<"und der code soll lesbar werden(versprechen kann ich aber nichts)."<<endl; cout<<endl; cout<<"<----Taschenrechner Version 1.0---->"<<endl; cout<<"Was wollen sie machen?"<<endl; cout<<endl; cout<<"1=Addieren"<<endl; cout<<"2=Multiplizieren"<<endl; cout<<"3=Subtrahieren"<<endl; cout<<"4=Dividieren"<<endl; cout<<"5=Wurzel ziehen"<<endl; cout<<"6=Potenzieren"<<endl; cout<<endl; cout<<"Bitte waehlen sie ihre Aktion"<<endl; cout<<endl; cin >> Aktion; cout<<endl; //----Addieren if (Aktion==1) { cout<<endl; cout<<"Bitte geben sie eine Zahl ein"<<endl; cout<<endl; double Zahl1; cin >> Zahl1; cout<<"Bitte geben sie eine zweite Zahl ein"<<endl; cout<<endl; double Zahl2; cin >> Zahl2; cout<<"Ergebniss: "<<Zahl1+Zahl2<<endl; cout<<endl; } //----Multiplizieren if (Aktion==2) { cout<<endl; cout<<"Bitte geben sie eine Zahl ein"<<endl; cout<<endl; double Zahl1; cin >> Zahl1; cout<<"Bitte geben sie eine zweite Zahl ein"<<endl; cout<<endl; double Zahl2; cin >> Zahl2; cout<<"Ergebniss: "<<Zahl1*Zahl2<<endl; cout<<endl; } //----Subtrahieren if (Aktion==3) { cout<<endl; cout<<"Bitte geben sie eine Zahl ein"<<endl; cout<<endl; double Zahl1; cin >> Zahl1; cout<<"Bitte geben sie eine zweite Zahl ein"<<endl; cout<<endl; double Zahl2; cin >> Zahl2; cout<<"Ergebniss: "<<Zahl1-Zahl2<<endl; cout<<endl; } //----Dividieren if (Aktion==4) { cout<<endl; cout<<"Bitte geben sie eine Zahl ein"<<endl; cout<<endl; int Zahl1; cin >> Zahl1; cout<<"Bitte geben sie eine zweite Zahl ein"<<endl; cout<<endl; int Zahl2; cin >> Zahl2; cout<<"Ergebniss: "<<Zahl1/Zahl2<<" Rest: "<<Zahl1%Zahl2<<endl; cout<<endl; } //----Wurzelziehen if(Aktion==5) { cout<<endl; cout<<"Bitte Geben sie die zahl ein, aus der sie die Wurzel ziehen möchten"<<endl; cout<<endl; double Quadratzahl; cin >> Quadratzahl; cout<<endl; double Wurzel = sqrt(Quadratzahl); cout<<"Wurzel aus "<<Quadratzahl<<" ist "<<Wurzel<<endl; cout<<endl; } //----Potenzieren if(Aktion==6) { cout<<endl; cout<<"Bitte geben die zu potenzierende Zahl ein"<<endl; cout<<endl; double Zahl; cin >> Zahl; cout<<endl; cout<<"Geben sie die Potenz ein"<<endl; cout<<endl; double Potenz; cin>>Potenz; cout<<endl; double PZahl =pow(Zahl, Potenz); cout<<"Ergebnis: "<<PZahl<<endl; cout<<endl; } return 0; }Und nach jeder rechnung möchte ich wieder zur auswahl der Rechenmöglichkeiten kommen...
