kostenloser Webspace werbefrei: lima-city


C++ Rechner - Hochrechnen?

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    robbmaster

    Kostenloser Webspace von robbmaster

    robbmaster hat kostenlosen Webspace.

    Hey.

    Ich bin gerade an der Entwicklung eines Taschenrechners mit C++. In seiner Beta Version v0.0.1 kann er jetzt alle 4 Rechenarten (Addition, Subtraktion, Multiplikation, Division). In der nächsten Version möchte ich jetzt Hochrechnung und die Anzeige der ersten Zahlen von Pi machen. Pi ist nicht schwer, man kann die "cin" Befehle eifnach weglassen und Pi ausgeben, sobald man auf die 5 drückt ("case").

    Aber wie realisiere ich Hochrehnungen. Ich möchte, das man erst den Wert eingibt, und dann die Zahl wie oft es hochgerechnet werden soll. Die Funktion ^ scheint ja in C++ nicht ohne weiteres zu funktionieren.

    Als Beispiel: Das hie rist die Multiplikation:

    case 3:
            cout<<"Bitte geben Sie Wert1 ein.\n";
            cin >> b;
            cout<<"\nBitte geben Sie Wert2 ein.\n";
            cin >> c;
            cout<<"Ergebnis:"<<b*c<<"\n\n";
            cout<<"Moechten Sie noch etwas berechnen?(1=Ja, 2=Nein)\n\n\n";
            cin >> d;
            break;


    Nur Was ist der Code für Hochrechnungen?

  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Irgendwo in der math.h soll es eine Funktion namens pow() geben -- die müsste auch mit c-- funktionieren:

    http://www.cpp-entwicklung.de/cpplinux/cpp_main/node5.html

    ^ ist übrigens der XOR-Operator, hab ich mir sagen lassen. ;-)


    Beitrag geändert: 11.12.2008 21:42:54 von alopex
  4. Wenn dus dir einfach machen willst, dann ists die Math.h pow() funktion.
    Alternativ kannste es auch selbst machen...bloß ist das kein so einfaches unterfangen, insbeondere wenn der exponent nicht nur positiv und ganzzahlig sondern auch negativ und reel sein darf.


    Das ^ funktioniert logischerweise nicht:
    ^ ist ein binärer Operator
    Und zwar das explizite oder, oder auch als entweder...oder bekannt :D
    Also:
    10110101 ^
    10010010
    ________
    00100111


    Beitrag geändert: 11.12.2008 21:50:05 von nikic
  5. Autor dieses Themas

    robbmaster

    Kostenloser Webspace von robbmaster

    robbmaster hat kostenlosen Webspace.

    Hey. Danke. Nebenbei habe ich jetzt eine Möglichkeit für Pi gefunden. Aber: In der Erklärung steht, das man sie halt selbst programmieren sollte. In etwa so:

    double my_power(double x, int n)
    
    {
    
      if (n<0) {
    
        if (x) return 1.0/my_power(x, -n);
    
        else   return 0.0;  // Fehlerfall!
    
      }
    
     
    
      switch(n) {
    
        case 0: return 1.0; 
    
        case 1: return x; 
    
        case 2: return x*x; 
    
        case 3: return x*x*x;
    
        default: return x*my_power(x, n-1);
    
      }
    
    }


    Steht da. Nur das kleine Problem daran ist, das case 0, 1, 2 und 3 schon belegt sind, und da dann in diesem Befehl einiges fehlt. Oder versteh ich das was falsch? Sorry ich beginne gerade mit C++.

    Mehr als #include <iostream>, cin, cout, case, break und return, default und noch einige hab ich nicht viel. ^^
  6. c*****s

    Steht da. Nur das kleine Problem daran ist, das case 0, 1, 2 und 3 schon belegt sind, und da dann in diesem Befehl einiges fehlt. Oder versteh ich das was falsch? Sorry ich beginne gerade mit C++.
    Also die Funktion ist für alle ganzen, positiven Exponenten ja schon definiert...

    Es ist hier über Rekursion gelöst worden.

    es gilt:
    x^n = x*(x^(n-1))

    d. h. wenn wir pow(x,n) = x^n setzen:

    pow(x,n) = x*pow(x,n-1)

    der Rechner ruft daher so lange die Funktion pow(x,n) auf, bis er irgendwann einen Rückgabewert bekommt, was bei n=3 der Fall ist. Danach hangelt er sich den ganzen Weg wieder zurück.

    Beispiel:

    In pow(2, 5) wird pow(2, 4) verwendet => berechne pow(2, 4)
    In pow(2, 4) wird pow(2, 3) verwendet => berechne pow(2, 3)

    pow(2, 3) kann berechnet werden: 2*2*2 = 8

    Jetzt geht er den ganzen Weg zurück:
    pow(2, 4) = 2*8 = 16
    pow(2, 5) = 2*16 = 32

    Negative Exponenten sind auch noch machbar, einfach ein "if(n < 0) return 1/pow(x, -n);" einfügen.

    Damit wäre die Funktion vollständig definiert (denn n darf ja auch negativ sein).


    Beitrag geändert: 12.12.2008 23:59:32 von calexus


    Beitrag geändert: 15.12.2008 22:11:20 von calexus
  7. Naja, ganz vollständig ist sie dann nicht definiert...
    ...zwar reicht es so für deine Zwecke sicher aus. Aber iegentlich müsste man noch den deutlich komplizierteren Fall von reelen Zahlen betrachten. Wurzeln will man ja auch ziehen :D
  8. c*****s

    Naja, ganz vollständig ist sie dann nicht definiert...
    schon klar, aber n ist ja als int deklariert.
    ...zwar reicht es so für deine Zwecke sicher aus. Aber iegentlich müsste man noch den deutlich komplizierteren Fall von reelen Zahlen betrachten. Wurzeln will man ja auch ziehen :D
    ja, geht wahrscheinlich über die Taylor-Reihe. Aber genau weiß ich da auch nicht bescheid...
  9. Autor dieses Themas

    robbmaster

    Kostenloser Webspace von robbmaster

    robbmaster hat kostenlosen Webspace.

    Es müsste aber für meine Zwecke ausreichnen. Ist ja nur ein kleiner Rechner^^. Zum Üben,

    Aber wie muss ich die Pi Funtkion in der math.h verstehen? Weil ich würd gern mal verstehen wie Pi in so einem Fall errechnet wird und nicht nur ausgegeben.

    Edit:

    @calexus:

    Also der vollständige Funktionsname ist jetzt?

    int pow(x,n) = x*pow(x,n-1)?
    {
    if(x < 0) return 1/pow(x)
    else
    return x,n;
    }

    oder hab ich was nicht gecheckt?

    Beitrag geändert: 14.12.2008 14:41:00 von robbmaster
  10. Autor dieses Themas

    robbmaster

    Kostenloser Webspace von robbmaster

    robbmaster hat kostenlosen Webspace.

    Sorry. Aber kann ma jemand antworten :[ Please. ^^ Achja noch ne Frage.

    Also der Befehl:

    case 4
    {
    BEFEHL
    }

    Gibt ja den Befehl aus, sobald man 4 eingibt.

    Aber

    case "version" & version

    funktioniert nicht.

    Welcher Befehl ist das denn?
  11. c*****s

    Aber wie muss ich die Pi Funtkion in der math.h verstehen?
    Gibt es eine Funktion Pi in der math.h? Das wäre mir neu, ich kenne Pi bloß als Konstante definiert. Hast du Quellcode?
    Weil ich würd gern mal verstehen wie Pi in so einem Fall errechnet wird und nicht nur ausgegeben.
    Es gibt so viele Methoden Pi zu berechnen, z. B. durch 2*arcsin(1) (und arcsin(x) über die Reihenentwicklung) einfach mal googlen.
    Also der vollständige Funktionsname ist jetzt?
    Sorry, mit 1/pow(x) hab ich was falsch gebracht. x ist die Basis, n der Exponent.
    Das wär mein Vorschlag:
    double my_power(double x, int n)
    
    {
    
      if (n<0) {
       return(1/my_power(x, -n));
      }
    
     
    
      switch(n) {
    
        case 0: return 1.0; 
    
        case 1: return x; 
    
        case 2: return x*x; 
    
        case 3: return x*x*x;
    
        default: return x*my_power(x, n-1);
    
      }
    
    }


    case 4
    {
    BEFEHL
    }

    Gibt ja den Befehl aus, sobald man 4 eingibt.

    case "version" & version

    funktioniert nicht.

    Welcher Befehl ist das denn?
    erläuter das nochmal genauer, ich verstehe nicht so ganz was du machen willst...
  12. das case "version" funktioniert nicht, wenn die ge-switch-te Variable ein char[] ist.
    Wenn du also char blablabla[] = "version" hast, dann ist blablabla eigentlich ein Poniter auf das erste Array-Element, was in diesem Fall ein Pointer auf das 'v' wäre. Das müsstest du also iwie anders realisieren.

  13. das case "version" funktioniert nicht, wenn die ge-switch-te Variable ein char[] ist.
    Wenn du also char blablabla[] = "version" hast, dann ist blablabla eigentlich ein Poniter auf das erste Array-Element, was in diesem Fall ein Pointer auf das 'v' wäre. Das müsstest du also iwie anders realisieren.



    mit strcmp() z.B.
  14. Autor dieses Themas

    robbmaster

    Kostenloser Webspace von robbmaster

    robbmaster hat kostenlosen Webspace.



    das case "version" funktioniert nicht, wenn die ge-switch-te Variable ein char[] ist.
    Wenn du also char blablabla[] = "version" hast, dann ist blablabla eigentlich ein Poniter auf das erste Array-Element, was in diesem Fall ein Pointer auf das 'v' wäre. Das müsstest du also iwie anders realisieren.



    mit strcmp() z.B.


    Kannst du das mal genauer erklären mit strcmp?

    EDIT:

    @Calexus: Scheint zwar beim Einbinden zu funktionieren, nur hab ich Problem wenn ich dann als Ergebniss die Variable n anzeigen lassen will, meckert mein Decompiler das n keinen Wert hat...

    Beitrag geändert: 16.12.2008 20:35:23 von robbmaster
  15. c*****s

    @Calexus: Scheint zwar beim Einbinden zu funktionieren, nur hab ich Problem wenn ich dann als Ergebniss die Variable n anzeigen lassen will, meckert mein Decompiler das n keinen Wert hat...
    Du meinst wohl dein Compiler?

    Die Variable n ist nur innerhalb der Funktion definiert, das Ergebnis ist der Rückgabewert der Funktion my_power.
    double ergebnis = my_power(x,n);
    cout << ergebnis;
    sollte funktionieren.
  16. Autor dieses Themas

    robbmaster

    Kostenloser Webspace von robbmaster

    robbmaster hat kostenlosen Webspace.

    Ahh. Danke. Ich denke es hat funktioniert. Jetzt mus sich nur noch gucken wie ich das mit dem anderen BEfehl hinkriege. Naja, du wollest ja mal wissen wie ich das meine.

    Also.

    Bei
    case 4
    {
    BEFEHL
    }


    Wird der Befehl ja bei eintippen der Zahl 4 und der Bestätigung mit Enter ausgeführt.

    Sowas möchte ich auch machen, allerdings nicht mit einer Zahl sondern einem Wort, da ich beim Eintippen von version sozusagen die Verionsinfos anzeigen möchte.

    Nur.
    case version // oder auch "version"
    {
    BEFEHL
    }


    funktioert nicht ja nicht.
  17. c*****s

    Also, case funktioniert da gar nicht mehr, da man Strings verleichen muss.

    Folgender Code würde funktionieren:
    char eingabe[10];
        cin >> eingabe;
        if(strcmp(eingabe, "version") == 0){
        cout << "Die Version ist 0.1" ;}


    Das Problem ist an dieser Lösung, dass es zu einem Pufferüberlauf kommen kann, wenn der Benutzer mehr als 10 Zeichen eingibt.
  18. Wie schon oben gesagt, kann man mit switch keine strings vergleichen, denn mit switch kann man nur char oder int übergeben.

    also

    string i = "hallo";
    switch(i)
    {
    case "Hallo":
    ...
    break;
    case "hallo":
    ....
    }

    funktioniert nicht.
    Du musst dir also eine andere Lösung einfallen lassen, wie zum beispiel nur ein Buchstabe übergeben (v anstatt version) oder du unterscheidest von nun an mithilfe von if
  19. Autor dieses Themas

    robbmaster

    Kostenloser Webspace von robbmaster

    robbmaster hat kostenlosen Webspace.

    So leider funktioniert keines der beiden richtig. Naja. Ich schicke dir mal eine PN calexus, da ich den Quellcode hie rnicht veröffentlich will und ich ihn dir einfach mal per PN schicke.

    Nebenbei würde mich mal interessieren wie ich ein Symbol und einen Titel in ein C++ Programm kriege.
  20. chakra-design

    chakra-design hat kostenlosen Webspace.

    ich würde das ganze simpel mit ner for-schleife lösen:

    [code
    ]for (int i=1; i!=hoch; i++)
    {
    zahl=zahl*zahl;
    }
    cout<<zahl;
    [/code]
  21. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!