sqrt() und pow() könne nicht compiliert werden



  • Fahrstuhlmusik schrieb:

    1.)

    using namespace std;  // Anmerkung: Bitte NIEMALS in Headern verwenden
    

    ok 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 verwenden
    

    ok 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... 😕



  • Versuch doch einmal die do/while-Schleife, die Braunstein gepostet hat, zu verstehen. Sowas ist schon genau das, was du in dem Fall brauchst.



  • hui habs geschafft, hab einfach

    do
    {
    cout<<"<----Taschenrechner Version 1.0---->"<<endl;
    cout<<"Was wollen sie machen?"<<endl;
    cout<<endl;
    ...
    ...
    ...
    ...
    }while (Aktion>0 && Aktion<7)
    return 0;
    }
    

    gemacht, also praktisch das ganze programm in eine do/while schleife gesetzt und jetzt funktioniert es perfekt^^ Danke an alle 👍



  • Schön. 🙂
    Jetzt solltest du dir mal was zu Funktionen durchlesen und anfangen deinen Code etwas zu strukturieren.


Anmelden zum Antworten