pap (Programmablaufplan) Zu "einfacher Taschenrechner"
-
Hi wir musste für Info einen Taschenrechner in C Programmieren und dann anschließend ein pap dazu schreiben, ich hab mir schon einiges dazu bei Wiki durchgelesen schaffe es aber nicht das auf mein Programm umzusetzen.
Könntet ihr mir vielleicht helfen ?mfg marcoboenner
Quellcode (inclusieve Erklärungen von nem Freund)
#include "uebung6.h" double einfacherRechner() { char eingabeString[512]; // Hier wird die Eingabe gespeichert (nur für Ausgabe) char zahlAlsString[100]; // Eingegebene Zahlen werden hier als Zeichenkette gespeichert CalcFrag frags[512]; // In diesem Array werden Operanden und Operatoren gespeichert (siehe uebung6.h) int fragCount=0; // Größe des Arrays (Anzahl Operanden + Operatoren) strcpy(eingabeString,""); // Erstmal die Eingabe auf Leerstring setzen bool StarteBerechnung=false; // Wird auf true gesetzt wenn die Eingabe komplett ist int zahlCounter=1; // Zählt mit wieviele Zahlen eingegeben wurden int i; // Zählvariable int x; // dito float zahl1; // Hilfsvariable float zahl2; // dito // Solange man nicht "(x) Ende / Ergebnis" gewählt hat läuft die Schleife while (!StarteBerechnung) { // Bisherige Eingabe ausgeben: system("cls"); printf(eingabeString); printf("\r\n"); printf("\r\n"); // User bitten eine Zahl einzugeben: printf("Bitte geben Sie die %i. Zahl ein:\r\n",zahlCounter); zahlCounter++; // Eingegebene Zahl einlesen und hinten ans frags-Array hängen: scanf("%f",&frags[fragCount].zahl); frags[fragCount].istOperator=false; // ...und Zahl an die bisherige Eingabe dranhängen: sprintf(zahlAlsString,"%f",frags[fragCount].zahl); strcat(eingabeString,zahlAlsString); // wir haben nun ein Element im frags-Array mehr: fragCount++; // Bisherige Eingabe ausgeben: system("cls"); printf(eingabeString); printf("\r\n"); printf("\r\n"); printf("Bitte nächsten Operator wählen:\r\n"); printf("(+) Addieren \r\n"); printf("(-) Subtrahieren \r\n"); printf("(*) Multiplizieren \r\n"); printf("(/) Dividieren \r\n"); printf("(x) Ende / Ergebnis \r\n"); // Operator-String einlesen: // Erstes Zeichen von operation (operation[0]) ist dann z.B. '+' oder '*'... char operation[50]; scanf("%s",&operation); // Operator an die bisherige Eingabe hängen: if(operation[0]=='+') { strcat(eingabeString," + "); } else if(operation[0]=='-') { strcat(eingabeString," - "); } else if(operation[0]=='*') { strcat(eingabeString," * "); } else if(operation[0]=='/') { strcat(eingabeString," / "); } else if(operation[0]=='x') { StarteBerechnung=true; // Yeah, User hat alles eingegeben, es kann los gehen... } else { // User hat kein +,-,*,/ oder x eingegeben: printf("'%s': Ungültige Operation!",operation); return 0; } // Operator ans Array hängen (falls nicht 'x' der letzte 'Operator' war ;D): if (!StarteBerechnung) { frags[fragCount].istOperator=true; frags[fragCount].operatorTyp=operation[0]; fragCount++; } } float ergebnis=0; // Hilfsvariable // Nochmal die Eingabe anzeigen: system("cls"); printf(eingabeString); printf("\r\n"); // Wir definieren hier die Operator-Reihenfolge: // Erst Punkt-Rechnung, dann Strich-Rechnung char opReihenfolge[]={'*','/','+','-'}; char currentOperator=0; // Hier wird unten in der Schleife einer der Operatoren stehen int y; for (y=0; y<4; y++) // Alle Operatoren aus dem Array oben durchlaufen { currentOperator=opReihenfolge[y]; // Operator aus opReihenfolge holen bool opFound=true; // Wir sagen mal wir hätten einen Operator gefunden, damit die Schleife mindestens einmal durchlaufen wird while (opFound) { // Diese Schleife wird solange durchlaufen wie der Operator aus currentOperator noch gefunden wird opFound=false; // Wird wieder auf true gesetzt, sollte der Operator gefunden werden // Jetzt alle Operatoren und Operanden durchlaufen for (i=0; i<fragCount; i++) { if (frags[i].istOperator) // Wir haben nen Operator gefunden { if (frags[i].operatorTyp==currentOperator) // und es ist der den wir suchen { opFound=true; // Auf gefunden markieren (Schleife wird nochmal durchlaufen) // Zahlen links und rechts vom Operator holen: zahl1=frags[i-1].zahl; // links zahl2=frags[i+1].zahl; // rechts // Rechnung je nach Operator durchführen: if (currentOperator=='*') { ergebnis = zahl1 * zahl2; } else if (currentOperator=='/') { ergebnis = zahl1 / zahl2; } else if (currentOperator=='+') { ergebnis = zahl1 + zahl2; } else if (currentOperator=='-') { ergebnis = zahl1 - zahl2; } // Zahl links vom Operator durch Ergebnis ersetzen... frags[i-1].zahl=ergebnis; // ..und den Operator und die Zahl rechts vom Operator entfernen. // Das machen wir indem wir einfach alles einfach um zwei Stellen nach links verschieben: for (x=i; x<fragCount-1; x++) { frags[x].zahl=frags[x+2].zahl; frags[x].istOperator=frags[x+2].istOperator; frags[x].operatorTyp=frags[x+2].operatorTyp; } fragCount=fragCount-2; // Operator und Zahl rechts vom Operator sind nun weg i=fragCount; // for-Schleife abbrechen // Neues Teil-Ergebnis ausgeben: printf("= "); for (x=0; x<fragCount; x++) { if (frags[x].istOperator) { printf(" %c ",frags[x].operatorTyp); } else { printf("%f",frags[x].zahl); } } printf("\r\n"); } } } } } return frags[0].zahl; } #ifndef UEBUNG6_H_INCLUDED #define UEBUNG6_H_INCLUDED // Falls Compiler den Typ bool nicht kennt: //////////////////////////////////////////// #ifndef bool #define bool int #endif #ifndef false #define false 0 #endif #ifndef true #define true 1 #endif // Diese Struktur wird zum Speicher der geparsten Eingabe benutzt: /////////////////////////////////////////////////////////////////// typedef struct CalcFrag { bool istOperator; // Zahl oder Operator? char operatorTyp; // Welcher Operator? float zahl; // Welche Zahl? } CalcFrag; double einfacherRechner(); #endif // UEBUNG6_H_INCLUDED
-
Hi wir musste für Info einen Taschenrechner in C Programmieren und dann anschließend ein pap dazu schreiben, ich hab mir schon einiges dazu bei Wiki durchgelesen schaffe es aber nicht das auf mein Programm umzusetzen.
Könntet ihr mir vielleicht helfen ?Gerne. Du bist im falschen Forum. Mit Code Tags lässt sich Quellcode viel einfacher lesen und dann:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-200753.html
-
Dieser Thread wurde von Moderator/in Unix-Tom aus dem Forum C# und .NET in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.