durch den nutzter daten löschen



  • hallo alle zusammen

    ich bin studentin und bin anfänger im programmieren in c wir lösen in userem kurs jede woche eine programmieraufgabe am pc und haben uns so dann das programmieren durch learning by doing beigebracht nun bin ich mittlerweile bei der letzten programmier aufgabe angekommen (juhu :D) aba die is echt schwer ich hoffe ihr könnt mir weiter helfen.

    also die aufgabe is folgende:

    5 bewohner wohnen in einer wg und ich soll jetzt ein programm zu telefonkostenverwaltung schreiben.

    Das Programm soll folgendes menü enthalten:
    1. Gespräch eingeben
    2. (falsch eingegebenes) Gespräch löschen
    3. Gespräche eines Monats löschen
    4. Monatsrechnungen
    5. Programm beenden
    zusätzlich sollen für jedes Gespräch die BewohnerInnen ihren Namen, das Datum, die Anfangsstunde, die Gesprächsdauer
    in Minuten und Sekunden und die Entfernung eingeben können (Menüpunkt 1). Um diese Daten zu
    speichern, erstellt man am besten einen strukturierten Datentyp (struct), in dem alle Merkmale eines Gespräches
    zusammengefasst werden können. Sämtliche Gespräche speichert man dann in einem Feld. Die
    Definition des strukturierten Datentypes und des Feldes könnte etwa so aussehen:
    struct telefonat
    {
    int dauer;
    ...;
    };
    struct telefonat gespraeche[100];
    Wir sollen der einfachhalthalber davon ausgehen, dass es 3 tarifzonen gibt: Ort, Fern und Ausland.

    Dauer einer Einheit à 0,06
    Euro in Sekunden
    Zeit Ort Fern Ausland
    0 - 2 240 25 9
    2 - 5 240 20 9
    5 - 9 150 20 9
    9 - 12 90 11,5 7,2
    12 - 18 90 12,5 7,2
    18 - 21 150 20 9
    21 - 24 240 25 9
    wir sollen diese tabelle in einem 2 dimensonalen feld abspeichern.
    z.B.: float tarifliste[24][3]
    Wenn ein Gespräch über die Geltungsdauer mehrerer Tarifzeiten stattfindet, so gilt für das ganze Gespräch die Tarifzeit, in der es angefangen hat.

    Schreibt eine Funktion einheiten, der ihr die Anfangsstunde, die Gesprächsdauer und die Tarifzone übergebt.
    In dieser Funktion könnt Ihr die eben beschriebene Tabelle verwenden und als Rückgabewert die Anzahl der vertelefonierten Einheiten zurückgeben.

    In der Monatsrechnung soll, für jeden Bewohner einzeln, tabellarisch jedes Gespräch mit Datum, Dauer,
    Anzahl der Einheiten, Kosten des Einzelgesprächs sowie der Monatssumme aufgeführt werden. Die Ausgabe auf dem Bildschirm genügt.

    Gespräche sollen für beliebige Daten und Zeiten eingegeben und gelöscht werden können - nicht nur immer das jeweils zuletzt eingegebene.

    Vor dem Löschen der Gespräche soll eine Liste der bereits vorhandenen Gespräche auf dem Bildschirm ausgegeben werden. Beim Löschen sollen keine Lücken entstehen; die freien Speicherplätze bei einer festen
    Feldgröße von bspw. 100 sollen sich immer am Ende befinden.

    Da es natürlich wenig sinnvoll ist, dass die Daten nach Beenden des Programms verloren gehen, sollen sie vorher in eine Datei geschrieben und beim Programmstart von dieser wieder eingelesen werden.

    Den menüpunkt 1 hab ich eig. schon ganz fertig aba der menüpunkt 2 und 3 bereiten mir schwierigkeiten. wie kann ich bewirken, dass etwas aus dem struct gelöscht wird nur durch die eingabe des benuzters????

    wär cool wenn mir jemand nen anhaltspunkt geben könnte

    danke schon ma 🙂


  • Mod

    Wenn du einen Eintrag löschen möchtest, könntest du zum Beispiel den letzten Eintrag an die Stelle kopieren (und das zu löschende Element dabei überschreiben), das vorletzte Element ist danach das neue letzte Element. Oder falls die Reihenfolge wichtig ist, dann alle folgenden Elemente um eine Position nach vorne kopieren.

    P.S.: Und float ist ein denkbar ungeeigneter Datentyp für Geld. Hast du dir das selber ausgedacht oder ist das eine Vorgabe? Falls du selber die Wahl hast: Eine einfach umzusetzende, aber trotzdem gute, Methode wäre es, stattdessen in Cents zu rechnen und als Datentyp int zu nehmen.



  • Wenn Du sowieso mit structs arbeitest, pflege doch lieber ein Attribut "char geloescht" mit ein und setze das auf '1', sobald Du den Datensatz löschen möchtest. Dann musst Du an den passenden Stellen abfragen, ob der Datensatz gelöscht ist. Das kommt etwas näher an übliche Programmierpraxis heran, als das wirkliche Löschen. Nichts ist schöner, als dem Kunden die Möglichkeit zu geben, Datensätze einfach zu entfernen und sich später rechtfertigen zu müssen, wo denn die ganzen Daten hin verschwunden sind 🙂



  • Das mit dem Löschkennzeichen kenn ich auch noch - ist aber heutzutage nicht
    mehr wirklich aktuell. Heute schreibt man Log-Dateien um so was nachvollziehen
    zu können. In Datenbanken werden sogar für sowas Trigger verwendet.
    Das Lösch-Byte kommt noch aus alten Großrechner-ISAM-Zeiten, wo es noch
    keine VSAM-KSDS gab.



  • pferdefreund schrieb:

    Das mit dem Löschkennzeichen kenn ich auch noch - ist aber heutzutage nicht
    mehr wirklich aktuell. Heute schreibt man Log-Dateien um so was nachvollziehen
    zu können. In Datenbanken werden sogar für sowas Trigger verwendet.
    Das Lösch-Byte kommt noch aus alten Großrechner-ISAM-Zeiten, wo es noch
    keine VSAM-KSDS gab.

    Hast du einen Artikel der diese Historien-Verwaltung genauer beschreibt und Vor/Nachteile aufzeigt?

    MfG SideWinder



  • LogFiles für derartige, sensible Benutzeraktionen bieten sich generell an.
    Frei nach dem Motto: Glaube keiner Statistik, die Du nicht selbst gefälscht hast.
    So kann man im Zweifel zumindest nachvollziehen wann etwas passiert ist, optimalerweise auch wie, wo und durch wen.

    Ansonsten ist das logische Löschen m.E. nicht deprecated, sondern situationsabhängig eventuell weniger elegant als Alternativen. Die gibt es aber sicherlich. Nur in puncto Sätze in Dateien schreiben kann man sicher mit einem char byte '1' / '0' als Flag prima zurechtkommen.



  • Nö, nen Artikel hab ich dazu nicht -aber in unserer Firma wird bei
    Reorga- und Archivierungsläufen so vorgegangen.
    Die zu löschenden Segmente (hier IMS-Datenbank) werden auf
    Band ausgelagert und dann gelöscht. Dazu gibt es dann ein Druckprogramm, mit
    dem man die alten Daten ggf wieder auslesen und anlisten kann.
    Auch SAP hat so ein Verfahren - da heißt es Änderungsbelege und bei
    Postgresql kann man sowas mit Triggern realisieren und in eine Änderungslog-Tabelle schreiben. Mach ich z. B. bei meiner selbstentwicklten Pferdeverwaltung. Hier werden alle Änderungen der Pferde, Besitzer- und Stallbetreiberdaten per
    Trigger in eine Änderungstabelle gestellt (sogar auf Feldebene), wobei der
    Trigger direkt in der Datenbank als pl/sql-Prozedur realisiert ist. Das hat den Vorteil, daß die Änderungen geloggt werden, egal ob per Programm, psql oder was auch immer auf die Datenbank zugegriffen wird.



  • "Wenn du einen Eintrag löschen möchtest, könntest du zum Beispiel den letzten Eintrag an die Stelle kopieren (und das zu löschende Element dabei überschreiben), das vorletzte Element ist danach das neue letzte Element. Oder falls die Reihenfolge wichtig ist, dann alle folgenden Elemente um eine Position nach vorne kopieren. "

    danke das hilft mir schon auf die sprünge, aber wie kann ich dann auf das struct zugreifen und sagen verschiebe es um ein nach oben bzw. verschiebe alle um eins nach oben wie schreibt man das auf :S???

    danke für den tipp mit den cents ich werd das so machen das is erlaubt int zu benutzten 🙂


Anmelden zum Antworten