Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

Program zliczania wystąpienia słowa w tekście



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Pascal, Delphi, ...
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Matii
Gość





PostWysłany: Pon Sty 22, 2018 10:04 pm  OP    Temat postu: Program zliczania wystąpienia słowa w tekście Odpowiedz z cytatem Pisownia

Witajcie

Napisałem prosty programik zliczania danego słowa w tekście. Najpierw podaje się nazwę pliku tekstowego np: tekst.txt a następnie szukane słowo np. Lorem

Prosiłbym też o jego przetestowanie, gdyż w jednym tekście zlicza dobrze a w drugim źle i tak się zastanawiam dlaczego ?

Kod:
program policz;
var
plik: text;
nazwa: string[12];
znak: char;
findword: string[20];
find: boolean;
i,suma,loop: integer;
begin
     find := false;
     suma := 0;
     readln(nazwa);
     readln(findword);
     assign(plik,nazwa);
     reset(plik);
     while not eof(plik) do
          begin
               while not eoln(plik) do
                    begin
                         read(plik,znak);
                         if znak <> ' ' then
                           begin
                                if (znak <> '"') and (znak <> '(') and (znak <> ')')
                                  and (znak <> ',') and (znak <> ':') and (znak <> ';') then
                                  begin
                                       if loop = 1 then
                                         find := true
                                       else
                                           if i = 1 then
                                             find := false;

                                       if find then
                                         if znak = findword[i] then
                                           i := i + 1
                                         else
                                             find := false;

                                       loop := loop + 1
                                  end
                           end
                         else
                             begin
                                 if find then
                                   suma := suma + 1;

                                 find := false;

                                 i := 1;

                                 loop := i;
                             end
                    end;
               readln(plik)
          end;

          if find then
            suma := suma + 1;

close(plik);
writeln(suma)
end.
Powrót do góry
mrowek



Dołączył: 28 Maj 2005
Posty: 330
Skąd: pniewy wlkp

PostWysłany: Pon Sty 22, 2018 10:56 pm      Temat postu: Odpowiedz z cytatem Pisownia

a w ramach nauki dalbys rade program podzielic na funkcje?
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Numer GG
samolot



Dołączył: 26 Sty 2006
Posty: 8247
Skąd: Toruń

PostWysłany: Pon Sty 22, 2018 11:01 pm      Temat postu: Odpowiedz z cytatem Pisownia

Wydaje się , że w wierszach 23-24 eliminujesz znaki, które uznałeś, że nie mogą być częściami słowa, a te, które uznałeś, że mogą być częściami słowa, "bierzesz do dalszej analizy".
Tyle, że tych przypadków do eliminacji jest na pewno więcej, niż ty to uwzględniłeś w wierszach 23-24.
Pliki tekstowe, które badasz: jedne mogą mieć te nie uwzględnione znaki, a inne nie. Na przykład zapis tekstu może zawierać kody sterujące, informujące o końcu wiersza czy o nowej linii, tyle, że na monitorze te kody nie są pokazywane. Nie są to normalne znaki alfanumeryczne, lecz kody sterujące. Twój algorytm je zapewne wykrywa i zalicza do sumy słów. Tym samym zafałszowuje liczbę słów, które ty widzisz na ekranie.

_________________
Nie zadawaj bezcelowych pytań / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
Matii
Gość





PostWysłany: Pon Sty 22, 2018 11:48 pm  OP(?)    Temat postu: Odpowiedz z cytatem Pisownia

Mam pytanie. Czy pojemność pliku tekstowego (dla zmiennej text) ma znaczenie ? Z natury jestem leniwy i z neta ściągnąłem sobie tekst Lorem Ipsum. W programiku napisanym przeze mnie słowo Lorem występuje 11 razy natomiast w przeglądarce 20, zaś w drugim pliku tekstowym o zawartości
Cytat:
ZTEKST "TEKST" :) TEKST YU p 9
TEKST" U TEKST U tekst" U
ZTEKST (TEKST) :) "TEKST tekst ,TEKST TEKST, ,TEKST,
wszystko zlicza ok :).
Powrót do góry
samolot



Dołączył: 26 Sty 2006
Posty: 8247
Skąd: Toruń

PostWysłany: Wto Sty 23, 2018 11:40 pm      Temat postu: Odpowiedz z cytatem Pisownia

Cytat:
Czy pojemność pliku tekstowego (dla zmiennej text) ma znaczenie ?

Ma oczywiście znaczenie, ale nie dla przypadku, o którym piszesz, bo zapewne wspomniany przez ciebie plik z Internetu, jak go nazwałeś "tekst Lorem Ipsum", nie jest większy, niż dopuszczalna wielkość jaka może się zmieścić w zmiennej tekstowej. Zresztą, gdyby miała się nie zmieścić, to wcześniej dostałbyś komunikat, że się nie mieści.
Ja, badając te pliki :
1. Sprawdziłbym, z jakim kodowaniem są zapisane
2. Odczytałbym w pętli znak po znaku całość pliku i pobrał bym ich kody funkcją AscW(). Nie wiem czy taka jest w Pascalu. Te kody zapisałbym do tablicy i sprawdziłbym, jaką mają wartość. jeśli wykraczają poza zakres 0-127 to warto sprawdzić, jakich znaków dotyczą.
3. Podziel plik tylko względem spacji (kod 32) i zapisz znalezione wyrazy do tablicy tekstowej. Następnie sprawdź w pętli każdy wyraz pod względem tego, ile zawiera znaków oraz ile zawiera ukrytych znaków.
Jeśli tak, jak w punkcie 3, podzielisz plik względem spacji (kod 32), to uzyskana tablica nie powinna zawierać spacji jako separatora. Podejrzyj teraz w kodzie elementy tablicy i zobacz, że niektóre elementy nadal wyglądają jak spacja. Są pokazane albo jako " ", albo jako "". Słowo TEKST, które przykładowo szukasz, ma 5 znaków. Ale w badanej treści może jest tak, że słowo to jest połączone z jakimś znakiem sterującym.

