Quass1m Napisano Kwiecień 24, 2011 Zgłoś Share Napisano Kwiecień 24, 2011 Próbuję napisać program, który wczyta wyrazy z pliku tekstowego i zapisze każdy z nich do tablicy dwuwymiarowej (wiersz, numer wyrazu w wierszu). Nie wiem jaka jest tego przyczyna ale okazało się, że program co każdy wiersz z wyrazami wypisuje pusty wiersz, np. wyraz z 3 pozycji w wierszu nr 3 jest zapisany w tablicy jako b[5,3]. Proszę o poradę jak naprawić program lub o chociaż informację jaka jest przyczyna takiego błędu. program slowa; uses crt; var x,y,z:longint; t:text; a:array[1..2000,1..2000] of char; b:array[1..200,1..10] of string; l,m,n,p:integer; zn:char; begin writeln(); writeln('_________________________________________'); assign(t, 'F:\lista.txt'); reset(t); m:=0; repeat inc(m); l:=1; repeat read(t,a[m,l]); write(a[m,l]); inc(l); until eoln(t); until eof(t); writeln(); writeln('========================================='); writeln(); for m:=1 to 9 do begin p:=1; for l:=1 to 100 do begin if a[m,l] <> ' ' then b[m,p]:=b[m,p]+a[m,l] ; if a[m,l] = ' ' then begin write(b[m,p],' '); inc(p); end; end; writeln(); close(t); readkey; end. P.S. Plik tekstowy zawiera 4 wiersze po 5 wyrazów, przykład: kot dom znak tebafla fasarttt kwa wak awk kka was mercury cumrery yrucrem mercyru ymrrcue asdrr sdfasffa sadsd fasfas alfabet Link do komentarza Udostępnij na innych stronach More sharing options...
Blind Napisano Kwiecień 24, 2011 Zgłoś Share Napisano Kwiecień 24, 2011 Debuger zna odpowiedź. www.blinder.pl - Blog Link do komentarza Udostępnij na innych stronach More sharing options...
Integer Napisano Kwiecień 24, 2011 Zgłoś Share Napisano Kwiecień 24, 2011 z grubsza pokolei: 1. Poprawiłem Ci wciecia - prawda ze lepiej to wygląda? 2. Usunłem 1 begina i bodajże 2 endy które były nie potrzebne a zaciemniały strukturę - przynajmniej mnie się tak wydaje 3. Zamiast oddzielania wyrazów w pliku spacją użyj może średnika, będziesz mógł wstawiać wyrażenia kilku wyrazowe 4. Do wczytywania z pliku zwykle używa się pewniejszej struktury var Linijka: String; While not (Eof (plik)) begin Readln(Linijka); end;OP+Zł7Ł9zyX9śzĘvęó{Ź\"(pĘśłŹFWzxkKnŻ*ZąĆqGf\"ŁFVvW#Ś& amp;VvŁ2b33łb33Ć挜w7VVŚW776Śbfw CłFVŚćĆ2g&VFć7w&\0&Vv\0\0VćCśW&6ŚRć7G&ćv6VGW&&66ĆFVĆWFRśś6vćRćWG'ŚV&ćVvg&vVGW6śśvćRg&vVGW Link do komentarza Udostępnij na innych stronach More sharing options...
Integer Napisano Kwiecień 24, 2011 Zgłoś Share Napisano Kwiecień 24, 2011 A tak na temat: zrób najpierw samo wpisywanie wyrazu do tabeli (wykasuj sobie wczytywanie numeru) i wyświetlaj sobie kolejno >numer z pętliwyraz wstawianywyraz z tabeli w takich klamerkach > a jak już to zadziała - rozbuduj program Link do komentarza Udostępnij na innych stronach More sharing options...
Stelma Napisano Kwiecień 25, 2011 Zgłoś Share Napisano Kwiecień 25, 2011 Popieram Integer'a Dodam od siebie iż po wczytaniu zawartości linijki wystarczy napisać sobie funkcję "explode" która zwróci ci tablice. I po kłopocie. Dzięki temu będziesz mógł użytkownikowi pozwolić zadecydować po czym ma rozbijać plik (domyślnie " "). Żeby nie było iż marudze to nagłówek : function explode( text : String; explod : Char = ';' ): TLineOP--śjB[HHXY[^H[[ Link do komentarza Udostępnij na innych stronach More sharing options...
Quass1m Napisano Kwiecień 25, 2011 Autor Zgłoś Share Napisano Kwiecień 25, 2011 CYTAT(Blind @ nie, 24 kwi 2011 - 14:31) <{POST_SNAPBACK}> Debuger zna odpowiedź. Niestey nie byłem w stanie znaleźć tej odpowiedzi... CYTAT(Integer @ nie, 24 kwi 2011 - 20:55) <{POST_SNAPBACK}> z grubsza pokolei: 1. Poprawiłem Ci wciecia - prawda ze lepiej to wygląda? 2. Usunłem 1 begina i bodajże 2 endy które były nie potrzebne a zaciemniały strukturę - przynajmniej mnie się tak wydaje 3. Zamiast oddzielania wyrazów w pliku spacją użyj może średnika, będziesz mógł wstawiać wyrażenia kilku wyrazowe 4. Do wczytywania z pliku zwykle używa się pewniejszej struktury (...) Aż o 1 end'a za dużo Spróbowałem wykorzystać twoją strukturę i obliczanie pozycji podziału wyrazów ale niestety nie wiem w jaki sposób miałbym odczytać więcej niż 1 wyraz z wiersza. Dostaję pozycję 1szej spacji lub średnika lecz co potem? W jaki sposób mógłbym znaleźć pozycję kolejnej przerwy między wyrazami? Popieram Integer'a Dodam od siebie iż po wczytaniu zawartości linijki wystarczy napisać sobie funkcję "explode" która zwróci ci tablice. I po kłopocie. Dzięki temu będziesz mógł użytkownikowi pozwolić zadecydować po czym ma rozbijać plik (domyślnie " "). (...) Przyznam szczerze że nie mam pojęcia jak miałaby wyglądać taka funkcja explode... Nigdy dotąd się z nią nie spotkałem (na pewno nie w Pascalu). Link do komentarza Udostępnij na innych stronach More sharing options...
Stelma Napisano Kwiecień 25, 2011 Zgłoś Share Napisano Kwiecień 25, 2011 Mam dobry humor bo święta. Cyrkiel na forum ks-expert.pl napisał PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer; Ja dodam I już masz explode, wadą tego rozwiązania jest to iż trzeba używać TStringList zamiast tablicy. Jeżeli jednak chcesz koniecznie tablice to musisz Przeszukiwać ciąg znaków w poszukiwaniu danego znaku przyda ci się tutaj (nie wiem czy w pascalu jest): PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer; Link do komentarza Udostępnij na innych stronach More sharing options...
Integer Napisano Kwiecień 25, 2011 Zgłoś Share Napisano Kwiecień 25, 2011 Quass1m co do tego enda to mniej więcej wygląda to tak ze jak od początku uczysz się bałaganu to po prostu ciężko Ci ogarnąć to co piszesz. W tych konkretnych przypadkach end i begin nie przeszkadzały, ale jeśli się tak pomylisz przy warunkach lub w pętlach to taki end może Ci strasznie napsioczyć, i będziesz godzinami szukał błędu dlaczego ci "coś" wyskoczyło albo nie wyskoczyło. No i teraz zauważyłem dopiero bo Stelma wstawił procki z Delphi, dodaj w temacie [Pascal] lub [Delphi] tak dla pewności funkcja Pos zawsze zwraca pozycję pierwszego szukanego znaku w springu więc jak masz wyrazy w stringu: s:= 'kot dom znak tebafla fasarttt' to teraz musisz: 1. zdjąć pierwszy wyraz 'kot' i zapamiętac go w tabeli 2. skasować z S ciąg znaków 'kot ' - spacje na końcu też 3. i ponieważ to się dzieje w pętli na nowo szukać spacji i kolejnego wyrazu... Proponuję Ci zrobić na początek - chociaż może Ci się wydać lekko sadystyczne ale każdemu bym to doradził, zrobić trzy malutkie programiki z zastosowaniem Pos, Copy, i Delete w odniesieniu do stringów będzie tam 6 linijek na krzyż ale przynajmniej będziesz wiedział co one robią i jak działają. Pamiętaj o wyświetlaniu na końcu stanu każdego stringa i zmiennej, będziesz widział co się dzieje. A jeśli nie jesteś pewny to skopiuj z pomocy przykłady z ich użyciem żeby nie było pomyłki. Link do komentarza Udostępnij na innych stronach More sharing options...
Stelma Napisano Kwiecień 25, 2011 Zgłoś Share Napisano Kwiecień 25, 2011 @Integer Z tym tagiem to moja wina. Choć przyznam że w szkole jak miałem zajęcia z pascala to i tak sobie pisałem w D7 i mogłem używać funkcji z tego języka nauczyciele rzadko się czepiają jeżeli coś się kompiluje... @Topic Ja zawsze powtarzam iż w programowaniu można problemy rozwiązać na wiele sposobów. (Ten integer'a z posem, copy, delete lepszy). var Ret : array [1..100] of string; i, j : Integer; explod : Char; explod = ';'; j := 1; for i := 1 to Count( Text ) do begin if( Text[i] != explod ) then begin Ret[j][i] := Text[i]; end else inc(j); end; Ps autorze wysil komórki jeżeli nie znasz funkcji to oznacza że trzeba ją znaleźć / napisać własną. Link do komentarza Udostępnij na innych stronach More sharing options...
Integer Napisano Kwiecień 25, 2011 Zgłoś Share Napisano Kwiecień 25, 2011 Stelma - ale ja nie mówiłem ze Twój sposób jest nie na miejscu, tu na forum pasuje wszystko byle na temat, zawsze komuś szersze myślenie się przyda, bo my tu pokazujemy sposoby a nie podajemy gotowce. A [Pascal] w temacie sam wstawię, ale żeby mi to było przed ostatni raz Link do komentarza Udostępnij na innych stronach More sharing options...
Quass1m Napisano Kwiecień 25, 2011 Autor Zgłoś Share Napisano Kwiecień 25, 2011 @Integer Nie pomyślałem o takim sposobie. Myślę że teraz wyjdzie bez problemu. @Stelma Na TYM forum nie znalazłem żadnego explode w dziale Pascal. Niestety też ciężko byłoby mi napisać algorytm o którym nic nie wiem... Co prawda mój pierwszy sposób teraz wydaje mi się zdecydowanie najprostszy ze wszystkich, ale skoro nie działa idealnie to oczywiście będę dalej kombinował aż program zadziała poprawnie. Dzięki za pomocne rady. Link do komentarza Udostępnij na innych stronach More sharing options...
Quass1m Napisano Kwiecień 25, 2011 Autor Zgłoś Share Napisano Kwiecień 25, 2011 Wszystko działa tak jak powinno. Ostateczny kod wygląda tak: program wyrazy; uses crt; var x,y,m,p,n,i:integer; t:text; linijka,wyr,cz:string; wyraz:array[1..200,1..20] of string; begin clrscr; writeln(); writeln('_________________________________________'); assign(t, 'F:\lista.txt'); reset(t); m:=0; While not (Eof (t)) do begin Readln(t, Linijka); inc(m); p:=1; repeat I:= Pos(' ',Linijka); wyr:=cz; n:=1; if I>1 then begin repeat wyr:=wyr + Linijka[n]; inc(n); until n=I; wyraz[m,p]:=wyr; writeln('Wiersz - ',m, ', Pozycja - ',p, ', = ',wyr); inc(p); end; delete(Linijka, 1, I); until p=6; end; writeln(); writeln('========================================='); writeln(); writeln('Podaj wspolrzedne wyrazu'); read(x); read(y); writeln(wyraz[x,y]); close(t); readkey; end. Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.