EA Programmieren in C

Dr Franke Ghostwriter
hat sich von euch schon jemand an die EA gesetzt und angefangen die Datenbank zu programmieren? Ich habe bisher noch nichts mit C gemacht und stolpere ein wenig vor mich hin. Ich komme mit allem recht gut klar, nur die Kunden-/Fahrzeug-/Vermietungsdatei bereitet mir echt kopfzerbrechen... irgendwie drehe ich mich im Kreis.
Hier also meine totale Laienfrage: Wie programmiere ich sowas?
Dankbar für jede Hilfe 😉
Gruß
 
Zuerst musst Du geeignete Strukturen für die Datenbanken definieren:
https://openbook.galileocomputing.de/c_von_a_bis_z/015_c_strukturen_001.htm

Dann musst Du anhand dieser Deklarationen für die drei Karteien (Kunden/KFZ/Vermietungen) Strukturarrays anlegen:
https://openbook.galileocomputing.de/c_von_a_bis_z/015_c_strukturen_006.htm

Auf diese Strukturen kannst Du dann zugreifen und diese als Karteien verwenden.

Zu Beginn und Ende des Programms solltest Du die Strukturen mit den entsprechenden Dateien auf der Festplatte synchronisieren:
https://openbook.galileocomputing.de/c_von_a_bis_z/016_c_ein_ausgabe_funktionen_009.htm

Eleganter wäre es natürlich, die DB als dynamische Strukturen mit verketteten Feldern zu konstruieren. Ich habe mich allerdings auf die genannte Basislösung beschränkt.
 
Also bei mir steht das Grundgerüst (Datenstrukturen und Hauptmenü) und die Kundenverwaltung (Menü 1 und 3) mit Eingabe und Datenspeicherung. Die Implementierung der Menüpunkte 2 und 4 wird vermutlich nicht viel mehr als eine Abwandlung davon sein.

Alles was ich dazu gebraucht habe, habe ich in den Beispielen B11-3 und B13-3 gefunden. Ich hoffe das hilft vielleicht noch dem ein oder anderen weiter.

Wie sieht es bei euch aus?
 
Habe es im Format JJJJMMTT (also z.B. 20131101) gemacht. Dann kann ich per Subtraktion direkt vergleichen.
Ich habe das auch so gemacht. Allerdings funktioniert der Vergleich
Code:
if ((Kundenvektor[i].abschluss - vergl_datum) <= 0 && (Kundenvektor[i].abschluss - vergl_datum) >= -365)
ja nicht so einfach, da das System dann ja mit ganzen Zahlen und nicht mit Datumswerten arbeitet. Magst du vielleicht erklären wie du das gemacht hast?
Das würde mir weiterhelfen.
 
ich habe bei der EA doch ziemliche Probleme und weiß nicht ob ich sie noch vollständig fertig bekomme. Insbesondere hab ich ein paar seltsame Fehler die ich einfach nicht gelöst bekomme 🙂

Weiß einer, ob es 0 Punkte gibt wenn das Programm nicht richtig arbeitet? Die Funktionalität selber (also dem Quellcode nach) ist aber eigentlich gegeben.

BTW: Weiß einer, warum ein Programm immer bei fclose abstürzt. sobald es schon Zeilen in der Datei gibt und sonst nicht?
 
Wenn das Programm nicht läuft gibt es wohl 25 Punkte Abzug. So wurde mir zumindest berichtet.
Ich hänge aber auch noch ganz schön. Habe einfach noch nie mit C programmiert, da finde ich das schon einen ganz schönen Brocken... vor allem, da scheinbar im Rest vom Skript C keine Anwendung mehr findet -.-
naja, ich habe nächstes Wochenende nochmal Zeit mich drum zu kümmern und dann wird es abgegeben; lauffähig oder nicht.
Gruß
 
Ich hänge aber auch noch ganz schön. Habe einfach noch nie mit C programmiert, da finde ich das schon einen ganz schönen Brocken
Die EA ist wirklich nicht ohne, vor allem wenn man sie fehlerfrei hinbekommen möchte.
Kleiner Tip: Fast alles was man dafür braucht findet man in den Lösungen der Übungsaufgaben oder den alten EAs. Code reinkopieren und nur noch an die Problemstellung anpassen. Kein Programmierer programmiert jedesmal wenn er z.B. eine lineare Liste benötigt diese neu....

