duminică, 3 mai 2020

clasa IX,X, Tema: Tipuri de date siruri de caractere. 04.05-08.05


Valorile tipului de date String sînt şiruri de caractere incluse între apostrofuri cu lungimea nu mai mare de 255 de simboluri. La declararea unei variabile de tip String putem preciza lungimea maximă a şirurilor de caractere ce pot fi memorate în variabila respectivă incluzînd  numărul dat în paranteze pătrate după cuvîntul String. Dacă şirul de caractere efectiv memorat într-o variabilă de tip String are lungimea mai mare decît dimensiunea maximă a variabilei, atunci şirul va fi trunchiat.
Operatorii aplicaţi valorilor de tip şir de caractere.
1)       ‘+’- concatenarea (alipirea) a două şiruri;
2)       Operatorii relaţionali: =(egal), <> (diferit), <( mai mic), >(mai mare), <=(mai mic sau egal), >=( mai mare sau egal). Comparaţia se face din punct de vedere lexicografic.
Procedurile şi funcţiile predefinite pentru şiruri de caractere.
1)      Funcţia Length
Sintaxa: Length(<şir de caractere>)
Funcţia: Returnează numărul efectiv de caractere ale şirului.
2)      Funcţia Copy
Sintaxa: Copy(<şir de caractere>,<poz>,<nr>)
Funcţia:Formează şi întoarce un subşir al şirului de caractere; subşirul va începe de la poziţia <poz> în <şir de caractere> şi va avea lungimea  <nr> caractere.
3)      Funcţia Pos
Sintaxa: Pos(<şir de caractere_1>,<şir de caractere_2>)
Funcţia: Testează dacă şirul <şir de caractere_1> este un subşir al şirului <şir de caractere_2>. În caz afirmativ, returnează poziţia primei apariţii, în caz contarar, returnează valoarea 0.
4)      Procedura Delete
Sintaxa: Delete(<şir de caractere>,<poz>,<nr>)
Funcţia: Şterge din şirul <şir de caractere>  un şubşir de lungime <nr> de caractere, începînd cu poziţia <poz>.
5)      Procedura Insert
Sintaxa: Insert(<subşir>,<şir de caractere>,<poz>)
Funcţia: Inserează subşirul <subşir> în şirul de caractere <şir de caractere> începînd cu poziţia  <poz>.
6)      Procedura Str
     Sintaxa: Str(<nr>,<şir de caractere>)
Funcţia: Transformă numărul <nr> în şirul de caractere corespunzător, pe care îl memorează în variabila  <şir de caractere>.
7)      Procedura Val
      Sintaxa: Val(<şir de caractere>,<nr>,<eroare>)
Funcţia: Încearcă să convertească şirul de caractere <şir de caractere> în numărul corespunzător. Tentativa va reuşi dacă şirul conţine numai caractere permise pentru un număr, adică cifre, punctul zecimal şi caracterul -. La apel parametrii <nr> şi <eroare> vor fi identificatri de variabile, valorile acestora completîndu-se în urma execuţiei procedurii astfel:
§ dacă transformarea reuşeşte, atunci în <nr> se memorează numărul rezultat prin transformare, iar în  <eroare> se memorează 0;
§ dacă transformarea eşuiază, atunci  <nr> va fi nedefinit, iar în  <eroare> se memorează poziţia în şir a primului character din cauza căruia a eşuat transformarea.
Parcurgerea caracterelor unui  şir.
Un şir de caractere poate fi privit ca un tablou unidimensional în care fiecare caracter ocupă o anumită poziţie.  Putem să referim un anumit caracteral şirului, indicînd poziţia pe care o ocupă caracterul în şir. Ştiind că lungimea efectivă a unui şir X este returnată de funcţia length(X), rezultă că poziţiile efectiv ocupate de caracterele şirului sînt 1, 2, ...,length(X).
Pentru a parcurge caracterele şirului, scriem un ciclu în care parcurgem poziţiile caracterelor i=1,...,length(X) şi pentru fiecare valoare a lui i, prelucrăm caracterul X[i].
For i:=1 To Length(X) Do <prelucrează X[i]>;
Limbajul Pascal foloseşte setul de caractere ASCII, în care fiecare caracter are un cod cuprins între 0 şi 255. Există două funcţii predefinite care realizează legătura dintre un caracter şi codul său:
·         chr(<nr>) –returnează caracterul cu codul <nr>;
·         ord(<ch>)-returnează codul ASCII al caracterului <ch>.
     Transformarea unui character ch din literă mică în litera mare corespunzătoare se poate realiza utilizînd funcţia predefintă UpCase: ch:=UpCase(ch). Nu trebuie testat dacă ch este o literă mică, deoarece în caz contrar apelul funcţiei UpCase nu are nici un efect.
