Taschenrechner

Arthuro
Guten Tag,

Hat einer von euch einen lauffähigen Taschenrechner in c++ ?! Der Additon,Subtraktion,Division und Multiplikation kann ?

Mfg Arthuro
daHooligan
hausaufgaben??

ansonsten empfehle ich:
Arthuro
ja.... hausaufgaben.... einmal mit einer do while schleife und einmal mit einer for schleife... Ja
Chico
sorry aber hast du keinen echten Taschenrechner?
is doch voll unnötig
daHooligan
*gröhl*

er muss als hausaufgabe nen taschenrechner programmieren, deswegen die frage.
Chico
und jetzt will er von uns die Lösung oder?
daHooligan
zumindest will er nen tipp wie sowas am beten geht, was man zu beachten hat etc.
aber wird wohl nix weil wir irgendwie zu wenig C-Progger haben
ThiefMaster
Ist eigentlich ganz einfach:
Du machst 4 Buttons und 2 Textfelder, wenn man die Buttons klickt werden die Inhalte der Textfelder in longs oder floats gecasted, addiert/o.ä. und das Ergebanis ausgegeben.

Oder soll er eine Eingabe wie "123 + 456 * 2" parsen und berechnen? Das wäre schon ein klein wenig schwieriger Augenzwinkern
daHooligan
gibts bei c/++ nicht auch ne art "eval();" wie in PHP??
weil dann müsste man ja nur stück für stück nen string aus den rechenanweisungen zusammensetzen und dann ausführen.
reepo2k
Console oder mit GUI?
ThiefMaster
Zitat:
Original von daHooligan
gibts bei c/++ nicht auch ne art "eval();" wie in PHP??
weil dann müsste man ja nur stück für stück nen string aus den rechenanweisungen zusammensetzen und dann ausführen.
Nein, das gibt es eigentlich bei keiner Sprache, die kompiliert wird...
daHooligan
sitmmt, ist eigentlich logisch. kann eigentlich auch nicht funktionieren. *koppfwiedermalgegendietischplatteschlag*
**sLy**
Hier mal ne Lösung in C Augenzwinkern

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
#include <stdio.h>

int main() {

int zahl1;
int zahl2;
int summe_add;
int summe_sub;
int summe_mul;
float summe_div;

printf("Type two numbers:\n");
scanf("%i %i", &zahl1, &zahl2);

summe_add = zahl1 + zahl2;
summe_sub = zahl1 - zahl2;
summe_mul = zahl1 * zahl2;
summe_div = (float) zahl1 / (float) zahl2;

printf("\n");
printf("Addition: %i\n", summe_add);
printf("Subtraktion: %i\n", summe_sub);
printf("Multiplikation: %i\n", summe_mul);
printf("Division: %f\n", summe_div);

getch();

}


edit seh grad C++ is gefordert... aber das kann ja dennoch ne hilfe sein Augenzwinkern
Arthuro
Guten Abend,

Hier habta einen Fertigen Taschenrechner ^^

Viel Spass

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
//---------------------------------------------------------------------------

#pragma hdrstop
#include <iostream>
#include <math.h>
#include <conio>

using namespace std;
//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
int eingabe;
long double zahl1,zahl2;
char i;

do {
clrscr();
cout << "\n\t<---------Taschenrechner----------->" << endl;
cout << "\n\t1.Addition" << endl;
cout << "\n\t2.Subtraktion" << endl;
cout << "\n\t3.Multiplikation" << endl;
cout << "\n\t4.Division" << endl;
cout << "\n\t5.Potenz" << endl;
cout << "\n\t6.Wurzel" << endl;
cout << "\n\t<----Copyright by Arthuro---->";
cout << endl;
cout << "\n\tEingabe: " ;
cin >> eingabe;

switch (eingabe)
{
case 1:
cout << "\n\tBitte geben Sie Zahl1 ein?";
cin >>  zahl1;
cout << endl;
cout << "\n\tBitte geben Sie Zahl2 ein?" << endl;
cin >>  zahl2;
cout << endl;
cout << "\n\t" "Addition: " << zahl1 << " + " << zahl2 << " = " << zahl1 + zahl2 << endl;
break;
case 2:
cout << "\n\tBitte geben Sie Zahl1 ein?" << endl;
cin >> zahl1;
cout << "\n\tBitte geben Sie Zahl2 ein?" << endl;
cin >> zahl2;
cout << "\n\t" "Subtraktion: " << zahl1 << " - " << zahl2 << " = " << zahl1 - zahl2 << endl;
break;
case 3:
cout << "\n\tBitte geben Sie Zahl1 ein?" << endl;
cin >> zahl1;
cout << "\n\tBitte geben Sie Zahl2 ein?" << endl;
cin >> zahl2;
cout << "\n\t" "Multiplikation: " << zahl1 << " * " << zahl2 << " = " << zahl1 * zahl2 << endl;
break;
case 4:
cout << "\n\tBitte geben Sie Zahl1 ein?" << endl;
cin >> zahl1;
cout << "\n\tBitte geben Sie Zahl2 ein?" << endl;
cin >> zahl2;
cout << "\n\t" "Division: " << zahl1 << " : " << zahl2 << " = " << zahl1 / zahl2 << endl;
break;
case 5:
cout << "\n\tBitte geben Sie eine Zahl ein?" << endl;
cin >> zahl1;
cout << "\n\t" << zahl1 << " zum quadrat ist = " << zahl1*zahl2 << endl;
break;
case 6:
cout << "\n\tBitte geben Sie eine Zahl ein?" << endl;
cin >> zahl1;
cout << "\n\tDie Wurzel von " << zahl1 <<  " = " << sqrt(zahl1) << endl;
break;
}
cout << endl;
cout << "\n\tWollen Sie nochmal Rechnen? (j/n)" << endl;
cout << "\n\tAntwort: ";
cin >> i;
} while (i == 'j');


