Scholieren.com forum

Scholieren.com forum (https://forum.scholieren.com/index.php)
-   Software & Hardware (https://forum.scholieren.com/forumdisplay.php?f=20)
-   -   Delphi en text bestanden (https://forum.scholieren.com/showthread.php?t=1533935)

BendeBen 24-01-2007 21:53

Delphi en text bestanden
 
voor de studie ben ik bezig met delphi het lukt allemaal vrij aardig maar het volgende krijg ik niet voor elkaar

ik heb een .txt met de volgende data er in
Code:

347        444        456        327
653        674        324        743
334        434        323        963
346        234        945        682

ik moet zorgen dat ik iedere kolom in een array kan plaatsen
en dit heb ik tot nu toe:
Code:

procedure TForm1.FormCreate(Sender: TObject);
var
bla: integer;
aa: textfile;
bb: integer;
begin
assignfile(aa, 'nrs.txt');
reset(aa);
for bla:= 1 to 4 do begin
read(aa, bb);
inhoud[bla,1]:= bb;
memo1.lines.add(floattostr(inhoud[bla,1]));
end;
closefile(aa);
end;

dit plaatst de eerste rij (dus de bovenste 4 waardes) in de array
readln zorgt ervoor dat ik de eerste kolom (dus de linker 4 waardes) in de array krijg
maar hoe zorg ik er nou voor dat ie bijv alleen de 2e kolom in de array gooit?

ILUsion 25-01-2007 16:08

Citaat:

BendeBen schreef op 24-01-2007 @ 22:53 :
voor de studie ben ik bezig met delphi het lukt allemaal vrij aardig maar het volgende krijg ik niet voor elkaar

ik heb een .txt met de volgende data er in
Code:

347        444        456        327
653        674        324        743
334        434        323        963
346        234        945        682

ik moet zorgen dat ik iedere kolom in een array kan plaatsen
en dit heb ik tot nu toe:
Code:

procedure TForm1.FormCreate(Sender: TObject);
var
bla: integer;
aa: textfile;
bb: integer;
begin
assignfile(aa, 'nrs.txt');
reset(aa);
for bla:= 1 to 4 do begin
read(aa, bb);
inhoud[bla,1]:= bb;
memo1.lines.add(floattostr(inhoud[bla,1]));
end;
closefile(aa);
end;

dit plaatst de eerste rij (dus de bovenste 4 waardes) in de array
readln zorgt ervoor dat ik de eerste kolom (dus de linker 4 waardes) in de array krijg
maar hoe zorg ik er nou voor dat ie bijv alleen de 2e kolom in de array gooit?

Je moet dit met 2 for-lussen oplossen. Je moet inderdaad per regel inlezen. Momenteel heb je voor de variabele inhoud een typedefinitie die hieronder staat, in plaats van op te slaan in [x,y] kun je opslaan in [y,x].

Code:

var inhoud : array[1..4] of array of [1..4] of integer;
Vergeet ook niet dat het inlezen niet zo simpel gaat als in jouw programma momenteel staat: wat je inleest is een string van de hele eerste lijn. Die moet je dan met stringmanipulaties omzetten naar 4 strings en die strings kan je weer omzetten naar integers die je in je array kan invoegen. Die stringmanipulaties zijn niet altijd even makkelijk om uit te dokteren, vaak is het een kwestie van proberen tot het werkt. Dat manipuleren moet je volgens mij wel kunnen doen met de functies copy, length en pos. (Spijtiggenoeg heeft Delphi geen explode zoals PHP, dan was dat gewoon een functie en hopla, je had je array).

Verder heb ik eens geprobeerd om die file in te laden als file of integer in plaats van textfile (file of string), maar dat gaf geen goede resultaten (daarmee had je anders gewoon read(file,x) en dan die x in je array steken voor alle waarden zonder stringmanipulaties, maar volgens mij kan die enkel werken met binaire bestanden en die van jou is een tekstbestand met getallen in tekstvorm en geen binaire getallen).

Probeer ook je code wat leesbaarder te maken: indentatie en deftige namen voor je variabelen. Als je later met grotere projecten zal werken, zal je het nut daarvan in ieder geval inzien.

Hieronder de onvolledige code van mezelf;
Code:

procedure TForm1.FormCreate(Sender: TObject);
var cntR, cntC : integer;
    numfile : textfile;
    tempE ,
    tempR : string;
const filename = 'nrs.txt';
begin
  if FileExists(filename)
    then
      try
        AssignFile(numfile,filename);
        Reset(numfile);
        for cntR:= 1 to 4 do
          begin
            ReadLn(numfile,tempR);
            for cntC := 1 to 4 do
              begin
                if cntC < 4
                  then
                    begin
                      tempE:=copy(tempR,0,4);
                      delete(tempR,0,4);
                    end
                  else
                    begin
                      tempE:=tempR;
                    end;
                tempE:=trim(tempE);
                inhoud[cntR,cntC] := StrToIntDef(tempE,0);
              end;
          end;
      finally
        Closefile(numfile);
      end;
  Memo1.Lines.LoadFromFile(filename);
  Memo1.Lines.Add('');
  for cntR := 1 to 4 do
    begin
      tempR := '';
      for cntC := 1 to 4 do
        begin
          tempR:= tempR + IntToStr(inhoud[cntC,cntR]);
          if cntC < 4
            then tempR:= tempR + '  ';
        end;
      Memo1.Lines.Add(tempR);
    end;
end;

Mijn declaratie voor inhoud staat in het vorige code-blok. Mijn code doet ergens iets verkeerd, maar ik heb niet veel zin om te gaan debuggen daarop (stringmanipulaties zijn niet mijn ding), de code haalt steeds enkel het eerste getal op, waarom: geen idee. Verder niet zo heel mooi omdat het me niet lukt te laten checken op de TABs (daarom die vastgezet o,4 bij copy, normaalgezien moet daar 0, pos('tab')+1 o.i.d. staan, maar het lukt me zoals ik al zei niet dat juist te krijgen.

Waarschijnlijk kun je wel voortbouwen op deze code (let er ook vooral op hoe meer leesbaar dit alles is door indentatie, bij jouw code heb je syntax highlighting nodig om er iets meer in te zien). maar je mag met indentatie doen wat je wilt, zo lang je een beetje consistent blijft en je zelf makkelijk je weg vindt in de code; maar het is volgens mij een van de vereisten om goed leesbare code te maken :-)

BendeBen 25-01-2007 18:42

hey bedankt voor je tijd :)
wat je zei over 2 loops gebruiken was even een "oja!" moment voor mij, tis eigenlijk heel simpel

kheb t nu zo
(het gaat eigenlijk om een bestand van 512 regels en 8 kolommen)

Code:

procedure TForm1.FormCreate(Sender: TObject);
var
bla, bla2: integer;
aa: textfile;
bb: real;

begin
assignfile(aa, 'OPEN.txt');
reset(aa);

for bla2:= 1 to 512 do begin
for bla:= 1 to 8 do begin
read(aa, bb);
inhoud[bla2,bla]:= bb;
memo1.lines.add(floattostr(inhoud[bla2,bla]));
end;
memo1.lines.add('');
end;

closefile(aa);
end;

zo leest ie de data van de 8 kolommen op 1 regel en zet dat in de array en gaat dan naar de volgende regel
kheb m ook nog zo ver gekregen dat ie de waardes van 1 hele kolom in een lijngrafiek zet (alleen meerdere lijnen in 1 chart lukt me niet maar is ook meer iets om voor de lol te weten)

nou moet ik nog de correlatie berekenen tussen de verschillende kolommen met een stuk code dat ik gekregen heb maar dat doe ik morgen wel want die ziet er niet prettig uit :(

en ja leesbaarheid is niet zo geweldig maar ik doe verder toch nix met programmeren, tis alleen een vak dat ik moet halen :p


Alle tijden zijn GMT +1. Het is nu 00:05.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.