Weiß einer, ob es 0 Punkte gibt wenn das Programm nicht richtig arbeitet? Die Funktionalität selber (also dem Quellcode nach) ist aber eigentlich gegeben.
Wegen ein paar Fehlern kriegt man bestimmt keine 0 Punkte. Hab mal irgendwo gelesen, dass man 25P Abzug bekommt wenn das Programm nicht lauffähig ist.
Ich denke mal das die Punkte auf die einzelnen Menüpunkte verteilt werden.

BTW: Weiß einer, warum ein Programm immer bei fclose abstürzt. sobald es schon Zeilen in der Datei gibt und sonst nicht? 🙂

Das kann man so nicht beantworten. Poste mal die Funktionen für das Lesen und das Schreiben der Datei.
 
Zuletzt bearbeitet:
Also weil du gerade was von Listen erzählst... ich arbeite in der EA immer direkt auf der Datei. D.h. wenn ich eine Miete vervollständigen will, gehe ich direkt die Datei durch und speichere die nicht erst in der Liste.

Mein Code z.B. für Kunden anlegen sieht wie folgt aus:

Code:
void kunde_erfassen()
{
    FILE *datei;
    KUNDE neu_kunde;
    struct tm datum;
    time_t zeit;
    int variante_datum;


    //aktuelle Kundennummer holen
    neu_kunde.k_id=akt_id(k_dat);
 
    printf("\nBitte Daten zum Kunden Nummer %d eingeben!", neu_kunde.k_id);

    //Datum auswählen lassen
    printf("\nAktuelles Datum fuer Vertragsbeginn? (1=ja, sonst manuelle Eingabe) ");scanf_s("%d", &variante_datum);

    //aktuelles Datum als Vertragsdatum
    if(variante_datum==1)
    {
        time(&zeit);    //aktuelle Zeit
        localtime_s(&datum, &zeit);
        neu_kunde.vertrag_beginn.tm_year=datum.tm_year;
        neu_kunde.vertrag_beginn.tm_mon=datum.tm_mon;
        neu_kunde.vertrag_beginn.tm_mday=datum.tm_mday;
    }
    else //Datum manuell einlesen
    {
        fflush(stdin);
        printf("\nBitte Tag eingeben (dd):");scanf_s("%d",&neu_kunde.vertrag_beginn.tm_mday);
        printf("Bitte Monat eingeben (mm):");scanf_s("%d",&neu_kunde.vertrag_beginn.tm_mon);
        printf("Bitte Jahr eingeben (yyyy):");scanf_s("%d",&neu_kunde.vertrag_beginn.tm_year);
    }


    //restliche Daten erfassen
    //hier werden Eingaben usw. getätigt
 
    //Datei öffnen, Kunden einschreiben, Datei schließen
    fopen_s(&datei, k_dat,"a+");

    fprintf(datei,"%d;%s;%s;%s;%s;%s;%s;%0d.%0d.%0d;\n",
        neu_kunde.k_id, neu_kunde.name, neu_kunde.vorname, neu_kunde.anschrift.strasse, neu_kunde.anschrift.hausnummer, neu_kunde.anschrift.plz,
        neu_kunde.anschrift.ort, neu_kunde.vertrag_beginn.tm_mday, neu_kunde.vertrag_beginn.tm_mon+1, neu_kunde.vertrag_beginn.tm_year+1900);

    fclose(datei);
}

Wenn die Datei kunden.txt leer ist, läuft alles sauber durch. Steht aber schon ein Datensatz drin, bricht das Programm bei fclose(datei) ab. Warum?! Keine Ahnung. Weiter oben rufe ich ja eine Hilfsfunktion neu_kunde.k_id=akt_id(k_dat); auf, welche mir die aktuelle ID liefert. In der öffne ich die Datei, zähle die vorhandenen Datensätze und schließe sie wieder. Das klappt ohne Probleme. Ich steige nicht ganz dahinter, auch in diversen Foren konnte man mir dabei nicht helfen :-\

