Pocet slov oddelenych lubovolnym poctom medzier – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pocet slov oddelenych lubovolnym poctom medzier – Pascal – Fórum – Programujte.comPocet slov oddelenych lubovolnym poctom medzier – Pascal – Fórum – Programujte.com

 

Orava ON
~ Anonymní uživatel
4 příspěvky
24. 5. 2008   #1
-
0
-

Neviete ako zistim pocet slov v stringu ak su oddelene lubovolnym poctom medzier?
Napadlo ma odstranit prebytocne medzeri ale to tiez neviem ako spravit

Nahlásit jako SPAM
IP: 213.81.189.–
Mircosoft+1
Věrný člen
24. 5. 2008   #2
-
0
-

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í.

Nahlásit jako SPAM
IP: 85.132.158.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
24. 5. 2008   #3
-
0
-

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í.

Nahlásit jako SPAM
IP: 83.240.78.–
Podpis: Do podpisu nelze vložit obrázky ani HTML kód. Je podporován nový řádek tagem
.
24. 5. 2008   #4
-
0
-

Mircosoft mě předběhl :-).

Nahlásit jako SPAM
IP: 83.240.78.–
Podpis: Do podpisu nelze vložit obrázky ani HTML kód. Je podporován nový řádek tagem
.
Orava ON
~ Anonymní uživatel
4 příspěvky
24. 5. 2008   #5
-
0
-

ok dik uz to som to spravil

Nahlásit jako SPAM
IP: 213.81.189.–
Laaca0
Stálý člen
24. 5. 2008   #6
-
0
-

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;

Nahlásit jako SPAM
IP: 81.0.253.–
DOS-u-akbar
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 1 host

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý