Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » UPN-Rechner mittel Stacks

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
01.12.2017, 22:58 Uhr
rakip68



Hallo Liebes Forum ,
bin neu hier und kenne nicht alle Regeln , also könnt ihr mich gerne drauf aufmerksam machen falls ich was falsches tuhe

Ich Raff die untere Aufgabenstellung nicht ...sitze seit 5 tagen dran und habe bisher noch nichts...kann mir jmd beim verständnis helfen bzw beispiele geben oder sonst noch was.
wer bock hat das programm zu schreiben gerne xDD oder als übung für sich selbst .Glaube aber das es nicht Sinn des Forums ist .
danke für eure Hilfen!

Folgende Aufgabenstellung:
Ihr Programm soll algebraische Ausdrücke auf reellen Zahlen in umgekehrt polnischer Notation (UPN) berechnen. Als Rechenoperationen sollen + (Addition), - (Subtraktion), * (Multiplikation) und / (Division) verarbeitet werden. Zahlenwerte sollen je nach Auswahl dezimal, hexadezimal oder binär eingegeben und angezeigt werden können.

Beispiel: Der Ausdruck ((3+4)*(7+1.6-12)-5)/(3-8.7)
werde auf Ihrem UPN-Rechner wie folgt berechnet 3 4 + 7 1.6 + 12 - * 5 - 3 8.7 - /

Die Bedienoberfläche ihres UPN-Rechners soll auf folgende Tasten reagieren:

Zahleneingabe: Dezimalziffern „0 … 9“, Hexziffernsymbole „a…f“ und Dezimalpunkt „.“ , Vorzeichen „-“, Exponentkennung „E“ (Exponent zur Basis 10)
Operatoren: +, -, *, /
Stackverwaltung: u (push), o (pop)
Wechsel der Zahlendarstellung im Stack: D (dezimal), H (hexadezimal), B (binaer)
Programm verlassen: „x“ (exit)

Ihr UPN-Rechner soll wie folgt arbeiten:

Ausgabe eines stehenden Bedien- und Anzeigebildschirms für den UPN-Rechner.
Entgegennahme beliebiger Tastatureingaben in der Eingabezeile, insbesondere also Zahleneingaben, Operandeneingaben, Befehlseingaben. Jede Eingabe muss mit der ENTER-Taste abgeschlossen werden. Im Beispiel oben sind also nacheinander folgende Eingaben notwendig:
3 ENTER 4 ENTER + ENTER 7 ENTER 1.6 ENTER + ENTER 12 ENTER – ENTER …
Speichern der eingegebenen Werte und Rechenergebnisse in einem Stack.
Ausgabe des jeweils aktuellen Stackinhalts auf der Konsole. Der zuletzt eingegebene Wert des Stacks soll auf der untersten Stackzeile, die übrigen Werte in der Reihenfolge der Eingabe darüber angezeigt werden. Nach Änderung des Stackinhalts dürfen keine Anzeigefragmente des vorherigen Stackinhalts mehr sichtbar sein.
Je nach gewählter Zahlendarstellung ist in den Stackzeilen folgende Ausgabe gefordert:
dezimal (D): reelle Werte in geeigneter Gleitkommadarstellung, linksbündig
hexadezimal (H): ganzzahlige Wertanteile, Zweierkomplement, linksbündig
binär(B): ganzzahlige Wertanteile, Absolutwert rechtsbündig, Vorzeichen linksbündig
Nach Eingabe eines Rechenoperators wird die Rechenoperation ausgeführt.
Insbesondere ändert der Rechenoperator „-“ das Vorzeichen des Wertes auf dem Stack, falls nur ein Wert auf dem Stack gespeichert ist (unäre Operation).
Nach Eingabe von push wird die oberste Wert des Stacks erneut auf den Stack gelegt. War bei Eingabe von push noch kein Wert im Stack gespeichert, wird der Wert 0 auf den Stack gelegt.
Nach Eingabe von pop wird der oberste Wert des Stacks gelöscht.
Nicht erlaubte Eingaben sollen ignoriert werden.
Die Stacktiefe soll als Programmparameter über die Konsole eingegeben werden. Sie muss mindestens 3 und darf höchstens 8 betragen.

