Vollständige Version anzeigen : [C] *.txt Files durchsuchen


s1nu
10.11.2013, 21:37

Hallo Leute,

hab wiedermal ne für mich zu knifflige Herausforderung.

Ich habe hier ein ;txt File mit folgendem Inhalt:

<3> <3>
1 2 3
2 3 4
5 3 0
<+>
1 0 0
0 1 0
0 0 1


Dieses soll mit stdin eingelesen werden. Es handelt sich hierbei um 2 3*3 Matrizen, die addiert werden sollen. Das <+> ist als Operator anzusehen. (Es kann hier auch <*> stehen.

Wie stell ich denn das am besten an?

Meine Lösungsansätze bis jetzt:
1;) Zeichenweise einlesen bis zum ersten '\n' für die Größe der Matrix
2;) Nächste Zeile bis zum '\n' einlesen und die Werte in die erste Reihe der Matrix speichern usw. bis eben zum <+>
3;) Operator einlesen und speichern
4;) Wie 2;) und eben bis zum EOF.

Ist das nicht besser zu handhaben? Die Größe der Matrizen kann sich ändern aber ist maximal 10x10 und die Zahlen in auf den verschiedenen Indizes dürfen maximal 0-10 sein.

Meinen Code habe ich gerade aus Frust vernichtet^^

Bin für jede Hilfe dankbar.

Hardware Preisvergleich | Amazon Blitzangebote!

Videos zum Thema
Video Loading...
Kolazomai
11.11.2013, 07:25

Hallo s1nu!

Du könntest dir einen endlichen Automaten für die Aufgabe bauen. Der Automat könnte aber nicht herausfinden, ob die Dimension der ersten Matrix mit der Dimension der zweiten Matrix übereinstimmt.

Der endliche Automat würde recht ähnlich wie von dir beschrieben funktionieren. Die Implementierung ist, wenn man dann einmal das Modell hat, ziemlich einfach und ist dank der Automatenbeschreibung gut dokumentiert und nachvollziehbar.

Ich weiss nicht, ob man es ohne irgendwelche zusätzlichen Bibliotheken (die Regular Expressions o;ä. anbieten) eleganter lösen kann. C ist, was String-Parsing anbelangt, eher mühsam.

Mfg,

Kolazomai


Murdoc
11.11.2013, 19:59

Bei einer nicht kontextfreien Grammatik würde sich ein (Rekursiver) Abstieg anbieten:

Pseudocode:
(Lexikalische Analyse weg gelassen (;de;wikipedia~org/wiki/Lexikalische_Analyse))

parse_expression() {
d1 = parse_dimension();
d2 = parse_dimension();
expect_token('\n');
left = parse_matrix(d1, d2);
op = parse_operator();

// hier ggf je nach `op` noch anpassungen an `d1` und `d2` vornehmen
right = parse_matrix(d1, d2);

ex = expression(left, op, right);
return ex;
}

parse_dimension() {
expect_token('<')
d = parse_integer();
expect_token('>');
return d;
}

parse_matrix(d1, d2) {
mx = matrix(d1, d2);

for (i1 = from 0 to d1) {
for (i2 = from 0 to d2) {
mx[i1][i2] = parse_integer();
}
expect_token('\n');
}

return mx;
}

parse_operator() {
expect_token('<');
op = 0;
switch (lookahead) {
case '+':
case '*':
// ...
op = lookahead;
next_token();
break;
default:
error();
}
expect_token('>');
expect_token('\n');
return op;
}

parse_integer() {
// ... ;-)
}

main() {
e = parse_expression();
evaluate(e);
}


Wäre auch recht einfach in C zu implementieren.
Bei Bedarf kann man auch eine operator precedence Rekursion mit einbauen sollte es jemals legal sein mehrere Operationen in einem Ausdruck zu verarbeiten.

Am Ende (e = parse_expression()) kannst du dir einen Syntax-Baum erstellen lassen um den Ausdruck auszuwerten:
<+>
/ \
matrix matrix


terraNova
12.11.2013, 18:47

Wenn Du faul bist kannst du natürlich auch mit scanf und entsprechenden Formatierungen arbeiten, allerdings müsste die "Eingabe" dann auch in einem entsprechendem Format vorliegen.


s1nu
16.11.2013, 17:18

Wenn Du faul bist kannst du natürlich auch mit scanf und entsprechenden Formatierungen arbeiten, allerdings müsste die "Eingabe" dann auch in einem entsprechendem Format vorliegen;

Danke an euch alle, habe das mit scanf lösen können, da die Files immer die gleiche Formatierung haben müssen, war das die "einfachste" Lösung".


Ähnliche Themen zu [C] *.txt Files durchsuchen
  • [PHP] XML durchsuchen
    Hallo, ich muss derzeit in einer XML Datei nach einem bestimmten Wort suchen allerdings bekomme ich keine Ausgabe. Hier mal mein Quellcode: $request_url = ";example~com/feed/feed_timeline;xml?pam=port&count=300"; // 300 ist die Anzahl der angeforderten Datensätze $xml = simplexml_ [...]

  • lan durchsuchen
    gibt es ein programm mit dem man alle computer und user in einem netzwerk auflisten kann? bzw. durchsuchen? (für LAN z;B;) mfg zodiake [...]

  • Kann man DLC Files in RSD Files ändern?
    Weis jemand zufällig wie das geht? Wenn jemand weis wie das gehen sollte kann ich ihm eine Datei zu kommen lassen und er ändert es mir so um das ich es mit dem Prog RSD oder MSD öffnen kann. [...]



raid-rush.ws | Imprint & Contact pr