Autor |
Beitrag |
argh
Hält's aus hier
Beiträge: 6
win xp
Delphi 2005
|
Verfasst: Do 09.03.06 13:06
Hallo!
Erstmal muss ich zugeben, das ich noch relativ blutiger Anfänger bin...deswegen wende ich mich auch an euch und hoffe auf Hilfe.
Folgendes Problem: ich muss eine Prozedur schreiben, die es mir ermöglicht Probleminstanzen beliebiger Größe, also n einlesen zu können. Bei den Probleminstanzen handelt es sich in meinem Fall immer um symmetrische Matrizen.
Kann mir jemand einen Tip geben, wie ich sowas machen kann?
Ich hatte es mit:
Delphi-Quelltext 1: 2:
| assign(eingabe, 'dateiname'); reset(eingabe); |
usw. versucht.
aber ich muss irgendwo was falsch gemacht haben und am ende kam nur "schmu" raus, d.h. nur eine zeile oder eine spalte oder alles komplett durcheinander...
Moderiert von raziel: Delphi-Tags hinzugefügt
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Do 09.03.06 14:27
Hallo,
SInd es ueberhaupt Textdateien, Laesst sich die Datei mit dem Editor(oder Word) oeffnen und ansehen.
was soll man hiermit anfangen ??
Zitat: | symmetrische Matrizen |
Wie gross sind diese, ist die Groesse konstant,welcher Datentyp, wie sind sie abgespeichert, als Text oder im Zahlenformat des Komputers?
ProblemInstanzen von welchem Problem in welcher Repraesentation??
[url]http://de.wikipedia.org/wiki/Komplexitätstheorie#Probleminstanzen[/url]
Gruss Horst
|
|
argh 
Hält's aus hier
Beiträge: 6
win xp
Delphi 2005
|
Verfasst: Do 09.03.06 14:45
Hallo!
ich hoffe, ich habe deine fragen richtig verstanden und kann sie so beantworten.
es handelt sich dabei um Matritzen, die Entfernungen zwischen verschiedenen Punkten beinhalten z.B. von knoten 1 zu knoten 1, von knoten 1 zu knoten 2 usw...mit symmetrisch meine ich, dass die anzahl der zeilen immer gleich der anzahl der spalten ist, also z.b. eine 5x5 matrix oder ähnliches und das in der hauptdiagonalen der wert immer 0 ist.
ich benötige das ganze für problem, wo es darum geht, den kürzesten weg zwischen den knoten zu finden.
die dateien, die ich mit meiner prozedur einbinden soll sind so hinterlegt, dass ich sie mit dem befehl assign(eingabe, 'dateiname.dat') aufrufen kann. ich kann sie auch im editor öffnen. das ganze soll nun auch für verschieden große probleme, wie z.b. 10x10 oder auch 50x50 und höher funktionieren...
ich hatte es so versucht:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| const n = 1000; type matrix = array [1..n, 1..n] of double; var dist: matrix; i, j: integer;
procedure einlesen (var dist: matrix);
var eingabe: textfile; datname: string;
begin writeln('bitte dateinamen eingeben: '); readln(datname); readln; assign(eingabe,datname); reset(eingabe); i:=1; j:=1; dist[i,j]:= 0;
while not eof(eingabe) do begin while not eoln(eingabe) do begin read(eingabe, dist[i,j]); write(dist[i,j]:8:2); end; read(eingabe, dist[i,j]); write(dist[i,j]:8:2);
end; |
aber irgendwie funktioniert das nicht...ich weiß nicht, ob das einlesen schon falsch ist, oder nur die ausgabe. ich komme aber absolut nicht drauf.
Moderiert von raziel: Delphi-Tags hinzugefügt
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Do 09.03.06 14:58
Hallo,
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| const n = 1000; type matrix = array [1..n, 1..n] of double; var dist: matrix; Zeile, Spalte: integer;
procedure einlesen (var dist: matrix);
var eingabe: textfile; datname: string; begin fillcahr(matrix,SizeOf(Matrix),#0);
writeln('bitte dateinamen eingeben: '); readln(datname); readln; assign(eingabe,datname); reset(eingabe); Zeile:=1; Spalte:=1; dist[Zeile,Spalte]:= 0; while not eof(eingabe) do begin while not eoln(eingabe) do begin read(eingabe, dist[Zeili,Spalte]); write(dist[Zeile,Spalte]:8:2); INC(Spalte); end; INC(Zeile); Spalte := 1; end; end; |
Du musst die Zeilen, Spalten auch bewegen.
Du hast ja ein reichlich grosszuegiges Feld (8 MioByte).
Gruss Horst
|
|
argh 
Hält's aus hier
Beiträge: 6
win xp
Delphi 2005
|
Verfasst: Do 09.03.06 15:15
hallo horst!
vielen dank erstmal-allerdings wird mir jetzt immer nur die erste zeile ausgegeben...ich hätte aber gern die ganze matrix, damit ich auch sehen kann, ob es wirklich geklappt hat. muss ich dafür noch einen neuen write-befehl hinzufügen?
das feld habe ich nur soooo groß gemacht, damit ich sicher gehen kann, das es wirklich für jede beliebig große instanz funktionieren kann...ich werde das aber noch reduzieren.
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 09.03.06 15:24
Die Ausgabe müsstest du natürlich auch in einer Schleife machen.
Übrigens gibt es sogenannte Dynamische Arrays. Damit legst du dich nicht auf eine feste Größe der Arrays fest.
|
|
argh 
Hält's aus hier
Beiträge: 6
win xp
Delphi 2005
|
Verfasst: Do 09.03.06 16:15
hi!
ich weiß, dass es auch dynamische arrays gibt, leider kann bzw. darf ich sie für dieses problem nicht verwenden...
trotzdem danke!
gruß
argh
|
|
argh 
Hält's aus hier
Beiträge: 6
win xp
Delphi 2005
|
Verfasst: Sa 18.03.06 19:54
Hallo!
Danke, für eure Hilfe bisher, aber irgendwie funktioniert das hier immernoch nicht so richtig...wie schaffe ich es, dass die Zeilen und Spalten in meinem Array richtig mit den Daten aus der Textdatei belegt werden? Und wie kann ich mir das ausgeben lassen, um zu überprüfen, ob das Einlesen überhaupt geklappt hat?
|
|
|