Sortier-Programm < Maple < Mathe-Software < Mathe < Vorhilfe
|
Aufgabe | Der Lokalsender off air möchte ein Sortier-Programm für seinen Veranstaltungskalender. Da die Veranstaltungen weder nach Terminen noch alphabetisch sortiert beim Sender eingehen, sollen sie eine kleine Funktion mysort schreiben. Diese Funktion soll die Daten, die in einer Datei abgelegt sind, einlesen, alphabetisch sortieren und in einer zweiten Datei ablegen und ferner eine chronologische Sortierung der Daten in einer dritten Datei speichern. Daher sollte der Aufruf in der Form mysort('Datei1','Datei2','Datei3') erfolgen.
Eine beispieldatei für die Veranstaltungshinweise ist die Datei Veranstaltung.txt. |
Beispiel eines Veranstaltungshinweis:
Dietrich Sauwetter: Samstag, 17.12.2134 "Geschichte der Frankfurter Mathematik"
Harald Riesenhagel: Freitag, 24.1.2135 "Wo war Frankfurt"
Ferdinand Niederschlag: Donnerstag, 18.12.2134 "Vorsemesterkurse in Matlab"
Richard-Ludwig Dauerregen: Montag, 2.1.2135 "Programmieren mit Matlab"
Ich weiß nur, dass mit
t=[text,'...']
n=double(t(1:6))
gearbeitet werden muss, aber ich weiß nicht genau wie ich anfangen soll. Der erste Schritt fehlt mir einfach.
Um Hilfe bin ich mega dankbar.
Liebe Grüße
Anna
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
|
|
|
|
Hallo,
ich wette, du bist versehentlich im Maple-Forum gelandet und willst eigentlich mit Matlab arbeiten...
Wie schon in diesem Thread solltest du deine Datei zeilenweise einlesen und die Zeilen jeweils mit Regular Expressions zerlegen.
Eine Struktur wäre auch nicht angebracht, z.B. mit den Feldern:
event.person
event.date
event.title
Das Thema kennst du ja schon.
Die Darstellung des Datums musst du in Zahlen umrechnen. ich empfehle da datenum.
Nun musst du zweimal sortieren. Falls du das eingebaute sort benutzen darfst, dann bist du aus dem Schneider. Sonst musst du noch einen kleinen Sortieralgorithmus implementieren. Such dir einfach einen aus.
Du sortierst einmal die Daten und einmal die Titel und merkst dir jeweils den Indexvektor (s. Hilfe zu sort).
Beim Speichern der Dateien gehst du dabei jeweils in der Reihenfolge der Indexvektoren vor.
Versuch es erstmal und schreib, welche Probleme aufgetreten sind.
Gruß
Martin
|
|
|
|
|
Hi Martin,
danke für die Hilfe, aber irgendwie komm ich nicht weiter.
Bereits am Anfang hab ich Probleme, d.h. die Datei einzulesen. Ich hab es mit
fid = fopen(Veranstaltungen.txt,r)
versucht, aber das Einlesen funktioniert nicht.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 12:49 Fr 23.11.2007 | Autor: | Martin243 |
Hallo,
> Bereits am Anfang hab ich Probleme, d.h. die Datei einzulesen. Ich hab es mit
>
> fid = fopen(Veranstaltungen.txt,r)
Das sollte ja auch
fid = fopen('Veranstaltungen.txt',r)
heißen. Schau dir doch immer die Fehlermeldungen an. Die helfen manchmal weiter.
Gruß
Martin
|
|
|
|
|
Die Hilfen von MAtlab schau ich mir an, aber problem ist halt, dass ich nicht alles genau verstehe, weil es auf englisch ist.
Ich hab das alphabetische Sortieren folgender versucht:
fid = fopen('Veranstaltungen.txt','r') ;
text = fscanf(fid,'%c')
fclose(fid);
s = struct('name','Dieter Sauwetter','Datum','Samstag,17.12.2134','Thema','Geschichte der Frankfurter Mathematik')
struct('name','Alfred Müller','Datum','Samstag,17.12.2134','Thema','Geschichte der Frankfurter Mathematik')
[snew,perm] = orderfields(s,{name})
Wo liegt, denn der Fehler, dass ich die Namen nicht alphabetisch ordnen kann?
Gruß
Anna
|
|
|
|
|
Das Sortieren hab ich einiger Maßen hinbekommen:
fid = fopen('Veranstaltungen.txt','r') ;
text = fscanf(fid,'%c')
fclose(fid);
c(1,:) = [{'Dieter'} {'Sauwetter'} {'Samstag'} {datenum(2134, 12, 17)} {'Geschichte der Frankfurter Mathematik'}];
c(2,:) = [{'Alfred'} {'Müller'} {'Samstag'} {datenum(2134, 11, 20)} {'Geschichte der Frankfurter Mathematik'}];
c(3,:) = [{'Bauer'} {'Sauwetter'} {'Samstag'} {datenum(2134, 10, 17)} {'Geschichte der Frankfurter Mathematik'}];
[cneu,ind]=sort(c(:,1));
SortName=c(ind,:)
[cneu,ind]=sort(c(:,3));
SortDate=c(ind,:)
Aber:
1. Kann man die Sortierung dierekt von der eingelesenen Datei machen, oder muss man dafür die Daten einzeln eingeben?
2. Ich hab versucht die chronologische Sortierung analog durchzuführen, ist das falsch? Weil ich das Datum irgendwie nicht soriteren kann.
Liebe Grüße
Anna
|
|
|
|
|
Hallo,
> 2. Ich hab versucht die chronologische Sortierung analog durchzuführen, ist das falsch? Weil ich das Datum irgendwie nicht soriteren kann.
Versuch es mal hiermit:
sort(cell2mat(c(:,4)))
> 1. Kann man die Sortierung dierekt von der eingelesenen Datei machen, oder muss man dafür die Daten einzeln eingeben?
Hatten wir das nicht schon einmal?
Lies die Daten zeilenweise per fgetl ein und verarbeite sie dann am besten mit regexp.
Gruß
Martin
|
|
|
|
|
Ich versteh nicht ganz was du damit meinst, dass die Zeilen einzeln eingelesen werden sollen. Meinst du die Informationen von der Datei Veranstaltungen.txt? Aber dann würde ich ja nicht direkt mit der eingelesenen Datei weiter arbeiten.
Was ich bisher hab ist:
fid = fopen('Veranstaltungen.txt','r') ;
text = fscanf(fid,'%c')
fclose(fid);
c(1,:) = [{'Dieter'} {'Sauwetter'} {'Samstag'} {datenum(2134, 12, 17)} {'Geschichte der Frankfurter MAthematik'}];
c(2,:) = [{'Harald'} {'Riesenhagel'} {'Freitag'} {datenum(2135, 1, 24)} {'Wo war Frankfurt'}];
c(3,:) = [{'Ferdinand'} {'Niederschlag'} {'Donnerstag'} {datenum(2134, 12, 18)} {'Vorsemesterkurse in Matlab'}];
c(4,:) = [{'Richard-Ludwig'} {'Dauerregen'} {'Montag'} {datenum(2135, 1, 2)} {'Programmieren mit Matlab'}];
[cneu,ind]=sort(c(:,1));
SortName=c(ind,:)
[cneu,ind]=sort(cell2mat(c(:,4)))
SortDate=c(ind,:)
Ich hab die Datei eingelesen und die dann sortiert, aber die Daten halt einzeln eingegeben. Muss aber die eingelesene Datei direkt sortieren
Liebe Grüße
Anna
Ps.: Ich glaube du verwechselst mich mit dem Benutzer tundrablume :)
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 22:34 Mi 28.11.2007 | Autor: | Martin243 |
Hallo,
> Ps.: Ich glaube du verwechselst mich mit dem Benutzer tundrablume :)
Oh, sorry. Wen wundert's? Der Name, die Aufgabenstellung...
> Ich versteh nicht ganz was du damit meinst, dass die Zeilen einzeln eingelesen werden sollen. Meinst du die Informationen von der Datei Veranstaltungen.txt? Aber dann würde ich ja nicht direkt mit der eingelesenen Datei weiter arbeiten.
Das kann auch keiner verlangen. Man kann nur Daten sortieren, nicht die Datei.
> Ich hab die Datei eingelesen und die dann sortiert, aber die Daten halt einzeln eingegeben. Muss aber die eingelesene Datei direkt sortieren
Wenn du mir sagst, wie das gemeint ist, sage ich dir auch, wie das geht. Ansonsten gilt: Um etwas bewegen zu können, muss man es schon anfassen. Also: zuerst Daten aus der Datei herausholen, dann sortieren und schließlich zurückschreiben.
Es steht ja auch in der Aufgabenstellung, dass du zwei neue Dateien erzeugen sollst. Also nix mit Datei sortieren.
Gruß
Martin
|
|
|
|
|
Laut Aufgabenstellung braucht man einen Quellcode, der die beiden Ausgabe-Dateien erzeugt. Die Ausgabe-Dateien sind ja die sortierten eingehenden Daten. Aber wie sieht denn so ein Code aus? Ich weiß nicht wie ich den hinbekomme.
|
|
|
|
|
Hallo,
> Laut Aufgabenstellung braucht man einen Quellcode, der die beiden Ausgabe-Dateien erzeugt. Die Ausgabe-Dateien sind ja die sortierten eingehenden Daten. Aber wie sieht denn so ein Code aus? Ich weiß nicht wie ich den hinbekomme.
Erlaube mir zuerst die Frage: Du weißt schon, dass der Code in eine Datei mit der Endung .m hineingehört, oder? Nur dann ist es tatsächlich eine Funktion (es gibt zwar noch eine andere Möglichkeit, aber...)
Du hast ja nun angefangen, also bastle ich mal die Grundstruktur dieser Datei und dann kannst du konkrete Fragen stellen.
function mysort(infile, namesortfile, datesortfile)
fid = fopen(infile,'r') ;
eventIndex = 0;
while ~feof(fid),
textline = fgetl(fid);
eventIndex = eventIndex + 1;
<Hier zerlegst du die eingelesene Textzeile per regexp>
<Zuweisung der Bestandteile zu Bestandteilen der Struktur>
end;
fclose(fid);
<Sortieren nach Namen>
<Erzeugen einer neuen Datei namesortfile>
<Zeilenweises Schreiben der neuen Datei>
<Schließen der Datei>
<Sortieren nach Daten>
<Erzeugen einer neuen Datei datesortfile>
<Zeilenweises Schreiben der neuen Datei>
<Schließen der Datei>
Schreib doch mal, was dir die größten Probleme bereitet.
Gruß
Martin
|
|
|
|
|
Ich versteh leider schon den Anfang nicht. Das mit dem Zerlegen.
Meinst du es etwa so:
c1 = [{'Dieter'} {'Sauwetter'} {'Samstag'} {datenum(2134, 12, 17)} {'Geschichte der Frankfurter MAthematik'}];
c2 = [{'Harald'} {'Riesenhagel'} {'Freitag'} {datenum(2135, 1, 24)} {'Wo war Frankfurt'}];
regexp(c1,c2)
Mein größtes Problem liegt eigentlich darin, dass ich die Befehle nicht kenne, die man verwenden muss, um die Aufgabe zu lösen. Deine Hilfen versuch ich alle bei help zu verstehen und zu ergooglen, wie zum Beispiel regexp, aber daraus werd ich kaum schlauer, weil alles auf Englisch ist. Morgen muss ich schon die Aufgabe gelöst haben und bis dahin wäre ich niemals alleine auf deine Grundstruktur gekommen. Fraglich ob ich den Rest überhaupt schaffe :(
Liebe Grüße
Anna
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 13:07 Do 29.11.2007 | Autor: | Martin243 |
> Mein größtes Problem liegt eigentlich darin, dass ich Anfänger bin und die Befehle nicht kenne, die man verwenden muss. Wenn ich nicht weiß, dass der Befehl existiert, kann ich nicht damit arbeiten.
Natürlich, das verstehe ich, geht mir ja nicht anders. Vieles finde ich eher zufällig. Aber manchmal hilft es, wenn man nach Schlagwörtern sucht.
> Deine Hilfen versuch ich alle bei help zu verstehen, wie zum Beispiel regexp, aber daraus werd ich kaum schlauer, weil alles auf Englisch ist.
Hmmm, ohne englische Hilfe kommst du aber nicht weit. Man muss ja nicht immer alles verstehen. Vieles ergibt sich aus dem Zusammenhang.
> Auf diese Grundstruktur wäre ich niemals gekommen.
Die ist aber nicht wirklich Matlab-spezifisch.
Bevor du dich ans Programmieren setzt (in Matlab, C, Fortran oder sonstwas), musst du dir zuerst grob überlegen, was du in welcher Reihenfolge machst. Die Struktur, die ich angeschrieben habe, gilt für so ungefähr alle Programmiersprachen, die mir einfallen. Und als Mathe-Studentin solltest du dir Rechenvorschriften überlegen können.
> Meinst du es etwa so: ...
Nein. Du sollst ja nichts mehr von Hand eingeben.
Nach dem Öffnen der Datei liest du die Daten Zeile für Zeile ein, bis das Ende der Datei erreicht ist (dafür sorgt das while-Konstrukt).
Die erste Zeile, die du aus der einliest, hat die Form:
Dietrich Sauwetter: Samstag, 17.12.2134 "Geschichte der Frankfurter Mathematik"
Nun gilt es, die Datei in "Tokens" zu zerlegen, also einfach in die Bestandteile. Nun kann man einfach Leerzeichen als Trennzeichen nehmen, um die ersten Elemente zu erkennen.
Die Aufteilung nach Trennzeichen gelingt mit dem Befehl strtok.
Hierzu sei (wie in meiner Grundstruktur) die Textzeile in textline abgelegt. eventIndex sei der aktuelle Index (also die Nummer der Zeile, s. Grundstruktur). Dann können wir mit der Aufteilung beginnen:
[t,r] = strtok(textline, ' '); %t enthät das erste Token, r den Rest
event(eventIndex).vorname = t;
[t,r] = strtok(r, ' '); %wir wiederholen das Vorgehen mit dem Rest
event(eventIndex).nachname = t;
[t,r] = strtok(r, ' '); %wir wiederholen das Vorgehen mit dem Rest
event(eventIndex).wochentag = t; %hier hängt noch das Komma dran
[t,r] = strtok(r, ' '); %wir wiederholen das Vorgehen mit dem Rest
event(eventIndex).datum = t; %im dd.mm.yyyy-Format
event(eventIndex).titel = r; %der Rest ergibt den Titel
Damit hätten wir eine Zeile zerlegt. Da in jeden Schleifendurchgang eine neue Textzeile eingelesen und eventIndex um 1 erhöht wird, haben wir am Ende eine entsprechende Darstellung der gesamten Daten aus der Datei.
Das mit regexp bietet sich an, wenn Besonderheiten berücksichtigt werden sollen wie mehrere Vornamen oder Adelsprädikate:
Wolfgang Karl Dietrich von Haltestelle kriegst du mit obigem Vorgehen nicht richtig zerlegt. Wenn du daran auch Interesse hast, dann schreib mal.
Nach der erfolgreichen Zerlegung kommt der Rest. Schau dir das erstmal in Ruhe an.
Gruß
Martin
|
|
|
|
|
Erst Mal ganz vielen Dank für deine Hilfe. Ich habe die Aufgabe jetzt noch mit Hilfe anderer Kommilitonen lösen können.
Liebe Grüße
Anna
|
|
|
|