Formularea temei. Să se scrie funcţii care să returneze numărul de apariţii ale unui
scalar într-un vector şi indicii acestora. De asemenea, să se verifice existenţa într-un vector
a unei secvenţe date de elemente.
seek ( u , a) := test ← 0
for i ∈ 0 .. length ( u ) − 1
if u a T
i v := ( 4 6 5 3 0 8 )
test ← 1 seek ( v , 3) = "Scalarul exista in vector"
break seek ( v , 9) = "Scalarul nu exista in vector"
"Scalarul exista in vector" if test
"Scalarul nu exista in vector" otherwise
44 7. Algoritmi de căutare în vectori
#include<stdio.h>
#include<conio.h>
main(){
int n,i,a,test=0,u[10];
printf(ʺIntroduceti nr de elem ale vct:ʺ);
scanf(ʺ%iʺ,&n);
for(i=0;i<n;i++){
printf(ʺIntroduceti elementul de index %i:ʺ,i);
scanf(ʺ%iʺ,&u[i]);}
printf(ʺAti introdus vectorul:\tʺ);
for(i=0;i<n;i++) printf(ʺ%i\tʺ,u[i]);
printf(ʺ\nIntroduceti scalarul:ʺ);scanf(ʺ%iʺ,&a);
for(i=0;i<n&&!test;i++)
if(u[i]==a)test=1;
if(test) printf(ʺScalarul exista in vectorʺ);
else printf(ʺScalarul nu exista in vectorʺ);
getch();}
seek_nr ( u , a) := test ← 0 T
v := ( 4 3 5 3 0 8 )
for i ∈ 0 .. length ( u ) − 1
seek_nr ( v , 3) = 2
test ← test + 1 if u a
i seek_nr ( v , 9) = 0
test
#include<stdio.h>
#include<conio.h>
main(){
int n,i,a,test=0,u[10];
printf(ʺIntroduceti nr de elemente ale vct:ʺ);
scanf(ʺ%iʺ,&n);
45 7. Algoritmi de căutare în vectori
for(i=0;i<n;i++){
printf(ʺIntroduceti elementul de index %i:ʺ,i);
scanf(ʺ%iʺ,&u[i]);}
printf(ʺAti introdus vectorul:\tʺ);
for(i=0;i<n;i++) printf(ʺ%i\tʺ,u[i]);
printf(ʺ\nIntroduceti scalarul:ʺ);scanf(ʺ%iʺ,&a);
for(i=0;i<n;i++)
if(u[i]==a)test++;
printf(ʺScalarul exista in vector de %i oriʺ,test);
getch();}
T T T
a := ( 4 2 8 6 4 9 ) b := ( 8 6 4 ) c := ( 8 7 )
T T T
a := ( 4 2 8 6 4 9 ) b := ( 2 8 5 4 ) c := ( 8 6 5 9 )
15 13
extrag( a , mltp) = extrag( a , prim) =
30 7
Funcţia extrag are ca parametri formali vectorul u, din care se face extragerea şi
condiţia cond ce trebuie verificată. Ea izolează elementele din u ce satisfac cond în
vectorul v, de indice k. Funcţiile mltp şi prim, cu parametru de apelare scalarul a, verifică
condiţiile propuse în formularea problemei, returnând 1 dacă argumentul le verifică şi 0 în
caz contrar. Ele vor înlocui parametrul formal cond în apelul funcţiei extrag.
47 7. Algoritmi de căutare în vectori
Exerciţiul 6. Să se scrie o funcţie care să localizeze prin indice apariţiile unui scalar
într-un vector, ambele citite de la tastatură.
poz( u , a) := k←0
for i ∈ 0 .. length ( u ) − 1 T
m := ( 15 3 10 3 7 9 )
if u a
i
1
v ←i poz( m, 3) =
k 3
k←k+ 1
v if IsArray ( v ) poz( m, 5) = "Nu se verifica aparitia"
"Nu se verifica aparitia" otherwise
Funcţia poz are ca parametri formali vectorul în care se face căutarea, u şi scalarul
care se caută, a. Valorile indicilor poziţiilor ce verifică condiţia sunt memorate în vectorul
v. Dacă acesta nu are nici un element, se afişează mesajul „Nu se verifică apariţia”.
De remarcat că datele de ieşire ale acestei funcţii sunt în dependenţă de valoarea
parametrului ORIGIN, exemplul de mai sus fiind realizat cu setări implicite.
Păstrând semnificaţia variabilelor, se scrie codul în limbaj C:
#include<stdio.h>
#include<conio.h>
main(){
int n,i,a,k=0,u[10];
printf(ʺIntroduceti nr de elem ale vct:ʺ);
scanf(ʺ%iʺ,&n);
for(i=0;i<n;i++){
printf(ʺIntroduceti elementul de index %i:ʺ,i);
scanf(ʺ%iʺ,&u[i]);}
printf(ʺAti introdus vectorul:\tʺ);
for(i=0;i<n;i++) printf(ʺ%i\tʺ,u[i]);
printf(ʺ\nIntroduceti scalarul:ʺ);scanf(ʺ%iʺ,&a);
printf(ʺScalarul %i apare pe pozitiile:\tʺ,a);
for(i=0;i<n;i++)
if(u[i]==a) printf(ʺ%i\tʺ,i);
getch();}
fiecare nouă apariţie. Variabilă, test, iniţializată de asemenea cu 0, îşi modifică valoarea în
momentul în care variabila s atinge valoarea cerută, n, determinând ieşirea din ciclu.
seek_apr ( u , m, n ) := s←0
test ← 0
for i ∈ 0 .. length ( u ) − 1
s ← s + 1 if u m
i
T
a := ( 5 3 8 7 5 5 4 )
if s n
test ← 1
break
i if test
"Aparitia cautata nu se verifica" otherwise
seek_apr ( a , 5 , 2) = 4 seek_apr ( a , 5 , 4) = "Aparitia cautata nu se verifica"
seek_apr ( a , 5 , 1) = 0 seek_apr ( a , 6 , 2) = "Aparitia cautata nu se verifica"
#include<stdio.h>
#include<conio.h>
main(){
int nr,i,m,n,u[10],test=0,s=0;
printf(ʺIntroduceti nr de elem ale vct:ʺ);
scanf(ʺ%iʺ,&nr);
for(i=0;i<nr;i++){
printf(ʺIntroduceti elementul de index %i:ʺ,i);
scanf(ʺ%iʺ,&u[i]);}
printf(ʺAti introdus vectorul:\tʺ);
for(i=0;i<nr;i++) printf(ʺ%i\tʺ,u[i]);
printf(ʺ\nIntroduceti scalarul:ʺ);scanf(ʺ%iʺ,&m);
printf(ʺA cata aparitie se cauta?ʺ);scanf(ʺ%iʺ,&n);
for(i=0;i<nr&&!test;i++)
{if(u[i]==m) s++;
if (s==n) test=1;}
if(test) printf(ʺIndicele cautat este %iʺ,i-1);
else printf(ʺAparitia cautata nu se verificaʺ);
getch();}
Temă de lucru