Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Taschenrechner programmieren??komme nicht weiter.

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.02.2008, 16:55 Uhr
fecub67



Grüßt euch leute,
ich sollte in der übung ein taschenrechner programmieren!
also die aufgabe war, das man die ganze rechen aufgabe schreibt, und das program rechnet es halt dann aus.
die aufgabe kann man so schreiben wie man möchte, also zwischen den zahlen können auch buchstaben sein, das program filtert nur die zahlen und das operanten aus!


Ich habe es mir so überlegt das ich die einzelnen zahlen und operanten mit ne scheife rauspicke!!
das rauspicken hat geklappt nur jetzt weiß ich nicht wie ich mit den zahlen rechnen könnte.

::::hier ist der code::::

Code:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    
    char aufgabe[100];
    char zeichen[100];
    int i,z;
    int ziffer[100];
    i=0;
    z=0;

    //rechenaufgabe einscannen
    printf("\n\t\tTaschenrechner! \n\n");
    printf("\tbitte rechenaufgabe eingeben: ");  gets(aufgabe);
    
    
    
    
    //zahlen werden entsprechenden zugewiesen
    while(aufgabe[i] != '\0')
    {
        if(aufgabe[i] < 48 || aufgabe[i] > 57)
        {
            printf("");
            i++;
        }
        else
        {
            ziffer[i] = aufgabe[i];
            i++;
        }
        
        if(aufgabe[i]==42 || aufgabe[i]==43 || aufgabe[i]==45 || aufgabe[i]==47)
        {
            zeichen[z]=aufgabe[i];
            i++;
        }
        
    }

    //... ab hier komm ich nicht weiter


    printf("\n");
    return EXIT_SUCCESS;        
}


würde mich freuen wenn ihr mir weiterhelfen würdet.

Gruß
fecub

Dieser Post wurde am 23.02.2008 um 16:59 Uhr von fecub67 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.02.2008, 19:18 Uhr
öni



Nun musst dir überlegen was er bei aufgabe[i]=42 machen soll....

somit wenn aufgabe[i]=42;

dann musste du die Zahl davor mal die Zahl danach..das kannste über ein switch machen geht am leichtesten.

Allerdings musst du dir noch die Zahlen vor und nach dem Rechenzeichen noch wo abspeichern vll. in Zahl1 und Zahl2.

Ich hoffe ich konnte helfen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.02.2008, 20:02 Uhr
fecub67



genau dieses abspeichern, wie kann ich zwei variablen in eine variable abspeichern, ohne das der andere den anderen überschreibt.

beispiel:

Code:
aufgabe[0] = 2;-----------|
                           ----->   zahl1[0] = 23;
ausgabe[1] = 3;-----------|



kann man sowas machen?????

Dieser Post wurde am 23.02.2008 um 20:04 Uhr von fecub67 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.02.2008, 20:51 Uhr
0xdeadbeef
Gott
(Operator)


Du willst dir wahrscheinlich mal die *scanf-Funktionen ankucken, damit kannste ne ganze Zahl auf einmal einlesen. Außerdem praktisch zur Auswertung wäre wohl http://en.wikipedia.org/wiki/Shunting_yard_algorithm - der Artikel beschreibt die Umwandlung in Postfix-Notation, aber man kann das mit einem zweiten Stack auch problemlos on-the-fly auswerten.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.02.2008, 21:38 Uhr
öni



Ich würde erst die 2 und dann die 3 in ein string reinstecken und dann den string in float oder int umwandeln. Ist vll. die Holzbrechermethode aber so wäre es für mich mit wenigsten Aufwand möglich ohne irgendwas zu lesen, suchen und ausprobieren.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.02.2008, 21:50 Uhr
0xdeadbeef
Gott
(Operator)


Ich hab mir sowas vor einiger Zeit mal zum Spaß zusammengehackt. Mein Tokenizer sah so aus:

C++:
namespace {
  std::string const ops = "+-*/^()";
}

struct token {
  enum id_t {
    op_id,
    num_id
  };

  union {
    char op;
    double x;
  } val;
  id_t type;
};

std::istream &get_token(std::istream &in, token &tok) {
  double x;
  char c;

  if(in >> c) {
    if(ops.find(c) == std::string::npos) {
      in.unget();
      in >> x;
      tok.val.x = x;
      tok.type = token::num_id;
    } else {
      tok.val.op = c;
      tok.type = token::op_id;
    }
  }

  return in;
}


...und dem Ding hab ich dann halt nen istringstream durchgereicht, bis kein token mehr da war. Das ist natürlich nicht mächtig genug, um noch Funktionsbezeichner etc. zu verarbeiten, aber für den Zweck hat's damals locker ausgereicht. Und in komplizierteren Fällen würd ich eh nen Parser-Generator verwenden (z.B. boost.spirit)
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 23.02.2008 um 21:51 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.02.2008, 22:37 Uhr
fecub67



leutz ich bedanke mich bei euch allen, ihr habt mir wirklich weitergeholfen!!!!

@0xdeadbeef
die aufgabe war, die zahl als string einzulesen!!!! und die einzelne sachen daraus zu filtern.
zahl operator etc.

ich könnte die rechenaufgabe auch so hinschreiben
1g23 +3f.

das program filtert und das kommt dann halt raus 123+3 = 126
mit scanf würde ich wahrscheinlich probleme bekommen oder was sagst du?????

gruß
fecub

Dieser Post wurde am 23.02.2008 um 22:37 Uhr von fecub67 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
23.02.2008, 23:17 Uhr
0xdeadbeef
Gott
(Operator)


Ugh, so ein Unfug. Ich würd wahrscheinlich erstmal den String minus unerwünschte Zeichen irgendwohin kopieren und dann mit sscanf parsen.

Und bitte verbrauch nicht so viele Satzzeichen auf einmal. Die gehen langsam zur Neige.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 23.02.2008 um 23:17 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: