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ß
Comments
Klangfreund
Contributions on this page: 8
View profileZuerst musst Du geeignete Strukturen für die Datenbanken definieren:
[url]https://openbook.galileocomputing.de/c_von_a_bis_z/015_c_strukturen_001.htm[/url]
Dann musst Du anhand dieser Deklarationen für die drei Karteien (Kunden/KFZ/Vermietungen) Strukturarrays anlegen:
[url]https://openbook.galileocomputing.de/c_von_a_bis_z/015_c_strukturen_006.htm[/url]
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:
[url]https://openbook.galileocomputing.de/c_von_a_bis_z/016_c_ein_ausgabe_funktionen_009.htm[/url]
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.
DaHias
Contributions on this page: 4
View profileHabt ihr da ne eigene Struktur fürs Datum definiert?
also so:
typedef struct
{
int tag;
int monat;
int jahr;
} DATUM;
Wie vergleich ich denn damit ein anderes Datum?
Klangfreund
Contributions on this page: 8
View profileHabe es im Format JJJJMMTT (also z.B. 20131101) gemacht. Dann kann ich per Subtraktion direkt vergleichen.
DaHias
Contributions on this page: 4
View profileAh das is nen guter Tipp! Aber das klappt dann ja auch nur beim Vergleich, nicht aber bei der Berechnung der Miettage oder?
Klangfreund
Contributions on this page: 8
View profileDie Miettage habe ich nach dem gleichen Prinzip (also normales Subtrahieren) berechnet.
Jochen104
Contributions on this page: 8
View profileAlso 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?
DaHias
Contributions on this page: 4
View profileVielleicht mach ichs mir irgendwie noch selbst zu kompliziert, aber fast 800 Zeilen Code find ich dann doch etwas viel für eine EA. Bin aber ähnlich weit wie Jochen104. Kämpfe noch mit den Auswertungen...
Jochen104
Contributions on this page: 8
View profileIch habe das auch so gemacht. Allerdings funktioniert der Vergleich
[CODE]if ((Kundenvektor[i].abschluss - vergl_datum) <= 0 && (Kundenvektor[i].abschluss - vergl_datum) >= -365)[/CODE]
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.
Klangfreund
Contributions on this page: 8
View profileMein Vergleich war der: Datum_1 minus Datum_2 muss <= 10000 sein, dann ist der Kunde aktiv.
Jochen104
Contributions on this page: 8
View profileStimmt, ist ja ganz einfach. Hab wohl etwas auf dem Schlauch gestanden.
Du musst aber auch überprüfen, ob der Wert >= 0 ist:
Ein Vertag der am 12.11.2013 geschlossen wird, ist bis zum 11.11.2014 gültig. Das Alle Werte (also kleiner 0 oder größer 10000) sind daher inaktiv.
Klangfreund
Contributions on this page: 8
View profileJa, stimmt, danke. Habe die EA schon abgeschickt, habe daher die Bedingung aus dem Kopf aufgeschrieben, nur um das Prinzip darzustellen
Jochen104
Contributions on this page: 8
View profileHast du auch noch einen Tipp wie du die Berechnung bei der Abrechnungliste gemacht hast? 20131013 bis 20131113 sind nämlich nur 30 und keine 100 Tage ;)
Danke schon mal!
Klangfreund
Contributions on this page: 8
View profileHmm, hast recht. Da habe ich wohl einen Fehler drin.
radiac
Contributions on this page: 5
View profileich 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?
Lexi_L
Contributions on this page: 4
View profileWenn 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ß
caro-1
Contributions on this page: 4
View profileDie 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....
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.
Das kann man so nicht beantworten. Poste mal die Funktionen für das Lesen und das Schreiben der Datei.
radiac
Contributions on this page: 5
View profileAlso 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;
printf("\nBitte Daten zum Kunden Nummer %d eingeben!", neu_kunde.k_id);
//Datei öffnen, Kunden einschreiben, Datei schließen
fopen_s(&datei, k_dat,"a+");
}[/CODE]
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.
caro-1
Contributions on this page: 4
View profileIch 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);
}[/CODE]
radiac
Contributions on this page: 5
View profileAls 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 :-\
radiac
Contributions on this page: 5
View profileIch 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;
}[/CODE]
Und beim Rücksprung fliegt das ganze dann auseinander. Vielleicht hat er "auswahl" bis dahin schonwieder vergessen?
caro-1
Contributions on this page: 4
View profileDie 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.
radiac
Contributions on this page: 5
View profileNaja, aber nach dem Schreiben in die Datei und dem fclose, gibt es wie gesagt keine Fehlermeldung. Erst beim Funktionsende. Und nach dem Funktionsende wird ja nicht sofort eine neue Datei geöffnet bzw. daraus gelesen.
Thuthi
Contributions on this page: 1
View profileich 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
chris*
Contributions on this page: 1
View profileDas kann man, ohne mehr Code zu sehen, nicht beantworten.
vok2012
Contributions on this page: 1
View profileprüfe mal wo ein "&" nötig ist und wo nicht. Und du nutzt wohl Visual Studio? Versuche den Code mal in z.B. Code::Blocks.
Lexi_L
Contributions on this page: 4
View profilehabt ihr schon Rückmeldung von der Einsendearbeit bekommen?
Jochen104
Contributions on this page: 8
View profileNein, leider noch nichts gehört.
Jochen104
Contributions on this page: 8
View profileIch habe heute die EA zurück bekommen
[LIST]
[*]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?)
[/LIST]
Naja, egal 65 Punkte ist bestanden und das reicht
Klangfreund
Contributions on this page: 8
View profileHmm, dieselben Kommentare hatte ich auch, inkl. Gesamtpunktzahl
Lexi_L
Contributions on this page: 4
View profiledito xD
und ich hatte sogar "Teilaufgabe a)" über den Definitionen stehen und dann "Teilaufgabe b)" vor dem gesamten Programmcode :P
DaHias
Contributions on this page: 4
View profileIch hab genau die gleichen Bemerkungen + Punkte?! :confused
caro-1
Contributions on this page: 4
View profileDa muss ich mich auch anschließen.
Wenn Visual Studio empfohlen wird, dann sollte doch der Korrektor eine entsprechende Laufzeitumgebung haben. Das kann man nicht den Studenten ankreiden. Na egal, Hauptsache bestanden.
Jochen104
Contributions on this page: 8
View profileErnsthaft? Das ist doch lächerlich!
Du hast die gleichen Kommentare, aber die volle Punktzahl?
Klangfreund
Contributions on this page: 8
View profileGleiche Kommentare & gleiche Gesamtpunktzahl
Jochen104
Contributions on this page: 8
View profileOk, dann hatte ich dich nur falsch verstanden. Trotzdem ärgerlich...