Autor Beitrag
argh
Hält's aus hier
Beiträge: 6

win xp
Delphi 2005
BeitragVerfasst: 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:
ausblenden 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 user profile iconraziel: Delphi-Tags hinzugefügt
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6

win xp
Delphi 2005
BeitragVerfasst: 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:

ausblenden volle Höhe Delphi-Quelltext
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 user profile iconraziel: Delphi-Tags hinzugefügt
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Do 09.03.06 14:58 
Hallo,

ausblenden volle Höhe Delphi-Quelltext
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
//matrix loeschen
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);
    //naechste Spalte
    INC(Spalte);
    end;
 //naechste Zeile
 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 Threadstarter
Hält's aus hier
Beiträge: 6

win xp
Delphi 2005
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6

win xp
Delphi 2005
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6

win xp
Delphi 2005
BeitragVerfasst: 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?