Aplicaţii.
1.    Problema Nr. 1. Determinaţi numărul semnelor de +’ dintr-un şir de caractere.
Intrare: şirul de caractere se citeşte de la tastatură.
Ieşire: la ecran se afişează numărul de semne de ’+’.
Algoritmul: Declarăm o variabilă contor, care iniţial se zerografiază. Parcurgem şirul de caractere într-un ciclu şi pentru fiecare simbol testăm, dacă nu este ’+’. Dacă condiţia se respectă, la variabila contor se adună o unitate.
Program Numarul_semne;
Uses CRT;
Var X:String;
    I,N:Byte;
Begin
   ClrScr;
Write(’Introduceti sirul:’);ReadLn(X);
  N:=0;
For I:=1 To Length(X) Do
If X[I]=’+’ Then Inc(N);
WriteLn(’Num de semne de + este:’,N);
 ReadLn End.                                          
2.    Problema Nr. 2. Determinaţi numărul de vocale dintr-un şir de caractere.
Intrare: şirul de caractere se citeşte de la tastatură.
Ieşire: la ecran se afişează numărul de vocale.
Algoritmul: Declarăm o variabilă contor, care iniţial se zerografiază. Parcurgem şirul de caractere într-un ciclu şi pentru fiecare simbol testăm, dacă nu este vocală. Dacă condiţia se respectă, la variabila contor se adună o unitate.
Program Numarul_vocale;
Uses CRT;
Var X:String;
    I,N:Byte;
Begin
   ClrScr;
Write(’Introduceti sirul:’);ReadLn(X);
  N:=0;
For I:=1 To Length(X) Do
If UpCase(X[I]) in [’A’,’E’,’I’,’O’,’U’] Then Inc(N);
WriteLn(’Num de vocale=’,N);
ReadLn End.                                         
3.  Problema Nr. 3. Se consideră șirul S. Să se scrie un program care numără aparițiile unui caracter arbitrar x în șirul dat.
Intrare: şirul de caractere şi caracterul se citesc de la tastatură.
Ieşire: la ecran se afişează numărul de apariţii ale caracterului dat în şir.
Algoritmul: Declarăm o variabilă contor, care iniţial se zerografiază. Parcurgem şirul de caractere într-un ciclu şi pentru fiecare simbol testăm, dacă nu este caracterul dat. Dacă condiţia se respectă, la variabila contor se adună o unitate.
Program caracter_arbitrar;
Uses crt;
Var S:String;
    K,I:Byte;
    X:Char;
Begin
  Clrscr;
Write (‘Introdu un sir de caractere:  ’);
Readln (S);
Write (‘Introdu un character : ’);
ReadLn(X);
     K=0;
For I:=1 to Length(S) do
    If S[I]=X Then Inc(K);
WriteLn(’Sirul ’,S,’ contine ’,K,’ caractere ’,X);
Readln End.
4.  Problema Nr.4. Se dă o propoziţie care se termina cu punct ( . ). De alcătuit un program care numără cîte vocale, cîte consoane și cîte alte caractere se întîlnesc în propoziție.
Intrare: propoziţia se citeşte de la tastatură.
Ieşire: la ecran se afişează numărul de vocale, consoane şi alte caractere ce se întîlnesc în propoziţia dată.
Algoritmul: Declarăm 3 variabile contor, care iniţial se zerografiază. Parcurgem şirul de caractere într-un ciclu şi pentru fiecare simbol testăm, dacă nu este vocală sau consoană. Dacă condiţia se respectă, la variabila contor pentru vocale sau respectiv pentru consoane se adună o unitate. Numărul de caractere ce nu sînt vocale şi nici consoane îl calculăm prin diferenţa dintre numărul total de simboluri cu vocale şi consoane.
Program Numar_vocale_consoane_simboluri;
Var Sir:String[80];
Vocale,Consoane, I:Integer;
Begin
Write(‘Introdu propozitia:’);ReadLn(Sir);
I:=1;Vocale:=0;Consoane:=0;
While Sir[I]<>’.’ Do
Begin
If Upcase(Sir[I]) in [‘A’,’E’,’I’,’O’,’U’] then Inc(Vocale)
   Else If Upcase(Sir[I]) in [‘A’..’Z’] Then Inc(Consoane) ;
Inc(I)
End;
Writeln(‘Vocale:’,Vocale,’ Consoane:’, Consoane,
        ’ Alte caractere:’,i-Vocale-Consoane);
