Würde mich gern mal mit C befassen

Es gibt 196 Antworten in diesem Thema, welches 20.614 mal aufgerufen wurde. Der letzte Beitrag (24. Mai 2023 um 15:33) ist von Axellander.

  • Wie ergibt sich aus den CSV-Daten, daß Hugo Huber der Vater von Albert Huber ist?

    Das ergibt sich aus dem Dateiformat. 1. Person, 2. Vater, 3. Mutter. Aber, ja, das würde problematisch werden wenn die Eltern mehr als ein Kind hätten. Man kann natürlich einen Verweis einbauen, wer die Eltern von welcher Person sind, aber das wird dann schon komplizierter. Der Verweis auf den Namen reicht nicht, weil der nicht eindeutig sein muss. Man könnte natürlich auch einen Indexverweis verwenden oder eine PersonenId vergeben, was auf jeden Fall die beste Variante wäre, weil dann die Reihenfolge egal wäre und es auch keine Rolle spielt ob für jemanden nur der Vater oder nur die Mutter vorhanden ist.

  • Wie ergibt sich aus den CSV-Daten, daß Hugo Huber der Vater von Albert Huber ist?

    Das ergibt sich aus dem Dateiformat. 1. Person, 2. Vater, 3. Mutter.

    Leider nein:

    Code
    Albert Huber,1910
    Charlotte Klein,1912
    Utz Lang,1917
    Berta Waldhorst,1920
    Hugo Huber,1889

    Hugo Huber ist 5., nicht 2. Da bestehen noch mehr Beziehungen zwischen den einzelnen Zeilen (Stammbaum), die aber nicht so offensichtlich sind.

    Woher weiß ich das? Ich hab' das "1 - 2 - 3" in Python gemacht, und festgestellt, daß das nicht ausreicht, um denselben Output zu bekommen.

  • Wie ergibt sich aus den CSV-Daten, daß Hugo Huber der Vater von Albert Huber ist?

    Das ergibt sich aus dem Dateiformat. 1. Person, 2. Vater, 3. Mutter.

    Leider nein:

    Code
    Albert Huber,1910
    Charlotte Klein,1912
    Utz Lang,1917
    Berta Waldhorst,1920
    Hugo Huber,1889

    Hugo Huber ist 5., nicht 2. Da bestehen noch mehr Beziehungen zwischen den einzelnen Zeilen (Stammbaum), die aber nicht so offensichtlich sind.

    Woher weiß ich das? Ich hab' das "1 - 2 - 3" in Python gemacht, und festgestellt, daß das nicht ausreicht, um denselben Output zu bekommen.

    Eben mußte ich mir die Datei nochmal anschauen. Also die stimmt:

    Erst kommt der Sohn, Hansi Huber, dann die Eltern: Robert Huber und Ute Schmitt, dann die Großeltern: Albert Huber, Charlotte Klein, Utz Lang und Berta Waldhorst. Dann die Urgroßeltern: Hugo Huber, usw.

    Klar kann man noch die Geschwister, 1. und weitere Ehefrauen berücksichtigen etc.

    Aber mir ging es hier nur um 1.: Die Pointertechnik in einer Struktur. 2.: Daten aus einer Datei auslesen und 3.: Rekursives Durchsuchen einer Baumstruktur.

    Zum Thema Baumstruktur:

    So wie es in dem Bsp. mit einem Array pf mit fester Anzahl Elementen ist, ist ja eigentlich auch nicht so toll.

    Normalerweise würde man das doch folgendermaßen machen oder?:

    Datensatz einlesen, Speicher für das Strukt "Person" allozieren und in den Baum hängen.

    Mit den Zeigern auf die Baumelement ist ja dann auch das Einfügen, Löschen und Verschieben ganz einfach. Einfach nur die Zeiger umbiegen.

    (Hatte ich letztens mal in dem Buch "C von A bis Z" von Jürgen Wolf entdeckt und direkt bestellt. Das gibt's auch online.)

  • Eben mußte ich mir die Datei nochmal anschauen. Also die stimmt:Erst kommt der Sohn, ... dann die Eltern ... dann die Großeltern ... dann die Urgroßeltern

    Ah, danke! Dann also so (ist ja nicht so ganz einfach, das muß man erstmal aufdröseln) (Sowas braucht man normalerweise, um die gesetzliche Erbfolge zu bestimmen. ;) )

    Bzgl. der Umsetzung würde man wohl einen "binären Baum" verwenden. Ich finde hier ein C-Tutorial dazu:

    Bitte melde dich an, um dieses Medienelement zu sehen.

    Und Bitte melde dich an, um diesen Link zu sehen. den zugehörigen Beispielcode.

    Ja gut, im Lehrbuch des (ersten Semesters des) Fernstudiums zur strukturierten Programmierung (in dem Fall in Pascal) waren "binäre Bäume" aber auch eines der letzten, also fortgeschrittensten Kapitel.

  • Ja gut, im Lehrbuch des (ersten Semesters des) Fernstudiums zur strukturierten Programmierung (in dem Fall in Pascal) waren "binäre Bäume" aber auch eines der letzten, also fortgeschrittensten Kapitel.

    Wir hatten das schon in der Schule im Informatik-Grundkurs, bevor es mit Assembler weiterging und wir Einplatinencomputer gebaut haben.

  • Wir hatten das schon in der Schule im Informatik-Grundkurs, bevor es mit Assembler weiterging und wir Einplatinencomputer gebaut haben.

    Pics, or it didn't happen. :)

    @all: Ich knabber gerade immer noch daran, wie man einen binären Baum am besten in einer Textdatei speichert, bzw. wie man zwischen einem binärem Baum und einem Array hin- und herkonvertiert. Dazu finde ich schon was, da ist die Rede von "Preorder" und "Inorder" bei dem Baum. Ach, es wird schon wieder so kompliziert, vor allem in C.

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

    Wie man es dreht und wendet, die Dinge sind in Python einfach einfacher, und dadurch schneller getan ...

  • Ich würd das so als CSV Datei speichern.

    # ID; Daten; Söhne

    0; "Paps"; 2,3

    Das 3. Element zerlegst Du dann mit split und bekommst die IDs aller Söhne. So irgendwie halt

  • Das 3. Element zerlegst Du dann mit split und bekommst die IDs aller Söhne. So irgendwie halt

    Das hätte ich auch so gedacht, mit 'ner ID. In dem ersten verlinkten Artikel in meinem Posting vorher steht aber, es genüge schon, die Stellen des Arrays dafür zu nutzen.

    Dafür müsse der Baum aber in einem bestimmten Format sein.

    So daß dann also eindeutig ist, "Stelle 0" im Array bedeutet "Position sowieso" im Baum.

    Fehlen gewisse Äste im Baum (in Ingos Beispiel bisher nicht der Fall), müsse man an den entsprechenden Stellen im Array eben "-1" oder sowas schreiben.

    Insgesamt so ein typisches abstraktes Informatikproblem. ;)

    Edit: Ich dachte gerade, sowas kapseln Informatiker doch gern in Modulen, so daß jemand wie ich sich nicht im Detail damit zu beschäftigen braucht. Und Bitte melde dich an, um diesen Link zu sehen. ...

  • Die IDs ersetzen funktional die Pointer des Baums im Speicher.

    Insofern sollte es reichen, als ID dann die Position des bezeigten Elements relativ zum Dateianfang anzugeben, z.B. gezählt in Bytes.

  • Insofern sollte es reichen, als ID dann die Position des bezeigten Elements relativ zum Dateianfang anzugeben, z.B. gezählt in Bytes.

    Den Index des Elements, aber nicht den Offset in Bytes. Der Offset wäre etwas problematisch (z.B. bei Erweiterungen) und wäre auch nicht unbedingt portierbar.

  • Insofern sollte es reichen, als ID dann die Position des bezeigten Elements relativ zum Dateianfang anzugeben, z.B. gezählt in Bytes.

    Den Index des Elements, aber nicht den Offset in Bytes. Der Offset wäre etwas problematisch (z.B. bei Erweiterungen) und wäre auch nicht unbedingt portierbar.

    Ich hatte das als Übungsaufgabe fürs Serialisieren und Deserialisieren verstanden, bei der nicht erwartet wird, dass in den Dump-Dateien rumeditiert wird.

    Aber Zeilennummer als ID ist sinnvoller für ein CSV-Textformat, ja.

  • Ich hatte das als Übungsaufgabe fürs Serialisieren und Deserialisieren verstanden, bei der nicht erwartet wird, dass in den Dump-Dateien rumeditiert wird.

    Kann schon sein, aber trotzdem sollte man nicht unbedingt potentielle Fehler einbauen, wenn man es leicht vermeiden kann. Wenn man z.B. nicht nur den Vater sondern auch die Mutter abbilden will dann ändert sich eben die Strukturgrösse und die Angaben stimmen nicht mehr. Das ist eine Änderung die eigentlich recht plausibel ist. Auch bei einer Übungsaufgabe.

  • Offenbar gibt es in der Standard C-Bibliothek Funktionen, um mit binären Bäume zu arbeiten, z.B. um sie zu durchsuchen: "tsearch()", "tfind()", "tdelete()", "twalk()" und "tdestroy()".

    Bitte melde dich an, um diesen Link zu sehen.

    Hier das Code-Beispiel aus der man-Seite:

    Schon das kleine Beispiel kann ich kaum verstehen, und "tree2array()" sowie "array2tree()" zu schreiben, wird mir auch zu kompliziert. Das kann man auch kaum noch in so einem Forum diskutieren, weil alle auf sehr verschiedenen Kenntnisständen sind, und die meisten dann aussteigen. Ist mir auch schon in anderen C-Foren aufgefallen. Verfluchtes C.

  • Standard C-Bibliothek Funktionen

    In der Tat ist eine Sache verwirrend bei C: es gibt den ISO C Standard, der die Sprache allgemein definiert, und außerdem den Posix-Standard, der Schnittstellen für Unix-Betriebssysteme definiert. tsearch ist Teil des letzteren und damit leider eher nicht portabel (z.B. kennt der Microsoft Compiler es m.W. nicht). Solange es um portable Programme geht, zählt eigentlich nur der ISO Standard, und da musst Du den binären Baum leider von Hand programmieren ^^.

    ────────────────────────────────────────────────────────────
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.
    ────────────────────────────────────────────────────────────

  • Ein gut gemeinter Rat: Vergiss C zu lernen auf dem Amiga!

    Mir ist noch kein gutes Buch zu C auf dem Amiga über den Weg gelaufen.

    Versuch zu schauen was du für Bücher zu C unter Windows findest, erlern dort die Grundlagen und dann erst schaust du dir C auf dem Amiga an.

    Gute C Bücher ist auch so eine Sache. C++, die "Erweiterung" von C blende erst mal komplett aus, fang mit reinem C an. Da ein gutes Buch finden, in deutsch ist nicht so einfach. Schau dir da mehrere (online pdf Bücher) an, lies die ersten Seiten an und vergleich welches du verstehen kannst. Wenn du gar nichts verstehst, weglegen, nächstes Buch. Mit der Methode besuch dann aber auch mal deine Stadtbibliothek und einen Buchladen. Es dauert etwas bis man "sein" C-(Lern)Buch gefunden hat.

    Viel Erfolg!

    Dem kann ich nur zustimmen.