Compiler ????
-
Ich hab da ein Informatikproblem:
Vielleicht fällt euch Systemprogrammierer da ja mehr ein als mir. Eigentlich soll es nur ein ausführbares Programm sein.So jetzt das Problem:
Ich sol ein Programm „Auswertung“ schreiben, das zulässige, geklammerte Ausdrücke einliest und berechnet, wobei zulässige Ausdrücke wie folgt aufgebaut sind:
Die Eingabewerte sind ganzzahlig und der Ausdruck wird vollständig übergeben, d.h. als vollständige Zeile oder als Datei. Als Operatoren können + (Addition), - (Subtraktion), * (Multiplikation), / (ganzzahlige Division ohne Rest), und **2 ( Quadrierung ) auftreten, wobei die Operanden auch mathematisch geklammert sein können ( Klammersymbole ( oder ) ). Als Trennzeichen fungiert das Leerzeichen; eine Folge von Trennzeichen ist einem einzelnen Trennzeichen gleichwertig. Vor und hinter jedem Operator darf ein Trennzeichen stehen, braucht es aber nicht. Ein Zeilenende-Zeichen beendet einen Ausdruck.
Das Programm erfüllt folgende Anforderungen/Funktionen:
Lesen und Berechnung werden wiederholt, bis das Dateiende-Zeichen erreicht wird. Die Umleitung der Eingabe in eine Datei ist möglich, d.h. Dateien mit zulässig geklammerten Ausdrücken können zur Auswertung an das Programm übergeben werden.
Das Programm sieht (mindestens) für folgende Fälle verschiedene Fehlermeldungen vor:
Unzulässige Eingaben ( Aufgabe: welche unzulässigen Eingaben können entstehen ??? ).
Bereichsüberschreitungen beim Rechnen.Desweiteren soll ich ein Programm „Prior“ schreiben, das wie das Programm Auswertung zulässige, geklammerte Ausdrücke einliest und berechnet, was aber zusätzlich die folgende Klammereinsparungsregel realisiert:
Man ordnet den Operatoren folgende Prioritäten zu:
**2 geht vor * , /
* , / geht vor + , -Alle anderen Rahmenbedingungen gelten analog zu Programm „Auswertung“, insbesondere Fehlermeldungen.
Und als letztes soll ich Programm „UPN“ schreiben, das zulässige, geklammerte Ausdrücke einliest und diesen Ausdruck in umgekehrte polnische Notation ( UPN ) übersetzt.
Die Eingabewerte können ganze Zahlen und auch Buchstaben ( keine Umlaute ) sein. Ein Ausdruck wird vollständig übergeben, d.h. als vollständige Zeile oder als Datei.
Als Operatoren können + (Addition), - (Subtraktion), * (Multiplikation), und / (Division) auftreten, wobei die Operanden auch mathematisch geklammert sein können ( Klammersymbol ( oder ) ). Als Trennzeichen fungiert das Leerzeichen; eine Folge von Trennzeichen ist einem einzelnen Trennzeichen gleichwertig. Vor und hinter jedem Operator darf ein Trennzeichen stehen, braucht es aber nicht. Ein Zeilenende-Zeichen beendet einen Ausdruck. Alle anderen Rahmenbedingungen gelten analog zu Programm „Auswertung“, insbesondere Fehlermeldungen.
-
Und wie lautet deine Frage dazu?
Wir lösen nämlich keine Aufgaben - das würde ja an deren Sinn vorbeigehen
Du kannst aber gerne konkrete Fragen stellen, wenn du irgendwo nicht mehr weiter weisst - oder dir ein Ansatz fehlt, etc.
-
Shade Of Mine schrieb:
Wir lösen nämlich keine Aufgaben
So pauschal würde ich das nicht sagen - kommt ganz drauf an was dabei rausspringt.
-
Wäre drüber nachzudenken !
-
Also ich finde die Aufgaben eigentlich relativ leicht. Man muss hald mal sein Köpfchen ein wenig anstrengen. Wofür hast du wohl die Aufgaben erhalten??
Das einzige was du eigentlich tun musst, ist die übergebenen Strings auszuwerten bzw. zu parsen und das ist im Grunde gar nicht mal so schwer.
-
Für jemanden der noch nie was von c++ gehört hat, sehr schwer. Betreibe aber Selbststudium.
-
Man muss nicht unbedingt schonmal was von C++ gehört haben, um ein C-Programm schreiben zu können :p
-
@Danny
Wenn man programmieren kann, dann ist die Programmiersprache relativ egal. Zur Not überlegst du dir hald wie du es in deiner Lieblingsprogrammiersprache machen würdest oder schreibst es erstmal in dieser und danach setzt du es in C um. Wichtig ist ja eigentlich nur, dass du die Ablauflogik deines Programms verstehst.
-
Hi.
Und da haben wir schon das Problem. Meine Programmierkentnisse beschränken sich auf ein Minimum. Ich habe es mir jetzt so gedacht. Das ich erstmal die komplette Zeile als String einlese. Dann übergebe ich alle Zeichen einzeln auf den Speicher. Anschließend lese ich alle Zahlen und Rechenoperationen raus, und zwar genau dann wenn zunächst eine Klammer aufegeht und dann wieder geschlossen wird. Ich rechne diesen Teil seperat aus in dem ich es in eine Zahl umwandel. Anschließend übergebe ich diesen Teil wieder in dein Speicher und lese die nächsten Zeichen bis ich irgendwann komplett durch bin. Wie ich diesen ganzen Teil mit allen Bedingungen umsetze ist dann der schwierigste Teil für mich. Weil ich damit noch nie was zu tun hatte.
Bis dann
-
Naja das ist ja schon mal ein Anfang. Zumindest weißt du schon wie du es ungefähr machst. Die Aufgaben finde ich übrigens recht gut aufgeteilt. Da lernt man stückchenweise dazu.
Versuch einfach mal nur die 1. Aufgabe zu realisieren. Du hast also einige Rechenoperationen in einer Zeile, die geklammert sind. Z. B. ( ( 3 * (6 - 2)) /12 ) Am besten versuchst du für den Anfang einfach nur den Inhalt der Klammern nacheinander auszugeben. Dabei solltest du von innen nach außen vorgehen. D. h. deine Ausgabe sollte dann folgendermaßen aussehen:
6 - 2
3 * (6 - 2)
( 3 * (6 - 2)) /12Als nächstes versuchst du die einzelnen Rechenoperationen zu bestimmen und auch auszurechnen.
Wenn das dann richtig läuft, wagst du dich an die nächste Aufgabe mit den Prioritäten.
-
Ist es nicht einfacher wenn ich bei der Formel einfach von vorne nach hinten gehe ? Das Problem ist ja die Syntax. Auf dem Blatt Papier weiß ich wie es funktionieren müsste. Ich weiß weder wie ich den Speicher anspreche noch sonstiges !
-
DannyB4281 schrieb:
Ist es nicht einfacher wenn ich bei der Formel einfach von vorne nach hinten gehe ? Das Problem ist ja die Syntax. Auf dem Blatt Papier weiß ich wie es funktionieren müsste. Ich weiß weder wie ich den Speicher anspreche noch sonstiges !
Theoretisch gehst du ja von vorne nach hinten durch die Zeile, aber du musst die Klammern berücksichtigen, d. h. beim Rechnen musst du zuerst die innerste Klammer ausrechnen, dann die Klammer, die um diese Klammer ist, usw. Wie würdest du es denn auf dem Blatt Papier machen?
-
Ich glaube wir meinen das Gleiche.
Also ich habe meinetwegen: ((2*3)-4*(5+8))Als erstes lese ich die Zeichen ein:
Stack1: (
Stack2: ((
Stack3: ((2
.
Stack6: ((23) So jetzt nehme ich den Klammerbegriff raus und rechne ihn
seperate aus. Und fürge ihn dann wieder ein.
Stack7: (6
Stack8: (6-
Stack9: (6-4
Stack10: (6-4
Stack11: (6-4*(
.
Stack15: (6-4*(5+8) Das Gleiche wie oben
Stack16: (6-4*13) Wieder rauslesen, ausrechen und wieder reingeben.
Stack17: -46Ergenis: -64 >>> Oder ist der Operationsaufwand dafür zu groß ??
Problem ist jedoch die Umsetzung !
-
Ja wahrscheinlich meinen wir in etwa das gleiche. Ich denke hald, dass du das Rechnen erstmal hinten dranstellen solltest, da ja das das einfachste darstellt. Versuch erstmal die Logik der Klammern zu realisieren und deren Inhalt rauszufiltern, denn genau das brauchst du dann zum Rechnen ;).
-
Steht sowas ähnliches nicht im K&R?
-
Lösung:
Mein Posting aus diesem Thread:
http://www.c-plusplus.net/forum/viewtopic.php?p=410430&highlight=#410430
-
Also mein erstes Problem ist jetzt erstmal die Deklaration eines Strings.
Bsp:
Ich habe die Klassen <iostream.h> und <string> implementiert und möchte eine Stringvariabel deklarieren.#include "stdafx.h"
#include <iostream.h>
#include <string>int main()
{
string t1 = "Hallo";
cout <<"schitt";
return 0;
}Macht er aber nicht !! Und ich weiß nicht warum ?
-
<iostream.h> ist der alte Headder, also benutze doch <iostream>.
Dort kannst du dann auf die Sachen im namespace std zugreifen, genauso wie in <string< auch. Also einfach using namespace std hinter das includieren der Header schreiben, oder std::string.Gruß
Entyl SaPS.:Sinnvoll ist es auch immer Fehermeldungen mit anzugeben.
-
Ihr solltet euch mal Gedanken darüber machen, warum das Forum ANSI-C heißt.
-
Hmmmmm..........
Ich möchte jetzt einen String in den Typ Integer umwandeln. Wie stelle ich das an.
string a="1";
int b;
b=a;Funktioniert leider nicht.
Stellt using namespace std da vielleicht eine Funktion bereit ?
Mit freundlichen Gruß