ReadKey End.
    5. Problema Nr. 5  Excludeţi spaţiile dintr-un şir de caractere.
Intrare: şirul de caractere se citeşte de la tastatură.
Ieşire: la ecran se afişează şirul de caractere fără spaţii.
Algoritmul: Vom utiliza funcţia Pos, cu ajutorul căreia vom testa  atîta timp cît există spaţii în şir, determină poziţia primului spaţiu şi îl exclude cu procedura Delete.
Program Excludere_spatii;
Uses CRT;
Var X:String;
Begin
   ClrScr;
Write(’Introduceti sirul:’);ReadLn(X);
While Pos(’ ’,X)>0 Do Delete(X,Pos(’ ’,X),1);
  WriteLn(’Sirul fara spatii este ’,X);
ReadLn End.  
   6. Problema Nr. 6. Se dă o mărime de tip șir de caractere S. De alcătuit programul care ar înlocui combinația de litere ’doi’  prin cifra ’2’.
Intrare: şirul de caractere se citeşte de la tastatură.
Ieşire: la ecran se afişează şirul de caractere modificat.
Algoritmul: Se determină poziția de început a cuvîntului  în șirul de caracter S;  dacă poziția este diferită de 0 înseamnă că acest cuvînt există în șir, se șterge acest cuvînt din șirul S și se inserează pe aceeași poziție cifra ’2’.
Program Sirul_doi_prin_2;
Uses Crt;
Var  S:String;
     P:Byte;
Begin
  ClrScr; Write('Scrie textul: ');
          Readln(s);
  P:=Pos('doi ',S);
While P<>0 Do  Begin
                 Delete(S,P,3);
                 Insert(’2’,S,p);
                 P:=Pos('doi ',S)
               End;
Write(’Sirul obtinut este:’,S);
     Readkey  End.
   7. Problema Nr.7. Excludeţi cifrele dintr-un şir de caractere.
Intrare: şirul de caractere se citeşte de la tastatură.
Ieşire: la ecran se afişează şirul de caractere fără cifre.
Algoritmul: Parcurgem şirul de caractere într-un ciclu şi pentru fiecare simbol testăm, dacă  este cifră. Dacă condiţia se respectă, excludem simbolul dat, în caz contrar verificăm următorul simbol.
Program Excludere_cifre;
Uses CRT;
Var X:String;
    I:Byte;
Begin
   ClrScr;
Write(’Introduceti sirul:’);ReadLn(X);
I:=1;
While I<=Length(X) Do
If X[I] in [’0’..’9’] Then Delete(X,I,1) Else Inc(I);
  WriteLn(’Sirul fara cifre este ’,X);
ReadLn End. 
    8. Problema Nr. 8 Fie dat un număr natural N. Alcătuiți programul, conform căruia vom obține un alt număr K, ce se deosebește de N prin faptul că nu conține cifre de ’2’ și ’4’, păstrîndu-se consecutivitatea celorlalte cifre.
Intrare: numărul N se citeşte de la tastatură.
Ieşire: la ecran se afişează numărul fără cifrele 2 şi 4.
Algoritmul: Transformăm numărul în şir de carcatere. Parcurgem şirul de caractere într-un ciclu şi pentru fiecare simbol testăm, dacă  este cifră 2 sau 4. Dacă condiţia se respectă, excludem simbolul dat, în caz contrar verificăm următorul simbol. Şirul obţinut după excludere îl transformăm în număr.
Program Numar;
Uses Crt;
Var N,K:Longint;
    S:String;
    I:Integer;
Begin
   ClrScr;  Write('N=: ');   ReadLn(N);
   Str(N,S);  I:=1;
While I<=Length(S) Do
If (S[I]=’2’) Or (S[I]=’4’)   Then Delete(S,I,1) Else I:=I+1;
Val(S,K,I);
if I=0 Then Write (’Numarul obtinut este:’, K)
       Else Write(’Numarul initial a fost format doar din 2 si 4’);
Readkey End.
  1. Problema Nr. 11. Se dă o mărime de tip șir de caractere S alcătuită din cuvinte despărțite prin mai multe lacune. De alcătuit programul care ar înlocui în această mărime lacunele dintre cuvinte prinr-o singură lacună.
Intrare: şirul de caractere se citeşte de la tastatură.
Ieşire: la ecran se afişează şirul de caractere modificat
Algoritmul: Parcurgem şirul de caractere într-un ciclu şi pentru fiecare două simboluri alăturate, care sunt lacune, eliminăm lacuna a doua.
Program Excludere_cifre;
Program Sirul;
Uses Crt;
Var  S:String[80];
     I:Byte;
