Twoje PC  
Zarejestruj się na Twoje PC
TwojePC.pl | PC | Komputery, nowe technologie, recenzje, testy
B O A R D
   » Board
 » Zadaj pytanie
 » Archiwum
 » Szukaj
 » Stylizacja

 
M E N U
  0
 » Nowości
0
 » Archiwum
0
 » Recenzje / Testy
0
 » Board
0
 » Rejestracja
0
0
 
Szukaj @ TwojePC
 

w Newsach i na Boardzie
 
OBECNI NA TPC
 
 » rookie 14:45
 » Syzyf 14:44
 » Dexter 14:36
 » burz 14:34
 » ligand17 14:33
 » Sherif 14:33
 » KHot 14:31
 » myszon 14:30
 » MARtiuS 14:30
 » Kenny 14:28
 » Demo 14:26
 » wrrr 14:26
 » [yureq] 14:23
 » Liu CAs 14:10
 » Arlathan 14:08
 » ulan 14:04
 » XepeR 13:59
 » palioza 13:50
 » elliot_pl 13:47
 » okobar 13:32

 Dzisiaj przeczytano
 47434 postów,
 wczoraj 61370

 Szybkie ładowanie
 jest:
włączone.

 
ccc
TwojePC.pl © 2001 - 2026
A R C H I W A L N A   W I A D O M O Ś Ć
    

[OT] Pascal, WordCount - pomocy (długie). , Coyote 27/05/05 17:33
Hej.

Piszę program na zaliczenie i mam mały problemik. Program ma działać jak wc z linuxa (a nawet więcej bo ma zliczać znaki, słowa, zdania, linijki).

Problem polega na tym, że nie wiem jak porównywać wczytany znak (bo wczytuję po znaku) ze znakami "!",".","...","?", "tabulator","znak nowej linii". Kompilator nie chce mi puścić porównania mojej zmiennej c typu char z np. chr(10) - enter. Do tego zastanawiam się czy nie lepiej byłoby to wczytywać do tablicy charów po trzy znaki (żeby nie było problemu z tym wielokropkiem i sprawdzaniem czy poprzednio wczytany znak nie był też kropką.


Oto fragment programu:

var nc,nw,ns,nl:integer;
c:char;
slowo:boolean;
p:text;
lokalizacja:string;
begin

nc:=0; nw:=0; ns:=0; nl:=0;

Write('Podaj lokalizacje pliku: ');
ReadLn(lokalizacja);
AssignFile(p,lokalizacja);
Reset(p);

while not eof(p) do
begin
Read(p,c);
nc:=nc+1;
if c=' ' or c=chr(9) or c=chr(10) then
begin
slowo:=false;
nw:=nw+1;
if c=chr(10) then nl:=nl+1;
end
else
begin
if slowo=false then
begin
slowo:=true;
nw:=nw+1;
end;
end;
if c='.' or c='!' or c='?' then
begin
ns:=ns+1;
slowo:=false;
end;
end;

Close(p);
WriteLn(nc,' ',nw,' ',ns,' ',nl);
ReadLn;

end.

Do J23: Buziaki dla Ciebie, Misiu! :*

>>GG 1650565<<

  1. hmmm , john565 27/05/05 18:35
    a zamiast chr(liczba) nie powinieneś użyć ord(liczba) ??, bo cosik mi tak świta, zobacz zrestą chra w helopie to ci sie wszystko wyjaśni bo japod ręką nie mam,

    odezwij sie na gg bo mi numra wcieło

    f*ck

    1. NIe. , Coyote 27/05/05 19:28
      Ord daje numer ascii danego znaku. A chr daje dany znak od numeru.

      Do J23: Buziaki dla Ciebie, Misiu! :*

      >>GG 1650565<<

      1. to nie mozesz , john565 28/05/05 01:07
        zrobić ak że zmaist pidsać chr piszesz if ord(a)=10 ... ?? przy czym a to twój znajk pojedyńsczy

        f*ck

        1. dzięki. , Coyote 28/05/05 10:49
          Sprawdzimy.

          Do J23: Buziaki dla Ciebie, Misiu! :*

          >>GG 1650565<<

  2. strasznie nie efektywny ten program będzie , pastor666 28/05/05 10:14
    Chr(9) nie jest poprawne, bo Chr to funkcja zamieniająca znak na jego reprezentacje liczbową, a 9 to nie znak tylko liczba. Znak o indeksie 9 to #9, więc powinieneś napisać: Char(#9).

    A tak w ogóle, to tak jak wspomniałem w temacie, ten program nie sprawdzi się przy większych plikach. Wczytywanie danych z dysku, to dość mozolna operacja, którą ty przy pliku o rozmiarze 50kB, wykonasz 51200 razy. Przy założeniu, że pojedynczy odczyt trwa ćwierć sekundy, twój program pracowałby blisko 12 minut. A to przecież całkiem niewielki plik.

    Radzę co byś skorzystał z procedury BlockRead (być może coś pokręciłem w jej nazwie, bo podaje z pamięci), a znaki porównywał wg ich indeksów.

    1. dzięki za info... , Coyote 28/05/05 10:49
      ...zaraz to posprawdzam.

      Do J23: Buziaki dla Ciebie, Misiu! :*

      >>GG 1650565<<

    2. O jakim języku mówisz ? , exmac 30/05/05 09:09
      bo chyba nie o pascalu.......

      o buforowaniu operacji IO też pewnie nie słyszałeś.....

  3. Tu jest problem , exmac 30/05/05 09:04
    if c=' ' or c=chr(9) or c=chr(10) then


    powinieneś użyć nawiasów, bo "or" ma wyższy priorytet niż "=" i to wyrzażenie jest interpretowane jako:

    if ((c=(' ' or c))=(chr(9) or c))=chr(10) then

    co raczej wiekszego sensu nie ma i w dodatku jest niepoprawne składniowo gdyż porównujesz wyrażenia logiczne ze znakowymi i dlatego kompilator "nie chce puścić".

    P.S. Czytaj komunikaty - one nie są wyłącznie do ozdoby

    
All rights reserved ® Copyright and Design 2001-2026, TwojePC.PL