Der Fehler der kommt lautet:
Unbehandelte Ausnahme bei 0x74686369 in Einsendearbeit.exe: 0xC0000005: Access violation.
 
ich arbeite in der EA immer direkt auf der Datei
Ich glaube das sollte man so nicht machen. In der EA steht:
Zu Beginn jeder Sitzung können die bereits vorhandenen Datendateien komplett in Felder eingelesen und von dort aus verarbeitet werden. Die Datendateien selbst müssen am Ende jeder Sitzung aktualisiert werden.
Der Fehler sieht nach einer Speicherverletzung aus. Sind wirklich alle Variablen die du in die Datei schreibst initialisiert ?

//restliche Daten erfassen
//hier werden Eingaben usw. getätigt
-->hier fehlt ja noch was

fopen_s(&datei, k_dat,"a+");
sollte da nicht fopen_s(&datei,"kunden.txt","a+"); stehen ?

passen die Datentypen ?
%s <-> hausnummer ist hausnummer tatsächlich ein String oder vielleicht ein int ?

versuch mal bei fprintf und fscanf mit Feldbreiten zu arbeiten:

fprintf(datei,"%6d %15s %10s %10s %10s %10s %10s %2d %2d 4d", variablen...
ich verstehe z.B. nicht, warum bei deinem Datum immer die Feldbreite 0 steht.

wenn du jetzt fscanf einsetzt, muss der String genauso wie oben sein.

Hier mal ein kleines Beispiel das funktioniert, vielleicht kannst du es als Ausgangspunkt verwenden und schrittweise erweitern, bis der Fehler auftritt.

Code:
// ConsoleApplication15.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

#include "stdafx.h"

void kunde_erfassen();
int auswahl;
int id;


int _tmain(int argc, _TCHAR* argv[])
{
   
    printf("Neuen Kunden erfassen 0= ja, 1 = nein");
    scanf("%d", &auswahl);
    while(auswahl==0)
    {
        printf("Geben sie die Kundennummer ein");
        scanf("%d", &id);
        kunde_erfassen();
       
        printf("Neuen Kunden erfassen 0= ja, 1 = nein");
        scanf("%d", &auswahl);
    }
}

void kunde_erfassen()
        {
            FILE *datei;
                     
                                         
                 
            fopen_s(&datei, "kunden.txt","a+");
       
            fprintf(datei,"%6d",id );
             
       
            fclose(datei);
        }
 
Zuletzt bearbeitet:
Als k_dat hab ich mittels #define als alias von kunden.txt erstellt. Die 0 beim Datum steht ja eigentlich dafür, dass führende Nullen mitgeschrieben werden. Z.B. wenn jemand 01.01.2013 schreibt. Hausnummer ist vom Typ string, weil eine 10a möglich sein soll.

Das seltsame ist ja wie gesagt, dass alles problemlos funktioniert, wenn die Datei kunden.txt leer ist. Sobald aber auch nur ein Datensatz darin enthalten ist, stürzt das Programm bei der fclose Anweisung ab. Den Datensatz schreib er jedoch ordentlich in die Datei. Klar wird es irgendein Speicherfehler sein, nur ist die Adresse, welche datei besitzt, vor und nach der fprintf Anweisung gleich. Theoretisch sollte also alles funktionieren :-\
 
Ich hab jetzt noch etwas probiert und es scheint nicht an fclose, sondern am Rücksprung in die main() funktion zu liegen. Füge ich nach fclose noch ein fprint auf der Console ein, erscheint diese Meldung noch und erst danach kommt der o.g. Fehler.

Meine main sieht wie folgt aus:
Code:
void main(void)
{
    int auswahl;

    printf("Programm: Informationssystem fuer eine Autoverleihfirma");

    //Wiederholen bis Progammende als Menüauswahl gewählt wird

    do
    {
        printf("\n\nBitte waehlen Sie aus den folgenden Menuepunkten:");

        printf("\n\n1: Kunde erfassen\n2: Fahrzeug erfassen\n3: Kundenliste anzeigen"
              "\n4: Fahrzeugliste anzeigen\n5: Fahrzeug vermieten\n6: Fahrzeug zuruecknehmen"
              "\n7: Vermietbare Fahrzeuge anzeigen\n8: Abrechnungsliste anzeigen\n9: Programm beenden");

        printf("\n\nNumerische Wahl: ");scanf_s("%d",&auswahl); //Option auswählen

        switch(auswahl)
        {
            case 1:kunde_erfassen();break;
            case 2:fahrzeug_erfassen();break;
            case 3:liste_ausgeben(k_dat);break;
            case 4:liste_ausgeben(f_dat);break;
            case 5:vermietung_anlegen();break;
            case 6:vermietung_beenden();break;
            case 7:vermietbare_fahrzeuge();break;
            case 8:abrechnung_erstellen();break;
        };

    }    while(auswahl!=9);
}

Und beim Rücksprung fliegt das ganze dann auseinander. Vielleicht hat er "auswahl" bis dahin schonwieder vergessen?
 
Und beim Rücksprung fliegt das ganze dann auseinander. Vielleicht hat er "auswahl" bis dahin schonwieder vergessen?
Die main() sieht ganz in Ordnung aus. Auswahl hat er nicht vergessen.Spielt hier auch keine Rolle. Der Rücksprung erfolgt hinter case 1:kunde_erfassen();
d.h. als nächstes macht er break(ausstieg aus switch) und dann geht es wieder mit do {... weiter und es wird ein neuer Wert für auswahl geschrieben.

Wenn es mit einer leeren Datei keine Problem gibt, könnte das ein Hinweis dafür sein, dass es irgendwo beim lesen der Daten aus der Datei zu Problemen kommt. Daher der Hinweis das die Formatstrings beim Lesen und Schreiben identisch sein müssen.
 
ich wäre echt dankbar, wenn mir einer sagen könnte, was ich in Folgendem Code falsch mache.
Sitze hier schon seit 2 Stunden und bekomme nur Fehlermeldung

while (fscanf(fKundendatei, "%i %s %s %s %s %s %s %s %i %s",
&KUNDE.KundenID,
&KUNDE.name,
&KUNDE.vorname,
&KUNDE.vertragsbeginndatum.Tag,
&KUNDE.vertragsbeginndatum.Monat,
&KUNDE.vertragsbeginndatum.Jahr,
&KUNDE.kundenAdresse.strasse,
&KUNDE.kundenAdresse.hausnummer,
&KUNDE.kundenAdresse.plz,
&KUNDE.kundenAdresse.stadt) != EOF)


PAUSE;

}


Felermeldung:Unbehandelte Ausnahme bei 0x65f413af (msvcr100d.dll) in Ausleihsystem.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x0000004b.

Kompilieren geht, schreiben in die Kundendatei geht auch.


Vielen Dank schon mal!
Susanne
 
Ich habe heute die EA zurück bekommen
  • Programm ist angeblich nicht lauffähig => bei mir hat es auf drei unterschidelichen Rechnern funktioniert ==> -25P
  • Aufgabenteil a) angeblich nicht gelöst oder nicht als Lösung kenntlich gemacht (LOL - auf der ersten Seite standen die Typendefeinitionen mit Kommentar kenntlich gemacht, stand nur nicht a) dran) ==> -10P
  • und dann gut strukturiertes Programm das alle geforderten Funktionen berücksichtigt (wie soll das gehen wenn ich a) nicht gemacht hätte?)
Naja, egal 65 Punkte ist bestanden und das reicht
 
Ich habe heute die EA zurück bekommen
  • Programm ist angeblich nicht lauffähig => bei mir hat es auf drei unterschidelichen Rechnern funktioniert ==> -25P
  • Aufgabenteil a) angeblich nicht gelöst oder nicht als Lösung kenntlich gemacht (LOL - auf der ersten Seite standen die Typendefeinitionen mit Kommentar kenntlich gemacht, stand nur nicht a) dran) ==> -10P
  • und dann gut strukturiertes Programm das alle geforderten Funktionen berücksichtigt (wie soll das gehen wenn ich a) nicht gemacht hätte?)
Naja, egal 65 Punkte ist bestanden und das reicht 😉
Hmm, dieselben Kommentare hatte ich auch, inkl. Gesamtpunktzahl
 
Oben