Neviete ako zistim pocet slov v stringu ak su oddelene lubovolnym poctom medzier?
Napadlo ma odstranit prebytocne medzeri ale to tiez neviem ako spravit
Fórum › Pascal
Pocet slov oddelenych lubovolnym poctom medzier
Počet slov := 0.
Nastav se na první znak řetězce.
Deklaruj si dvě proměnné typu char. Do první vlož mezeru.
Cyklus:
- Do druhé proměnné ulož obsah první.
- Do první proměnné načti jeden znak z aktuální pozice v řetězci.
- Pokud je v první proměnné písmeno a ve druhé mezera, našli jsme začátek slova - zvyš počet slov o 1.
- Posuň se v řetězci o znak dál.
Opakuj, dokud nedojdeš na konec řetězce.
Nebo kdybys chtěl odstranit vícenásobné mezery, tak můžeš opakovat hledání podřetězce ' ' (dvě mezery vedle sebe) pomocí funkce Pos a následné smazání jedné té mezery procedurou Delete, ale bude to méně efektivní.
Moje stránka.
Tak, musíš číst od začátku do velikosti stringu ( ord(s[0]) ). Číst po znacích a pokud narazíš na mezeru a další písmeno je různé od mezery, tak přičíst.
ve zkratce
function VratPocetSlov(s:string):integer;
var j, pocet:integer;
Begin
pocet:=0;
if s[1]<>' ' then pocet:=pocet+1;
for j:=1 to ord(s[0]) do
Begin
if (s[j]=' ') and (s[j+1]<>' ') then pocet:=pocet+1;
end;
VratPocetSlov:=pocet;
end;
nejdříve zkontroluji, jestli náhodou není první znak různý od mezery a pokud je, tak přičtu počet slov (pokud je tam písmeno, tak tam musí být slovo) - dělám to kvůli podmínce, kterou jsem pak dal do for cyklu. No a pak udělám for cyklus, který projíždí postupně celý řetězec a zjišťuje, jestli není aktuální mezera a další různý od mezery - slova jsou oddělena mezerou, tudíž pokud je na tomto mezera a na dalším není, nutně tam musí být slovo. Toto ošetřuje i případy více mezer za sebou (na aktuální sice mezera je, ale na další taky -> proměnná se nepřičte). Možná to není zrovna elegantní, ale je to funkční.
Mircosoft mě předběhl :-).
Garret Razier to nenapsal moc dobře. Kód sice bude ve většině případů fungovat správně, ale kód je chybný. Problém je, že při posledním cyklu přistupuje k znaku většímu než je délka řetězce, jehož obsah není definován a může tam být cokoliv.
Kvůli podobným chybám (jde vlastně o překročení rozsahu pole) může i zhavarovat systém. V tomto případě se to, pravda, stát nemůže (ledaže by délka řetězce byla 255 znaků), protože typ string je defnován jako pole 256 znaků (1 bajt délka+ 255b data).
Také není šťastné použití výrazu ord(s[0])
Proč? Snižuje to čitelnost kódu a omezuje to kompatibilitu. Kvůli tomuhle nelze tvoji funkci používat např. pro typ Ansistring. (řetězec, který může obsahovat více než 255 znaků)
Lepší je třeba toto:
function PocetSlov(s:string):byte;
var i,j:byte;
b:boolean;
begin
j:=0;
b:=false;
for i:=1 to Length(s) do
if s[i]<>' ' then
if b=false then
begin
b:=true;
inc(j);
end
else {if B...}
else {if s[j]...}
b:=false;
PocetSlov:=j;
end;
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Počet medzier na jeden tabulátor — založil Tango
Počet slov ve stringu — založil Ed
Pocet slov (zadanych uzivatelem) v souboru — založil johnyxxP
Počet opakování stejných slov v textovém souboru — založil tomstein
Výpis vět s počtem slov větším než je průměr slov ve větě — založil alex
Moderátoři diskuze