cin.get(); cin.get();
        return 0;
}
//---------------------------------------------------------------------------
ThiefMaster
Schonmal was vom Einrücken gehört? Augenzwinkern
Manuelh87
@ThiefMaster:
würd nicht sagen dass es das nicht bei c++ geben kann... die erklärung ist nicht ganz schlüssig! Im Standart Packet ist sowas nicht dabei aber man kann serwohl so einen algo selber schreiben...

@Arthuro:
Wenn du schon willst dass hier deine gesamte Hausaufgabe gemacht wird dann solltest du zumindest ein wenig ganauer beschreiben was du haben möchtest!

Ich schätz mal es soll eine konsolenanwendung werden, oder?

Erwarte nicht von mir dass ich dir jetzt den ganzen code poste... ich gebe dir einen anstoß:
1. alles eingeben lassen, gesamte zeile lesen; Dann hast mal nen string der art "1+2"
2. den string parsen zahlen extrahieren und dann die operationen machen; fertiges ergebnis ausgeben...

mfg Manuel
p-Logic
Erstens is der Threat schon ne Weile alt.

Das mit dem _einfachen_ Taschenrechner ist eine beliebte Aufgabe für Anfänger (die dann natürlich noch Konsolenanwendungen machen) um die Grundlegenden Strukturen (if, switch, Abfragen, Ausgaben...) näher zu bringen.
Dabei werden drei (und nur drei) Eingaben erwartet: erste Zahl, zweite Zahl und Operator.

Was Thief gemeint hat, ist dass es keine Funktion eval wie in JavaScript oder PHP gibt, die eine Zeile Programmtext ausführt.
Man kann in einer Compilersprache keine solche Funktion coden, da der Programmcode schon vor dem Ausführen in Maschinencode umgewandelt wurde. Man müsste also eigentlich Maschienencode aus den Eingaben des Users erstellen, was so gut wie unmöglich ist.

In Interpreter Sprachen (PHP) wird dagegen so oder so alles interpretiert, da kann man auch mal einen frisch zusammengesetzten String als Anweisung auswerten.
(Hoffe, das war schlüssig)

Trotzdem stimme ich dir zu, dass eine Funktion zur mathematischen Auswertung einer Zeichenkette möglich ist.

(BTW: Was definierst du mit "Standart Packet"?)

Wobei das mit Klammern und dem ganzen Zeug (oder einfach "Punkt vor Strich") doch noch etwas komplizierter wird.
Mathematisch korrekt ist 1 + 2 * 3 = 7, wenn man alles nach einander parst, kommt 6 raus.
(Die parse-Funktion dafür müsste man so wie so selbst schreiben, compiler => kein eval etc.)

Ich habs mal geschaft ne parse Funktion mit allen Möglichen geklammere in pascal zu coden (das waren noch Zeiten...), hab dann aber die Source verloren und es seitdem nie wieder geschafft, hatte dann auch nicht mehr den elan dazu.
Hab dann irgendwie anstatt ner Zahl nen "Pointer" (gibts ja net in Pascal) auf einen zweiten String mit der Teilaufgabe z.B. 2*3 gesetzt und während des parsens immer zuerst die einzelnen Teilaufgaben gelöst bis ich irgendwann zum Ergebnis gekommen bin. (War ne ziemlich unsaubere Lösung...)


