Newsgroup: it.comp.lang.pascal
Titolo: Stringa

Ciao a tutti,
         sapete come posso fare a contare in una stringa x, di y dimensioni,
quante volte gli stessi caratteri si ripetono?
per esempio nella stringa 'ESSERE' compaiono tre E, due S e una R.
Ringrazio in anticipo

 ha scritto nel messaggio
news:S3Pc8.285$6F1....@twister2.libero.it...


scorri la stringa e conti :-)
n: byte; s: string; miochar: char;
for n := 1 to length(s) do
 if s[n] = miochar then Inc(count);
mmmh se devi contare tutte le ripetizioni di tutti
i caratteri puoi farti un'array di 256 byte e incrementare
il contatore corrispondente al carattere trovato
count : array [0..255] of byte;
for n:= 1 to length(s) do
 Inc(count[ ord( s[n] ) ] );
--
Dreadnaut
(Life would be easier if I had the source code)

 volta una sottostringa è contenuta in una stringa.
temo non ci sia, la pos restituisce la posizione della prima occorrenza
di una sottostringa, e in effetti si potrebbe utilizzare per quello che
chiedeva... ma non so se valga la pena...
per i PChar ci sono invece StrPos per cercare una sottostringa,
StrScan e StrRScan per cercare un carattere, dall'inizio o dalla fine della
stringa


 ha scritto nel messaggio
news:S3Pc8.285$6F1....@twister2.libero.it...

come spiegato nel mio sito, il cui indirizzo si puo' trovare nella firma, i
caratteri di una variabile string sono indirizzabili individualmente. ad
esempio, noi abbiamo la stringa x il cui suo valore e' 'ESSERE'. ponendo y
come variabile di tipo char posso compiere questa operazione:
y:=x[i];
come forse sai, una variabile string, puo' essere considerata come un array
di char, infatti, l'istruzione che ho scritto prima, ti fara' ricordare
sicuramente gli array, anche se x e' di tipo string. ritornando al nostro
esempio se noi imponiamo il valore di i (l'indice della stringa) a 3, il
valore di y diventa S, se invece lo imponiamo a 6, il suo valore diventa E,
e cosi' via.
tornando al tuo problema, potresti risolverlo cosi':
program ciccio;
uses wincrt;
var   a:array[1..256]of char;
        b:array[1..256]of byte;
        stringa:string;
        tmp:char;
        k,z,lung:byte;
begin
for k:=1 to 256 do
a[k]:=chr(k); (*in pratica, trasferisco il contenuto del cadice ascii (up to
256) in questo array*)
read(stringa); (*acquisisco la stringa che devo esaminare*)
lung:length(stringa);
for k:=1 to lung do
begin
tmp:=stringa[k];
z:=ord(tmp);
b[z]:=b[z]+1;
end;
end.
l'esercizio non e' completo, e non e' neanche stato provato. cmq alla fine
ti ritrovi  l'array b, contenente il numero di volte per cui ogni carattere
e' ripetuto nella stringa. b e' parallelo all'array a, per cui, ad esempio
al valore b[56], corrisponde il numero di volte per cui il carattere
corrispondente ad a[56], e' contenuto nella stringa.. spero di essere stato
chiaro
--
Ciao
Marchese Gianfranco
e-mail dgruma@NOPUBBLICITA'
tin.it
 (Da togliere NOPUBBLICITA' se vuoi
rispondermi da qui)
sito internet personale: 
www.turbo-pascal.cjb.net
  Tutto sul Turbo Pascal
1.5
per il reply togliere NOSPAZZATURA

Questo programma io l'avrei fatto con un singolo array di integer,
implementando una procedura scrivi, grazie alle seguenti procedure::
var testo:string;
    j,k:integer;
    lettere: array[1..256] of integer;
procedure azzera;
var x:integer;
begin
for x:=1 to 256 do
begin
lettere[x]:=0;
end;
end;
procedure conta;
begin
j:=1;
k:=1;
while k<=length(testo) do begin
inc(lettere[ord(testo[k])]);
inc(k);
end;
end;
procedure scrivi;
var x:integer;
begin
for x:=1 to 256 do
begin
if lettere[x]<>0 then begin
write(char(x),'=',lettere[x],' , ');
end;
end;