Newsgroup: it.comp.lang.delphi
Titolo: cicli di calcolo

non so so č possibile, ma vrrei trovare un algoritmo piů veloce per
calcolare se in una stringa sono presenti alcuni caratteri.
attualmente uso la seguente funzione:
function contapari (s:string):integer;
var
x,k:integer;
begin
k:=0;
for x:= 1 to length(s) do if odd(ord(s[x])) then inc(k);
result:=k;
end;
esiste un metodo piů veloce?
Grazie a tutti coloro che vorranno rispondere.

calcolare se in una stringa sono presenti alcuni caratteri.
???
Guarda che quella funzione fa tutto fuorchč verificare la presenza di certi
caratteri. Il suo compito č quello di dirti quanti sono i caratteri della
stringa il cui valore ordinale č un numero dispari. Da quel che dici tu vuoi
vedere se in una stringa c'č un certo carattere e puoi farlo cosě :
Function Presente (s:string; c:Char):Boolean;
Var I:Integer;
begin
Result:=False;
For I:=1 to Length(s) do
   If UpperCase(S[I])=UpperCase(C) then begin
   Result:=True;
   Break;
   end;
end;
Se poi ho capito male dimmi pure!
Ciao
--
- Carlo -
BSSoftware Tips Mailing-List Support

 vedere se in una stringa c'è un certo carattere e puoi farlo così :
Non so ovviamente la vera natura della domanda di Narciso... però l'ho letta
prima
e ho provato 10 minuti a "ottimizzare" la sua procedura...
Comunque a me sembrava che dal nome della sua funzione "ContaPARI" ... lui
volesse
creare una funzione che gli restituisse il numero di caratteri con un valore
ordinale pari/dispari
nella stringa. (Almeno è quello che fa!! Poi non so!)
Cmq ... oltre che provare a scriverselo in asm, avevo pensato questo :
Type TPD = (Pari, Dispari);
Function Conta ( S : String; PD : TPD ) : integer;
var i : integer;
Begin
  Result := 0;
  for i := 1 to length (s) do
    inc (Result, integer ( byte (s[i]) mod 2 = byte(PD) ) );
End;
Poi però non so se è più veloce!!!
Vabbè --- Ciao! Davide DG

Leggendo la richiesta di Narciso credo che la funzione di Carlo sia adeguata
al problema, ma leggendo la tua non ho capito la parte finale della
funzione, me la puoi spiegare?
Luigi
--
Posted from [195.223.215.6] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 end;
Ahem...
Posto che la domanda sia "Come sapere se in una stringa è presente un dato
carattere?", la Pos vi sta tanto antipatica? ;-)
Ciao
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply

 funzione, me la puoi spiegare?
  inc (Result, integer ( byte (s[i]) mod 2 = byte(PD) ) );
Penso tu intenda questa...
Ci arrivo per piccoli passi :
   Incrementa Result di 1 se il carattere s[i] ha un valore ordinale (ord
(s[i]) che è o pari o dispari (pd), cioè:
   Incrementa result del valore intero ( 1° Byte () ) corrispondente alla
condizione booleana espressa dopo.
La condizione è espressa come:  ( s[i], trattato come byte, ) mod 2  =  (PD,
trattato come byte),
cioè ritorna vero se  ord (s[i]) mod 2 =  pd (inteso come byte).
A Mod 2 ritorna 0 se il numero è pari (contiene 2 un numero intero di volte)
e 1 se è dispari.
... spero di non aver complicato ... :)
Comunque, per quanto ne so io (spero sia così, visto che praticamente faccio
sempre così...), tutti quei
"Byte" ... non generano codice, ma dicono solo al compilatore come
utilizzare la zona di memoria della var.
CIAO, Davide DG.

carattere?"
Ti riporto il 
testualmente quanto scritto da Narciso : "non so so è
possibile, 
ma vrrei trovare un algoritmo più veloce per calcolare se in 
una
stringa sono presenti alcuni caratteri."
Che poi la funzione da 
lui postata non faccia nulla di tutto ciò è
tutt'altro 
discorso.......
la Pos vi sta tanto antipatica? ;-)
No, non mi sta 
affatto antipatica, ma ragionando un attimo ho ritenuto
opportuno non 
utilizzarla perchè veniva chiesto il metodo + veloce per
eseguire 
quanto detto sopra.
Essendo la Pos una funzione che ti dice il numero di 
volte che un carattere
è presente all'interno di una stringa, è 
"costretto" a scorrerla tutta, dal
primo all'ultimo 
carattere.
Con la mia funzione invece esce dal ciclo subito dopo che ha 
trovato il
carattere. Certo se non fosse stato richiesto un metodo veloce la 
Pos si
sarebbe rivelata migliore poichè il codice risultante si 
ridurrebbe a ciò :
Function Presente (s:string; 
c:Char):Boolean;
begin
Result:=False;
If Pos(c,s) > 0 
then
   Result:=True;