Begin   ClrScr;
     Write('Scrie textul: ');    ReadLn(S);
     I:=1;
While I<Length(S) Do
If (S[I]=’ ’) and (S[I+1]=’ ’) Then Delete(S,I,1)
                               Else I:=I+1;
      Write(’Sirul obtinut este:’,S);
  Readkey
 End.
    9. Problema Nr. 9. Determinaţi şi afişaţi la ecran toate prefixele unui cuvînt, valoarea căruia se citeşte de la tastatură. (prefixele unui şir sînt subşirurile formate din primele caractere ale şirului)
Intrare: cuvîntul se citeşte de la tastatură.
Ieşire: la ecran se afişează prefixele cuvîntului unul sub altul.
Algoritmul: Formăm prefixele într-un ciclu, titipăriind la ecran cuvîntul fără ultimul caracter, apoi fără ultimile două ş.a.m.d.
Program Prefixele_cuvintului;
Uses CRT;
Var X:String;
    I:Byte;
Begin
   ClrScr;
Write(’Introduceti cuvintul:’);ReadLn(X);
For I:=2 To Length(X) Do
WriteLn(Copy(X,1,Length(X)-I+1);
ReadLn End.  
   10. Problema Nr. 10. Să se determine codificarea “păsărească” a unui cuvînt, ce  constă din adăugare   după fiecare vocală din cuvînt a grupului format din caracterul p urmat de vocala  respectivă.
Intrare: şirul de caractere se citeşte de la tastatură.
Ieşire: la ecran se afişează şirul de caractere codificat.
Algoritmul: Parcurgem şirul de caractere într-un ciclu şi pentru fiecare simbol testăm, dacă  este vocală. Dacă condiţia se respectă, adăugăm după vocală litera p împreună cu vocala dată şi mărim valorea contorului cu 3 unităţi, în caz contrar verificăm următorul simbol, mărind valorea contorului cu o unitate.
Program Codificare_pasareasca;
Uses CRT;
Var X:String;
    I:Byte;
Begin
   ClrScr;
Write(’Introduceti sirul:’);ReadLn(X);
I:=1;
While I<=Length(X) Do
If UpCase(X[I]) in [’A’,’E’,’I’,’O’,’U’] Then
Begin Insert(’p’+X[I],X,I+1); Inc(I,3) End Else Inc(I);
  WriteLn(’Sirul codificat ’,X);
ReadLn End.       
11. Problema Nr. 11.  Calculaţi suma cifrelor zecimale şi suma pătratelor cifrelor zecimale.
Intrare: şirul de caractere se citeşte de la tastatură.
Ieşire:la ecran se afişează într-o linie suma cifrelor zecimale şi suma pătratelor cifrelor zecimale, separate prin spaţiu.
Algoritmul: Declarăm 2 variabile de tip întreg pentru suma cifrelor zecimale şi suma pătratelor cifrelor zecimale, care iniţial se zerografiază. Parcugem într-un ciclu şirul de caractere.  Încercăm să convertim fiecare simbol din şirul de caractere în numărul corespunzător. Dacă tentativa ne reuşeşte, adunăm la variabila pentru sumă numărul obţinut, iar la variabila pentru suma pătratelor cifrelor adunăm pătratul numărului obţinut.
Program Sume_cifre;
Uses CRT;
Var X:String;
    Cod, S,Sp:Integer;
    I:Byte;
    C:0..9;
Begin
   ClrScr;
Write(’Introduceti sirul:’);ReadLn(X);
  S:=0; Sp:=0;
For I:=1 To Length(X) Do
    Begin
    Val(X[I],C,Cod);
If Cod=0 Then Begin
                S:=S+C;
                Sp:=Sp+Sqr(C)
              End;
WriteLn(S,’ ’,Sp);
ReadLn End.        
   12. Problema Nr. 12. Fie dat un şir din cel mult 255 caractere. Scrieţi un program care determină caracterul cu un număr maxim de apariţii în acest şir. Dacă există mai multe caractere cu număr maxim de apariţii, se indică toate.
Intrare: şirul de caractere se citeşte de la tastatură.
Ieşire: la ecran se afişează într-o linie numărul maxim de apariţii, în linia a doua se afişează caracterele cu număr maxim de apariţii, separate prin spaţiu.
Algoritmul: Declarăm un tablou unidimensional cu indicii – valorile tipului Charşi componentele – elemente naturale. Iniţial tabloul se zerografiează. Parcurgem şirul de caractere şi adunăm cîte o unitate la valoarea elementului tabloului cu indicele egal cu simbolul din şir. În rezultat vom număra pentru fiecare simbol de cîte ori se conţine în şirul de caractere. Detrminăm valoarea maximă din acest tablou şi obţinem în rezultat numărul maxim de apariţii a simbolurilor în şirul de caractere.
Program Caractere;
Uses CRT;
Type Lin=Array[Char] Of Byte;
Var P:String;
    N:Lin;
    I,Max:Byte;
Begin
  ClrScr;
  Write('Introduceti sirul de caractere:');ReadLn(P);
  For I:=0 To 255 Do N[Chr(I)]:=0;
  For I:=1 To Length(P) Do Inc(N[P[I]]);
      Max:=N[Chr(0)];
  For I:=2 To 255 Do
  If N[Chr(I)]>Max Then Max:=N[Chr(I)];
      WriteLn('Nr maxim:',Max);
  For I:=0 To 255 Do
  If N[Chr(I)]=Max Then Write(Chr(I),' ');
  ReadLn
End.
   13. Problema Nr. 13. Se dă o mărime de tip șir. De scris un program, care află cel mai lung cuvînt din această mărime. Cuvintele sunt separate printr-un singur spațiu.
Intrare: propoziţia  se citeşte de la tastatură.
Ieşire: la ecran se afişează cuvîntul de lungime maximă şi lungimea lui, fiind separate prin spaţiu.
Algoritmul: Se separă cuvîntul ordinar din șir și se determină lungimea lui. Dacă ea este mai mare decît cea precedentă, atunci păstrăm acest cuvînt și lungimea lui. Operațiile sunt repetate atît timp cînt contorul caracterului analizat nu depășește lungimea șirului dat.
Program Sirul_lung;
Uses Crt;
Var T, S, C_max:String;
    I, L_max:Byte;
Begin  ClrScr;
   Write('Scrie textul: ');  ReadLn(S);
   T:=' '; I:=1; L_max:=0;
While I<=Length(S) Do
Begin
  If S[I]<>’’ Then T:=T+S[I]
              Else If  T<>' ' Then Begin
              If Length (T)>L_­max Then Begin
                 L_max:=Length(T); C_max:=T
                                      End;
              T:=’ ’;
              end;
   Inc(I)
End;
If T<>’ ’ Then Length (T)>L_max Then Begin
          L_max:=Length(T); C_max:=t
                                     End;
Write(’Cel mai lung cuvint este:’, C_max ,’ cu lungimea’, L_max);
     Readkey End.
  14. Problema Nr.14. Fie dată o propoziţie din cel mult 250 caractere, cuvintele fiind separate printr-un spaţiu. Toate cuvintele au lungimi distincte. Scrieţi un program care reordonează cuvintele în ordinea creşterii lungimii lor.
Intrare: propoziţia  se citeşte de la tastatură.
Ieşire: la ecran se afişează propoziţia modificată, cuvintele fiind separate prin spaţiu.
Algoritmul: Declarăm un tablou unidimensional cu elementele – şiruri de caractere. Copiem cuvintele din propoziţie în tablou. Ordonăm tabloul crescător după lungimile cuvintelor şi formăm propoziţia înscriind cuvintele în ordinea ce se găsesc în tabloul ordonat.
Program Propozitia_ordonata;
Uses CRT;
Type TipSir=String[250];
     Lin=Array[1..100] Of TipSir;
Var P, Min:TipSir; (* propozitia *)
    A:Lin; (* tabloul cu cuvinte *)
    N,I,J,Loc:Byte;
    (* N - numarul de cuvinte, I - contor p/u ciclu *)
Begin
         ClrScr;
  Write('Propozitia:');ReadLn(P);
  (* exclude spatiile de la inceputul propozitiei, daca exista *)
  While P[1]=' ' Do Delete(P,1,1);
  (* transfera cuvintele din prop. intr-un tablou liniar *)
        N:=0;
  While Pos(' ',P)>0 Do
       Begin
         Inc(N);
         A[N]:=Copy(P,1,Pos(' ',P)-1);
         Delete(P,1,Pos(' ',P))
       End;
         Inc(N); A[N]:=P;
(* ordoneaza cuvintele crescator dupa lungime *)
  For I:=1 To N-1 Do
      Begin
      Min:=A[I]; Loc:=I;
  For J:=I+1 To N Do
  If Length(A[J])<Length(Min) Then Begin
                                   Min:=X[J];
                                   Loc:=J
                                   End;
      A[Loc]:=X[I]; A[I]:=Min
      End;
           P:='';
       For I:=1 To N-1 Do
           P:=P+A[I]+' '; P:=P+A[N];
   WriteLn('Propozitia modificata:',P);
   ReadLn End.

Niciun comentariu:

Trimiteți un comentariu