kleine übung => kleines prob



  • also leudz...
    ich muss euch erstma danken...ich hab motivation zu coden! 😃 😉
    so und nu zu meinem prob:
    hab n kleines progg geschrieben, wo ne mathe function (kleiner popliger rechner) vorhanden ist...

    wenn ich nun eine aufgabe hab:

    2+2 => 2 operanten
    2+2+2 => 3 operanten (ja ne is klaa 😃 )

    nu will ich aber dass man vorher gefragt wird wie viele operanten man haben will...
    auch kein ding:
    einefach ne while schleife die solange geht, wie es vorher inna var gespeichert wird, die operanten dabei innem array gespeichert, welches die position innerhalb der schleife pro durchlauf inkementiert:

    int mch;
    	int nu;
    	int i = 1;
    	int var[10];
    	cout << "Please select your mathmatical Operation: \n
    		1 - Addition\n
    		2 - Subtraction\n
    		3 - Multiplication\n
    		4 - Division" << endl;
    	cin >> mch;
    	cout << "Please select your number of operants" << endl;
    	cin >> nu;
    	while (i < nu) {
    		cout << "Operand " << i << ": " << endl;
    		cin >> var[x];
    		x++;
    		i++;
    

    das is der code....nun meine farge(n)

    1. wenn der operant nun 2 stellen hat (22 zum beispiel),
    weiss das programm doch im nachhinein nich, dass es EIN operant mit dem wert 22 ist, anstelle 2 operanten je mit dem wert 2...

    2. kann man das auch ohne array lösen?

    THX in advance 😉



  • 1. operator>> liest solange weiter, bis er etwas nicht als Ziffer interpretieren kann, d.h. "22" ist ein Operand mit Wert 22, "2 2" wären zwei Operanden je mit Wert 2.

    2. Du könntest die eingegebenen Werte direkt aufsummieren, wie sie kommen, anstatt sie erstmal zwischenzuspeichern.



  • zu 1. => lol, is mir auch grad eingefallen, dass pro bereich im array nich nur eine ziffer möglich is!

    zu 2. => es wurde vorher ja ne rechnoperation ausgewählt,
    sodass es sich nich sofort summiert...
    allerdings...gib ma n beispiel wie das funzen sollte 😃



  • Dann mußt du halt per switch() auswählen, wie du "summieren" willst:

    while(i<n)
    {
      cin>>val;
      switch(mch)
      {
      case 1: res+=val;break;
      case 2: res-=val;break;
      case 3: res*=val;break;
      case 4: res/=val;break;
      }
    }
    

    (allerdings mußt du den Startwert für res noch je nach Operation einsetzen)

    PS: Und eventuell solltest du auf double's statt auf int rechnen.



  • hmmm...k...danke auch 😃
    aja...ich hab da so n doofen err0r beim compilen:

    "d:\Pr0gg3n\rechner\rechner.cpp(52): fatal error C1075: Dateiende erreicht, bevor das zugehörige Element für das linke Element Klammer '{' in 'rechner.cpp(3)' gefunden wurde"
    

    ne function muss doch nich zwingend n rückgabewert haben oder?
    is doch fehler diesbezüglich? o_O

    joooar...
    achja... CStoll:

    case 1: res+=val;break;
    

    case is klar...und... "res" denk ich ma is so ne art forlaufende var oder?
    is die vom system schon vordefiniert oder wie funzt die?



  • Chaoz schrieb:

    hmmm...k...danke auch 😃
    aja...ich hab da so n doofen err0r beim compilen:

    "d:\Pr0gg3n\rechner\rechner.cpp(52): fatal error C1075: Dateiende erreicht, bevor das zugehörige Element für das linke Element Klammer '{' in 'rechner.cpp(3)' gefunden wurde"
    

    ne function muss doch nich zwingend n rückgabewert haben oder?
    is doch fehler diesbezüglich? o_O

    Wenn du den Rückgabetyp als "void" angibst, benötigst du kein return.

    (aber der Fehler sieht eher so aus, als ob du irgendeine } Klammer vergessen hast)

    achja... CStoll:

    case 1: res+=val;break;
    

    case is klar...und... "res" denk ich ma is so ne art forlaufende var oder?
    is die vom system schon vordefiniert oder wie funzt die?

    res ist eine Variable, in der die Zwischenwerte der Berechnung landen sollen - die mußt du schon selber deklarieren (anstelle deines Werte-Arrays).



  • res wie result und val wie value 🙂



  • res ist eine Variable, in der die Zwischenwerte der Berechnung landen sollen - die mußt du schon selber deklarieren (anstelle deines Werte-Arrays).

    als müsst ich vorher eben nur "int res" (wobei res variabel is oO???)
    und dann eben nur die case anweisung und der addiert die einfach auf?
    oder was?



  • chaoz hast du schon mal von der klasse "vector" gehört? falls nein kann ich dir das mal erklären. damit dürfte dein problem gelöst sein.



  • hier ein kleiner ansatz mit aufteilung des ganzen in funktionen:

    #include <iostream>
    using namespace std;
    
    int operation(int nmal, int(*berechne)(int, int), int startwert)
    {
        int ergebnis = startwert;
        int aktuell;
        for(int i = 0; i < nmal; ++i)
        {
            cout << "Operand " << (i+1) << ": " << endl;
            cin >> aktuell;
            ergebnis = berechne(ergebnis, aktuell);
        }
        return ergebnis;
    }
    
    //Operationen
    
    inline int multipliziere(int a, int b) { return a*b; }
    inline int multiplikation(int nmal) { return operation(nmal, multipliziere, 1); }
    
    //noch mehr Operationen selber machen!!!
    
    int main()
    {
        int operationsnr, ergebnis, anzahl=0;
    
        cout << "Please select your mathmatical Operation: \n" <<
            "1 - Addition\n" <<
            "2 - Subtraction\n" <<
            "3 - Multiplication\n" <<
            "4 - Division" << endl;
        cin >> operationsnr;
    
        cout << "Please select your number of operants" << endl;
        cin >> anzahl;
    
        if(anzahl>0)
        {
            switch(operationsnr)
            {
                case 3:
                ergebnis = multiplikation(anzahl);
                cout << "Das Ergebnis der Multiplikation lautet: " << ergebnis << endl;
                break;
    
                default:
                cerr << "Fehler: Operation nicht implementiert!" << endl;
                break;
            }
        }
    }
    


  • warum kompliziert wenn´s auch einfach geht?

    // ich habe es, um zu erklären nur mit Addition gemacht!
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
        vector<int> v_operand;
        int zahl, wert, summe=0;
    
        cout << "Addieren von Zahlen: \nWieviele Operanden wollen sie verwenden?";
        cin >> zahl;
        cout << "Geben Sie nun die zu addierenden Werte ein:\n";
    
        //Werte einlesen
        for(int i=1; i<=zahl; i++)
        {
                cout << i << ".Wert: ";
                cin >> wert;
                v_operand.push_back(wert);
        }
        //Werte zusammenzählen
        for(int i=0; i<v_operand.size(); i++)
        {
                summe = summe + v_operand[i];
        }
        cout << "Das Ergebnis beträgt: " << summe;
    
        system("PAUSE");
        return 0;
    }
    


  • @ schorsch code:
    k, n1....bloß ich versteh das echt voll nich sry 😉
    @ XatriXX:
    nette sache, bloß nu musst mir noch irgendwie erklären was:

    v_operand.push_back(wert);
    v_operand.size();

    ist...so... 😃

    (danke nochma dass ihr euch so ne mühe macht,
    endlich ma ne kompetente community 😃 )



  • @schorch: Warum selber schreiben, wenn man die STL nutzen kann? Hast du schonmal etwas von "accumulate()" gehört?

    @Chaoz: Ich empfehle dir einen Blick ins Magazin (recht weit unten im Forum) - dort steht seit letzter Woche der erste Teil meiner STL-Serie.



  • @CStoll: Schon, aber bei accumulate muss man die Operanden vorher in einem Container zwischenspeichern, oder? Ich meine wozu einen LKW nehmen, wenn man etwas mit einem Fahrrad transportieren kann? Außerdem lernt man manchmal beim Selbermachen grundlegende Dinge, die vllt. nicht nur beim Verstehen von fremdem Code, wie der STL, helfen, sondern gerade durch den Prozess des Selberschreibens evtl. auch bestimmte Muster besser vermitteln.



  • Nein, mußt du nicht. Du kannst auch direkt aus der Eingabe heraus akkumulieren:

    accumulate(istream_iterator<int>(cin),istream_iterator<int>(),0);
    

    (das bricht ab, sobald du etwas nicht-numerisches eingibst)



  • Super! Das ist natürlich praktisch. Jetzt müsste man nur noch nach jeder Eingabe eines Operanden eine Ausgabe machen können, die, so wie Chaoz es wollte, besagt welcher Operand eingegeben werden soll. Aber das geht ja auch, indem man cout dekoriert (siehe Dekorierer). Ich glaube jedoch, all das ist für Anfänger noch verwirrender, als das bißchen erstmal selber zu schreiben.



  • ich schrieb:

    indem man cout dekoriert

    Ich meine natürlich, indem man cin dekoriert.



  • ganz einfach chaoz:

    v_operand.push_back(wert); //Wert anhängen: das was in der variable in der klammer  //                           steht wird an den vector
                               //v_operand angehängt.
    
    v_operand.size()           //die Länge des Vektors -> wieviele Werte sind
                               //enthalten.
    
                               //z.B. in einem vector befinden sich 5 werte: 
    cout << v_operand.size(); 
                               /*bildschirmausgabe: 5 (kann wie eine normale Zahl                      //behandelt werden.)*/
    


  • schorsch code schrieb:

    Super! Das ist natürlich praktisch. Jetzt müsste man nur noch nach jeder Eingabe eines Operanden eine Ausgabe machen können, die, so wie Chaoz es wollte, besagt welcher Operand eingegeben werden soll. Aber das geht ja auch, indem man cout dekoriert (siehe Dekorierer).

    Du kannst accumulate() als vierten Parameter auch die Funktion übergeben, mit der es seine Werte aufsummieren soll (und die Grundrechenarten erreichst du mit plus<int>, minus<int>, multiplies<int> und divides<int>).


Log in to reply