end;
Vabbè, ti 
saluto!
Ci sentiamo! :)
--
- Carlo -
BSSoftware Tips 
Mailing-List Support


 


PS : Rispondo tramite Mailgate 
perchè il server fa i classici scherzetti....



 carattere.
La Pos non dice il numero di volte che un carattere è presente all'interno
di una stringa, bensi' la posizione in cui compare la prima volta. Quindi
funziona piu' o meno come la tua funzione.
Ho fatto un piccolo esperimento e la tua funzione e la Pos sono a pari
merito indipendentemente dalla posizione del carattere nella stringa.
Per finire una piccola osservazione quasi solo stilistica. Anziche':
    Function Presente (s:string; c:Char):Boolean;
    begin
        Result:=False;
        If Pos(c,s) > 0 then
            Result:=True;
    end;
scriverei:
    Function Presente (s:string; c:Char):Boolean;
    begin
        Result := Pos(c,s) > 0;
    end;

On 26 Apr 2000 23:17:48 +0200, 
c.b...@libero.it
 ("Carlo Bertuccini")
wrote:
devo a tutti una spiegazione: mi sono espreso male!
In effetti io voglio valutare quanti caratteri di un certo tipo sono
presenti in una stringa. Che tipo di caratteri? Quelli che hanno un
valore Ordinale PARI (o dispari)!
E la funzione postata fa tale servizio!
Purtroppo mi sembra lenta, e siccome dev'essere richiamata più volte
da un ciclo anche lungo, volevo conoscere il modo di velocizzarla!
Quando mi sono espresso dicendo "Un certo carattere", intendevo dire
che la soluzione proposta dovrebbe essere utile , per esempio anche a
sapere, per ipotesi, quante maiuscole sono presenti. Chiaramente
usando un'altra funzione.
esempio 
for x:= 1 to length(s) do if ord(s[x]) in [65..91] then inc(k);
oppure le vocali... etc
secondo me, bisognerebbe eliminare il ciclo FOR, ma come?
Grazie a tutti!

da un ciclo anche lungo, volevo conoscere il modo di velocizzarla!
L'unico modo che mi viene in mente e' quello di riscriverla in
assembly.

    end;
[SNIP]
Avete ragione tu ed Andrea, la devo aver confusa con qualche altra
funzione....penso anche che sia una delle maniere + veloci, perchè andando a
vedere il codice sul file System ho visto che la funzione è stata scritta
tutta in ASM.
Ciao Ciao!!


Scusate se mi intrometto, ma che senso ha nella funzione
If (c,s) > 0 ? Perché questo > 0?


 If (c,s) > 0 ? Perché questo > 0?
Non era
      If (c,s) > 0 then ....
bensi'
      If Pos (c,s) > 0 then ....
Se il tuo dubbio e' di natura sintattica: fra la if e la then ci va
un'espressione booleana. "Pos (c,s) > 0" e' un'espressione booleana, "Pos
(c,s)" e' invece intera e non puo' stare da sola tra una if e una then.
Se invece il dubbio riguarda la logica di funzionamento: la funzione Pos
restituisce il valore zero se non trova la sottostringa nella stringa;
quindi nel nostro caso scrivere "Pos (c,s) > 0" equivale a "il carattere c
compare nella stringa s".

Conosco il funzionamento di If then else...
Praticamente non capisco perchè   pos(c,s) >0.   mica pos(c,s) è un numero.


 Praticamente non capisco perchč   pos(c,s) >0.   mica pos(c,s) č un
numero.
... Come no ? Pos č una funzione che ritorna un numero (integer) ... quindi
č come un numero, cioč
si possono testare disuguaglianze!!
Davide DG

 via Mailgate.ORG Server - 
http://www.Mailgate.ORG
Guarda l'help della funzione Pos. Dice:
      function Pos(Substr: string; S: string): Integer;
cioe' la funzione Pos restituisce un valore Integer. Quindi puo' stare in
un'espressione di confronto dove venga confrontata con un altreo Integer
(nel nostro caso la costante zero). Tu dici "mica pos(c,s) č un numero", ma
neppure (2+x) e' un numero, eppure penso che non avresti nulla da obiettare
se io scrivessi:
      if (2+x) > 0 then ....
Se non sei convinto guardati un po' le definizioni sintattiche (appendice A
del manuale "Guida al linguaggio Object Pascal").