Hinweise zum Lösungsweg

Der Stack (oder LIFO = Last-In-First-Out Speicher) soll in main() als eindimensionales Feld aus double-Werten aufgebaut werden. Allokieren Sie den Stack als dynamischen Speicher (calloc()). Achten Sie darauf, dass der Speicher einen double-Wert mehr aufnehmen kann, als die Stacktiefe erfordert.
Neue Eingabewerte werden immer „oben“ auf dem Stack (also beim ersten unbelegten Feldindex) abgelegt. Die Eingabe eines Operators wirkt sich nur auf die beiden zuletzt eingegebenen Werte im Stack aus. Nach Ausführen der Operation ersetzt das Ergebnis den älteren der beiden Werte und der zuletzt eingegebene Wert wird vom Stack entfernt.
Um auf der Konsole eine stehende Ausgabe für die Bedienoberfläche zu erzeugen, nutzen Sie die #define Literale aus console.h und die in der Quelldatei POOL2_005.c vorgegebenen Funktionen Bildschirmmaske() und ClearLine().
Schreiben Sie die Funktion PrintStack(), um den gesamten Stackinhalt im vorgesehenen Bildschirmbereich in der gewählten Zahlendarstellung (dezimal, hexadezimal oder binär) auszugeben.
Nutzen Sie scanf(), um die Eingaben von der Konsole zu lesen
die Vorgaben füge ich noch bei...

Dieser Post wurde am 01.12.2017 um 23:09 Uhr von rakip68 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.12.2017, 23:03 Uhr
rakip68



Vorgaben ( Console.h und die Funktionen --daran soll halt weitergearbeitet werden)

// Console.h

Code:
/* Defines zur Positionierung des Cursors auf der Konsole */
/* CLS = Clear Screen. Use: CLS; */
#define CLS printf("\033[2J")
/* CURPOS(L,C) = Positioniere den Cursor in Zeile L und Spalte C.
  * Use: to print a text in line L starting at column C
  * CURPOS(L,C); printf("place your text here"); */
#define CURPOS(L,C) printf("\033[%d;%df",L,C)
/* CURUP(L) = Bewege den Cursor um L Zeilen nach oben. */
#define CURUP(L) printf("\033[%dA",L)
/* CURDOWN(L) = Bewege den Cursor um L Zeilen nach unten. */
#define CURDOWN(L) printf("\033[%dB",L)
/* CURRIGHT(C) = Bewege den Cursor um C Spalten nach rechts. */
#define CURRIGHT(C) printf("\033[%dC",C)
/* CURLEFT(C) = Bewege den Cursor um C Spalten nach links. */
#define CURLEFT(C) printf("\033[%dD",C)
/* CUR2EOL = Lösche alle Zeichen rechts ab aktuelle CURPOS */
#define CURCLR2EOL printf("\033[K")




Code:

/*
Dateiname : POOL2_005.c
Programm  : UPN-Rechner für Grundrechenarten (dezimal, hexadezimal, binaer)
Beispielhafte Musterlösung für Aufgabe 005 aus POOL2
Eingaben  : Parametereingabe bei Programmaufruf über Konsole. Aufruf mit:
             ./POOL2_005 <StackTiefe>
StackTiefe = 3 ... 8
Ausgaben  : Rückgabewerte des Programms:
             0 falls Eingabeparameter OK
             -1 falls fehlerhafte oder unvollständige Eingabeparameter
Autor     :
Version   :
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "console.h"

#define SCOL   40  //linke Spalte zur Stackdarstellung auf Konsole
#define SLINE  10  //obere Zeile zur Stackdarstellung auf Konsole
#define ILINE  12  //Eingabezeile auf Konsole
#define ICOL   41  //linke Eingabespalte in Stackdarstellung auf Konsole
#define SWIDTH 32  //max. Breite der Anzeige fuer Stack
#define STACKLINE "[                                ]"  // leere Stackzeile
#define SDEPTH 8   //max. Tiefe der Anzeige fuer Stack

/*
Funktion  : void ClearLine(int Line)
Aufgabe   : Loescht die Stackzeile Line auf dem Bildschirm
Eingaben  : Line = Zeilenindex der zu loeschenden Zeile
             (oberste Bildschirmzeile: Line=0)
Ausgaben  : keine
Autor     : Kreiser
Version   : 01
Datum der letzten Änderung: 2012-12-14
*/
void ClearLine(int Line){
    CURPOS(Line, SCOL); CURCLR2EOL;
    CURPOS(Line, SCOL); printf("[                                ]");
    CURPOS(Line, ICOL);
}

