[Pascal] Z pliku do tablicy


(Jedras121) #1

Witam. Mam następujący problem: Mam plik tekstowy w którym zapisane są ciągi 0 i 1 o długości 10. I mam tablicę jednowymiarową rekordów o dług10(a,b:integer; i code:boolean). Pola tablicy wyglądają następująco: 1,2; 1,3; 1,4; 1,5; 2,3; 2,4; 2,5; 3,4; 3,5; 4,5;. I na początku pole code = false. Chodzi o to aby wczytać wartość pliku i jeśli =1 to pierwszy rekord tablicy przenieść na jej koniec i code=true, a jeśli =0 to sprawdzać następny element pliku i jeśli =1 to znowu przepisać odpowiadający mu rekord. Niestety coś mi nie wychodzi i źle zamienia pola w tablicy i je wypisuje(np. wszystkiepola code=true pomimo że nie wystąpiła w tym miejscu jedynka. No i program ma wypisywać rekord tablicy tylko jeśli code =true(czyli ma wypisać tyle par liczb ile jest jedynek w ciągu). Proszę o pomoc.

Cały program: http://pastebin.pl/6128


([alex]) #2

Problem jak mi się wydaje jest tu:

while not eoln(f) do begin read(f,P[i,j]); i:=i+1; end;

Chodzi o to że znak 'a zostanie wczytany do tablicy po czym dopiero przejdzie do następnego wiersza.

Radzę wczytać znak, potem sprawdzić co jest w tym znaku:

  • jeżeli '0' lub '1' dopisz do tablicy

  • jeżeli #13 przejdź do następnego wierszu

  • jeżeli #10 ignoruj (ewentualnie można ignorować wszystko co nie trafiło do 1 i 2 opcji)

Wypadało by dać jakiś przykład wczytywanego pliku.


(Jedras121) #3

przykładowy_plik.txt

0000000000

1000000000

1000000100

1100000000

1100000001

1100010000

1100010010

1100010011

1100010100

-- Dodane 16.03.2009 (Pn) 19:59 --

Poza tym wczytywanie z pliku do tablicy P jest prawidłowe bo po wypisaniu zawartości tablicy na konsoli wszystkie ciągi są takie same.

-- Dodane 16.03.2009 (Pn) 20:02 --

Aktualizacja linku z kodem: http://pastebin.pl/6154 według mnie tak jest lepiej. zmieniłem tylko procedure Gnk

-- Dodane 16.03.2009 (Pn) 20:06 --

Przykładowo dla takiej zawartości pliku

1100000000

1000000001

0000000110

powinny zostać wypisane odpowiednio

1 2 | 1 3

1 2 | 4 5

3 4 | 3 5

ale program wypisuje

1 2 | 4 5

3 5 | 4 5 | 1 2

3 4 | 3 5 | 4 5 | 1 2


([alex]) #4

Nie udaje mi się zrozumieć za chińskiego, co program próbuje zrobić.

Masz straszną plątaninę w kodzie, funkcje używają zmiennych globalnych oraz parametrów, nigdzie nie ma początkowych ustawień co do zmiennych globalnych.

Może napisz co próbujesz policzyć.


(Jedras121) #5

Najprościej jak potrafię: Program ma wczytać z pliku ciąg 0 i 1 o 10 elementach. I w tablicy E o długości 10 ma "poprzestawiać" elementy które odpowiadają 1 w ciągu. Czyli jeśli 1 występuje na 1,2 i 7 miejscu ciągu to w tablicy E elementy 1,2 i 7 mają zostać przeniesione na koniec tablicy i podstawić pod te 3 elementy code:=true; I wypisać te elementy na konsoli.


([alex]) #6

Chyba zbyt uprościłeś :smiley:

Tablica E ma składowe a,b -> co ma być w tych a i b?

Może lepiej rozpisz co oczekujesz w tablice E dla pliku wejściowego:

1100000000

1000000001

0000000110

skąd mają pochodzić te dane w tablice E dla czego taka a nie inna kolejność;

funkcja init tworzy w tablice E rekordy: 1,2 1,3 1,4 1,5 2,3 2,4 2,5 3,4 3,5 4,5

nie rozumiem co to ma wspólnego z ilością rekordów=3 ani ilością kolumn=10

EDIT:

Nie rozumiem też poco te rekordy przenosić jeżeli wypisując wyniki i tak pomijasz wszystkie gdzie code jest false, jaka różnica pomijać te na początku czy te na końcu? Może prościej napisz na GG.


(Jedras121) #7

Problem rozwiązany by [alex]. Wielkie dzięki i do zamknięcia.