Appunti d’Informatica Stringhe Programmi Pascal Le stringhe Una stringa può essere dichiarata o come string (in questo caso può contenere al massimo 255 caratteri) o come string[m] con m≤255 (in questo caso il numero massimo di caratteri che può contenere è m). Se da input si inseriscono più caratteri di quelli consentiti allora quelli in eccesso verranno tralasciati. Una stringa dove sono stati inseriti n caratteri (n≤ di quelli consentiti) può essere pensata come un array di n+1 elementi dove l’elemento di posizione 0 contiene il carattere il cui codice ASCII è uguale alla lunghezza effettiva della stringa. Cosa importante da tenere presente è che la lunghezza e quindi il carattere di posizione 0 viene aggiornato automaticamente dall’input con il comando Readln o con l’assegnazione alla stringa ma non da operazioni sui singoli caratteri. Operazioni con le stringhe 1. Varie operazioni sulle stringhe Program stringhe; uses crt; var s,SS:string; k,j:Byte; begin readln(s); (* stampa un carattere della stringa uno alla volta *) for k:=1 to length(s) do writeln(s[k]); (* stampa il primo e l'ultimo carattere *) writeln(s[1],s[length(s)]); (* copia tutte le vocali presenti in s nella variabile SS *) j:=0; for k:=1 to length(s) do if upcase(s[k]) in ['A','E','I','O','U'] then begin inc(j); SS[j]:=s[k] end; SS[0]:=chr(j); (* assegna la lunghezza della stringa SS *) writeln(SS); (* o più semplicemente nel seguente modo *) for k:=1 to length(s) do if upcase(s[k]) in ['A','E','I','O','U'] then SS:=SS+s[k]; (* sostituisce a tutti i caratteri di posto dispari il carattere = *) for k:=1 to length(s) do if odd(k) then s[k]:='='; writeln(s); repeat until keypressed end. Prof. A.Venia Pagina 1 Appunti d’Informatica Stringhe Programmi Pascal 2. Data da input una stringa S e un intero N non più grande della lunghezza della stringa, modificare la stringa in modo tale da eliminare da essa il carattere di posto N. (Simula la procedura del linguaggio Pascal DELETE(stringa, inizio, numerocaratteri); con la limitazione numerocaratteri=1). program Elimina1Carattere; uses crt; var S:string; N,I:byte; begin clrscr; write('Stringa : '); readln(S); (* il seguente ciclo serve ad imporre ad N un valore che non superi la lunghezza della stringa *) repeat write('Posizione : '); readln(N); until N<=length(S); (* copia tutti i caratteri da N+1 alla lunghezza della stringa nella posizione precedente *) for I:=N+1 to length(S) do S[I-1]:=S[I]; (* diminuisce di 1 la lunghezza della stringa *) S[0]:=pred(S[0]); write(S); repeat until keypressed end. Generalizziamo il precedente algoritmo facendo in modo tale che dalla stringa di partenza dalla posizione N si possano eliminare X caratteri. program EliminaXCaratteri; uses crt; var S:string; N,X,I,L:byte; Begin clrscr; write('Stringa iniziale : '); readln(S); L:=length(S); repeat write('Posizione : '); readln(N); write('N° caratteri : '); readln(X); until N+X<=L; for I:=N+X to L do S[I-X]:=S[I]; S[0]:=chr(L-X); write((#10,'Stringa finale : ',S); repeat until keypressed end. Prof. A.Venia Pagina 2 Appunti d’Informatica Stringhe Programmi Pascal 3. Data da input una stringa S si vuole calcolare qual è l’occorrenza di tutte le lettere del’alfabeto inglese composto da 26 caratteri (non si terrà in considerazione la differenza fra minuscole e maiuscole. Program occorrenze; uses crt; var S:string; NC:Array['A'..'Z'] of byte; k:byte; c:char; begin clrscr; writeln(' Data da input una stringa, calcola l''occorrenza di ogni carattere dell''alfabeto'); write('Stringa : '); readln(S); for k:=1 to length(s) do inc(NC[Upcase(S[k])]); writeln(#10,'Elenco occorrenze'); for c:='A' to 'Z' do writeln(c,NC[c]:4); repeat until keypressed end. indice L’algoritmo proposto utilizza un array di 26 elementi il cui indice è un carattere che va da 'A' a 'Z' di tipo byte. Tale array conterrà alla fine il numero di occorrenze che la lettera relativa al suo indice presenta nella stringa data. Esempio. Se ad S dessimo il valore ‘Data da input una stringa, calcola il numero di occorrenze di ogni lettera dell'alfabeto inglese’ allora il risultato sarebbe quello elencato nella tabella accanto. Inizialmente l’array NC è vuoto o meglio tutti i suoi elementi sono inizializzati a zero. Per k=1 si ha S[k]=’D’, Upcase(S[k])=’D’ per cui verrà incrementata di uno la casella NC[Upcase(S[k])] cioè NC[‘D’] e così via di seguito per gli altri caratteri della stringa S fino a length(s). Prof. A.Venia A B C D E F G H I J K L M N O P Q R S T U V W X Y Z NC 10 1 4 5 9 1 3 0 7 0 0 8 1 7 6 1 0 5 2 6 3 0 0 0 0 1 Pagina 3