Ähm, außerdem hat er schon eine vollständige Lösung und ich glaube außerdem nicht, dass sein Info-Lehrer so geduldig ist...
Manuelh87
ja stimmt, hab nicht genau gelesen... eval gibt's nat. nicht... aber das mit dem parser ist ja keine so große sache.. muss man sich nur ne halbwegs gute struktur überlegen... an klammern hab ich noch nicht gedacht aber für den rest hab ich auch nen recht hübschen ansatz...

Naja, gut hast wahrscheinlich recht dass das nicht unbedingt ne anfängeraufgabe ist...

mfg Manuel
Manuelh87
[Will auch unbedingt mal code posten...]

enums und ne expression klasse...

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
enum type
{
  noop=0,
  number=1,
  add=2,
  sub=3,
  mul=4,
  div=5
};

class expression
{
public:
  expression(float num) : m_number(num), m_type(number) {}
  
  expression(char op) : m_number(0)
  {
    switch (op)
    {
      case '+':
        m_type=add;
        break;
      case '-':
        m_type=sub;
        break;
      case '*':
        m_type=mul;
        break;
      case '/':
        m_type=div;
        break;
      default:
        m_type=noop;
    }
  }
  
  expression(const expression& exp) : m_number(exp.m_number), m_type(exp.m_type) {}
  
  ~expression(void){}
  
  const type get_type(void) const
  {
    return m_type;
  }
  
  const float value(void) const
  {
    return m_number;
  }
  
  void mul_op(const float& val)
  {
    m_number*=val;
  }
  
  void div_op(const float& val)
  {
    m_number/=val;
  }
  
  void no_op(void)
  {
    m_type=noop;
    m_number=0;
  }
  
private:
  
  float     m_number;
  type      m_type;
};


meine string->float funktion
(und fragt mich nicht warum die hier so scheiße strukturiert dargestellt ist... in meinen source dateinen ist das alles viel hübscher... eigentlich sollten alle tabs durch leerzeichen ersetzt sein aber ka; ist aber eh nicht so spektakulär..)
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
bool ex_float (char*& data, float& num)
{
  float sign=1;
  int koma=0;
  int count=0;
  num=0.0f;
  
  while((*data)==' ')
    ++data;
  
  if((*data)=='-')
  {
    sign=-1;
    ++data;
  }
  
  while((*data)!=0)
  {
    if(((*data)>=48)&&((*data)<=57))
    {
      ++count;
      if(koma==0)
			{
				num*=10.0f;
    		num+=(float)((*data)-48);
			}
			else
			{
				num+=(float)(((*data)-48)/((float)pow(10.0f, koma)));
				++koma;
			}
    }
    else if((*data)=='.' && koma==0)
			koma=1;
		else
		{
      num*=sign;
      if(count>0)
        return true;
      return false;
    }
    ++data;
  }
	return true;
}


die eval funktion (verwendung: eval("14+7-3/-2*1.5", variable); )
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
bool eval(char* string, float& result)
{
  long i=0;
  
  result=0.0f;
  
  if(0==string)
    return false;
  
  std::vector<expression> exp_list;
  float f0=0.0f, sign=1.0f;
  char data=0;
  char* ptr=0;
  bool last_sign=true;
  
  while(*string!=0)
  {
    ptr=string;
    data=*string;
    
    if(data=='+' || data=='*' || data=='/')
    {
      if(last_sign!=false)
        return false;
      exp_list.push_back(expression(data));
      last_sign=true;
    }
    else if(data=='-')
    {
      sign*=(-1);
      if(last_sign==false)
      {
        last_sign=true;
        exp_list.push_back(expression(static_cast<char>('+')));
      }
    }
    else if(ex_float(ptr, f0)!=false)
    {
      last_sign=false;
      if(string!=ptr)
        string=ptr-1;
      f0*=sign;
      sign=1.0f;
      exp_list.push_back(expression(f0));
    }
    else
      return false;
    ++string;
  }
  
  if(last_sign!=false)
    return false;
  
  std::vector<expression>::iterator end=exp_list.end();
  std::vector<expression>::iterator last;
  
  for(std::vector<expression>::iterator iter=exp_list.begin(); iter!=end; ++iter)
  {
    if(iter->get_type()==mul)
    {
      iter->no_op();
      ++iter;
      last->mul_op(iter->value());
      iter->no_op();
    }
    else if(iter->get_type()==div)
    {
      iter->no_op();
      ++iter;
      last->div_op(iter->value());
      iter->no_op();
    }
    else if(iter->get_type()==number)
      last=iter;
  }
  
  for(std::vector<expression>::iterator iter=exp_list.begin(); iter!=end; ++iter)
  {
    switch(iter->get_type())
    {
      case number:
          result+=iter->value();
        break;
      case add:
        break;
        
      case noop:
        break;
        
      default:
        return false;
    }
  }
  
  return true;
}


mfg Manuel