logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Pascal] Wyszukiwanie ostatniej liczby w pliku tekstowym?

Siber 26 Wrz 2004 15:30 3527 12
REKLAMA
  • #1 875978
    Siber
    Poziom 11  
    Posty: 38
    Ocena: 1
    Chcę, aby mój program napisany w języku pascal potrafił znaleźć ostatnią liczbę w jakimś pliku tekstowym, chcę aby zwracał ilość liczb zapisanych w tym pliku. Potrzebne mi to, bo chcę napisać program, który wczyta z pliku txt kolejne liczby, posortuje je np. rosnąco, zapisze plik z posortowanymi liczbami.
    Proszę o pomoc.

    Zamykam. - arnoldziq
  • REKLAMA
  • #2 876106
    zibiw
    Poziom 12  
    Posty: 20
    Pomógł: 1
    W basicu wyglądało by to mniej więcej tak:
    dim a$ as string * 1
    dim liczba (1000)
    dim licznik
    open nazwapliku for append as #1
    for x = 1 to EOF(1)
    input #1 , a$
    if a$>chr$(48) or a$<chr$(57) then
    licznik=licznik+1
    liczba(licznik)=val(a$)
    end if
    next x
    close #1
    w pascalu podobnie musisz po prostu sprawdzać kolejne znaki w pliku i jeśli jest to znak ascii z przedziału od 48 czyli 0 do 57 czyli 9 to podstawiasz go pod zmienną tablicową.
    aby odczytać tą zmienną wystarczy pętla
    for x=1 to licznik
    msgbox(liczba(x))
    next x
  • #3 876250
    Siber
    Poziom 11  
    Posty: 38
    Ocena: 1
    kiedy pascal dochodzi do miejsca gdzie jest koniec liczb to zwraca zera za każde puste pole, ale kiedy zaro będzie wpisane jako liczba w pliku to już nie posortuję. Napisałem prog co sortuje liczby w pliku ale w tych liczbach nie może być zera, jak to zrobić aby prog brał pod uwagę zero?
    Ten kod źródłowy niestety nic mi nie mówi, ale jeszcze go poanalizuję. (nie znam basica)....
  • REKLAMA
  • #4 876807
    000andrzej
    Poziom 37  
    Posty: 3276
    Pomógł: 302
    Ocena: 238
    Nie wiem do czego ten programik, ale może poprzez pętelkę i IF spróbuj wyeliminować wszystko co nie jest liczbą. Pozostaną same liczby, które posegregujesz. Czy mniej więcej o to chodzi? Pętelka sprawdza poszczególne znali od 1 do iluśtam i IF: jeżeli dany znak (nie pamiętam chyba $) = 1,2,3,..... THEN wpisuje znak ELSE puste. Dawno nie pisałem, więc może inni podpowiedzą coś innego. Zerknij też w Helpie, może masz tam gotową procedurę.
  • REKLAMA
  • #5 877705
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    funkcje eof eoln seekeoln

    wersja minimum
    . while not eof(fi) do
    . . readln(fi, n);
    dobre jeśli w jednym wierszu jest jedna liczba

    albo
    repeat
    . if eoln(fi) then readln(fi);
    . if not eof(fi) then read(fi, n);
    until eof(fi)
  • REKLAMA
  • #6 878836
    Siber
    Poziom 11  
    Posty: 38
    Ocena: 1
    próbowałem z eof ale ta funkcja nie chce u mnie działać, wyskakuje błąd
  • #7 878895
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    panie doktorze jak tak zrobie to mnie tu strzyka, co mi jest? ;)
    napisz coś więcej, jak zbudowany jest plik, czy w jednym wierszu jest jedna liczba? czy są to tylko liczby czy może jeszcze jakieś litery? jaki to błąd - kompilacji czy wykonania?
  • #8 879699
    Konto nie istnieje
    Konto nie istnieje  
  • #9 879995
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    
    uses crt,dos;
    var fSource:file;
        bufor:array[0..1023] of char;
        i,o,p:word;
        read:integer;
        liczba:longint;
        cyfr:byte;
        znal_liczby:array[0..1023] of longint;
        ind_znal_liczb:integer;
    
    procedure SwapLI(var a,b:longint);
    var tmp:longint;
    begin
      tmp := a;
      a := b;
      b := tmp;
    end;
    
    begin
      clrscr;
      assign(fSource,'findcy~1/przyk.txt'); {nazwa pliku do przeszukania}
      reset(fSource,1);
      liczba := 0; {ostatnia liczba}
      cyfr := 0; {ilosc cyfr w liczbie}
      ind_znal_liczb := 0;
      while not eof(fsource) do {skanowanie pliku do konca }
      begin
        blockread(fSource,bufor,1024,read); {odczyt bloku}
        for i := 0 to read-1 do {analizowanie przeczytanego bloku}
        begin
          if bufor[i] in ['0'..'9'] then {jesli liczba to dodaj do wyniku}
          begin
            liczba := liczba * 10 + ord(bufor[i]) - ord('0');
            inc(cyfr);
          end
          else if cyfr>0 then {a jesli nie liczba a wynik sklada sie z conajmniej
                               jednej cyfry to zapisz ja do tablicy}
          begin
            znal_liczby[ind_znal_liczb] := liczba;
            inc(ind_znal_liczb);
            liczba := 0;
            cyfr := 0;
          end;
        end;
      end;
      close(fsource); {zamkniecie plkiku}
    
      writeln('ostatnia liczba w pliku to: ',znal_liczby[ind_znal_liczb-1]);
    
      { sortowanie bombelkowe (pierwsza liczba najwieksza) }
      for i := 0 to ind_znal_liczb-2 do
        for o := i+1 to ind_znal_liczb-1 do
          if znal_liczby[i] < znal_liczby[o] then
            SwapLI(znal_liczby[i],znal_liczby[o]);
    
    
      for i:=0 to ind_znal_liczb-1 do
        writeln(znal_liczby[i]);
    
      readln;
    end.
    

    Podczas skanowania pliku (którego warunkiem końca jest eof) jest szukana dowolna cyfra, jeśli cyfra zostanie znaleziona to wynik jest mnożony przez 10 i dodawana jest wartość odczytanego znaku, jeśli to niecyfra (znak) to sprawdź czy w wyniku jest zapisana conajmniej jedna cyfra (dodatkowa zmienna), jeśli tak to zapisz wynik do tablicy. po zakończonym skanowaniu pliku następuje sortowanie bombelkowe. na końcu są wyświetlane znalezione liczby.
    p.s. program niejest zabezpieczony przed przepelnieniem buforu znalezionch liczb albo pustym buforem znalezionych liczb, itp. bufor odczytu z pliku jest zabezpieczony.
  • #10 880394
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    a co ze znakami "+-E,." (plus minus E przecinek i kropka)?
    no i jeszcze wielkie liczby
    jak będę miał więcaj czasu to jeszcze pomarudzę ;)
    tak czy siak Dialerowi należą się podziękowania
    (poza tym bąbelkiem, wrrrrr ;) )
    -------dopisek---------
    tJanusz:
    - bez sensu? no nie całkiem.
    - eof konieczny? wcale nie bo zobacz w programie Dialera wystarczy pętlę WHILE NOT EOF(FI) zastąpić przez REPEAT ...... UNTIL READ<1024 i co? eof jest konieczne? ;)
    nie wiem jak był przygotowany plik z danymi, ale czuję że pytający miał kłopot z przeskoczeniem końca wiersz.
    twoja propozycja poszła w dobrą stronę, ale była trochę nie na temat, tak jak proponowałeś otrzymali byśmy histogram występowania cyfr.
    ogólnie rozwiązanie - owszem trzeba czytać po znaku, ale należy dodać parę drobiazgów, właśnie przecinek albo kropka (czemu?) E + - pilnowanie zakresu liczb.
    "diabeł tkwi w szczegółach" ale o nich zwykle pytający zapominają
  • #11 881026
    maciek_dz
    Poziom 12  
    Posty: 59
    Pomógł: 3
    Ocena: 6
    Właśnie histogram występowania liczb (czyli count sort) jest jednym z najszybszych algorytmow sortowania w niektórych zastosowaniach. Nawet qsort wysiada.
  • #12 881407
    Konto nie istnieje
    Konto nie istnieje  
  • #13 881685
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    * maciek_dz:
    celna uwaga
    * tJanusz:
    jestem czepialski, ale nie złośliwy. częściej prościej by się dyskutowało gdyby pytający dokładniej określił czego oczekuje, jeśli tego nie robi to staram patrzeć się na sprawę jak najogólniej.
    twój 1 post
    -Pytający nie wspomina że interesuje go częstość występowania LICZB tylko ich posortowanie
    -plik typu file? a może lepiej file of char?
    2 post
    -w życiu różnie bywa, czasem trzeba tak, czasem inaczej, bywa że:
    while not eof(fi) do begin
    . readln(fi, t[n]);
    . inc(n)
    end;
    będzie całkiem wystarczające, prawda?
    -powiedziałeś, że eof konieczny, tak przy pliku tekstowy owszem nie mamy innej możliwośći, ale zauważ że u Dialera plik jest typu FILE i czyta go blokami po 1024 znaki no to i u mnie ta liczba, napisałem to tylko po to zeby pokazać że eof nie jest konieczny.
    -przyznałem wcześniej że moja pierwsza propozycja była zbyt pochopna
    -do bąbelka uprzedziłem się dość dawno kiedy jeszcze komputery miały zegar w MHz nie GHz (mój pierwszy PC miał 4,77 MHz) ile ja czasu spędziłem gapiąc się w migający kursor kiedy komputer mi bąbelkował i ja myślałem, że tak trzeba ;)

