Skocz do zawartości


[PASCAL] wczytywanie liczb z pliku do tablicy


12 odpowiedzi w tym temacie

#1 rafal92909

    Nowy na forum

  • Użytkownicy
  • 12 Postów:

Napisano pon, 25 paź 2010 - 17:43

Witam wszystkich mam problem z napisaniem programu w Pascalu który wczyta wszystkie liczby z pliku txt do tablicy dwuwymiarowej. Niby coś napisałem ale nie do końca działa jak powinno, ponieważ wypisuje tylko pierwszy wiersz z tablicy a cala reszta jest pusta. Chce aby liczby w tablicy wyglądały tak samo jak pliku tekstowym (czyli 228 wierszy i 13 kolumn)


pascal

program p1;
uses crt;
type
    T2W=array [1..228,1..13] of string;
var
   t:text;
   w:string;
   i,j:integer;
   T1:T2W;

begin
   assign(t, 'C:\temp.txt');
   reset(t);
      for i:=1 to 228 do
         for j:=1 to 13 do
         begin
            read(t,w);
            T1[i,j]:=w;
         end;

      close(t);
      writeln('liczby w tablicy');
      writeln();

      for i:=1 to 228 do
      begin
         for j:=1 to 13 do
         begin
            write(T1[i,j]);
         end;
         writeln();
      end;
   readln;
end.
 

 



plik txt który wczytuje znajduje się: TUTAJ

czy zmienna w i tablicy nie powinny być zdeklarowane jako liczby rzeczywiste jeśli później chciałbym np sumować liczy z kolumn? Gdy zmienię deklaracje na real to kompilator nie widzi żadnego błędu ale od razu się zamyka. Proszę o pomoc.

Użytkownik Integer edytował ten post czw, 07 kwi 2011 - 23:36
Wciecia


#2 Adam27

    Pomocna dłoń

  • Super użytkownicy
  • 156 Postów:
  • Gadu-Gadu:20032942

Napisano pon, 25 paź 2010 - 18:15

Nie wczytujesz do tablicy pojedynczych liczb, tylko całe wiersze, więc nie działa prawidłowo, a program się zamyka dlatego, że natknął się na błąd podczas wykonania. Jeżeli zmieniasz typ zmiennej w i T1 na rzeczywisty i jest błąd, to prawdopodobnie w pliku powinny być kropki a nie przecinki. Spróbuj jeszcze nadać typ Single tym zmiennym, a przy wczytywaniu zmień kod na:

pascal


   for i:=1 to 228 do
   begin
      for j:=1 to 13 do
      begin
         read(t,w);
         T1[i,j]:=w;
      end;
      readln;
   end;

 


Może to pomoże.

Użytkownik Integer edytował ten post czw, 07 kwi 2011 - 23:38
Wcięcia


#3 rafal92909

    Nowy na forum

  • Użytkownicy
  • 12 Postów:

Napisano pon, 25 paź 2010 - 18:29

niestety nadal to samo wkleilem twoj kawalek kodu (bez readln; bo musialem enter klikac) i jest to samo. a po zmianie typu zmiennej w i tablicy na single dzieje sie to samo co przy typie real czyli kompilator nie widzi bledow wlacza sie program i od razu wysypuje.

#4 Adam27

    Pomocna dłoń

  • Super użytkownicy
  • 156 Postów:
  • Gadu-Gadu:20032942

Napisano pon, 25 paź 2010 - 18:34

Z tym readln to chodziło o to, żeby przy wczytywaniu pliku przechodziło do następnej linijki, ale moja wina, zrób tak:

pascal


   for i:=1 to 228 do
   begin
      for j:=1 to 12 do
      begin
         read(t,w);
         T1[i,j]:=w;
      end;
      readln(t,w);
      T1[i,13]:=w;
   end;

 


#5 rafal92909

    Nowy na forum

  • Użytkownicy
  • 12 Postów:

Napisano pon, 25 paź 2010 - 19:02

pozornie dziala bo wyswietla na ekranie tak jak powinno, ale chodzilo mi o to by w kazdym miejscu w tablicy byla jedna ze liczb. a miejsca wkolumnach od 2-13 sa puste a wypelniona jest cala kolumna pierwsza calym wierszem z pliku tekstowego. a nie o to chodzilo. czy wiesz jak to poprawic?