Być może nie wszystko napisałem precyzyjnie, ale warto pod tym względem zbadać tekst, Zobaczysz, że sprawa policzenia słów jest bardziej skomplikowana, niż się wydaje.

_________________
Nie zadawaj bezcelowych pytań / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
Matii
Gość





PostWysłany: Sro Sty 24, 2018 11:21 pm      Temat postu: Odpowiedz z cytatem Pisownia

Miałem do wykonania zadanie, które polegało na wyświetlaniu w całości pliku tekstowego. Plik tekstowy większy niż ekran więc musiałem zrobić przewijanie i właśnie do tego zadnia kilka razy skopiowałem tekst Lorem Ipsum, który wcześniej pobrałem z neta :) i tak się zastanawiam czy to ma znaczenie ? Niemniej z tego co piszesz Samolot to chyba nie ma.
Powrót do góry
samolot



Dołączył: 26 Sty 2006
Posty: 8247
Skąd: Toruń

PostWysłany: Czw Sty 25, 2018 12:46 am      Temat postu: Odpowiedz z cytatem Pisownia

Z tego, co ja napisałem, to właśnie może mieć znaczenie. Tekst z Internetu ma to do siebie, że jest "obłożony" sporą ilością różnych składników formatujących, specyficznych dla formatowania stron HTML. Spróbuj skopiować taki tekst ze strony internetowej do pliku Worda z zachowaniem formatowania i w nim włączyć pokazywanie znaków formatujących tekst. Zobaczysz, że jest dość sporo. Żeby to sprawdzić w twoim programie, to właśnie zastosuj badanie tego tekstu metodami jakie ci zasugerowałem.
Piszesz, że jesteś leniwy. Czasem się przez to dwa razy traci. Bo gdybyś z lenistwa nie wklejał z Internetu jakiegoś tam Lorem..., to napisałbyś w polu tekstowym swoje kilka zadań i pewnie nie miałbyś różnic w liczeniu ilości słów. Ale z drugiej strony jeśli dojdziesz wreszcie to przyczyny różnic w ilości liczenia słów, to czegoś więcej się nauczysz.

_________________
Nie zadawaj bezcelowych pytań / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
Matii
Gość





PostWysłany: Pią Sty 26, 2018 11:10 am      Temat postu: Odpowiedz z cytatem Pisownia

Udało mi się napisać program zliczania stringów tzn. Całych łańcuchów wyrazowych oddzielonych spacjami, mogą też być pojedyncze wyrazy. Dlatego też program ten jest jakby lepszą wersją poprzedniego. Chociaż jak czytałem to osoba, która napisała dany program nie powinna go testować ja jednak przetestowałem i tak się składa, że wszystkie testy przeszły pomyślnie :).
Kod:
program sprawdzania_stringow;
uses Crt;
var
plik: text;
nazwa: string[12];
znak:  string[250];
findstring: string[100];
linia: string[100];
zaczynamy: boolean;
i,j,suma,loop: integer;
begin
suma := 0;
readln(nazwa);
readln(findstring);
assign(plik,nazwa);
reset(plik);
ClrScr;
writeln(findstring);
zaczynamy := false;
while not eof(plik) do
     begin
          readln(plik,znak);
          for loop := 1 to Length(znak) do
          {while not eoln(plik) do}
               begin
                    {read(plik,znak);}
                    if zaczynamy = false then
                      begin
                           if znak[loop] <> ' ' then
                             begin
                                  i := 1;
                                  if znak[loop] = findstring[i] then
                                    begin
                                         if i = Length(findstring) then { od jedynki }
                                           begin
                                                writeln(znak[loop]);
                                                suma := suma + 1;
                                                continue
                                           end;
                                         j := loop - 1;
                                         i := i + 1;
                                         zaczynamy := true
                                    end
                                  else
                                      zaczynamy := false
                             end  { if znak <> ' '}
                      end
                    else { zaczynamy = true }
                        if znak[loop] = findstring[i] then
                          begin
                               if loop - j = Length(findstring) then { od dw˘jki }
                                 begin
                                      writeln(' Dlugo˜† wynosi: ',Length(znak));
                                      writeln(' i wynosi: ',i);
                                      j := 1;
                                      while j <= Length(findstring) do
                                           begin
                                                write(loop - Length(findstring) +j:2,znak[loop - Length(findstring) +j]:2,' ');
                                                j := j + 1
                                           end;
                                      writeln;
                                      suma := suma + 1;
                                      zaczynamy := false
                                 end;
                               i := i + 1
                          end { zaczynamy = true }
                        else
                            zaczynamy := false
               end; { eoln }
          {readln(plik)}
     end; { eof }
close(plik);
write('suma ciĄg˘w wynosi: ',suma)
end.
Powrót do góry
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Pascal, Delphi, ... Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.09211 sekund, zapytan = 12
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |