Programm mit Variabler Eingabe(wie Bash o.Ä)
-
Aloha Community,
ich muss ein Programm schreiben wo ich auf beliebige Eingaben reagieren muss, es soll Vektoren im R³ addieren,subtrahieren das Skalarprodukt und Multiplikation mit einem Skalar gewährleisten können.
Eingaben können in etwa so aussehena 1 2 3 1 2 3
Soll eine Addition der zwei Vektoren {1;2;3} und {1;2;3} darstellen.
Das ganze soll auch mit Multiplikation(m als Kommando) usw geschehen können.
Weiterhin soll es möglich sein Vektoren zu deklarieren, ungefähr so:d v1 1 2 3
Später soll man bei einer Addition o.ä auch vorher deklarierte Vektoren mit einbeziehen können.
Meine Idee war es das ganze so zu unterteilen das ich die Eingabe erstmal auf ihr Command überprüfe und an die jeweiligen zugehörigen Methoden weiter delegiere.
Diese Methoden tokenizen dann den Inputstring in seine Einzelteile und ich analysiere weiter was ich als nächstes für eine Methode aufrufen muss.Habt ihr noch Ideen wie ich das ganze noch dynamische gestalten kann.
Wohlgemerkt muss die ganze Fehlerbehandlung natürlich auch mit drinne sein.
-
Ja, würde ich auch so machen.
Und dann noch zusätzlich (ähnlich wie der CommandLine Parser) vorher die Parameter parsen und dann nur noch das Parameter-Array an die einzelnen Command-Methoden weiterdelegieren.
-
Ok klingt schonmal gut.
Aber von dem CommandLine Parser hab ich bisher noch nichts gehört.
Du meinst also die Tokenzide Parameter nur noch an die Methoden übergeben?
-
So, oder die Commandline mit an die Funktion übergeben, so dass sie diese selber interpretieren muss/kann. Das hat den Vorteil, dass das Hauptprogramm nichts vom Aufbau der Parameter wissen muss. So kannst du recht flexibel neue Funktionalität hinzufügen, ohne bestehende Funktionen anpassen zu müssen.
-
Du meinst mit "die Commandline mit an die Funktion übergeben"
Einfach den char* argv[] mit an die Funktion übergeben und die macht das jeweilige parsing selber?
-
Schreibe du eine standardkonforme Eingabefunktion für Strings und werte diesen String dann mittels switch/case aus:
char *getline(void) { static char *s; char c; int i=1; s=realloc(s,1); *s=0; while( (c=getchar())!='\n' && !feof(stdin) ) strncat(s=realloc(s,++i),&c,1); return s; } int main() { char *s; while( s=getline() ) switch( *s ) { case 'a': addiere(s+1);break; case 'm': multipliziere(s+1);break; default : return puts("Fehler"),1; } return 0; }
Die eigentliche Arbeit kapselst du in den jeweiligen Funktionen, die als einzigen Parameter den Eingabestring enthalten und das Aufsplitten der Elemente selbst übernehmen.
-
Alles klar, danke für die Tipps
-
Du solltest auch die Möglichkeit einbauen die Parameter von stdin oder einer Datei zu lesen.
-
Ahh ja da fällt mir noch was ein wo du das sagst DirkB.
Die Aufgabe kommt ja von unserem Uni-Prof, und damit er nicht das komplette Programm durchtesten musst bei jedem Studenten gibt er eine "Testdatei" vor welche er in das Programm speißt, aber nicht etwa als Parameter sondern so:vector.exe < eingabeDatei.txt > ausgabedatei.txt
Das "> ausgabedatei.txt" versteh ich ja noch, das der output umgeleitet wird, aber ich wüsste jetzt nicht auf anhieb wie ich mit dem "< eingabeDatei.txt" umzugehen habe. Kann mir das jemand erklären?
-
Firefighter schrieb:
Das "> ausgabedatei.txt" versteh ich ja noch, das der output umgeleitet wird, aber ich wüsste jetzt nicht auf anhieb wie ich mit dem "< eingabeDatei.txt" umzugehen habe. Kann mir das jemand erklären?
Das lenkt die Standardeingabe auf den Inhalt von eingabeDatei.txt. Insofern würde ich auch die Bemerkung zum Lesen aus Dateien ignorieren. Es reicht, von der Standardeingabe zu lesen. Wenn der Nutzer eine Datei als Quelle der Befehle möchte kann er die Datei als Standardeingabe benutzen.
-
imho ist gemeint die main als:
int main (int argc, const char* argv[])
zu schreiben und mit dem argv auf die eingabeparameter (< und name.txt) zuzugreifen. diese sollten sich an index 1 und 2 befinden
-
Wutz schrieb:
while( (c=getchar())!='\n' && !feof(stdin) ) strncat(s=realloc(s,++i),&c,1);
wie durchgeknallt muß man sein, um sowas rauszuhauen?
-
orioon schrieb:
imho ist gemeint die main als:
int main (int argc, const char* argv[])
zu schreiben und mit dem argv auf die eingabeparameter (< und name.txt) zuzugreifen. diese sollten sich an index 1 und 2 befindenDiese Sachen bekommt das Programm aber nicht mitgeteilt, weil die Shell das schon rausfiltert und entsprechend behandelt.