B
Achso, daran hab ich gar nicht gedacht, ich hatte weiter oben extra Strings angelegt, in die ich die Werte gespeichert hatte.
Die Funktion hab ich hier gefunden: http://home.fhtw-berlin.de/~junghans/cref/EXAMPLES/strcmp.c Aber da hab ich wohl das falsche übernommen
EDIT: Mittlerweile sieht es schon ganz gut aus, nur wenn ich zweimal nacheinander eine zweistellige Operation durchführen will, hängt sich das Programm auf... Ich pack mal den kompletten Quellcode hier rein, falls jemand die Muße hat, sich den mal anzugucken wär ich sehr dankbar
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
struct stack {
double value; // Zahl
struct stack *next; // nächstes Element
};
int main(void) {
struct stack *neu=NULL;
struct stack *kopf=NULL;
struct stack *aktuell=NULL;
int i, anz=0, boo=0, bol=0; //nimmt Art der Eingabe auf, Anzahl d. Elemente, StringComparison
double z, a, erg; //Zahleingabe, zweistellige Operanden, Ergebnis
char c='a',s[5]; //ein-/zweistellige Operationen
printf("UPN RECHNER\n");
printf("===========\n\n");
while (i!=0) {
printf("\n%d Elemente",anz); //Anzahl der vorhandenen Elemente
if(anz!=0) { //Sicherung ob es überhaupt schon Elemente gibt
aktuell=kopf;
while(aktuell->next!=NULL) {
aktuell=aktuell->next; //Suche des letzten Elements
}
printf("; aktuell letztes Element: %.3lf", aktuell->value); //Ausgabe des letzten Elements
}
while(i!=0 && i!=1 && i!=2 && i!=3) {
printf("\nZahl(1) einst. Op(2) zweist. Op(3) Ende(0)");
scanf("%d", &i);
}
if (i==1) { //Zahl auf stack packen
printf("\nEingabe:");
scanf("%lf",&z); //Zahl einlesen
if (kopf!=NULL) { //Liste nicht leer
anz=2;
aktuell=kopf;
while(aktuell->next!=NULL) {
aktuell=aktuell->next; //Suche des letzten Elements
anz++;
}
neu=(struct stack *)malloc(sizeof(struct stack));
aktuell->next=neu; //Zeiger d. letzten Elements auf neues Element
neu->next=NULL; //Zeiger d. neuen Elements aufs Ende
neu->value=z; //Zahl einfuegen
} else { //Liste leer
neu=(struct stack *)malloc(sizeof(struct stack));
kopf=neu; //Zeiger auf dieses als erstes Element
neu->next=NULL; //gleichzeitig auch letztes Element
neu->value=z; //Zahl einfuegen
anz=1;
}
}
//EINSTELLIGE OPERATIONEN
if (i==2) {
if(anz!=0) {
while (bol==0) {
printf("Eingabe:");
gets(s);
boo=strcmp (s, "abs");
if(boo==0) bol=1;
boo=strcmp(s, "neg");
if(boo==0) bol=1;
boo=strcmp(s, "inv");
if(boo==0) bol=1;
boo=strcmp(s, "sqr");
if(boo==0) bol=1;
boo=strcmp(s, "sqrt");
if(boo==0) bol=1;
}
bol=0;
if (kopf!=NULL) { //Liste nicht leer
aktuell=kopf;
while(aktuell->next!=NULL) {
aktuell=aktuell->next; //Suche des letzten Elements
}
boo = strcmp(s, "neg");
if (boo==0) {
aktuell->value=0-aktuell->value; //negative Zahl
}
boo = strcmp(s, "abs");
if (boo==0) {
aktuell->value=fabs(aktuell->value); //Betrag
}
boo = strcmp(s, "sqr");
if (boo==0) {
aktuell->value=pow(aktuell->value,2); //Quadrat
}
boo = strcmp(s, "sqrt");
if (boo==0) {
aktuell->value=sqrt(aktuell->value); //Quadratwurzel
}
boo = strcmp(s, "inv");
if (boo==0) {
aktuell->value=1/(aktuell->value); //Reziproke
}
}
} else { //Liste leer
printf("\nEs wurde noch keine Zahl eingegeben!\n");
}
}
//ZWEISTELLIGE OPERATIONEN
if(i==3) {
if(anz>1) {
while(c!='/' && c!='*' && c!='+' && c!='-') {
printf("\nEingabe:");
c=getchar();
}
i=1;
aktuell=kopf;
while(i!=anz-1) {
aktuell=aktuell->next; //Suche des vorletzten Elements
i++;
}
a=aktuell->value; //Wertauslesung
aktuell=aktuell->next;
if(c=='/') //Division
erg=a/aktuell->value;
if(c=='*') //Multiplikation
erg=a*aktuell->value;
if(c=='-') //Subtraktion
erg=a-aktuell->value;
if(c=='+') //Addition
erg=a+aktuell->value;
aktuell=kopf;
while(i!=anz-1) {
aktuell=aktuell->next; //Suche des vorletzten Elements
i++;
}
aktuell->value=erg; //Wertzuweisung
aktuell->next=NULL; //löscht letztes Element
anz--;
c='a';
} else {
printf("\nEs sind nicht genuegend Elemente vorhanden!\n");
}
}
if(i!=0){
i=5;
}
}
return 0;
}