Podsumowanie tematu

✨ Dyskusja dotyczy problemu napisania programu w języku Pascal, który potrafi odczytać z pliku tekstowego wszystkie liczby, znaleźć ostatnią liczbę oraz zwrócić ich ilość. Użytkownicy sugerują różne podejścia do odczytu i analizy pliku, m.in. czytanie znak po znaku, wykorzystanie funkcji eof do wykrywania końca pliku, a także filtrowanie znaków ASCII w zakresie cyfr ('0'..'9'). Poruszono kwestie rozróżnienia pojedynczych cyfr od wielocyfrowych liczb oraz obsługi liczb ze znakami dodatnimi, ujemnymi, przecinkami, kropkami i notacją wykładniczą (np. "+", "-", "E", ",", "."). Zaproponowano także czytanie pliku blokami (np. 1024 bajty) i analizę zawartości bufora, a także przechowywanie liczb w tablicach typu longint. Wskazano, że do sortowania można użyć prostych algorytmów, np. sortowania bąbelkowego, a także histogramu występowania cyfr (count sort). Podkreślono, że funkcja eof jest standardowym i najprostszym sposobem wykrywania końca pliku tekstowego, choć niektórzy proponowali alternatywne metody. Dyskusja zawierała także uwagi dotyczące poprawnego odczytu liczb z pliku, obsługi błędów oraz konieczności dokładnego określenia formatu pliku i oczekiwań co do danych wejściowych.
Wygenerowane przez model językowy.
REKLAMA