#6 Adam27

    Pomocna dłoń

  • Super użytkownicy
  • 156 Postów:
  • Gadu-Gadu:20032942

Napisano pon, 25 paź 2010 - 19:18

A zmienne w i T1 są typu rzeczywistego?

#7 rafal92909

    Nowy na forum

  • Użytkownicy
  • 12 Postów:

Napisano pon, 25 paź 2010 - 19:40

nie robie na stringach bo jak tylko zmienie zmienne na real to odrazu po otwarciu program sie zamyka program

pascal


program p1;
uses crt;
type
    T2W=array [1..228,1..13] of string;
var
t:text;
   w:string;
   i,j:integer;
   T1:T2W;

begin
   assign(t, 'C:\temp.txt');
   reset(t);
   for i:=1 to 228 do
   begin
      for j:=1 to 12 do
      begin
         read(t,w);
         T1[i,j]:=w;
      end;
      readln(t,w);
      T1[i,13]:=w;
   end;

   close(t);
   writeln('liczby w tablicy');
   writeln();

   for i:=1 to 228 do
   begin
      for j:=1 to 13 do
      begin
         write(T1[i,j]);
      end;
      writeln();
   end;
   readln;
end.
 

 

Użytkownik Integer edytował ten post czw, 07 kwi 2011 - 23:41
Wcięcia


#8 Adam27

    Pomocna dłoń

  • Super użytkownicy
  • 156 Postów:
  • Gadu-Gadu:20032942

Napisano pon, 25 paź 2010 - 19:47

Zamień wszystkie przecinki w pliku tekstowym na kropki, powinno działać. Jeżeli chcesz liczby w osobnych komórkach tablicy to nie można tego zrobić na stringach.

#9 rafal92909

    Nowy na forum

  • Użytkownicy
  • 12 Postów:

Napisano pon, 25 paź 2010 - 20:08

Cytat

Zamień wszystkie przecinki w pliku tekstowym na kropki, powinno działać. Jeżeli chcesz liczby w osobnych komórkach tablicy to nie można tego zrobić na stringach.


zmienilem na kropki i jak zmieniam na stringi na reale to kompilator nie wykrywa bledu ale po wlaczeniu programu od razu sie wylacza (tak jakby nie mial readln; na koncu) i nie wiem co mu sie jeszcze nie zgadza

#10 Adam27

    Pomocna dłoń

  • Super użytkownicy
  • 156 Postów:
  • Gadu-Gadu:20032942

Napisano pon, 25 paź 2010 - 20:14

No to użyj debuggera i zobacz w którym momencie program się wywala.

#11 rafal92909

    Nowy na forum

  • Użytkownicy
  • 12 Postów:

Napisano pon, 25 paź 2010 - 20:56

Cytat

No to użyj debuggera i zobacz w którym momencie program się wywala.


chodzi Ci o uzycie funkcjiu debug w kompilatorze? to po uzyciu jej wyskakuje dosowskie okienko w ktorym pisze "wiersz wprowadzenia jest za dlugi" i szybko znika

#12 jozekkg

    Bywalec

  • Użytkownicy
  • 71 Postów:

Napisano wto, 26 paź 2010 - 05:39

pascal


begin
  assign(t, 'C:\temp.txt');
  reset(t);
  for i:=1 to 228 do
  begin
     readln(t,w);           {wczytuje cały wiersz z pliku tekstowego}
    for j:=1 to 12 do
    begin
       while w[1]=' ' do delete(w,1,1); {usuwa spacje na początku wiersza}
       T1[i,j]:=copy(w,pos(' ',w)-1);  {wstawia do tablicy fragment wiersza do pierwszej napotkanej spacji}
       delete(w,1,pos(' ',w));             {usuwa z wiersza to co wstawił do tabeli, razem ze spacją}
    end;
  end;
  close(t);
end;
 

 


Coś w tym stylu. Sprawdź tylko, czy w funkcjach copy i delete powinny być -1 za funkcjami copy.

#13 Adam27

    Pomocna dłoń

  • Super użytkownicy
  • 156 Postów:
  • Gadu-Gadu:20032942

Napisano wto, 26 paź 2010 - 14:47

@rafal92909: Ustaw breakpoint i zobacz w której linijce jest błąd.