Herausfinden der ältesten Personen in einer Personaldatei
-
Hallo,
ich habe heute eine Aufgabe gestellt bekommen, mit der ich so überhaupt nicht zurecht komme.
------------------------------------------------------------------------------
Aufgabe 1:Gegeben sind Dateien mit Listen von Vornamen, Nachnamen, Strassen- und Ortsnamen. Jeder Name steht steht in der jeweiligen Datei in einer einzelnen Zeile.
Daraus sollen eine Million zufällige Adressen gebildet werden. Zufällige Doppel sind zulässig.
Zusätzlich soll jede Adresse um ein zufälliges Geburtsdatum zwischen dem 1.1.1900 und dem 15.7.2005 ergänzt werden.
Die so erzeugten Personendaten sollen in einer CSV Datei vom Format<Name>;<Vorname>;<Geburtsdatum>;<Strasse>;<Ort><CRLF>
abgespeichert werden. Das Geburtsdatum soll als Klartext im Format dd.mm.yyyy dargestellt werden. Sie dürfen davon ausgehen, dass jede Zeile eines Datensatzes maximal 512 Zeichen lang ist.
Beispiel:
Müller;Hans;17.04.1978;Friedrichstrasse;Hamburg
Maier;Johanna;31.10.1941;Gartenstrasse;KölnBei der Wahl des Geburtsdatums ist darauf zu achten, dass eine halbwegs realistische Altersverteilung gewählt wird. Es sollen sich z.B. deutlich weniger extrem alte bzw. extrem junge Menschen in der Datei befinden. Beachten Sie bitte auch Schaltjahre.
Aufgabe 2:
Schreiben sie ein Programm, welches die in Aufgabe 1 generierte Datei liest und die 200 ältesten Personen ermittelt, die an einem Sonntag geboren sind. Die Daten dürfen dabei nicht komplett im Arbeitsspeicher gehalten werden. Versuchen Sie mit maximal 400 Datensätzen im Arbeitsspeicher auszukommen.
Verwenden Sie zur Zwischenspeicherung folgendes Struct:struct person {
char *name;
char *givenname;
unsigned long birthdate;
char *adress;
char *city;
char data[];
};Die Ausgangsdatei darf bei der Auswertzung nur ein mal gelesen werden.
Die Daten der 200 ältesten Personen sollen in eine Datei vom gleichen Format, wie in Afg. 1, beschrieben ausgegeben werden.
------------------------------------------------------------------------------Ich kann meinem Dozenten erst mal ein sehr schlechtes Deutsch bescheinigen, also ich weiss nicht so recht, was er überhaupt will. Kann mir das jemand übersetzen?
Auf den ersten Blick fallen mir gleich mehrere Fragen auf. Was versteht er unter einer realistischen Altersverteilung? Was soll das Feld data[] im Struct? Ist das ein Schreibfehler? Was soll data überhaupt? Wieso soll ich eine long für das Geburtsdatum nehmen und wie geht das überaupt? Wie bekomme ich heraus, ob es ein Schaltahr ist und wie bekomme ich heraus, ob es ein Sonntag ist?
Fragen über Fragen. Meine Kommilitonen sind auch alle ratlos und wir fragen uns, ob diese Frage für einen Anfängerkurs nicht etwas übertrieben ist. Zur Lösung haben wir nur zwei Wochen Zeit.
Vielleicht ist noch wichtig, welchen Compiler wir verwenden müssen. Es ist der Dev-C++ 4.9.9.2 unter Windows 2000.Könnt ihr mir helfen?
DANKE,
Ines
-
Ist doch, bis auf eins, zwei kleine Tippfehler korrektes Deutsch.
Mit realistischer Altersverteilung ist gemeint, das Personen des Jahrgangs 1900 eher seltener anzutreffen sind, als Personen vom Jg. 1965 z.b.Machste ne Glockenkurve mit dem Maximum um 1960 rum, das sollte langen, auch wenn es in Wirklichkeit wohl eher diese Zwiebelform ist, die man von Alterstatistiken kennt. Linktipp -> Statistisches Bundesamt.
Das <CRLF> ist ein Newline/Enter. Also eine neue Zeile in der Textdatei.
Das Geburtsdatum soll sicherlich als "Sekunden seit dem 1.1.1900 angegeben werden, deswegen die long. Schau dir mal http://www.cppreference.com/stddate/
an, ob da Funktionen bei sind, die dir Umrechenarbeit abnehmen können.
-
Hallo Ines,
so trifft man sich wieder. Auf die Frage hab ich schon gewartet.
Kommen wir erst mal zur Frage, wie man eine verbeulte Altersverteilung bekommt. Du brauchst eine S-förmig geschwungene Transformationsfunktion für die von rand() gelieferten Werte. Dafür bietet sich eine gebrochen rationale Funktion an.
Nun willste auch noch Schaltjahre berücksichtigen und das geht am leichtesten, wenn man die Zeit linearisiert - Also z.B. Tage oder Stunden seit dem 1.1.1900 Sekunden gehen nicht, weil Dir sonst ne 32 Bit long um die Ohren fliegt. Damit kannste dann auch ein Datum gleich in ne long packen.
Nun ja, Du suchst nur Sonntage und jede Woche ist glücklicherweise nur exakt 7 Tage lang
Beim Suchen der exponierten Teilmenge solltest Du nen Heap verwenden. Ihr hattet doch bestimmt Heapsort durchgenommen? Schau Dir das nochmal an, da steckt die Idee drin!
Das Feld data[] ist kein Schreibfehler, sondern ist ein Bezeichner für den Bereich, wo die eigentlichen Nutzdaten reinsollen. Die Zeiger sollen vermutlich in das Feld data[] zeigen. Wühl auch mal im Spotligtht Forum, doert hatte eine gewisse Sonja die gleichen Probleme und bekam Antworten.
Die Aufgabe ist tatsächlich nicht ganz unheftig aber gut! Sie behandelt viele Teilbereiche, die man einfach beherrschen muss! Zwei Wochen sind für einen Anfänger knapp, aber zu bewältigen.Viele Grüsse,
Uli
-
Hi Ines,
CSV heißt- sofern ich mich recht erinnere - comm seperated cersion.
Dann sollten die Felder durch kommata getrennt werden??Tip zum bestimmen der 200 ältesten:
- bau Dir ein string-array mit 200 feldern a 8Zeichen
-öffne Datei
-lies jeden Satz bis ende
- mit jedem Satz
-- wenn kein Sonntag, dann weiter
-- wndle das Datum (dd.mm.yyyy) in yyymmdd um
-- scanne Dein Array von hinten nach vorn
-- wenn leer: weiter
-- wenn das neue größer als im Array, dann weiter
-- wenn kleiner ( oder null ) verschiebe alle größeren nach hinten
( nr 200 fällt dann evtl raus, wenn vorhanden )
und trag das neue einHab eben das mit der sStruc gelesen:
WEnn Du max 400 DS im Speicher haben darfst, dann nimm eben eine Struc Array, oder ne verkette Liste, ds ginge am schnellsten, und nach dem Sortieren
schreibts Du alles auf Platte
HTH
Hanns
nur so lockere Gedanken
-
Hallo, erst mal vielen dank für eure Tipps. Ich möchte tatsächlich eine Glockenkurve bei der Verteilung haben und nichts S-förmiges. Die Tipps von Hanns W sind einleuchtend, danke dafür.
Das mit de Geburtsdatum habe ich nun dank der Hilfe von Hanns hinbekommen, ich mache das mitbirthdate=10000*year+100*month+day;
Das Zurückrechnen ist dann auch relativ einfach. Die Schaltjahre funktionieren bei mir zwar noch nicht, das ist aber eine Kleinikeit, die ich später noch einbauen kann.
Das Struct darf zwar eigentlich nicht geändert werden, aber so kann es nicht funktionieren und ich habe es halt doch geändert.struct person { char name[20]; char givenname[20]; unsigned long birthdate; char adress[20]; char city[20]; };
Das ist einfacher und ich brauche das Feld data[] gar nicht mehr!!!
Trotzdem komme ich nicht richtig weiter. Ein Stück kommentierter Code von euch würde mir wirklich sehr weiterhelfen.
DANKE,
Ines
-
Deine "Lösung" mit der Datumscodierung ist Unfug, denn so kriegst Du weder die Schaltjahre vernünftig in den Griff noch kannst Du ohne Riesenverrenkungen rauskriegen, ob's nun ein Sonntag ist oder nicht.
Das Kürzel CSV steht im übrigen für "Character Separated Values" oder "Comma Separated Values". Einen echten Standard gibt es hierfür nicht, es ist aber üblich, ein Semikolon als Trennzeichen zu nehmen (man könnte jedes Zeichen nehmen).
Das Struct von eurem Dozenten ist übrigens auch richtig und Du sollst da nicht dran rumfummeln. Bau's zurück und begreif das Ding erst mal!
Wie schon gesagt, wühl mal im C Bereich vom Spotlight Forum (www.spotlight.de) nach dem Begriff "SonjaB". Fast exakt die gleiche Aufgabenstellung hatte sie auch und bekam Lösungen bzw. Lösungsansätze.
-
Deine "Lösung" mit der Datumscodierung ist Unfug, denn so kriegst Du weder die Schaltjahre vernünftig in den Griff noch kannst Du ohne Riesenverrenkungen rauskriegen, ob's nun ein Sonntag ist oder nicht.
Das Kürzel CSV steht im übrigen für "Character Separated Values" oder "Comma Separated Values". Einen echten Standard gibt es hierfür nicht, es ist aber üblich, ein Semikolon als Trennzeichen zu nehmen (man könnte jedes Zeichen nehmen).
Das Struct von eurem Dozenten ist übrigens auch richtig und Du sollst da nicht dran rumfummeln. Bau's zurück und begreif das Ding erst mal!
Wie schon gesagt, wühl mal im C Bereich vom Spotlight Forum (www.spotlight.de) nach dem Begriff "SonjaB". Fast exakt die gleiche Aufgabenstellung hatte sie auch und bekam Lösungen bzw. Lösungsansätze.
-
Zahlenhaufen schrieb:
Wie schon gesagt, wühl mal im C Bereich vom Spotlight Forum (www.spotlight.de) nach dem Begriff "SonjaB". Fast exakt die gleiche Aufgabenstellung hatte sie auch und bekam Lösungen bzw. Lösungsansätze.
Fast ist gut. Würde sagen so ein Zufall Die hat exakt die gleiche Aufgabe.
Kurt
-
La la la lasst euch nicht verarschen...
-
Ich hab gerade nochmal recherchiert, die Fragestellung von SonjaB ist fast exakt die gleiche. (http://www.spotlight.de/zforen/ccc/m/ccc-1105381876-28366.html).
Wenn man weiter sucht, dann findet man auch ne Frage einer gewissen Ines, bei der es sich exakt um das Problem der Datumslinearisierung dreht. (http://www.spotlight.de/nzforen/ccc/m/ccc-1112504258-10908.html).
Sucht man nochmal weiter, dann findet man eine Frage von thiste, bei der's um CSV Dateien geht (http://www.spotlight.de/zforen/ccc/m/ccc-1119544969-7696.html).
Wenn man dann noch nach Heap sucht, dann findet man sogar einen Beispielcode, wie man das Finden der grössten Elemente mit nem Heap macht.
Ich fühl mich langsam auch ein klein wenig verarscht.
Für alles sind Lösungen da, man muss es nur noch zusammenbauen!
-
Bäh, was für ein unübersichtliches Forum, das Spotlight.
Nicht zu fassen, die Leute posten da tatsächlich komplette Quellcodes.
Hehe.