/*
Funktion  : void PrintStack(double* Stack, int StackTiefe, int StackIndex,
                            char CalcMode)
Aufgabe   : Gibt den gesamten Stack auf dem Bildschirm aus
Eingaben  : Stack = Zeiger auf den Stack (Vektor mit double-Werten)
             StackTiefe = Groesse des Stacks (Anzahl der Speicherstellen)
             StackIndex = Index der letzten belegten Speicherstelle im Stack
             CalcMode = 'D' (dezimal), 'H' (hexadezimal), 'B' (binaer)
Ausgaben  : keine
Autor     : Kreiser
Version   : 01
Datum der letzten Änderung: 2012-12-14
*/
void PrintStack(double* Stack, int StackTiefe, int StackIndex, char CalcMode){

}

/*
Funktion  : void Bildschirmmaske(int StackTiefe)
Aufgabe   : Zeigt den Bildschirm des UPN-Rechners an
Eingaben  : StackTiefe = Groesse des Stacks (Anzahl der Speicherstellen)
Ausgaben  : keine
Autor     : Kreiser
Version   : 01
Datum der letzten Änderung: 2012-12-14
*/
void Bildschirmmaske(int StackTiefe){
    int j;
    int i=3;  //Zeilenposition fuer Stackdarstellung auf Console
    CLS;
    CURPOS(1,   1); printf("UPN-Rechner - (c) 2012-12 F07");
    CURPOS(2,   1); printf("-------------------------------------------------------------------------");
    CURPOS(i++, 1); printf("Programm verlassen               (x)");
    CURPOS(i++, 1); printf("Operatoren                 (+ - * /)");
    CURPOS(i++, 1); printf("Ziffern          (01234567890abcdef)");
    CURPOS(i++, 1); printf("Dezimalpunkt | Vorzeichen    (. | -)");
    CURPOS(i++, 1); printf("Exponentkennung                  (E)");
    CURPOS(i++, 1); printf("Stackoperationen Push | Pop  (u | o)");
    CURPOS(i++, 1); printf("Eingabe abschliessen         (ENTER)");
    CURPOS(i++, 1); printf("Binaermodus                      (B)");
    CURPOS(i++, 1); printf("Dezimalmodus                     (D)");
    CURPOS(i++, 1); printf("Hexadezimalmodus                 (H)");
    i=ILINE;
    // Darstellungsfeld fuer Eingaben, Breite 30 Zeichen + Klammern
    CURPOS(i--, SCOL); printf(STACKLINE);
    CURPOS(i--, SCOL); printf("----------------------------------");
    //X                     0123456789          0123456789          0123456789          0123456789
    //X                               0123456789          0123456789          0123456789
    for(j=0;j<StackTiefe;j++){
        CURPOS(i--, SCOL); printf(STACKLINE);
    }
    CURPOS(ILINE+1, 1); printf("-------------------------------------------------------------------------\n");
}

int main(int argc, char *argv[]){
    int Ausgabe=0;    // Rueckgabewert von main()

    return(Ausgabe);
}



Dieser Post wurde am 01.12.2017 um 23:05 Uhr von rakip68 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: