Sunteți pe pagina 1din 60

DANIELA-ELENA ILIE GEORGETA-IULIA BALACEA

GENIA JOC MUŞUNOIU NOVETSCHI MONICA


POPESCU MĂDĂLINA NEAGU VIOLETA
DIMITRIEVICI LUCIAN TUDOR VERONICA
GAVRILĂ IULIA GHEORGHIU BOGDAN
GHEORGHIU CARMEN VOINEA MIRELA
STAN MIHAELA IORDACHI LIZETA
DĂU LILIANA MAGDALENA GRIGORE

PROGRAMARE

PE ÎNŢELESUL TUTUROR

1
ARGUMENT

Informatica – ştiinţǎ relativ nouǎ în raport cu cele deja consacrate, devenite


clasice, este abordatǎ ca disciplinǎ şcolarǎ astfel încât sǎ contribuie la dezvoltarea unei
personalitǎţi autonome şi creative a elevilor. Pentru a înţelege dinamica şi pentru a se
putea adapta ei, elevii trebuie mai întâi sǎ înţeleagǎ elementele fundamentale ale
programǎrii.
In acest context, lucrarea Programare pe înţelesul tuturor este un
instrument de lucru simplu şi practic destinat elevilor şi profesorilor. Este centratǎ pe
tematica de pregǎtire pentru examenul de bacalaureat şi pentru atestatul profesional dar
şi pentru lucrul la clasǎ.
Lucrarea este structuratǎ în trei pǎrţi : algoritmicǎ şi programare , baze de
date- modulul FOX şi baze de date- modulul ORACLE.
Partea de programare conţine 40 de probleme ce abordeazǎ noţiunile de bazǎ
ale limbajelor de programare: algoritmi elementari, structuri de date, recursivitatea.
Atât partea de baze de date – modulul FOX cât şi partea de baze de date-
modulul ORACLE cuprind câte 40 de probleme variate, care pot fi rezolvate atât
realizând programe (în varianta FoxPro) cât şi lucrând în mod comandǎ ( varianta
FoxPro sau varianta ORACLE).
Pentru a fi de un real folos elevilor, la fiecare problemǎ se furnizeazǎ codul
sursǎ atât în limbajul C++ cât şi în limbajul Pascal..
In speranţa cǎ aceastǎ lucrare va contribui, sub aspect metodico-didactic ,
atât la formarea celor ce se iniţiazǎ în tainele profesiei de dascǎl cât şi, mai ales, elevilor
şi viitorilor absolvenţi, dorim cititorilor acestei cǎrţi o lecturǎ plǎcutǎ şi, nǎdǎjduim noi,
utilǎ.

Autorii

2
PROBLEME PENTRU ALGORITMICǍ ŞI PROGRAMARE

Au fost propuse un numǎr de 40 de probleme de programare.


Subiectele de programare propuse doresc sǎ evalueze elevii în urmǎtoarele direcţii :

1) Identificarea datelor care intervin într-o problemă şi a relaţiilor dintre acestea;


2) Elaborarea algoritmilor de rezolvare a problemelor;
3) Aplicarea algoritmilor fundamentali în prelucrarea datelor;
4) Aplicarea în mod creativ a algoritmilor fundamentali în rezolvarea unor probleme concrete;
5) Implementarea algoritmilor într-un limbaj de programare;
6) Identificarea necesităţii structurării datelor în tablouri, structuri, liste;
7) Prelucrarea datelor structurate în tablouri unidimensionale şi bidimensionale;
8) Utilizarea fişierelor text pentru introducerea datelor şi extragerea rezultatelor;
9) Alegerea celui mai eficient algoritm de rezolvare a unei probleme;
10) Analizarea unei probleme în scopul identificării datelor necesare şi alegerea modalităţilor
adecvate de structurare a datelor care intervin într-o problemă;
11) Identificarea avantajelor utilizării diferitelor metode de structurare a datelor necesare pentru
rezolvarea unei probleme;
12) Utilizarea tablourilor, a şirurilor de caractere şi a structurilor de date neomogene în modelarea
unor situaţii problemă;
13) Implementarea unor algoritmi de prelucrare a tablourilor , a şirurilor de caractere şi a
structurilor neomogene ;
14) Recunoaşterea situaţiilor în care este necesară utilizarea unor subprograme;
15) Analiza problemei în scopul identificării subproblemelor acesteia;
16) Utilizarea corectă a subprogramelor predefinite şi a celor definite de utilizator;
17) Descrierea şi aplicarea mecanismului recursivităţii;
18) Descrierea operaţiilor specifice listelor simplu înlănţuite şi elaborarea unor subprograme care
să implementeze aceste operaţii;
19) Analizarea în mod comparativ a avantajelor utilizării diferitelor metode de structurare a
datelor necesare pentru rezolvarea unei probleme;

3
Problema nr. 1
Descompuneţi un număr natural în factori primi şi determinaţi factorul care apare în descompunere,
la puterea cea mai mare şi factorul care apare la puterea cea mai mică.

LIMBAJUL PASCAL
program Problema1;
uses crt;
var
n,max,min,d,fmin,fmax:longint;
cont,m,i:byte;
v:array[1..100] of longint;
begin
write('n='); readln(n);
min:=maxint; max:=-maxint;
LIMBAJUL C++
#include<iostream.h> d:=2; m:=0;
void main() while n<>1 do
begin
{int n,fp,p,fmax,fmin,pmax,pmin;
cont:=0;
cout<<”n=”; cin>>n;
while n mod d=0 do
fp=2;
begin
pmax=0; pmin=1000;
n:=n div d; inc(cont);
while(n!=1)
end;
{ p=0;
if cont>0 then
while(n%fp==0)
begin
{ p++; n=n/fp; }
inc(m); v[m]:=d;
if( p!=0)
if min>cont then
{if(p<pmin)
begin
{ p=pmin; fmin=fp; }
min:=cont; fmin:=d;
if(p>pmax)
end;
{ p=pmax; fmax=fp; }
if max<cont then
}
begin
fp++;
max:=cont; fmax:=d;
}
end;
cout<<”pmin=”<<pmin ;
end;
cout<<fmin=”<<fmin<<endl;
inc(d);
cout<<”pmax=”<<pmax ;
end;
cout<<” fmax=”<<fmax;
if min=max then
}
begin
writeln('Toti factorii au aceeasi putere ',min);
write('Acestia sunt: ');
for i:=1 to m do write(v[i],' ');
end
else
begin
writeln('Factorul la puterea cea mai mare: ',fmax,' la puterea ',max);
writeln('Factorul la puterea cea mai mica: ',fmin,' la puterea ',min);
end;
end.

Problema nr. 2
Fie matricea A, pătratică, de dimensiune nXn, cu elemente numere întregi. Să se determine suma
elementelor de sub diagonala principală a matricei,inclusiv elementele de pe diagonala principală.
4
LIMBAJUL PASCAL
LIMBAJUL C++ program Problema 2;
#include<iostream.h> var
int i,n,j,a[20][20],s; a:array[1..10,1..10] of integer;
void suma(int x) n,i,j:byte;
{for(i=1;i<=x;i++) s:integer;
for(j=1;j<=i;j++) begin
s=s+a[i][j]; cout<<s; write('Dimensiunea matricii: '); readln(n);
} for i:=1 to n do
void main() for j:=1 to n do
{clrscr(); begin
cout<<"n=";cin>>n; write('a[',i,',',j,']='); readln(a[i,j]);
for(i=1;i<=n;i++) end;
for(j=1;j<=n;j++) s:=0;
{cout<<"a["<<i<<"]["<<j<<"]="; cin>>a[i][j]; for i:=1 to n do
} for j:=1 to i do
suma(n); inc(s,a[i,j]);
} writeln('Suma ceruta este: ',s);
end.

Problema nr. 3
Fie v un tablou unidimensional cu n elemente de tip întreg. Să se construiască vectorii v1 şi v2
astfel încât elementul v1[i] să fie egal cu suma cifrelor lui v[i] şi v2[i] să fie egal cu produsul cifrelor lui
v[i].

LIMBAJUL PASCAL
program Problema 3;
LIMBAJUL C++
var
#include<stdio.h>
v,v1,v2:array[1..100] of integer;
#include<math.h>
n,i:byte;
void main (void)
suma,prod,x:integer;
{int n,i,v[20],v1[20],v2[20],s,p;
begin
printf("n="); scanf("%d",&n);
write('Dimensiunea vectorului: ');readln(n);
for(i=1;i<=n;i++)
for i:=1 to n do
{printf("v[%d]=",i); scanf("%d",&v[i]); } begin
i=1; write('v[',i,']='); readln(v[i]); v[i]:=abs(v[i]);
while(i<=n) end;
{if(v[i]==0) for i:=1 to n do
{ v1[i]=0; v2[i]=0; i++; } if v[i]=0 then
else begin
if(v[i]<0) v1[i]:=0; v2[i]:=0;
{ v[i]=abs(v[i]); p=1; s=0; end
while(v[i]!=0) else
{ s=s+v[i]%10; p=p*(v[i]%10); v[i]=v[i]/10; } begin
v1[i]=-s; v2[i]=-p; i++; x:=v[i]; suma:=0; prod:=1;
} repeat
else suma:=suma+(x mod 10); prod:= prod*(x mod 10);
{p=1;s=0; x:=x div 10;
while(v[i]!=0) until x=0;
{ s=s+v[i]%10; p=p*(v[i]%10); v[i]=v[i]/10; } v1[i]:=suma; v2[i]:=prod;
v1[i]=s; v2[i]=p;i++; end;
} writeln('Vectorul initial:');
} for i:=1 to n do write(v[i],' ');
printf("vectorii sunt \n"); writeln;writeln('Vectorul cu sumele:');
for(i=1;i<=n;i++) for i:=1 to n do
printf("\n v1[%d]=%d",i,v1[i]); write(v1[i],' ');
for(i=1;i<=n;i++) writeln;writeln('Vectorul cu produsele:');
printf("\n v2[%d]=%d",i,v2[i]); for i:=1 to n do
} 5write(v2[i],' ');
end.
Problema nr. 4
Fie a şi b două numere naturale, a<b. Să se genereze toate numerele prime cuprinse între cele două
numere, a şi b. Scrieţi o funcţie care primeşte ca parametru de intrare un număr natural şi care dacă acest
număr este prim. Utilizaţi un algoritm eficient pentru verificarea proprietăţii de număr prim.

LIMBAJUL PASCAL
program Problema 4;
LIMBAJUL C++ var
#include<iostream.h> a,b,j:integer;
int a,b; function prim(x:integer):boolean;
int prim(int x) var i:integer;
{int j; begin
if(x<=1) prim:=true;
return 0; if x<=1 then prim:=false
else else
if (x==2) return 1; if x=2 then prim:=true
else else
if (i%2==0) return 0; if x mod 2=0 then prim=false
else else
for(j=3;j<=x/2;j+=2) begin
if(x%j==0) return 0; i:=3;
return 1; while (i<= x div 2) and (prim=true) do
} if x mod i=0 then prim:=false
void main() else i:=i+2;
{clrscr(); end;
cout<<"a=";cin>>a;
cout<<"b=";cin>>b; begin
for(int i=a;i<=b;i++) writeln('Dati intervalul:'); write('a='); readln(a);write('b='); readln(b);
if(prim(i)==1) writeln('Numerele prime din intervalul [',a,',',b,'] sunt:');
cout<<"\n nr prim este: "<<i; for j:=a to b do
} if prim(j) then
write(j,' ');
end.

Problema nr. 5
Să se calculeze cel mai mare divizor comun a două numere naturale nenule date, a şi b, utilizând algoritmul
lui Euclid .

LIMBAJUL C++ LIMBAJUL PASCAL


#include<iostream.h>
int a,b; program Problema 5;
int cmmdc(int a,int b) var a,b:integer;
{int r,d,i; function cmmdc(x,y:integer):integer;
d=a; i=b; r=d%i; var r:integer;
if(r==0) return i; begin
else while x mod y<>0 do
{while(r!=0) begin
{r=d%i; d=i; i=r; } r:=x mod y; x:=y; y:=r;
return d; end;
} cmmdc:=y;
} end;
void main()
{ int man; begin
cout<<"a=";cin>>a; cout<<"b=";cin>>b; clrscr;
if(a<b) writeln('Introduceti cele doua valori:'); write('a='); readln(a);
{man=a; a=b; b=man; } write('b='); readln(b);
cout<<cmmdc(a,b); write('Cmmdc al celor doua valori este: ',cmmdc(a,b));
} end.

6
Problema nr. 6
Fie tabloul bidimensional A, cu m linii şi n coloane. Să se elimine linia l şi coloana c, l şi c citite de la
tastatură. Să se afiseze matricea după fiecare prelucrare.

LIMBAJUL C++ LIMBAJUL PASCAL


program Problema6;
#include<stdio.h> var a:array[1..10,1..10] of integer;
int n,m,a[20][20]; n,m,i,j,p,q:byte;
void elimlin(int l) procedure elimlinie(l:byte);
{ int i,j; var j:byte;
for(i=l+1;i<=n;i++) begin
for(j=1;j<=m;j++) if l=n then dec(n)
a[i-1][j]=a[i][j]; else
n--; begin
} for i:=l to n-1 do
void elimcol(int c) for j:=1 to m do a[i,j]:=a[i+1,j];
{ int i,j; dec(n);
for(i=1;i<=n;i++) end;
for(j=c+1;j<=m;j++) end;
a[i][j-1]=a[i][j]; procedure elimcoloana(c:byte);
m--; var i:byte;
} begin
void main() if c=m then dec(m)
{int i,j,l,c; else
printf("n="); scanf("%d",&n); begin
printf("m=");scanf("%d",&m); for j:=c to m-1 do for i:=1 to n do
for(i=1;i<=n;i++) a[i,j]:=a[i,j+1];
for(j=1;j<=m;j++) dec(m);
{ printf("a[%d][%d]=",i,j); scanf("%d",&a[i][j]); end;
} end;
printf("\n Matricea inainte de modificare este:\n"); procedure afisare;
for(i=1;i<=n;i++) var i,j:byte;
{ for(j=1;j<=m;j++) begin
printf("%3d",a[i][j]); for i:=1 to n do
printf("\n"); begin
} for j:=1 to m do write(a[i,j],' ');
printf("l="); scanf("%d",&l); writeln;
printf("c="); scanf("%d",&c); end;
if(l>n||l<1) end;
printf("Introduceti o alta linie"); begin
else writeln('Introduceti dimensiunile matricii:');
{elimlin(l); write('Linii: '); readln(n);
printf("\n Matricea dupa eliminarea liniei %d este:\n",l); write('Coloane: ');readln(m);
for(i=1;i<=n;i++) for i:=1 to n do
{for(j=1;j<=m;j++) for j:=1 to m do
printf("%3d",a[i][j]); begin
printf("\n"); write('a[',i,',',j,']='); readln(a[i,j]);
} end;
} writeln('Matricea inainte de modificare este:');
if(c>m||c<1) afisare;
printf("Introduceti o alta coloana"); repeat
else write('Linia de eliminat:'); readln(p);
{elimcol(c); until (p>=1) and (p<=n);
printf("\n Matricea dupa eliminarea coloanei %d este :\n",c); elimlinie(p);
for(i=1;i<=n;i++) afisare;
{for(j=1;j<=m;j++) repeat
printf("%3d",a[i][j]); write('Coloana de eliminat:'); readln(q);
printf("\n"); until (q>=1) and (q<=m);
} elimcoloana(q);
} afisare;
} end.

7
Problema nr. 7
Fie V un tablou unidimensional cu n elemente de tip întreg şi x un număr întreg. Să se determine poziţia
numărului x în vectorul V, utilizând algoritmul căutării binare. Dacă numărul x nu este element al
vectorului V , să se insereze în vector pe prima poziţie a sa.

LIMBAJUL PASCAL
program Problema7;
var v:array[1..100] of integer;
c1,c2,n,i,sw:byte;
x,aux:integer;
function caut:boolean;
var sw1:integer;
li,ls,mijloc:byte;
begin
sw1:=1;
if c1=n-1 then
begin
li:=1; ls:=n;
end
LIMBAJUL C++ else
#include<stdio.h> if c2=n-1 then
#include<stdlib.h> begin
void main(void) li:=n; ls:=1; sw1:=-1;
{int v[20],n,i,x,st,dr,test,m; end
printf("n="); scanf("%d",&n); else
for(i=1;i<=n;i++) begin
{printf("v[%d]=",i); scanf("%d",&v[i]); repeat
} sw:=0;
printf("x="); scanf("%d",&x); for i:=1 to n-1 do
for(i=1;i<n;i++) if v[i+1]>v[i] then
if(v[i]>v[i+1]) begin
exit(0); aux:=v[i]; v[i]:=v[i+1]; v[i+1]:=aux; sw:=1;
st=1;dr=n;test=0; end;
while(st<=dr&&!test) until sw=0;
{m=(st+dr)/2; li:=1; ls:=n;
if(v[m]==x) end;
{printf("\n cheia de cautare se afla pe poz. %d",m); repeat
test=1; mijloc:=(li+ls) div 2;
} if x>v[mijloc] then li:=mijloc+sw1;
if(v[m]>x) dr=m-1; if x<v[mijloc] then ls:=mijloc-sw1;
else if(v[m]<x) st=m+1; until (x=v[mijloc]) or ((sw1=1) and (li>ls)) or ((sw1=-1) and (li<ls));
} caut:=(x=v[mijloc]);
if(test==0) end;
{for(i=n;i>=1;i--) v[i+1]=v[i]; begin
v[1]=x; n++; write('Dimensiunea vectorului:');readln(n);
for(i=1;i<=n;i++) printf("\n v[%d]=%d",i,v[i]); for i:=1 to n do
} begin write('v[',i,']='); readln(v[i]); end;
} write('Elementul care se cauta:');readln(x);
c1:=0;c2:=0;
for i:=1 to n-1 do
begin
if v[i+1]>=v[i] then inc(c1);
if v[i+1]<=v[i] then inc(c2);
end;
if caut then writeln('DA, elementul exista in vector')
else
begin
writeln('NU, elementul nu exista, il voi insera pe prima pozitie:');
for i:=n downto 1 do v[i+1]:=v[i];
v[1]:=x; inc(n);
for i:=1 to n do write(v[i],' ');
end;
end.
8
Problema nr. 8

Să se interclaseze doi vectori ordonaţi crescător, folosind metoda interclasării cu santinelă.

LIMBAJUL PASCAL

program Problema8;
var a,b,c:array[1..100] of integer;
n,m,i,j,k:integer;
begin
writeln('Introduceti vectorii ordonati crecscator');
write('n='); readln(n);
for i:=1 to n do
begin
LIMBAJUL C++ write('a[',i,']='); readln(a[i]);
#include<stdio.h> end;
int x[20],y[20],z[40],n,m,k,i,j; write('m='); readln(m);
void main() for i:=1 to m do
{printf("n=");scanf("%d",&n); begin
printf("m=");scanf("%d",&m); write('b[',i,']='); readln(b[i]);
for(i=1;i<=n;i++) end;
{printf("x[%d]=",i); scanf("%d",&x[i]); i:=1; j:=1; k:=0;
} while (i<=n) and (j<=m) do
for(i=1;i<=m;i++) if a[i]<b[j] then begin
{printf("y[%d]=",i); scanf("%d",&y[i]); k:=k+1; c[k]:=a[i]; i:=i+1;
} end
x[n+1]=y[m]+1;y[m+1]=x[n]+1; else
i=1;j=1; if a[i]>b[j] then begin
for(k=1;k<=n+m;k++) k:=k+1; c[k]:=b[j]; j:=j+1;
if(x[i]<y[j]) end
{ z[k]=x[i]; i++; } else
else begin
{z[k]=y[j]; j++; } k:=k+1;c[k]:=b[j]; j:=j+1; k:=k+1; c[k]:=a[i]; i:=i+1;
printf("\n Vectorul obtinut prin interclasare este:\n"); end;
for(i=1;i<=n+m;i++) if i<=n then
printf("\n z[%d]=%d",i,z[i]); for j:=i to n do begin
} k:=k+1; c[k]:=a[j];
end;
if j<=m then
for i:=j to m do begin
k:=k+1; c[k]:=b[i];
end;
writeln('Vectorul obtinut prin interclasare este:');
for i:=1 to k do
write(c[i],' ') ;
end.

Problema nr. 9

Se ştie că orice număr natural par mai mare decât 4 se poate scrie ca suma a două numere prime.
(CONJECTURA LUI GOLDBACH). Să se scrie un program care să scrie un număr natural par mai mare
decât 4 ca suma a două numere prime. Să se utilizeze o funcţie care să verifice proprietatea de număr prim a
unui număr natural.

9
LIMBAJUL C++
#include<stdio.h> LIMBAJUL PASCAL
int prim(int x) program Problema9;
{int j,test; var n,i,q:word;
if(x==1) return 0; function prim(x,k:word):boolean;
test=1; //pp ca nr x este prim begin
for(j=2;j<=x/2;j++) if k=(x div 2)+1 then prim:=true
if(x%j==0) else
{test=0; break; } if x mod k=0 then prim:=false
return test; else prim:=prim(x,k+1);
} end;
void main()
{int n,i; begin
clrscr(); write('Introduceti n>=4, par:'); readln(n);
printf("n=");scanf("%d",&n); writeln('Perechile de valori prime sunt:');
if(n>=4&&n%2==0) for i:=2 to n div 2 do
{for(i=1;i<=n;i++) begin
if(prim(i)==1&&prim(n-i)==1) q:=2;
printf("\n suma este %d =%d+%d",n,i,n-i); if prim(i,q) and prim(n-i,q) then writeln('(',i,',',n-i,')');
} end;
else end.
printf("Date eronate");
}

Problema nr. 10
Se citesc de la tastatură cele n elemente ale unui tablou unidimensional cu elemente distincte. Să se
determine elementul cu numărul de ordine k , din tabloul ordonat crescător, fără a ordona tabloul.

LIMBAJUL C++ LIMBAJUL PASCAL


#include<stdio.h> program Problema10;
void main() var v,poz,u:array[1..100] of integer;
{int n,v[20],poz[20],i,j,k; n,i,j,k:integer;
printf("n=");scanf("%d",&n); begin
for(i=1;i<=n;i++) writeln('vector cu elemente distincte');
{printf("v[%d]=",i); scanf("%d",&v[i]); } write('n=');readln(n);
printf("k=");scanf("%d",&k); for i:=1 to n do
for(i=1;i<=n;i++) poz[i]=1; begin
for(i=1;i<=n-1;i++) write('v[',i,']='); readln(v[i]);
{for(j=i+1;j<=n;j++) end;
if(v[i]<v[j]) poz[j]++; write('introduceti pozitia k=');readln(k);
else poz[i]++; for i:=1 to n do poz[i]:=0;
} for i:=1 to n-1 do
for(i=1;i<=n;i++) for j:=i+1 to n do
if(poz[i]==k) if v[i]>v[j] then poz[i]:=poz[i]+1
printf("elem este %d",v[i]); else poz[j]:=poz[j]+1;
} writeln('Elementul care va ocupa pozitia ',k,' este:');
for i:=1 to n do
if poz[i]+1=k then writeln(v[i]);
end.

Problema nr. 11

Să se ordoneze alfabetic numele a n copii.

10
LIMBAJUL C++
#include<iostream.h>
LIMBAJUL PASCAL
#include<string.h>
typedef struct copil program Problema11;
{char nume[30]; var v:array[1..100] of string[20];
char prenume[30]; i,n,j:integer;
aux:string[20];
};
begin
struct copil a[20];
write('Introduceti numarul de elevi:'); readln(n);
int i,j,n;
write('Introduceti numele elevilor:');
char man[20];
for i:=1 to n do
void main()
begin
{cout<<"n=";cin>>n;
write('v[',i,']='); readln(v[i]);
for(i=1;i<=n;i++)
end;
{cout<<"numele este"; cin>>a[i].nume;
for i:=1 to n do
//scanf("%s",a[i].nume);gets(a[i].nume);
for j:=i+1 to n do
cout<<"prenumele este"; cin>>a[i].prenume;
if v[i]>v[j] then
}
begin
for(i=1;i<=n-1;i++)
aux:=v[i]; v[i]:=v[j]; v[j]:=aux;
for(j=1+i;j<=n;j++)
end;
if(strcmp(a[i].nume,a[j].nume)>0)
writeln('Elevii in ordinea alfabetica sunt:');
{strcpy(man,a[i].nume); strcpy(a[i].nume,a[j].nume);
for i:=1 to n do
strcpy(a[j].nume,man); strcpy(man,a[i].prenume);
writeln('v[',i,']=',v[i]);
strcpy(a[i].prenume,a[j].prenume);strcpy(a[j].prenume,man);
end.
}
cout<<"copii ordonati dupa nume sunt";
for(i=1;i<=n;i++)
cout<<"\n"<<a[i].nume<<" "<<a[i].prenume;
}

Problema nr. 12

Să se verifice daca elementele unui tablou unidimensional pot forma o multime

LIMBAJUL C++
LIMBAJUL PASCAL
#include<stdio.h>
program Problema12;
void main()
var v:array[1..100] of integer;
{int v[20],n,i,j,test;
i,j,n:integer;
printf("n=");scanf("%d",&n);
sw:boolean;
for(i=1;i<=n;i++)
begin
{ printf("v[%d]= ",i); scanf("%d",&v[i]); }
write('Introduceti dimensiunea vectorului:');readln(n);
test=0;
for i:=1 to n do
for(i=1;i<=n-1;i++)
begin write('v[',i,']='); readln(v[i]); end;
for(j=i+1;j<=n;j++)
sw:=true;
if(v[i]==v[j]) {test=1; break;}
for i:=1 to n-1 do
if(test==0)
for j:=i+1 to n do
printf("elementele pot forma o multime");
if v[i]=v[j] then sw:=false;
else
if sw then writeln('elementele POT forma o multime')
printf(" elementele nu pot forma o multime ");
else writeln('elementele NU POT forma o multime');
}
end.

Problema nr. 13

Să se verifice dacă două cuvinte sunt anagrame.

11
LIMBAJUL C++
#include<stdio.h>
LIMBAJUL PASCAL
#include<string.h>
void main()
{int n,m,i,j;
program Problema13;
char s1[20],s2[20],man;
var s1,s2:string;
printf("Primul cuvant este :");gets(s1);
i,h:integer;
printf("Al doilea cuvant este:");gets(s2);
begin
n=strlen(s1);m=strlen(s2);
write('s1=');readln(s1);
for(i=0;i<n-1;i++)
write('s2=');readln(s2);
for(j=i+1;j<n;j++)
if length(s1)<>length(s2) then
if(s1[i]>s1[j])
writeln(' cele doua siruri nu sunt anagrame')
{man=s1[i]; s1[i]=s1[j]; s1[j]=man; }
else
for(i=0;i<m-1;i++)
begin
for(j=i+1;j<m;j++)
for i:=1 to length(s1) do
if(s2[i]>s2[j]) begin
{man=s2[i]; s2[i]=s2[j]; s2[j]=man; } h:=pos(s1[i],s2);
if(n!=m) if h<>0 then
printf("cuvintele nu sunt anagrame"); delete(s2,h,1);
else end;
{int test=1; if s2='' then writeln(' cele doua siruri sunt anagrame')
for(i=0;i<n;i++) else writeln(' cele doua siruri nu sunt anagrame');
if(s1[i]!=s2[i]) end;
{test=0; break;} end.
if(test==1) printf("\n cuvintele sunt anagrame");
else printf("\n cuvintele nu sunt anagrame ");
}
}

Problema nr. 14
Se citesc de la tastatură n numere întregi. Să se determine factorul prim care apare la puterea cea mai
mare în descompunerea produsului celor n numere,fara a efectua produsul numerelor.

LIMBAJUL C++
#include<stdio.h> LIMBAJUL PASCAL
long p=1; program Problema14;
int max,n,i,v[20],f,pf,nr,nrf,factor[20]; var v:array[1..100] of word;
long produs() n,i,sw:byte; max,fact,d,t,cont:word;
{for(i=1;i<=n;i++) p=p*v[i]; procedure calcul(var x:word;w:word;var q:word);
return p; begin
} while x mod w=0 do
void main() begin x:=x div w; inc(q); end;
{printf("n=");scanf("%d",&n); end;
for(i=1;i<=n;i++) begin
{printf("v[%d]=",i); scanf("%d",&v[i]); } write('Introduceti dimensiunea vectorului:');readln(n);
produs(); i=2; for i:=1 to n do
while(i<=p) begin write('v[',i,']='); readln(v[i]); end;
{if(p%i==0) max:=0;fact:=0;d:=2;
{nr=0; repeat
do {p=p/i; nr++; } cont:=0; sw:=0;
while(p%i==0); for i:=1 to n do
if(nr>max) {factor[1]=i; max=nr; nrf=1; } if v[i]>1 then
else if(nr==max) begin
{nrf++; factor[nrf]=i; } sw:=1; t:=0; calcul(v[i],d,t); inc(cont,t);
} end;
else i++; if cont>max then
} begin max:=cont; fact:=d; end;
printf("puterea maxima a unui fact prim este %d",max); inc(d);
printf("\nsecventa fact de putere maxima"); until sw=0;
for(i=1;i<=nrf;i++) printf(" \n%d ",factor[i]); writeln('Puterea maxima: ',max,' factorul: ',fact);
} end.
12
Problema nr. 15
Fiind dată o matrice pătratică de dimensiune n ,cu elemente numere întregi, să se afişeze coloanele care
reprezinta şiruri ordonate crescator şi liniile care reprezintă şiruri ordonate descrescător.
LIMBAJUL C++ LIMBAJUL PASCAL
#include<stdio.h> program Problema15;
int n,i,j,a[20][20]; var a:array[1..10,1..10] of integer;
int coloana(int x) n,i,j,p:byte;
{int test=1; function veriflinie(l:byte):boolean;
for(i=1;i<n;i++) var j:byte;
for(j=i+1;j<=n;j++) begin
if(a[i][x]>a[j][x]) {test=0; break;} veriflinie:=true;
return test; for j:=1 to n-1 do
} if a[l,j+1]>a[l,j] then veriflinie:=false;
int linie(int x) end;
{int test=1; function verifcoloana(c:byte):boolean;
for(i=1;i<n;i++) var i:byte;
for(j=i+1;j<=n;j++) begin
if(a[x][i]<a[x][j]) {test=0; break;} verifcoloana:=true;
return test; for i:=1 to n-1 do
} if a[i+1,c]<a[i,c] then verifcoloana:=false;
void main() end;
{int k,l; begin
printf("n=");scanf("%d",&n); write('Introduceti dimensiunea matricii:'); readln(n);
for(i=1;i<=n;i++) for i:=1 to n do
for(j=1;j<=n;j++) for j:=1 to n do
{printf("a[%d][%d]=",i,j); scanf("%d",&a[i][j]); } begin write('a[',i,',',j,']='); readln(a[i,j]); end;
for(k=1;k<=n;k++) writeln('Liniile ordonate descrescator sunt:');
{ if(linie(k)==1) for p:=1 to n do
printf("\n linia %d este ordonata descrescator",k); if veriflinie(p) then write(p,' ');
if(coloana(k)==1) writeln('Coloanele ordonate crescator sunt:');
printf("\n coloana %d este ordonata crescator",k); for p:=1 to n do
} if verifcoloana(p) then write(p,' ');
} end.

Problema nr. 16
Să se determine dintre n cuvinte date submulţimile de cuvinte care rimează (au cel puţin 2 litere de la
sfârşit identice).

LIMBAJUL C++ LIMBAJUL PASCAL


#include<iostream.h> program Problema16;
#include<string.h> var v:array[1..100] of string[25];
#include<stdio.h> n,i,j:byte;
int n,i,j; p,q:string[2];
char a[20][20]; begin
void main() write('Introd. numarul de cuvinte: ');readln(n);
{clrscr(); for i:=1 to n do
printf("n=");scanf("%d",&n); begin
cout<<"\nCuvintele sunt "; write('v[',i,']='); readln(v[i]);
for(i=0;i<n;i++) end;
scanf("%s",&a[i]); writeln('Perechile de cuvinte rime sunt:');
cout<<"\nSe formeaza rimele \n"; for i:=1 to n-1 do
for(i=0;i<n-1;i++) for j:=i+1 to n do
for(j=i+1;j<n;j++) begin
if(strcmp(&a[i][strlen(a[i])-2],&a[j] p:=copy(v[i],length(v[i])-1,2);q:=copy(v[j],length(v[j])-1,2);
[strlen(a[j])-2])==0) if p=q then writeln(v[i],' ',v[j]);
printf("\n %s %s",a[i],a[j]); end;
} end.

13
Problema nr. 17
Se dă un tablou bidimensional cu m linii şi n coloane, cu elemente numere întregi. Să se stabilească dacă
există elemente comune:
-tuturor liniilor
-tuturor coloanelor
Să se afişeze elementele comune şi poziţia lor de apariţie pe fiecare din liniile respectiv coloanele matricei.

LIMBAJUL PASCAL
program Problema17;
var a:array[1..10,1..10] of integer;
n,m,i,j,p,q,k,s,lin,col,t,sw:byte;
poz:array[1..100] of word;
procedure linie(q:integer;l:byte;var c:byte);
LIMBAJUL C++ var j:byte;
#include<stdio.h> begin
void main() for j:=1 to n do if q=a[l,j] then c:=j;
{int nr,m,n,v[22] end;
[22],i,j,k,mi,pe_linie,pe_coloana,yesl,yesc; procedure coloana(q:integer;c:byte;var l:byte);
printf("nr de linii:"); scanf("%d",&m); var i:byte;
printf("numarul de coloane"); scanf("%d",&n); begin
for(i=1;i<=m;i++) for i:=1 to m do if q=a[i,c] then l:=i;
for(j=1;j<=n;j++) end;
{ printf("a[%d][%d]=",i,j); scanf("%d",&v[i][j]); } begin
yesl=0; writeln('Introduceti dimensiunile matricii:'); write('Linii: ');
for(i=1;i<=n;i++) readln(m);write('Coloane: ');readln(n);
{ pe_linie=v[1][i]; nr=1; for i:=1 to m do
for(j=2;j<=m;j++) for j:=1 to n do
{ mi=nr; begin write('a[',i,',',j,']='); readln(a[i,j]); end;
for(k=1;k<=n;k++) writeln('Elementele comune liniilor si pozitiile acestora sunt:');
if(v[j][k]==pe_linie) nr++; for p:=1 to n do
if(nr-mi>1) nr=mi+1; begin
} sw:=0;k:=0;
if(nr==m) for lin:=2 to m do
{ printf("%d este elem comun liniilor\n",pe_linie); begin
yesl=1; } t:=0; linie(a[1,p],lin,t);
} if t<>0 then
if(yesl==0) printf("nu exista un elem comun tuturor begin inc(k); poz[k]:=t; end
liniilor\n"); else sw:=1;
yesc=0; end;
for(i=1;i<=m;i++) if sw=0 then
{pe_coloana=v[i][1]; nr=1; begin
for(j=2;j<=n;j++) write('Elem.: ',a[1,p],' pe pozitiile: ',p,' ');
{ mi=nr; for s:=1 to k do write(poz[s],' ');
for(k=1;k<=m;k++) end;
if(v[k][j]==pe_coloana) nr++; end;
if(nr-mi>1) nr=mi+1; writeln('Elementele comune coloanelor si pozitiile acestora sunt:');
} for p:=1 to m do
if(nr==n) begin
{ printf("%d este elem comun coloanelor",pe_coloana); sw:=0;k:=0;
yesc=1; for col:=2 to n do
} begin
} t:=0; coloana(a[p,1],col,t);
if(yesc==0) if t<>0 then
printf("nu exista un elem comun tuturor coloanelor\n"); begin inc(k); poz[k]:=t; end
} else sw:=1;
end;
if sw=0 then
begin
write('Elem.: ',a[p,1],' pe pozitiile: ',p,' ');
for s:=1 to k do write(poz[s],' ');
end;
end;
end.
14
Problema nr. 18

Fiind dată o matrice patratică de dimensiune n, să se determine dacă aceasta are puncte şa. Un punct se
numeste şa dacă este minim pe linia i şi maxim pe coloana j.

LIMBAJUL C++
#include<stdio.h>
int n,i,j,a[20][20]; LIMBAJUL PASCAL
int minim(int i) program Problema18;
{int poz=1,min;//se determina coloana unui element var a:array[1..10,1..10] of integer;
de minim pe linia i n,i,j,p,q:byte;
min=a[i][1]; function minim(l:byte):integer;
for(j=2;j<=n;j++) var j:byte;min:integer;
if(min>a[i][j]) begin
{ min=a[i][j]; poz=j; } min:=a[l,1];
return poz; for j:=2 to n do
} if min>a[l,j] then min:=a[l,j];
int maxim(int j) minim:=min;
{int poz1=1,max;//se determina linia unui element de end;
maxim pe coloana j function maxim(c:byte):integer;
max=a[1][j];. var i:byte;max:integer;
for(i=2;i<=n;i++) begin
if(max<a[i][j]) max:=a[1,c];
{ max=a[i][j]; poz1=i; } for i:=2 to n do
return poz1; if max<a[i,c] then max:=a[i,c];
} maxim:=max;
void main() end;
{printf("n=");scanf("%d",&n); begin
for(i=1;i<=n;i++) write('Introduceti dimensiunea matricii:');readln(n);
for(j=1;j<=n;j++) for i:=1 to n do
{printf("a[%d][%d]=",i,j);scanf("%d",&a[i][j]);} for j:=1 to n do
printf("\n matricea este :\n"); begin write('a[',i,',',j,']='); readln(a[i,j]); end;
for(i=1;i<=n;i++) writeln('Elementele sa ale matricii sunt:');
{ for(j=1;j<=n;j++) printf("%3d",a[i][j]); for p:=1 to n do
printf("\n"); for q:=1 to n do
} if (a[p,q]=minim(p)) and (a[p,q]=maxim(q)) then
for(i=1;i<=n;i++) writeln(a[p,q],' pe pozitia: ',p,',',q);
for(j=1;j<=n;j++) end.
{ if(minim(i)==maxim(j))
printf("\n elementul %d este un punct sa",a[i][j]);
}
}

Problema nr. 19
Se citeşte un număr real x de la tastatură. Să se determine numerele întregi prime p şi q astfel încât p ≤ x<q
şi diferenţa q-p este minimă.

15
LIMBAJUL C++
#include<stdio.h>
int p,q,x,j;
int prim(int n)
{int i,test=1; LIMBAJUL PASCAL
if(n==1) test=0; program Problema19;
if(n==2) test=1; var n,q,t:word;
for(i=2;i<=n-1;i++) function prim(x:word):boolean;
if(n%i==0) var i:word;
{ test=0; break; } begin
return test; prim:=true;
} for i:=2 to x div 2 do
void main() if x mod i=0 then prim:=false;
{printf("x=");scanf("%d",&x); end;
if(prim(x)==1) begin
{for(j=x+1;j<=2*x;j++) write('Introduceti numarul:');readln(n);
if(prim(j)==1) q:=n;
{q=j; break; } while not prim(q) do
printf("p=%d si q=%d",x,q); dec(q);
} t:=n+1;
else while not prim(t) do
{ for(j=x-1;j>=2;j--) inc(t);
if(prim(j)==1) writeln('Perechea de valori este: ',q,',',t);
{p=j; break; } end.
for(j=x+1;j<=2*x;j++)
if(prim(j)==1)
{q=j; break; }
printf("p=%d si q=%d",p,q);
}
}

Problema nr. 20
Se dă un cuvânt şi un şir de cuvinte sau o frază. Să se determine doua cuvinte din frază, care concatenate
determină un cuvânt identic cu cuvântul dat.
Exemplu :
ana
bara a vant na lipie
se formează ana cu al doilea cuvânt şi al patrulea.

LIMBAJUL C++
#include<stdio.h>
#include<string.h> LIMBAJUL PASCAL
#include<iostream.h> program Problema20;
void main (void) var v:array[1..100] of string[25];
{char c[20],a[20][20],s1[20],s2[20]; n,i,j:byte;
int n,i,j; p:string[50];
puts("cuvantul este:");gets(c); begin
printf("n=");//nr de cuvinte din fraza ; scanf("%d",&n); write('Introd. numarul de cuvinte: ');readln(n);
for(i=1;i<=n;i++)
{ printf("Cuvantul cu nr %d este:",i);
for i:=1 to n do
cin>>a[i]; begin write('v[',i,']='); readln(v[i]); end;
} write('Introduceti cuvantul de referinta: ');readln(p);
for(i=1;i<=n-1;i++) writeln('Perechile de cuvinte care concatenate dau ',p,' sunt:');
for(j=i+1;j<=n;j++) for i:=1 to n-1 do
{ strcpy(s1,a[i]); strcpy(s2,a[j]); for j:=i+1 to n do
strcat(s1,s2); if v[i]+v[j]=p then
if(strcmp(s1,c)==0) writeln(v[i],' ',v[j]);
printf("\n cele doua cuvinte sunt %s si %s",a[i],a[j]); end.
}
}

16
Problema nr. 21

Se citeşte n, un număr natural. Să se calculeze produsul cifrelor pare ale numărului n.

LIMBAJUL C++ LIMBAJUL PASCAL


#include<iostream.h> program Problema21;
void main() var n,p:integer;
{int n,c,P; begin
cout<<"n="; cin>>n; write('n='); readln(n);
P=1; p:=1;
while(n!=0) while n<>0 do
{c=n%10; begin
if (c%2==0) P=P*c; if (n mod 10) mod 2=0 then p:=p*(n mod 10);
n=n/10;} n:=n div 10;
cout<<"Produsul este egal cu: "<<P; end;
} if p=1 then writeln('numarul n nu are cifre pare')
else writeln('produsul cifrelor pare este:',p);
end.

Problema nr. 22

Se citesc n numere naturale. Verificaţi dacă suma acestora este număr prim .
LIMBAJUL PASCAL
LIMBAJUL C++ program Problema22;
#include<iostream.h> var x,n,s,i:integer;
#include<math.h> sw:boolean;
void main() begin
{int n,S,g,i,j,a; write('n='); readln(n);
cout<<"n="; cin>>n; s:=0;
S=0; for i:=1 to n do
for(i=1;i<=n;i++) begin
{cout<<"a=";cin>>a; write('x='); readln(x); s:=s+x;
S+=a;} end;
g=1; sw:=true;
for (j=2;j<=sqrt(S);j++) for i:=2 to s div 2 do
if (S%j==0) g=0; if s mod i =0 then sw:=false;
if(g==1) cout<<"Suma este numar prim"; if sw then writeln('suma numerelor ',s,' este un nr.prim')
else cout<<"Suma nu este numar prim";} else writeln(' suma numerelor ', s,' nu este nr. prim');
end.

Problema nr. 23

Se citeşte n, un număr natural. Să se verifice dacă n este o putere a lui 2.

LIMBAJUL C++ LIMBAJUL PASCAL


#include<iostream.h> program Problema23;
#include<math.h> var n,cont,aux:integer;
void main() begin
{int n,k; write('n='); readln(n); cont:=0;aux:=n;
cout<<"n=";cin>>n; while n mod 2 =0 do
k=0; begin
do {n=n/2;k++;} cont:=cont+1; n:=n div 2;
while (n%2==0); end;
if (n==1) cout<<"Numarul este o putere a lui 2"; if n=1 then writeln('numarul ', aux,' este 2 la puterea ',cont)
else cout<<"Numarul nu este o putere a lui 2";} else writeln(' numarul ', aux ,' nu este o putere a lui 2');
end.

17
Problema nr. 24
Se citeşte de la tastatură o frază de maxim 70 de caractere. Să se afişeze, cu spaţii intre ele, toate perechile
de vocale consecutive din frază, precum şi numărul acestor perechi.
LIMBAJUL C++ LIMBAJUL PASCAL
#include<iostream.h> program Problema24;
#include<string.h> var s:string[70]; cont,i:integer;
void main() m:set of char;
{char text[70],c[]="aeiou"; begin
int n,i,x=0; write('s='); readln(s);
cout<<"Introduceti textul: "<<endl; cont:=0;
cin.get(text,70); m:=['a','e','i','o','u','A','E','I','O','U'];
n=strlen(text); for i:=1 to length(s)-1 do
for(i=0;i<n;i++) if (s[i] in m) and (s[i+1] in m) then
if((strchr(c,text[i])!=0)&&(strchr(c,text[i+1])!=0)) begin
{cout<<text[i]<<text[i+1]<<" "; cont:=cont+1;
x++; writeln(s[i],' ',s[i+1]);
} end;
cout<<endl; writeln('numarul de perechi de vocale consecutive este:',cont);
cout<<x;} end.
Problema nr. 25
Se consideră un tablou unidimensional, cu maxim 100 de valori, reprezentând înălţimile a n persoane, date
în cm. Să se afişeze câte persoane au înălţimea mai mare decât o valoare citită de la tastatură.

LIMBAJUL PASCAL
program Problema25;
LIMBAJUL C++
var a:array[1..100] of word;
#include<iostream.h>
h,n,i,cont:integer;
void main()
begin
{int n,s,v[100],i,k;
write('numarul de persoane:'); readln(n);
cout<<"n="; cin>>n;
for i:=1 to n do
s=0;
begin
cout<<"k="; cin>>k; write('inaltimea persoanei ', i,' este:'); readln(a[i]);
for(i=0;i<n;i++) end;
{cout<<"inaltime="; cin>>v[i]; write('inaltimea citita este:');readln(h);
if(v[i]>k) s++;} cont:=0;
cout<<"s="<<s;} for i:=1 to n do
if a[i]>h then cont:=cont+1;
writeln('numarul de persoane cu inaltimea mai mare ca ', h,'cm este:',cont);
end.
Problema nr. 26
Se citeşte o matrice de numere reale cu n linii si m coloane (n,m ≤ 20). Să se afişeze câte dintre liniile
matricei au componente strict pozitive.
LIMBAJUL PASCAL
program Problema26;
LIMBAJUL C++ var a:array[1..20,1..20] of real;
#include<iostream.h> i,j,n,m,cont:integer;
void main() sw:boolean;
{float a[20][20]; begin
int i,j,n,m,s; write('n='); readln(n); write('m='); readln(m);
cout<<"n="; cin>>n; for i:=1 to n do
cout<<"m="; cin>>m; for j:=1 to m do
s=0; begin write('a[',i,',',j,']='); readln(a[i,j]); end;
for(i=0;i<n;i++) cont:=0;
for(j=0;j<m;j++) for i:=1 to n do
{cout<<"a["<<i<<"]["<<j<<"]="; begin
cin>>a[i][j]; sw:=true;
if(a[i][j]>0) s++;} for j:=1 to m do if a[i,j]<0 then sw:=false;
cout<<"nr pozitive="<<s;} if sw then cont:=cont+1;
end;
writeln('numarul de linii cu elem. strict pozitive este:',cont);
end.

18
Problema nr. 27
Dându-se un tablou unidimensional, care conţine maxim 100 numere întregi, să se afişeze diferenţa
maximă găsită între două elemente consecutive ca poziţie în tablou.

LIMBAJUL C++
#include<iostream.h> LIMBAJUL PASCAL
void main() program Problema27;
{int v[100],i,j,n,s,max; var a:array[1..100] of integer;
cout<<"n="; cin>>n; i,n,d:integer;
for(i=0;i<n;i++) begin
{cout<<"v["<<i<<"]="; cin>>v[i];} clrscr;
max=0; d:=-maxint;
j=0; write('n='); readln(n);
while(j!=n) for i:=1 to n do
{s=0; begin
s+=v[j]+v[j+1]; write('a[',i,']=');readln(a[i]);
if(s>max) max=s; end;
j++; for i:=1 to n-1 do
} if d<(abs(a[i]-a[i+1])) then d:=abs(a[i]-a[i+1]);
cout<<"diferenta maxima="<<max; writeln('diferenta maxima dintre doua elem. consecutive este:',d);
} end.

Problema nr. 28
Se citesc de la tastatură n numere întregi. Să se afişeze mai întâi numerele pare şi apoi numerele impare în
ordinea inversă a apariţiei lor. LIMBAJUL PASCAL
program Problema28;
LIMBAJUL C++ var v:array[1..100] of integer;
#include<iostream.h> n,i,p:integer;
void main() begin
{int a,v[100],i,j,n,x; write('n='); readln(n);
cout<<"n="; for i:=1 to n do
cin>>n; begin
for(i=0;i<n;i++) write('v[',i,']='); readln(v[i]);
cin>>v[i]; end;
for(i=0;i<n;i++) writeln('numerele pare in ordine inversa sunt:');
if(v[i]%2==0) cout<<v[i]; for i:=n downto 1 do
for(i=n;i>=0;i--) if v[i] mod 2=0 then write(v[i],' ');
if(v[i]%2!=0) cout<<v[i]; writeln;
} writeln('numerele impare in ordine inversa sunt:');
for i:=n downto 1 do
if v[i] mod 2=1 then write(v[i],' ');
end.

Problema nr. 29
Se consideră un vector cu n componente. Să se afişeze câte elemente din vector au valoarea mai mare decât
media aritmetică a componentelor vectorului.
LIMBAJUL C++ LIMBAJUL PASCAL
#include<iostream.h> program Problema29;
void main() var a:array[1..100] of integer;
{int v[20],n,i,s=0,nr=0; n,i,cont:integer;
float m=0; ma:real;
cout<<"n="; cin>>n; begin
for(i=0;i<n;i++) write('n='); readln(n);
{cout<<"v["<<i<<"]="; cinv[i];} for i:=1 to n do
for(i=0;i<n;i++) s+=v[i]; begin write('a[',i,']='); readln(a[i]); end;
m=s/n; cont:=0;ma:=0;
for(i=0;i<n;i++) for i:=1 to n do ma:=ma+a[i];
if(v[i]>m) nr++; ma:=ma/n;
cout<<"nr="<<nr; for i:=1 to n do if a[i]>ma then cont:=cont+1;
} writeln('numarul de elem. cu valoarea mai mare decat ma ',ma:3,:2,' este:',cont);
end.
19
Problema nr. 30
Se consideră o matrice cu n linii şi m coloane, cu componente numere întregi. Să se afişeze elementele de
pe conturul matricei, începând cu elementul de pe prima linie şi prima coloană, în ambele sensuri de
parcurgere.

LIMBAJUL PASCAL
program Problema30;
LIMBAJUL C++ var a:array[1..100,1..100] of integer;
#include<iostream.h> n,m,i,j:integer;
void main() begin
{int a[10][10],n,m,i,j; write('n='); readln(n);
cout<<"n="; write('m=');readln(m);
cin>>n; for i:=1 to n do
cout<<"m="; for j:=1 to m do
cin>>m; begin write('a[',i,',',j,']='); readln(a[i,j]); end;
for(i=1;i<=n;i++) writeln('Afisarea conturului in sens retrograd:');
for(j=1;j<=m;j++) for j:=1 to m do write(a[1,j],' ');
{cout<<"a["<<i<<"]["<<j<<"]="; for i:=2 to n do write(a[i,m],' ');
cin>>a[i][j];} for j:=m-1 downto 1 do write(a[m,j],' ');
for(j=1;j<=m;j++) cout<<a[1][j]<<" "; for i:=n-1 downto 2 do write(a[i,1],' ');
for(i=2;i<=n;i++) cout<<a[i][m]<<" "; writeln;
for(j=m-1;j>=1;j--) cout<<a[n][j]<<" "; writeln('Afisarea conturului in sens trigonometric:');
for(i=n-1;i>1;i--) cout<<a[i][1]<<" "; for i:=1 to n do write(a[i,1],' ');
} for j:=2 to m do write(a[n,j],' ');
for i:=n-1 downto 1 do write(a[i,m],' ');
for j:=m-1 downto 2 do write(a[1,j],' ');
end.

Problema nr. 31
Se citeşte din fişierul “mat.in” , de pe prima linie un număr natural n≤20 şi de pe următoarele n linii o
matrice pătratică de dimensiune n. Să se verifice dacă toate elementele aflate strict deasupra diagonalei
secundare a matricei au aceeaşi paritate şi să se afişeze rezultatul pe ecran.
LIMBAJUL PASCAL
program Problema31;
var f:text;
LIMBAJUL C++ a:array[1..10,1..10] of word;
#include<fstream.h> n,i,j,ci,cp:byte;
int a[21][21],n; begin
ifstream f("mat.in"); assign(f,'d:\bp\bin\mat.in'); reset(f);
int main() readln(f,n);
{f>>n; for i:=1 to n do
int i,j; begin
for(i=1;i<=n;i++) for j:=1 to n do read(f,a[i,j]);
for(j=1;j<=n;j++) readln(f);
f>>a[i][j]; end;
int ok=1; close(f);
for(i=1;i<=n-1 && ok;i++) cp:=0; ci:=0;
for(j=1;j<=n-i && ok;j++) for i:=1 to n-1 do
if(a[1][1]%2!=a[i][j]%2) for j:=1 to n-i do
ok=0; if a[i,j] mod 2 =0 then inc(cp)
cout<<(ok==1?"DA":"NU"); else inc(ci);
return 0; if (cp=0) or (ci=0) then
} writeln('DA, toate elementele de deasupra diag. secundare au aceeasi
paritate')
else
writeln('NU, nu toate elementele de deasupra diag. secundare au aceeasi
paritate');
end.

20
Problema nr. 32
Se citeşte un număr natural n≤10000 de la tastatură. Să se verifice dacă n este număr puternic. Un număr
este puternic dacă are mai mulţi divizori decât orice număr mai mic decât el.

LIMBAJUL C++ LIMBAJUL PASCAL


#include<iostream.h> program Problema32;
int n; var n,t,j:word;
int nr_div(int n){ sw:string[25];
int nd=1; function nr(x:word):word;
for(int i=1;i<=n/2;i++) var q,i:word;
if(n%i==0) nd++; begin
return nd;} q:=2;
int main(){ for i:=2 to x div 2 do
cin>>n; if x mod i=0 then inc(q);
int i,k,puternic=1; nr:=q;
k=nr_div(n); end;
for(i=1;i<=n-1&& puternic;i++) begin
if(k<=nr_div(i)) write('Introduceti numarul:');readln(n);
puternic=0; sw:='PUTERNIC';t:=nr(n);
if(puternic) cout<<"Numarul "<<n<<" for j:=1 to n-1 do
este puternic"; if nr(j)>=t then
else cout<<"Numarul "<<n<<" sw:='NU ESTE PUTERNIC';
nu este puternic"; writeln(sw);
return 0;} end.

Problema nr. 33
Se citeşte un text din fişierul ”text.in”. Textul are mai multe linii şi fiecare linie conţine mai multe cuvinte
formate din litere mici şi mari ale alfabetului englez. Cuvintele sunt despărţite prin câte un singur spaţiu. Să
se afişeze în fişierul ”text.out” , pe linii consecutive, toate literele care apar în text împreună cu frecvenţele
lor de apariţie. Nu se ţine seama de diferenţa dintre literele mici şi cele mari.

LIMBAJUL PASCAL
program Problema33;
LIMBAJUL C++ var f,g:text;
#include<fstream.h> c:char;
#include<ctype.h> v:array[1..256] of word;
int a[32]; i:byte;
char c; begin
ifstream f("text.in"); assign(f,'d:\bp\bin\text.in'); assign(g,'d:\bp\bin\text.out');
ofstream g("text.out"); reset(f); rewrite(g);
int main() for i:=ord('A') to ord('Z') do v[i]:=0;
{f>>c; while not(eof(f)) do
while(!f.eof()){ begin
if (isalpha(c)) while not(eoln(f)) do
a[toupper(c)-65]++; begin
f>>c; read(f,c);
} if c<>' ' then inc(v[ord(upcase(c))]);
for(int i=0;i<26;i++) end;
if(a[i]) readln(f);
g<<(char)(i+65)<<' '<<a[i]<<endl; end;
return 0; close(f);
} for i:=ord('A') to ord('Z') do
if v[i]<>0 then writeln(g,chr(i),' ',v[i]);
close(g);
end.

21
Problema nr. 34
Se citeşte din fişierul “frecv.in”, de pe prima linie, un număr natural n. De pe următoarea linie se citesc
elementele unui şir de lungime n. Să se scrie un program care să introducă într-o listă simplu înlănţuită
elementele distincte ale şirului împreună cu frecvenţa lor de apariţie şi afişează rezultatul în fişierul
“frecv.out”.
LIMBAJUL PASCAL
program Problema34;
type
ref=^inr;
inr=record
nr:integer;
ap:byte;
adr:ref;
end;
var b,c,d:ref;
LIMBAJUL C++ f,g:text;
#include<fstream.h> x:integer;
ifstream f("frecv.in"); n,i:word;
ofstream g("frecv.out"); procedure creare;
struct nod begin
{int info,fr; new(b);
nod *next;}*p,*u; c:=b;d:=b;c^.nr:=x;c^.ap:=1;c^.adr:=nil;
int n,a; end;
nod* cauta(nod *p,int n){ procedure adaug;
for(nod*c=p;c;c=c->next) var sw:byte;
if(c->info==n) return c; begin
return 0;} if b=nil then creare
void adauga(nod *&p,int n){ else
nod *c; begin
c=new nod; sw:=0;c:=b;
c->info=n; c->fr=1;c->next=p; while c<>nil do
p=c; begin
} if c^.nr=x then begin inc(c^.ap); sw:=1; end;
void listare(nod *p) c:=c^.adr;
{for(nod *c=p;c;c=c->next) end;
g<<c->info<<"->"<<c->fr<<endl; if sw=0 then
} begin
int main(){ new(c);
f>>n; c^.nr:=x; c^.ap:=1; d^.adr:=c; d:=c; d^.adr:=nil;
for(int i=1;i<=n;i++){ end;
f>>a; nod *c=cauta(p,a); end;
if(c) c->fr++; end;
else adauga(p,a); begin
} assign(f,'d:\bp\bin\frecv.in'); assign(g,'d:\bp\bin\frecv.out');
listare(p); reset(f);rewrite(g);
return 0;} readln(f,n);
for i:=1 to n do
begin
read(f,x); adaug;
end;
close(f);
c:=b;
while c<>nil do
begin
writeln(g,c^.nr,' ',c^.ap); c:=c^.adr;
end;
close(g);
end.

22
Problema nr. 35
Se citesc 2 numere naturale n şi m mai mici decât 100 şi apoi elementele a două mulţimi cu câte n,
respectiv m elemente numere naturale distincte. Să se scrie un program în care se realizează reuniunea celor
două mulţimi. Rezultatul se va afişa pe ecran. Ordinea elementelor în mulţime nu este importantă.

LIMBAJUL PASCAL
program Problema35;
type
vector=array[1..200] of word;
var a,b,c:vector;
n,m,k,i:byte;
LIMBAJUL C++ function exista(x:word;q:vector;z:byte):boolean;
#include<iostream.h> var h:byte;
int n,m,p,a[101],b[101],c[101]; begin
void citeste(int x[101],int &k){ exista:=false;
cin>>k; for h:=1 to z do
for(int i=1;i<=k;i++) cin>>x[i]; if x=q[h] then exista:=true;
} end;
int apartine(int x[101],int k,int nr){ begin
for(int i=1;i<=k;i++) write('Introd. dimens. primului vector: '); readln(m);
if(x[i]==nr) return 1; for i:=1 to m do
return 0; begin
} write('a[',i,']='); readln(a[i]);
int main(){ end;
citeste(a,n);citeste(b,m); write('Introd. dimens. celui de-al doilea vector: '); readln(n);
memcpy(c,b,sizeof(b)); for i:=1 to n do
p=m; begin
for(int i=1;i<=n;i++) write('b[',i,']='); readln(b[i]);
if(!apartine(b,m,a[i])) c[+ end;
+p]=a[i]; k:=1; c[k]:=a[1];
for(i=1;i<=p;i++) for i:=2 to m do
cout<<c[i]<<' '; if not exista(a[i],c,k) then
return 0;} begin
inc(k); c[k]:=a[i];
end;
for i:=1 to n do
if not exista(b[i],c,k) then
begin
inc(k); c[k]:=b[i];
end;
writeln('Reuniunea celor doi vectori este:');
for i:=1 to k do write(c[i],' ');
end.

Problema nr. 36
Se consideră fişierul text “sir.in” care conţine numere pe mai multe rânduri, numerele de pe acelaşi rând
fiind despărţite prin câte un singur spaţiu. Să se determine câte numere sunt pe fiecare linie. Rezultatul se va
afişa pe ecran.

23
LIMBAJUL PASCAL
LIMBAJUL C++ program Problema36;
#include<fstream.h> var
#include<ctype.h> f:text;
int n; x:integer;
char c; cont:word;
ifstream f("sir.in"); begin
int main(){ assign(f,'d:\bp\bin\sir.in');reset(f);
f>>n; writeln('Numarul de valori de pe fiecare rand este:');
f.get(c); while not eof(f) do
int nr=0; begin
while(!f.eof()){ cont:=0;
nr++; while not eoln(f) do
if(c=='\n') begin
{cout<<nr<<endl; nr=0;} read(f,x); inc(cont);
f>>n; end;
f.get(c); writeln(cont);
} readln(f);
cout<<nr+1; end;
return 0;} close(f);
end.

Problema nr. 37
Se citesc de la tastatură un număr natural n<=50 şi apoi numele şi vârstele a n persoane. Să se afişeze pe
ecran aceste persoane în ordinea alfabetică a numelor.

LIMBAJUL PASCAL
program Problema37;
uses crt;
type
LIMBAJUL C++ pers=record
#include<iostream.h> nume:string[20];
#include<string.h> varsta:byte;
struct pers{char nume[30]; end;
int varsta;}a[30]; var v:array[1..100] of pers;
int n; n,i,sw:byte;
int main(){ aux:pers;
int i,j,ord; begin
cin>>n; write('Introd. nr de persoane: ');readln(n);
for(i=1;i<=n;i++) for i:=1 to n do
{cin.get(); begin
cin.get(a[i].nume,30); write('Nume: '); readln(v[i].nume);
cin>>a[i].varsta;} write('Varsta: '); readln(v[i].varsta);
do{ ord=1; end;
for(i=1;i<n;i++) repeat
if(strcmp(a[i].nume,a[i+1].nume)>0) sw:=0;
{pers aux=a[i]; a[i]=a[i+1]; for i:=1 to n-1 do
a[i+1]=aux; ord=0;} if v[i].nume>v[i+1].nume then
}while(!ord); begin
for(i=1;i<=n;i++) aux:=v[i]; v[i]:=v[i+1]; v[i+1]:=aux; sw:=1;
cout<<'('<<a[i].nume<<','<<a[i].varsta<<") "; end;
return 0;} until sw=0;
writeln('Lista alfabetica este:');
for i:=1 to n do
writeln(v[i].nume,' ',v[i].varsta);
end.

Problema nr. 38
Se consideră un tablou bidimensional a cu n linii şi n coloane (1 ≤ n ≤ 50) componente întregi. Se cere ca
24
prin operaţii de interschimbare de linii şi coloane să se obţină un tablou cu elementele de pe diagonala
principală ordonate crescător.
LIMBAJUL PASCAL
program Problema38;
var a:array[1..10,1..10] of integer;
n,i,j,sw:byte;
procedure schimblinii(x,y:byte);
var r:byte;
LIMBAJUL C++ aux:integer;
#include <iostream.h> begin
int n,a[5][5]; for r:=1 to n do
void citire() begin
{cout<<”n=”;cin>>n; aux:=a[x,r];a[x,r]:=a[y,r]; a[y,r]:=aux;
for (int i=1;i<=n;i++) end;
for (int j=1;j<=n;j++) end;
{cout<<"a["<<i<<","<<j<<"]=";cin>>a[i] procedure schimbcoloane(x,y:byte);
[j];} var r:byte;
} aux:integer;
void schimba_l(int i,int j) begin
{int k,aux; for r:=1 to n do
for(k=1;k<=n;k++) begin
{aux=a[k][j];a[k][j]=a[k][i];a[k][i]=aux;} aux:=a[r,x];a[r,x]:=a[r,y];a[r,y]:=aux;
} end;
void schimba_c(int i,int j) end;
{int k,aux; begin
for(k=1;k<=n;k++) write('Dimensiunea matricii: ');readln(n);
{aux=a[j][k];a[j][k]=a[i][k];a[i][k]=aux;} for i:=1 to n do
} for j:=1 to n do
void scrie() begin
{for( int i=1;i<=n;i++) write('a[',i,',',j,']=');
{cout<<endl; readln(a[i,j]);
for(int j=1;j<=n;j++) cout<<a[i][j]<<" "; end;
} repeat
} sw:=0;
void main() for i:=1 to n-1 do
{ citire(); if a[i,i]>a[i+1,i+1] then
int ok,i,j,k=1; begin
do{ ok=1; schimblinii(i,i+1);
for(i=1;i<=n-k;i++) schimbcoloane(i,i+1);
if(a[i][i]>a[i+1][i+1]) sw:=1;
{ok=0;schimba_l(i,i+1); end;
schimba_c(i,i+1);} until sw=0;
k++; writeln('Matricea dupa ordonarea DP este:');
}while(!ok); for i:=1 to n do
scrie(); begin
} for j:=1 to n do
write(a[i,j],' ');
writeln;
end;
end.

Problema nr. 39
Se consideră un vector x cu n (1 ≤n ≤50) componente de tip întreg. Pentru k dat (1 ≤k ≤n) să se
ordoneze crescător primele k componente şi descrescător celelalte componente ale lui x. Se va folosi un
subprogram pentru citirea lui x şi un subprogram ce ordonează crescător la alegere o parte din componentele
unui vector (delimitată de doi indici).

25
LIMBAJUL PASCAL
program Problema39;
type vector=array[1..100] of integer;
var i,k:byte;
x:vector;
n:byte;
LIMBAJUL C++ procedure citire(var x:vector;var y:byte);
#include<iostream.h> var i:byte;
int v[100],n,k; begin
void citire() write('Dimens. vectorului: '); readln(y);
{cout<<"n=";cin>>n;cout<<"k=";cin>>k; for i:=1 to y do
for (int i=1;i<=n;i++) begin
{cout<<"v["<<i<<"]=";cin>>v[i];} write('x[',i,']='); readln(x[i]);
} end;
void ordonare_c(int i,int j) end;
{int aux,ok,q=1; procedure sortare(a,b:byte);
do var sw:byte;
{ok=1; aux:integer;
for (int u=i;u<=j-q;u++) begin
if (v[u]>v[u+1]) if a=1 then
{aux=v[u];v[u]=v[u+1];v[u+1]=aux;ok=0;} repeat
q++; sw:=0;
}while (!ok); for i:=a to b-1 do
} if x[i]>x[i+1] then
void ordonare_d(int i,int j) begin
{int aux,ok,q=1; aux:=x[i]; x[i]:=x[i+1]; x[i+1]:=aux; sw:=1;
do end;
{ok=1; until sw=0
for (int u=i;u<=j-q;u++) else
if (v[u]<v[u+1]) repeat
{aux=v[u];v[u]=v[u+1];v[u+1]=aux;ok=0;} sw:=0;
q++; for i:=a to b-1 do
}while (!ok); if x[i]<x[i+1] then
} begin
void main() aux:=x[i]; x[i]:=x[i+1]; x[i+1]:=aux; sw:=1;
{citire(); end;
ordonare_c(1,k); until sw=0
ordonare_d(k+1,n); end;
for(int i=1;i<=n;i++) begin
cout<<v[i]<<" "; n:=0;readln(k);
} citire(x,n);
sortare(1,k);
sortare(k+1,n);
writeln('Dupa sortare, vectorul este:');
for i:=1 to n do
write(x[i],' ');
end.

Problema nr. 40
Se consideră un vector cu n (1 ≤ n ≤ 100) componente numere naturale. Să se determine componentele
vectorului cu cei mai multi divizori. Se va folosi un subprogram pentru citirea vectorului şi unul pentru
calculul numărului de divizori ai unui număr.

26
LIMBAJUL PASCAL

program Problema40;
type vector=array[1..100] of word;
var
i,n:byte;
x:vector;
max,j,t:word;

procedure citire(var x:vector;var y:byte);


var i:byte;
begin
write('Dimens. vectorului: ');
LIMBAJUL C++
readln(y);
#include<iostream.h> for i:=1 to y do
#include<math.h> begin
int v[100],n,dmax; write('x[',i,']=');
void citire() readln(x[i]);
{ cin>>n; end;
for (int i=1;i<=n;i++) end;
{cout<<"v["<<i<<"]=";cin>>v[i];}
}
int nrdiv(int x) function nr(q:word):word;
{int i,nd=0; var a,i:word;
begin
for(i=1;i<sqrt(x);i++)
a:=2;
if (x%i==0) nd=nd+2;
for i:=2 to q div 2 do
return nd;
if q mod i=0 then
}
inc(a);
void main()
nr:=a;
{citire();
end;
dmax=0;
for(int i=1;i<=n;i++)
if (dmax<nrdiv(v[i]))
begin
dmax=nrdiv(v[i]);
clrscr;
for (i=1;i<=n;i++)
n:=0;
if (dmax==nrdiv(v[i]))
citire(x,n);
cout<<v[i]<<" ";
max:=2;
}
for j:=1 to n do
begin
t:=nr(x[j]);
if t>max then
max:=t;
end;
writeln('Componentele cu nr. maxim de divizori sunt: ');
for j:=1 to n do
if max=nr(x[j]) then
writeln(x[j]);
end.

27
PROBLEME PENTRU BAZE DE DATE
MODULUL FOX

Au fost propuse un numǎr de 40 de probleme de baze de date.


Problemele pentru baze de date doresc sǎ evalueze elevii în urmǎtoarele direcţii :

1) Proiectarea unei baze de date relaţionale , plecând de la o problemǎ datǎ şi popularea


corepunzǎtoare;
2) Proiectarea evenimentelor din cerinţe şi rezolvarea lor corectǎ;
3) Organizarea acţiunilor folosind meniuri şi proceduri;
4) Realizarea prelucrǎrilor sistematice ale datelor astfel încât sǎ se obţinǎ unele informaţii
centralizatoare ( ordonare, calcule statistice, grupare,etc.);

Problemele vor fi rezolvate in mod program;fiecare subpunct va fi precedat de un mesaj


care sa explice ce anume urmeaza sa se rezolve.Pentru fiecare problema trebuie creata
tabela(tabelele) si populata(e) cu inregistrari .

Etapele parcurse in rezolvarea problemelor si comenzile utilizate

1. Crearea tabelelor din enunţ;


CREATE nume_tabelă
2. Popularea tabelelor cu date
APPEND
3. Crearea fişierului sursă al programului
MODIFY COMMAND nume_program
4. Scrierea programului
Meniul fiecărui program va fi adaptat numărului de cerinţe.Pentru fiecare cerinţă din enunţ se va scrie
câte o procedură. Apelarea unei proceduri se realizează astfel : DO nume_procedură.

COMENZI UTILIZATE

- Modificarea stucturii unei tabele:


MODIFY STRUCTURE

- Activarea unei tabele:


USE nume_tabelă [ALIAS porecla] [INDEX lista_de indecsi]

- Adaugarea de articole noi cu editare


a) Adaugare la sfirsitul tabelei:
APPEND [BLANK]

Comanda APPEND permite şi editarea inregistrărilor mai vechi existente in tabelă (vizualizarea şi
modificarea acestora).
Daca este prezenta opţiunea BLANK, se va adăuga la sfirşitul tabelei un articol vid, cu câmpurile
iniţializate cu valori implicite.
28
b) Adăugarea de articole intr-o tabelă activă, prin preluarea lor dintr-o altă tabelă se face cu :
APPEND FROM [FIELDS listă_câmpuri ] [FOR condiţie] nume_tabelă

- Ştergerea articolelor dintr-o tabelă


a) Operaţia de ştergere a articolelor dintr-o tabelă se face cu comanda:
DELETE [domeniu] [FOR condiţie] [WHILE condiţie]
Domeniul implicit pentru comanda este articolul curent; comanda nu realizează ştergerea
efectivă a articolelor, ci face doar marcarea articolelor pentru ştergere.

b) Ştergerea efectivă a articolelor marcate se face cu comanda:


PACK

c) Demarcarea articolelor marcate pentru ştergere se face cu comanda:


RECALL [domeniu] [FOR condiţie]

-Afişarea informaţiilor din tabele


. a)LIST [domeniu] [listă_câmpuri] [FOR condiţie]
Domeniul implicit al comenzii este ALL (toată tabela).

b)DISPLAY [domeniu] [listă_câmpuri] [FOR condiţie]


Domeniul implicit este înregistrarea curentă.

-Calcule efectuate cu datele din tabelă


CALCULATE [domeniu] [FOR condiţie] [lista_expresii] [TO listă_variabile]
Expresiile pot să conţină funcţii cum ar fi AVG( ), de calcul a mediei, sau MIN() şi MAX(), dar nu
combinaţii ale lor.

-Modificarea articolelor fără ca acestea să fie vizualizate (fără utilizarea unei comenzi de editare).
REPLACE [domeniu] câmp1 WITH expresie1 [,câmp1 WITH expresie2 [, ...]] [FOR
conditie]
Domeniul implicit de aplicare a comenzii este înregistrarea curentă.

-Indexarea tabelelor
a) indecşi simpli
INDEX ON expresie_cheie TO nume_index [FOR condiţie]
In urma acestei comenzi se creează o structură de ordonare simplă nume_index, care asigură accesul la
articole in ordinea stabilită de cheia de ordonare expresie_cheie.

b) indecşi compuşi
INDEX ON expresie_cheie TAG nume_index [FOR condiţie] [OF nume_fis_cdx]
[ASCENDING|DESCENDING] [FOR condiţie]
In acest caz este creată o structură de ordonare compusă care poate să conţină mai mulţi indecşi
(denumiţi TAG-uri), adică informaţii despre mai multe criterii de ordonare pentru tabela respectivă.
Structura de ordonare compusă este memorată intr-un fişier cu extensia .cdx.
-Comenzi de intrare/ieşire
a)INPUT [expresie_şir_de_caractere] TO var
Comanda INPUT acceptă pentru var şi tipul numeric, când ceea ce s-a tastat reprezintă un număr; in
cazul comenzii INPUT, când se doreşte introducerea unui şir de caractere, acesta trebuie delimitat cu
apostroafe sau ghilimele.
b)? [expresie1 [opţiuni_de_afişare] ] [,expresie2 [opţiuni_de_afişare] . . . . . ]
Comanda ? realizează afişarea pe ecran a valorilor expresiilor expresie1, expresie2. Afişarea este
precedată de trecerea cursorului la un rând nou şi se face conform cu parametrii denumiţi
generic opţiuni_de_afişare.
c)@ lin,col [SAY expresie [opţiuni_de_afişare]] [GET variabila [opţiuni_de_introducere]]
29
Read
Comanda @...SAY/GET permite efectuarea operaţiilor de intare/ieşire într-o anumită poziţie de pe
ecran. Poziţia este specificată prin parametrii lin (linia) si col (coloana).
Parametrul variabila din opţiune GET poate să fie un nume de câmp dintr-o tabelă sau un nume de
variabilă şi poate avea orice tip din cele permise; dacă reprezintă un nume de variabilă, obligatoriu
aceasta trebuie iniţializată cu o valoare inainte de lansarea comenzii @...SAY/GET

-Comanda SELECT
SELECT [DISTINCT] [*, coloana alias], . . . ]FROM tabela WHERE condiţie(ii)
GROUP BY [coloana] HAVING conditie ORDER BY [coloana, expr] [ASC/DESC] INTO
TABLE
[TO SCREEN]
SELECT - selectează cel puţin o coloană
Alias - poate fi folosit pentru coloanele din lista selectată
* - desemneză toate coloanele
DISTINCT - poate fi utilizat pentru eliminarea duplicatelor
FROM Tabela - desemnează tabela din care provin coloanele
WHERE -restricţionează cererea la rândurile care îndeplinesc o condiţie. Poate conţine valori de
coloane, expresii şi literali
AND/OR - poate fi utilizat într-o clauza WHERE pentru a construi condiţii mai complexe. AND are
prioritate peste OR.
( ) - pot fi utilizate pentru a forta prioritatea

GROUP BY- executa functia totalizatoare descrisa in instructiunea SELECT pentru fiecare din
grupurile coloanei care urmeaza clauza GROUP BY.

HAVING- Clauza where nu lucreaza cu functii totalizatoare, deci avem nevoie de clauza HAVING

ORDER BY - întotdeauna apare la sfarşit . Specifică ordinea de sortare. Una sau mai multe coloane pot
fi specificate aici.
ASC -ordinea ascendentă este ordinea de sortare ( implicită) şi nu trebuie specificata.
DESC –ordonare descendentă şi trebuie specificata după un nume de coloană.
INTO TABLE tabela – creaza o tabela in care se regasesc rezultatele interogarii.

OBSERVAŢII:
• Dacă o comandă trece pe linia următoare fiecare linie, mai puţin ultima se va termina cu ;(punct
si virgulă).

• Atenţie : tipul unui camp trebuie să coincidă cu tipul datei introduse de la tastatură şi invers(în
rezolvarea problemelor am folosit tipurile şi dimensiunile indicate in enunţuri!)

• După fiecare listare am pus o comandă Wait wind –asteaptă apăsarea unei taste- pentru a putea
vizualiza rezultatul listării;

• Daca se utilizează SELECT nu este nevoie ca tabela să fie activă,altfel activaţi tabela cu USE
tabelă;

• &&-simbolul pentru comentarii în Visual FoxPro.

30
Problema nr. 1
O şcoală are o bază de date numită Şcoala.dbf cu următoarele tabele:
ELEVI(matricol N(4),clasa C(4),nume C(10),prenume C(10),medie_gen N(5,2))
INFORMAŢII(matricol N(4), localitate C(20),data_n D).
Se cere:
a) Afişaţi elevii cu mediile generale cele mai mari din fiecare clasă.
b) Afişaţi pentru fiecare elev :nume,prenume,localitate şi data_naşterii.
Rezolvare
? ‘Elevii cu mediile generale cele mai mari din fiecare clasa’
select clasa,max(medie_gen),nume from elevi group by clasa into table rez_pct_a
list
? ‘Informatii elevi’
select e.nume,e.prenume,i.localitate,i.data_n from elevi e,informatii i where e.matricol=i.matricol into table rez_pct_b
list

Problema nr. 2
O şcoală are o bază de date numită Şcoala.dbf cu următoarele tabele:
ELEVI(matricol N(4),clasa C(4),nume C(10),prenume C(10),medie_gen N(5,2))
INFORMAŢII(matricol N(4), localitate C(20),data_n D).
Se cere:
a)Mutaţi toţi elevii într-un fişier cu numele ELEVI1(clasă,nume,prenume,localitate,data naşterii). In
fişierul ELEVI1 elevii trebuie să fie ordonaţi după nume şi prenume.
b)Din fişierul ELEVI1 eliminaţi înregistrările care conţin informaţii despre elevii din clasa a XII-a.
Rezolvare
? ‘Continutul fisierului ELEVI1’
select e.clasa, e.nume,e.prenume,i.localitate,i.data_n from elevi e,informatii i where e.matricol=i.matricol order by
nume,prenume into table elevi1
list
? ‘Continutul fisierului ELEVI1 fara elevii din clasa a XII-a’
delete for occurs("XII",upper(clasa))=1
list
pack

Problema nr. 3
O persoană işi ţine evidenţa veniturilor şi cheltuielilor. Ea foloseşte următorul tabel:
EVIDENŢA(data D, chelt_ven L,suma N(6),explicaţii C(20)).
Se cere:
a)Afisaţi veniturile totale precum şi cheltuielile totale ale persoanei.
b)Aflaţi dacă persoana a economisit sau a fost nevoită să împrumute. Care este suma economisită sau
împrumutată?
Rezolvare
@10,10 say ‘Veniturile si cheltuielile persoanei’
select sum(suma) as venit_total from evidenta where chelt_ven=.T. into table venit
list
select sum(suma) as cheltuieli_total from evidenta where chelt_ven=.F. into table chelt
list
close all
use evidenta
calculate sum(suma) for chelt_ven=.F. to total_cheltuieli
calculate sum(suma) for chelt_ven=.T. to total_venituri
if (total_cheltuieli>total_venituri)
? ‘Persoana a imprumutat ‘ ,total_cheltuieli-total_venituri
else
if (total_cheltuieli<total_venituri)
? ‘Persoana a economisit ‘ ,total_venituri- total_cheltuieli
else
31
? ‘Persoana a cheltuit exact cat a castigat ‘
endif
endif
use

Problema nr. 4
O persoană îşi ţine evidenţa veniturilor şi cheltuielilor. Ea foloseşte următorul tabel:
EVIDENŢA(data D, chelt_ven L, suma N(6), explicaţii C(20)).
Se cere:
a)Cât a economisit/cheltuit persoana într-o perioadă [d1,d2],unde d1 si d2 se citesc de la tastatură.
b)Care este luna cu cele mai mari încasări(venituri)? Dar luna cu cele mai mari cheltuieli?
Rezolvare
Input 'Data d1' to d1
Input 'Data d2' to d2
use evidenta
calculate sum(suma) for chelt_ven=.F. and between (data,d1,d2)=.T. to total_cheltuieli
calculate sum(suma) for chelt_ven=.T. and between (data,d1,d2)=.T. to total_venituri
? 'Persoana a cheltuit ' ,total_cheltuieli
? 'Persoana a economisit ' ,total_venituri

select sum(suma) as suma ,cmonth(data) as luna from evidenta group by data into table rezultate
use rezultate
calculate max(suma) to suma_maxima
select suma,luna from rezultate where suma=suma_maxima into table rez1
? 'Luna cu venitul maxim'
list
close all
use rezultate
calculate min(suma) to suma_minima
select suma,luna from rezultate where suma=suma_minima into table rez2
? 'Luna cu venitul minim'
list
close all

Problema nr. 5
O firmă se ocupă cu comercializarea materialelor pentru contrucţii. Materialele sunt stocate în
depozite numerotate de la 1..n. Pentru gestionarea activităţii firmei se utilizează un tabel cu următoarea
structură :
STOCURI(denumire C(13),cantitate N(3),preţ_unitar N(4),depozit N(2),valoare N(12)).
Se cere:
a)Calculaţi valoarea şi introduceţi rezultatul, prin comandă, în câmpul valoare(valoare=cantitate*preţ).
b)Determinaţi valoarea totală pentru un depozit x introdus de la tastatură.
Rezolvare
use stocuri
clear
list
replace all valoare with cant*pret_u
list
input 'Introduceti numarul depozitului' to x
calculate sum(valoare) for depozit=x to val_totala
? 'valoarea totala din depozitul ',x,' este ',val_totala
use

Problema nr. 6
O firmă se ocupă cu comercializarea materialelor pentru contrucţii. Materialele sunt stocate in
depozite numerotate de la 1..n. Pentru gestionarea activităţii firmei se utilizează un tabel cu următoarea
structură :

32
STOCURI(denumire C(13),cantitate N(3),preţ_unitar N(4),depozit N(2),valoare N(12)).
Se cere:
a)Afişaţi depozitele goale (fără nici un material).
b)Care sunt materialele epuizate?
Rezolvare
select sum(valoare) as val_depo ,depozit from stocuri group by depozit into table rezultate
list
? ‘Depozitele fara niciun material ’
list for val_depo=0
select sum(cant) as val_cant ,denumire from stocuri group by denumire into table rezultate
list
? ‘Materialele epuizate ’
list for val_cant=0

Problema nr. 7
O firmă se ocupă cu comercializarea materialelor pentru contrucţii. Materialele sunt stocate in
depozite numerotate de la 1..n. Pentru gestionarea activităţii firmei se utilizează un tabel cu următoarea
structură :
STOCURI(denumire C(13),cantitate N(3),preţ_unitar N(4),depozit N(2),valoare N(12)).
Se cere:
a) Se da un material de la tastatura. Ieftiniţi materialul cu 50% si afişaţi rezultatele.
b) Afişaţi valoarea maximă din fiecare depozit.
Rezolvare
input 'Introduceti numele materialului' to x
use stocuri
? 'Continutul fisierului inainte de ieftinire'
list
replace all pret_u with pret_u-pret_u*0.5,valoare with cant*pret_u for denumire=x
? 'Materialul ieftinit '
list
select max(valoare) as val_max ,depozit from stocuri group by depozit into table rezultate
? 'Valoarea maxima din fiecare depozit '
list
use

Problema nr. 8
O firmă se ocupă cu comercializarea materialelor pentru contrucţii. Materialele sunt stocate in
depozite numerotate de la 1..n. Pentru gestionarea activităţii firmei se utilizează un tabel cu următoarea
structură :
STOCURI(denumire C(13),cantitate N(3),preţ_unitar N(4),depozit N(2),valoare N(12)).
Se cere:
a) Ştergeţi din toate depozitele un material cu denumirea x (x introdus de la tastatura).
b)Scumpiţi materialul y cu 50% (y introdus de la tastatură).

Rezolvare
close all
use stocuri
input 'Introduceti numele materialului' to x
delete for denumire=x
list
pack
? 'Stocurile dupa stergerea materialului ',x
list
input 'Introduceti numele materialului' to y
replace all pret_u with pret_u+pret_u*0.5,valoare with cant*pret_u for denumire=y
? 'Materialul ' ,y, ' scumpit '
list
use
33
Problema nr. 9
O bază de date conţine 2 tabele:
PERSOANE(cod_pers N(3),nume C(15),prenume C(15),localitate C(15)).
AUTOMOBILE (număr C(9),marca C(15),cod_persoana N(3)).
Observaţie:numărul maşinii poate fi de forma BR-10-XXY.
Se cere:
a)Afişaţi numele,prenumele,numărul şi marca maşinii tuturor persoanelor.
b)Afişaţi persoanele care au automobile ’SKODA’ înmatriculate în Bucureşti.
Rezolvare
SELECT p.nume,p.prenume,a.numar,a.marca from persoane p,automobile a where p.cod_pers=a.cod_pers into table
rezultat
? ‘Afisare rezultate pct-ul a’
list
SELECT p.nume,p.prenume,a.numar,a.marca from persoane p,automobile a where p.cod_pers=a.cod_pers and
substr(numar,1,2)="B-" and upper(marca)="SKODA" into table rezultat
? ‘Afisare rezultate pct-ul b’
list

Problema nr. 10
O bază de date conţine 2 tabele:
PERSOANE(cod_pers N(3),nume C(15),prenume C(15),localitate C(15)).
AUTOMOBILE (număr C(9),marca C(15),cod_persoana N(3)).
Observaţie:numărul maşinii poate fi de forma BR-10-XXY.
Se cere:
a)Pentru o marcă introdusă de la tastatură afişaţi câte persoane deţin automobilul cu marca respectivă.
b)Care este marca de automobil cu cele mai multe automobile, dar cea cu cele mai puţine automobile?
Rezolvare
input "Introduceti marca automobilului " to m
SELECT count(p.nume) as nr_pers,a.marca from persoane p,automobile a where p.cod_pers=a.cod_pers and a.marca=m
group by marca into table rezultate
? ‘Numarul de persoane care detin automobil marca ‘,m
list
SELECT count(cod_pers) as nr_auto,marca from automobile group by marca into table rezultate
list
calculate max(nr_auto) to maxim
? ‘marca de automobil cu cele mai multe automobile ‘
list nr_auto,marca for nr_auto=maxim
calculate min(nr_auto) to minim
? ‘marca de automobil cu cele mai putine automobile ‘
list nr_auto,marca for nr_auto=minim

Problema nr. 11
În baza de date a unei şcoli se găsesc următoarele tabele:
PROFESORI(clasa C(4),p_mate C(10),p_info C(10),p_română C(10),p_chimie C(10))
ELEVI (clasa C(4),nume_elev C(15),med_mate N(5,2),med_romana N(5,2), med_infoN(5,2),
med_chimie N(5,2)).
Se cere:
a)Care este numele profesorului de română al elevului x.(x citit de la tastatură).
b)Câţi promovaţi are fiecare profesor de informatică?
Rezolvare
close all
input "Introduceti numele elevului" to x
select e.clasa,e.nume_elev,p.p_rom from elevi e,profesori p where e.nume_elev=x and p.clasa=e.clasa into table rezultat
? 'Profesorul de romana al elevului ',x, ' este: '

34
list
select count(e.nume_elev),p.p_info from elevi e,profesori p where e.med_info>4 and p.clasa=e.clasa group by p.p_info into
table rezultat
? 'Numarul de promovati pentru fiecare profesor de info '
List

Problema nr. 12
În baza de date a unei şcoli se găsesc următoarele tabele:
PROFESORI(clasa C(4),p_mate C(10),p_info C(10),p_română C(10),p_chimie C(10))
ELEVI (clasa C(4),nume_elev C(15),med_mate N(5,2),med_romana N(5,2), med_infoN(5,2),
med_chimie N(5,2)).
Se cere:
a)Care este media rezultatelor obţinute de profesorii de informatică la toate clasele?
b)Care este clasa cu cei mai mulţi promovaţi la chimie?
Rezolvare
? 'Media rezultatelor obtinute de prof. de info la toate clasele'
select avg(e.med_info),p.p_info from elevi11 e,profesori p where p.clasa=e.clasa group by p.p_info into table rezultat
list
? 'Clasa cu cu cei mai multi promovati la chimie'
select count(nume_elev),clasa from elevi11 where med_chimie>4 group by clasa into table rezultat
list

Problema nr. 13
În baza de date a unei şcoli se găsesc următoarele tabele:
PROFESORI(clasa C(4),p_mate C(10),p_info C(10),p_română C(10),p_chimie C(10))
ELEVI (clasa C(4),nume_elev C(15),med_mate N(5,2),med_romana N(5,2), med_infoN(5,2),
med_chimie N(5,2)).
Se cere:
a)Afişaţi elevii care au la chimie profesorul x(x dat de la tastatură).
b)Câţi corigenţi are fiecare profesor de matematică?
Rezolvare
input "Introduceti numele profesorului de chimie" to x
select e.clasa,e.nume_elev,p.p_chi from elevi11 e,profesori p where p.p_chi=x and p.clasa=e.clasa into table rezultat
? 'Elevii care studiaza chimia cu ',x
list
select count(e.nume_elev),p.p_mate from elevi11 e,profesori p where e.med_mate<5 and p.clasa=e.clasa group by p.p_mate
into table rezultat
? 'Numarul de corigenti ai fiecarui professor de mate'
list

Problema nr. 14
O bibliotecă ţine evidenţa activităţii zilnice în baza de date BIBLIOTECA.Baza de date conţine
următoarele tabele:
CARŢI(cod_carte N(4),titlu C(10),autor C(10),editura C(10))
NR_CARŢI(cod_carte N(4),nr exemplare N(2))
CITITORI(CNP N(13),nume C(10),localitate C(10),nr_telefon C(10)
ÎMPRUMUT(cod_carte N(4),CNP N(13),data_împrumut D).
Se cere:
a)Introduceţi o valoare X de la tastatură,pentru cod_carte si determinaţi câte exemplare cu codul x sunt
împrumutate.
b)Afişaţi pentru fiecare carte imprumutată codul, titlul, autorul şi editura.
Rezolvare
input 'Introduceti codul cartii!' to x
? 'Din cartea cu codul ',x,' sunt imprumutate'

35
select count(cod_carte) from imprumut where cod_carte=x into table rez
list
? 'Informatii despre cartile imprumutate'
select c.cod_carte,c.titlu,c.autor,c.editura from carti c,imprumut i where c.cod_carte=i.cod_carte into table rezultat
list

Problema nr. 15
O bibliotecă ţine evidenţa activităţii zilnice în baza de date BIBLIOTECA.Baza de date conţine
următoarele tabele:
CARŢI(cod_carte N(4),titlu C(10),autor C(10),editura C(10))
NR_CARŢI(cod_carte N(4),nr exemplare N(2))
CITITORI(CNP N(13),nume C(10),localitate C(10),nr_telefon C(10)
ÎMPRUMUT(cod_carte N(4),CNP N(13),data_împrumut D).
Se cere:
a)Introduceţi de la tastatură o valoare pentru titlu şi verificaţi dacă există exemplare disponibile pentru
titlul respectiv.
b)Afişaţi adresa(localitatea) cititorilor care au împrumutat cărţi într-o anumită dată x( x se citeşte de la
tastatură).
Rezolvare
input 'Introduceti titlul cartii cautate!' to x
? 'Din cartea cu titlul ',x, 'in biblioteca exista urmatorul nr. de exemplare'
select c.titlu,c.autor,c.editura,n.nr_exem from carti c,nr_carti n where c.cod_carte=n.cod_carte and c.titlu=x into table
rezultat
list
input 'Introduceti data imprumutului!' to x
? 'adresa cititorilor care au imprumutat carti pe data de ',x
select c.localitate,i.data_impr from cititori c,imprumut i where c.cnp=i.cnp and i.data_impr=x into table rezultat
list

Problema nr. 16
O bibliotecă ţine evidenţa activităţii zilnice în baza de date BIBLIOTECA.Baza de date conţine
următoarele tabele:
CARŢI(cod_carte N(4),titlu C(10),autor C(10),editura C(10))
NR_CARŢI(cod_carte N(4),nr exemplare N(2))
CITITORI(CNP N(13),nume C(10),localitate C(10),nr_telefon C(10))
ÎMPRUMUT(cod_carte N(4),CNP N(13),data_împrumut D).
Se cere:
a)Care este titlul cu cele mai multe exemplare?
b)Care este cartea cea mai puţin solicitată?
Rezolvare
? 'titlul cu cele mai multe exemplare'
select c.titlu,n.nr_exem from carti c,nr_carti n where c.cod_carte=n.cod_carte and n.nr_exem= (select max(n.nr_exem) from
nr_carti n) into table rezultat
list
? 'Cartea cu cele mai putine exemplare imprumutate'
select count(i.cod_carte) as nr_imprum,i.cod_carte from imprumut i group by i.cod_carte into table nr_imprumuturi
calculate min(nr_imprum) to impr_min
select c.titlu,c.autor,n.nr_imprum from nr_imprumuturi n,carti c where c.cod_carte=n.cod_carte and
n.nr_imprum=impr_min into table rezultat
list

Problema nr. 17
O bibliotecă ţine evidenţa activităţii zilnice în baza de date BIBLIOTECA.Baza de date conţine
următoarele tabele:
CARŢI(cod_carte N(4),titlu C(10),autor C(10),editura C(10))
NR_CARŢI(cod_carte N(4),nr exemplare N(2))
36
CITITORI(CNP N(13),nume C(10),localitate C(10),nr_telefon C(10))
ÎMPRUMUT(cod_carte N(4),CNP N(13),data_împrumut D).
Se cere:
a)Afişaţi cititorii in ordine alfabetică.
b)Care sunt cititorii care nu au mai împrumutat cărţi de 6 luni?
Rezolvare
? 'cititorii in ordine alfabetica'
use cititori
index on nume to ialfabetic
list
? 'cititorii care nu au mai imprumutat carti de 6 luni'
select c.nume,i.data_impr from cititori c,imprumut i where c.cnp=i.cnp and date()-i.data_impr>=180 into table rezultat
list

Problema nr. 18
O bibliotecă ţine evidenţa activităţii zilnice în baza de date BIBLIOTECA. Baza de date conţine
următoarele tabele:
CARŢI(cod_carte N(4),titlu C(10),autor C(10),editura C(10))
NR_CARŢI(cod_carte N(4),nr exemplare N(2))
CITITORI(CNP N(13),nume C(10),localitate C(10),nr_telefon C(10))
ÎMPRUMUT(cod_carte N(4),CNP N(13),data_împrumut D).
Se cere:
a) Afişaţi cititorii care au împrumutat o carte de mai mult de 3 săptămâni.
b)Câte exemplare sunt împrumutate din fiecare carte.
Rezolvare
? ‘cititorii care au imprumutat o carte de mai mult de 3 saptamani’
select c.nume,i.data_impr from cititori c,imprumut i where c.cnp=i.cnp and date()-i.data_impr>21 into table rezultat
list
? ‘Numarul de exemplare imprumutate din fiecare carte’
select count(i.cod_carte) as nr_carti,i.cod_carte from imprumut i group by i.cod_carte into table rezultat
list

Problema nr. 19
Evidenţa elevilor dintr-un liceu este ţinută cu ajutorul bazei de date ŞCOALA. Trei dintre
tabelele acestei baze de date sunt:
ELEVI (clasa C(4),nume_elev C(10),id_elev N(3), absenţe nemotivate N(4), nr_corigenţeN(2),
este_repetent L);
MEDII (id_elev N(3),cod_disciplină N(2),medie_sem1 N(5,2),med_sem2 N(5,2), med_gen N(5,2))
DISCIPLINE(cod_disciplină N(2),disciplinăC(10))
Se cere:
a)Calculaţi si populaţi în mod automat câmpul med_gen din tabela MEDII.
Care sunt disciplinele la care media generală este mai mică decât 6?
b)Creaţi fişierul RAPORT.DBF în care să existe următoarele informaţii:id_elev,disciplina,media
generala.Pentru o disciplină x ştergeţi toate înregistrările din fişierul creat.Afişaţi conţinutul fişierului
RAPORT.DBF
Rezolvare
use medii
replace all for (medie_sem1>4 and medie_sem2>4) medie_gen with (medie_sem1+medie_sem2)/2
? 'Fisierul MEDII completat cu date'
list

? 'disciplinele la care media generala este mai mica decat 6'


select distinct d.disciplina,m.medie_gen from discipline d,medii m where d.cod_disc=m.cod_disc and m.medie_gen<7 and
m.medie_gen<>0 into table rezultat
37
list
select m.id_elev,d.disciplina,m.medie_gen from discipline d,medii m where d.cod_disc=m.cod_disc into table raport
? 'Continutul fisierului RAPORT'
list
input 'Introduceti disciplina' to x
delete for disciplina=x
pack
? 'Continutul fisierului RAPORT dupa stergerea inregistrarilor aferente disciplinei ' ,x
List

Problema nr. 20
Evidenţa elevilor dintr-un liceu este ţinută cu ajutorul bazei de date ŞCOALA. Trei dintre
tabelele acestei baze de date sunt:
ELEVI (clasa C(4),nume_elev C(10),id_elev N(3), absenţe nemotivate N(4), nr_corigenţeN(2),
este_repetent L);
MEDII (id_elev N(3),cod_disciplină N(2),medie_sem1 N(5,2),med_sem2 N(5,2), med_gen N(5,2))
DISCIPLINE(cod_disciplină N(2),disciplinăC(10))
Se cere:
a) Creaţi fişierul INFORMAŢII.DBF în care să se afle date despre elevi (clasa, numele,numele
disciplinei şi media generală la disciplina respectivă)
b)Completaţi in mod automat pentru toţi elevii câmpul este_repetent (in funcţie de numărul de
corigenţe). Afişaţi pe ecran elevii repetenţi.
Rezolvare
close all
? 'Continutul fisierului INFORMATII'
select e.nume_elev,e.clasa,d.disciplina,m.medie_gen from discipline d,medii m,elevi19 e where d.cod_disc=m.cod_disc
and e.id_elev=m.id_elev into table informatii
list
close all
use elevi
replace all for nr_corig<3 este_repet with .F.
replace all for nr_corig>=3 este_repet with .T.
? 'Situatia privind elevii repetenti'
List

Problema nr. 21
Să se creeze o tabelă numită elevi.dbf cu următoarea structură:
NUME C(20) PRENUME C(20) MEDIESCRIS N(5,2) MEDIEORAL N(5,2) MEDIE N (5,2)
PROMOVAT C(2)
Să se introducă minimum 5 înregistrări.
Să se scrie apoi un program pentru realizarea următoarelor cerinţe:
a) Calculati valoarea mediei si actualizati in baza de date campul MEDIE si campul PROMOVAT.
b)Afisati o lista avand campurile :nume, prenume, medie, promovat in ordinea descrescătoare a
mediilor.

Rezolvare
use elevi
replace all medie with (mediescris+medieoral)/2
replace all promovat with "da" for medie>=5
replace all promovat with "nu" for medie<5

SORT TO ord ON medie /D


USE ord
DISPLAY ALL FIELDS nume,prenume,medie,promovat

38
Problema nr. 22
Să se creeze o tabelă numită elevi.dbf cu următoarea structură:
NUME C(20) PRENUME C(20) MEDIESCRIS N(5,2) MEDIEORAL N(5,2),CLASA C(3) MEDIE
N (5,2) PROMOVAT C(2)
Să se introducă minimum 5 înregistrări.
Să se scrie apoi un program pentru realizarea următoarelor cerinţe:
a) Să se creeze o noua baza de date promovat.dbf preluând din baza de date elevi.dbf
numai câmpurile: nume, prenume, clasa, medie şi baza de date nepromovat.dbf (daca o medie<5)
preluand campurile NUME,PRENUME,CLASA şi adăugând un nou camp NRCORIG N(1).
b) Să se afişeze cele doua baze de date nou create, cu toate câmpurile acestora.

Rezolvare
USE elevi.dbf
COPY TO promovat FIELDS nume,prenume,clasa,medie FOR medie>=5
USE elevi.dbf
COUNT TO a FOR medie<5
DECLARE matrice (4)[a,4]))
COPY TO ARRAY matrice FIELDS nume,prenume,clasa FOR medie<5
CREATE TABLE nepromovat (nume c(15),prenume c(20),clasa c(5),nrcorig n(1))
USE nepromovat
APPEND FROM ARRAY matrice
?'Cei promovati sunt:'
?
USE promovat
DISPLAY ALL
?'Cei nepromovati sunt:'
?
USE nepromovat
DISPLAY ALL

Problema nr. 23
Să se creeze o tabelă numită alocatii.dbf cu următoarea structură:
NUME C(20) PRENUME C(20) DN D (LL/ZZ/AA) SEX C(1)
Să se introducă minimum 5 înregistrări.
Să se scrie apoi un program pentru realizarea următoarelor cerinţe:
a) Să se creeze o nouă bază de date au.dbf având câmpurile: NUME, PRENUME, DN, SEX care să
conţină numai elevii care nu au îimplinit 18 ani până la data de 15 septembrie 2008.
b) Să se afişeze alfabetic baza de date nou creată.

Rezolvare
use alocatii
COPY STRUCTURE TO au.dbf FIELDS nume,prenume,dn,sex
COUNT TO a FOR dtos(dn)>dtos({09/15/90})
DECLARE matrice[a,5]
COPY TO ARRAY matrice FIELDS nume,prenume,dn,sex ;
FOR dtos(dn)<dtos({09/15/90})

USE au
APPEND FROM ARRAY matrice
LIST

SORT TO aloc ON nume,prenume ASCENDING


USE aloc
LIST

Problema nr. 24
Să se creeze o tabelă numită alocatii.dbf cu următoarea structură:
NUME C(20) PRENUME C(20) DN D (LL/ZZ/AA) SEX C(1)
39
Să se introducă minimum 5 înregistrări.
Să se scrie apoi un program pentru realizarea următoarelor cerinţe:
a) Să se creeze o nouă bază de date fete.dbf preluând din baza de date alocatii.dbf
câmpurile NUME , PRENUME şi adăugând câmpul INALTIME şi o bază de date baieti.dbf preluând
din baza de date alocatii.dbf câmpurile NUME ,PRENUME şi adăugând câmpul GREUTATE . Să se
completeze apoi minimum cinci înregistrari doar pentru noile câmpuri.
b) Să se afişeze cele două baze de date nou create, cu toate câmpurile acestora.

Rezolvare
USE alocatii.dbf
COUNT TO x FOR sex='F'
DECLARE matrice[x,3]
COPY TO ARRAY matrice FIELDS nume,prenume FOR sex='F'
CREATE TABLE fete.dbf (nume c(15),prenume c(20),inaltime n(2))
USE fete.dbf
APPEND FROM ARRAY matrice
?'BAZA FETELOR'
DISPLAY ALL
WAIT
* COMPLETAREA A FIX 5 INREGISTRARI DOAR PENTRU INALTIME

SCAN ALL FOR recno()<=5


clear
@ 12,12 SAY 'Inregistrarea '+str(RECNO(),5)
@ 14,12 SAY 'Dati inaltimea :' get inaltime PICTURE '99'
READ
ENDSCAN

DISPLAY ALL
Analog pt baieti
?'Fete:'
?
USE fete
DISPLAY ALL
?'Baieti:'
?
USE baieti
DISPLAY ALL

Problema nr. 25
Să se creeze o tabelă numită alocatii.dbf cu următoarea structură:
NUME C(20) PRENUME C(20) DN D (LL/ZZ/AA) SEX C(1) , VARSTA N(2)
Să se introducă minimum 5 înregistrări.
Să se scrie apoi un program pentru realizarea următoarelor cerinţe:
a)Să se calculeze vârsta fiecarui elev.
b)Să se afişeze descrescator în ordinea vârstei baza de date nou creată.

Rezolvare
replace all varsta with 2009-year(dn)
SORT TO aloc ON nume,prenume,varsta DESCENDING
USE aloc
LIST

Problema nr. 26
Să se creeze o tabelă numită elevi.dbf cu următoarea structură:
NUME C(20) PRENUME C(20) MEDIESCRIS N(5,2) MEDIEORAL N(5,2) MEDIE N (5,2)
PROMOVAT C(2)
a) Să se şteargă elevii corigenţi (minimum o medie <5)
40
b) Să se afişeze elevii rămaşi în baza de date iniţială ,sortaţi descrescător după medie , având doar
câmpurile NUME,PRENUME ,MEDIE.

Rezolvare
SET TALK OFF
USE atestat
DELETE ALL FOR (mediescris<5).or.(medieoral<5).or.(medie<5)
LIST
SET DELETED ON
SORT TO ramasi ON medie /d FIELDS nume,prenume,medie
USE ramasi
LIST
SET DELETED OFF

Problema nr. 27
Să se creeze o tabelă numită elevi.dbf cu următoarea structură:
NUME C(20) PRENUME C(20) MEDIESCRIS N(5,2) MEDIEORAL N(5,2),CLASA C(3) MEDIE
N (5,2)
Să se introducă minimum 5 înregistrări.
Să se scrie apoi un program pentru realizarea următoarelor cerinţe:
a) Să se facă calculul mediei generale pe clase apoi să se calculeze şi să se afişeze clasa.
b) Să se afişeze pentru clasa 12A numărul de elevi care au media generala <media clasei.

Rezolvare
12A si media acesteia .
USE elevi
AVERAGE medie TO x1
?x1
AVERAGE medie TO x2 for clasa='12a'
?'media clasei 12a', x2
?'Clasa 12A'
COUNT TO y FOR (medie<x2)and(clasa='12A')
?y

Problema nr. 28
Să se creeze o tabelă numită elevi.dbf cu următoarea structură:
NUME C(20) PRENUME C(20) MEDIESCRIS N(5,2) MEDIEORAL N(5,2),CLASA C(3) MEDIE
N (5,2)
Să se introducă minimum 5 înregistrări.
Să se scrie apoi un program pentru realizarea următoarelor cerinţe:
a)Să se calculeze media maximă a clasei 12A şi să se afişeze numele, prenumele şi media elevului
respectiv
b)Să se sorteze descrescător mediile elevilor clasei 12A

Rezolvare
close all
calculate max(medie) to x for clasa='12a'
list nume, prenume, medie for medie=x
SORT TO elevi12A ON medie /d FIELDS nume,prenume,medie
USE elevi12A

Problema nr. 29
Să se creeze tabela telefon.dbf cu următoarea structură: NUME, PRENUME, TELEFON,
ADRESĂ, VALOARE, ACHITAT.
Să se introducă minimum 5 înregistrări.
Să se scrie apoi un program pentru realizarea următoarelor cerinţe:
41
a) Să se citească de la tastatură un nume şi să se verifice dacă a achitat sau nu telefonul şi în ultimul
caz să se afişeze valoarea restantă;
b) Să se afişeze numărul total al restanţierilor.
Rezolvare
@ 4,2 say 'numele' get n
Read
List valoare for nume=n and achitat=’da’
COUNT FOR achitat=’nu’ TO x
?’numarul de restantieri’, x

Problema nr. 30
Să se creeze tabela telefon.dbf cu următoarea structură: NUME, PRENUME, TELEFON, ADRESĂ,
VALOARE, ACHITAT.
Să se introducă minimum 5 înregistrări.
Să se scrie apoi un program pentru realizarea următoarelor cerinţe:
a) Să se afişeze restanţierii la achitarea telefonului având doar câmpurile: NUME, PRENUME,
VALOARE;
b) Să se afişeze suma totală pentru toţi restanţierii.
Rezolvare
list nume, prenume,valoare for achitat=’nu’
SUM valoare FOR achitat=’nu’ to x
?’suma totala restanta’, x

Problema nr. 31
Se considera baza de date BIBLIO.DBF cu urmatoarea structura:
Nr_legitim: N,3- numărul de legiţimatie al cititorului
Nume: C,20- numele cititorului
Nr._inv. : N,3- numărul de inventar al cărţii împrumutate
Data_imprum: D- data împrumutului cărţii
Titlu: C,15- titlul cărţii
Autor : C,15- autorul cărţii
Editura : C,15- editura cărţii
Pret: N,10- preţul cărţii
An_aparitie: D - anul apariţiei cărţii
a) Să se afişeze cititorul care a împrumutat cartea cu numărul de inventar X sau dacă nu este
împrumutată, să se afişeze un mesaj corespunzător.
b) Afişaţi anul cu cele mai multe apariţii de carte.

Rezolvare
Input 'nr inventar=' to x
Go top
Locate for nr_inv=x
?Iif(found()=.t.,nume,"cartea nu e imprumutata")
Sort to fis on an_apariti
Use fis
Total to fis1 on an_apariti
Use fis1
Calculate max(cod) to a
Browse fields an_apariti for cod=a

42
Problema nr. 32
Se consideră baza de date BIBLIO.DBF cu urmatoarea structură:
Nr_legitim: N,3- numărul de legiţimatie al cititorului
Nume: C,20- numele cititorului
Nr._inv. : N,3- numărul de inventar al cărţii împrumutate
Data_imprum: D- data împrumutului cărţii
Titlu: C,15- titlul cărţii
Autor : C,15- autorul cărţii
Editura : C,15- editura cărţii
Pret: N,10- preţul cărţii
An_aparitie: D - anul apariţiei cărţii

a) Cititorul cu numele Z dă un telefon la secretariatul bibliotecii pentru că nu-şi mai aminteşte


exact ce cărţi are de adus. Ajutaţi bibliotecara să-i dea un răspuns rapid. Afişaţi şi data la care ar
trebui să restituie cărţile.
b) Să se mărească cu 200% preţul pentru cărţile apărute înainte de 1990
c) Să se marcheze pentru ştergere cărţile autorului X.
Rezolvare
USE biblio
accept "z=" to a
LIST titlu for nume=a
LIST data_impru+365 for nume=a
REPLACE ALL pret WITH 3*pret FOR an_apariti<1990
accept "x=" to b
DELETE ALL FOR autor=b

Problema nr. 33
O bazăde date BOLNAV.DBF are structura:
Numar fişa (N3) ,Nume (C15) ,Vârsta (N2), Grupa sanguina(C4), Diagnostic(C15)
Se cere:
a) Să se determine cea mai frecventă grupă sanguină.
b) Să se listeze (în ordinea alfabetică a numelor) numele, numai cu majuscule şi numerele de fişă
ale bolnavilor care sunt singurii bolnavi de boala pe care o au.

Rezolvare
SET dire to d:\lucru\12a
USE bolnav
SORT TO fis ON grupa
USE fis
TOTAL TO fis1 ON grupa
USE fis1
BROWSE
CALCULATE MAX(cod) TO a
BROWSE FIELDS grupa FOR cod=a
USE bolnav
SORT TO fis ON diagnostic
USE fis
TOTAL TO fis1 ON diagnostic
USE fis1
SORT TO fis2 ON nume
USE fis2
BROWSE FOR cod=1

Problema nr. 34
O baza de date BOLNAV.DBF are structura:
Numar fişa (N3), Nume (C15), Vârsta (N2), Grupa sanguina(C4), Diagnostic(C15)

43
Se cere:
a) Să se listeze (în ordinea alfabetică a numelor) numele şi numerele de fişă ale bolnavilor de
preinfarct .
b) Să se determine numărul de bolnavi de artrită care au grupa sanguina AB4.
c) La ce grupă sanguină e mai frecventă anemia?

Rezolvare
SORT TO x.dbf ON nume FOR diagnostic='preinfarct'
USE x
BROWSE
USE bolnav
BROWSE
CALCULATE CNT() FOR diagnostic='artrita' AND grupa='AB4'
SORT TO fis ON grupa
USE fis
TOTAL TO fis1 ON grupa FOR diagnostic='anemie'
USE fis1
CALCULATE MAX(cod) TO a
BROWSE FIELDS grupa FOR cod=a

Problema nr. 35
Să se creeze tabela capacitate.dbf
nume_prenume (C20), prenume_tata (C10), data_n (D), proba1 (N5,2), proba2 (N5,2),
proba3 (N5,2), media (N5,2), admis (L)
Completaţi câmpul admis cu TRUE (.T.) dacă elevii au toate cele 3 note peste 5 şi cu FALSE (.F.)
altfel. Completaţi câmpul media cu media aritmetică a celor trei note, numai dacă elevii au fost admişi.

a) Se votează o ordonanţă de urgenţă prin care se hotărăşte ca toţi candidaţii care nu au obţinut
note de trecere şi care sunt născuţi la data examenului (cu 2 zile înainte de data afişării
rezultatelor, considerată dată curentă) să fie declaraţi admişi cu media 5.
b) Elevul X reclamă că numele său a fost scris greşit. Corectaţi în tabelă folosind comenzi FoxPro
(numele gresit si cel corect vor fi citite de la tastatura).
c) Afişaţi cu majuscule numele complet al candidaţilor (NUME I. PRENUME – I. reprezentând
iniţiala tatălui) şi mediile obţinute de aceştia.
Rezolvare
REPLACE ALL admis with.T. FOR proba1>5 AND proba2>5 AND proba3>5
REPLACE ALL admis with.F. FOR proba1<5 or proba2<5 or proba3<5
REPLACE ALL media WITH (proba1+proba2+proba3)/3 FOR admis=.T.
REPLACE ALL media WITH 5, admis WITH .T. FOR admis=.F. AND DAY(data_n)=DAY(DATE()-2) AND
MONTH(data_n)=MONTH(DATE())
accept "nume" to a
accept"nume gresit" to b
GO top
LOCATE FOR nume_pren=b
REPLACE nume_pren WITH a
LIST UPPER(LEFT(nume_pren,AT(' ',nume_pren)-1))+' '+ UPPER(LEFT(pren_tata,1))+'.'+'
'+UPPER(SUBSTR(nume_pren,AT(' ',nume_pren)+1)), media

Problema nr. 36
Să se creeze tabela capacitate.dbf , cu următoarea structură:
nume_prenume (C20), prenume_tata (C10), data_n (D), proba1 (N5,2)
proba2 (N5,2), proba3 (N5,2), media (N5,2), admis (L)
Completaţi câmpul admis cu TRUE (.T.) dacă elevii au toate cele 3 note peste 5 şi cu FALSE (.F.)
altfel. Completaţi câmpul media cu media aritmetică a celor trei note, numai dacă elevii au fost admişi.

44
a) Câţi elevi au numele de familie mai lung de 7 caractere?
b) Creaţi o tabelă admisi.dbf care conţine elevii admişi în ordinea descrescătoare a mediilor şi o
tabelă respinsi.dbf care conţine respinşii alfabetic.
c) Care este procentul admişilor? Care este media generală obţinută la examen (numai pentru
elevii care au reuşit)?

Rezolvare
LIST all for LEN(LEFT(nume_pren,AT(' ',nume_pren)-1))>7
SORT TO admisi.dbf ON Media/d,nume_pren/A FOR Admis=.T.
USE admisi.dbf
BROWSE
SORT TO respinsi.dbf ON nume_pren/A FOR Admis=.F.
USE respinsi.dbf
BROWSE
CALCULATE CNT() TO a
USE D:\Lucru\admisi.dbf
CALCULATE CNT() TO b
CALCULATE avg(media)

Problema nr. 37
Să se creeze tabela capacitate.dbf , cu următoarea structură:
nume_prenume (C20), prenume_tata (C10), data_n (D), proba1 (N5,2)
proba2 (N5,2), proba3 (N5,2), media (N5,2), admis (L)
Completaţi câmpul admis cu TRUE (.T.) dacă elevii au toate cele 3 note peste 5 şi cu FALSE (.F.)
altfel. Completaţi câmpul media cu media aritmetică a celor trei note, numai dacă elevii au fost admişi.
a) Facilitaţi accesul la tabelă atât în ordinea alfabetică a numelor cât şi în ordinea
descrescătoare a mediilor.
b) Câţi dintre candidaţi sunt născuţi în luna noiembrie?
c) Creaţi o tabelă neadmis.dbf care conţine elevii respinşi care au luat o notă peste 8.
Rezolvare
REPLACE ALL admis WITH .T. FOR proba1>=5 AND proba2>=5 AND proba3>=5
REPLACE ALL media WITH (proba1+proba2+proba3)/3 FOR admis=.T.
SORT TO fis ON nume_pren /A
USE fis
BROWSE
USE capacitate
BROWSE
SORT TO fis1 ON media /d
USE fis1
BROWSE
USE capacitate
CALCULATE CNT() FOR MONTH(data_n)=11
COPY TO neadmisi.dbf FOR admis=.F. AND (proba1>=8 OR proba2>=8 OR proba3>=8)
USE neadmisi
BROWSE

Problema nr. 38
Fie tabela elevi.dbf, cu următoarea structură :
Clasa ( C(3) ) - Clasa elevului; ex: ‘09A’, ‘12C’,…
Nume (C(15) - Nume elev
Nota1 (N(2)) – Nota 1
Nota2 (N(2)) – Nota 2

Se cere:
a) Să se afişeze numele, nota1, nota2, medie=(nota1+nota2)/2 pentru fiecare elev
b) Să se calculeze şi să se afişeze media fiecărei clase pentru câmpurile nota1, nota2, medie

45
Rezolvare
use elevi
wait "a) Afisati nume,nota1,nota2,media:"
list nume,nota1,nota2,(nota1+nota2)/2
select nume,nota1,nota2,(nota1+nota2)/2 as media from elevi
wait "b) Sa se calculeze media fiecarei clase:"
select clasa,avg(nota1),avg(nota2),avg((nota1+nota2)/2);
from elevi group by clasa

Problema nr. 39
Consideram tabela candidat.dbf, cu următoarea structura:
Nume ( C(15) - Nume candidat
Notar (N(5,2))- Nota la limba română
Notam (N(5,2)) – Nota la matematică
Clasa ( C(3) ) - Clasa elevului; ex: ‘09A’, ‘12C’,…
Se cere:
a) Să se afişeze media generală a unei clase x citită de la tastatură.
b) Să se listeze candidaţii care au obtinut ambele note peste 8.
c) Să se afişeze nota cea mai mare la româna şi matematică

Rezolvare
wait "1)"
accept 'clasa=' to c
calculate avg((notar+notam)/2) to m for clasa=c
?c," media generala=",m
wait "2)"
list for notar>=8 and notam>=8
wait "3)"
calculate max(notar) to r
?r
calculate max(notam) to m
?m

Problema nr. 40
La o agenţie CFR, pentru activitatea de eliberare a biletelor sunt folosite tabelele vagoane.dbf,
locuri.dbf, cu următoarea structură :
VAGOANE.DBF
codv (N(2)) Cod vagon
codt (N(2)) Codul trenului de care este atasat vagonul
tipv (N(1)) Tipul vagonului/ clasa; ex: 1 sau 2
locurit (N(2)) Numarul total de locuri al vagonului
Perechea (codv, codt) este unică.
LOCURI.DBF
codt (N(2)) Codul trenului de care este atasat vagonul
codv (N(2)) Cod vagon
locuriv (N(2)) Numarul de locuri vandute din vagon
data (D) Data cursei

Se cere :
a) Scrieţi un program care calculează numărul de locuri ocupate si neocupate, pe categorii de
vagoane si date calendaristice.
b) Aflaţi care sunt zilele in care au fost ocupate integral locurile unui tren dat.

46
Rezolvare
wait "punctul 1) "
select data,sum(locuriv) as Loc_Vand,;
sum(locurit-locuriv) as Loc_Libere;
from vagoane,locuri where tipv=1 and;
vagoane.codt=locuri.codt and vagoane.codv=locuri.codv;
group by data
select data,sum(locuriv) as Loc_Vand,;
sum(locurit-locuriv) as Loc_Libere;
from vagoane,locuri where tipv=2 and;
vagoane.codt=locuri.codt and vagoane.codv=locuri.codv;
group by data
wait "punctul 2) "
input "cod tren=" to ct
select data from locuri, vagoane where;
locuri.codt=ct and vagoane.codt=ct and;
locuri.codv=vagoane.codv;
group by data hav

PROBLEME PENTRU BAZE DE DATE

MODULUL ORACLE

Pentru următoarele probleme se va scrie comanda de realizare a tabelelor, se va defini cheia primară
şi cea secundară , se vor completa cel puţin 5 inregistrǎri şi apoi se vor scrie instrucţiunile ce realizează
interogările cerute .

Problema nr. 1
În baza de date a unei facultăţi sunt următoarele tabele:
studenti (ids N(5), nume VARCHAR2(20), prenume VARCHAR2(20), adresa VARCHAR2(40),
localitate VARCHAR2(15) )
cursuri (idc N(5), denumire VARCHAR2(30), durata N(3), nr_credite N(3))
inscrieri (idc N(3), ids N(5), data_inscriere DATE, data_finalizare DATE, nota N(5,2) )
Se cere:
a) Să se afişeze toţi studenţii înscrişi la cursul de operare, ordonaţi alfabetic.
b) Să se afişeze numele şi id-ul studenţilor care vor finaliza cursul de operare în aprilie.

Rezolvare:
a. select nume, prenume from studenti order by nume
b. select s.nume, s.ids from studenti s, cursuri c, inscrieri i where s.ids=i.ids and c.idc=i.idc and
upper(c.denumire) ='operare'and to_char(i.data_final,'MON')='APR'

Problema nr. 2
În baza de date a unei facultăţi sunt următoarele tabele:
studenti (ids N(5), nume VARCHAR2(20), prenume VARCHAR2(20), adresa VARCHAR2(40),
localitate VARCHAR2(15) )
cursuri (idc N(5), denumire VARCHAR2(30), durata N(3), nr_credite N(3))
inscrieri (idc N(3), ids N(5), data_inscriere DATE, data_finalizare DATE, nota N(5,2) )
Se cere:
a) Să se afişeze numărul de credite acumulate de studentul Florescu Mihai..
b) Să se afişeze notele obţinute de studenţi la cursul de operare finalizat în luna februarie.
47
Rezolvare:
a) select s.ids,sum(c.nr_credite),s.nume, s.prenume from studenti s, cursuri c, inscrieri i where s.ids=i.ids and
c.idc=i.idc and upper(s.nume)='FLORESCU'and upper(s.prenume)='MIHAI'group by s.ids, s.nume, s.prenume
b) select s.nume, s.prenume, i.nota from studenti s, cursuri c, inscrieri i where s.ids=i.ids and c.idc=i.idc and
upper(c.denumire) ='OPERARE'and to_char(i.data_final,'MON')='FEB'

Problema nr.3
În baza de date a unei facultăţi sunt următoarele tabele:
studenti (ids N(5), nume VARCHAR2(20), prenume VARCHAR2(20), adresa VARCHAR2(40),
localitate VARCHAR2(15) )
cursuri (idc N(5), denumire VARCHAR2(30), durata N(3), nr_credite N(3))
inscrieri (idc N(3), ids N(5), data_inscriere DATE, data_finalizare DATE, nota N(5,2) )
Se cere:
a) Să se afişeze numele studenţilor care sunt din Galaţi şi stau pe strada Tecuci.
b) Să se calculeze cea mai mare notă obţinută la cursul de ecologie.

Rezolvare:
a) select nume, prenume from studenti where upper(localitate)='GALATI' and upper(adresa) like '%TECUCI%'
b) select max(nota) as "nota maxima la ecologie" from(select s.nume, s.prenume,c.idc, i.nota from studenti s, cursuri
c, inscrieri i where s.ids=i.ids and c.idc=i.idc and upper(c.denumire) ='ECOLOGIE'group by c.idc, i.nota,s.nume,
s.prenume)

Problema nr.4
În baza de date a unei facultăţi sunt următoarele tabele:
studenti (ids N(5), nume VARCHAR2(20), prenume VARCHAR2(20), adresa VARCHAR2(40),
localitate VARCHAR2(15) )
cursuri (idc N(5), denumire VARCHAR2(30), durata N(3), nr_credite N(3))
inscrieri (idc N(3), ids N(5), data_inscriere DATE, data_finalizare DATE, nota N(5,2) )
Se cere:
a) Să se afişeze toţi studenţii înscrişi la cursul de operare, în ordine descrescătoare a notelor.
b) Să se afişeze în ce zi a lunii s-a înscris la cursuri studenta Popa Maria.

Rezolvare:
a) select s.nume, s.prenume, i.nota from studenti s, cursuri c, inscrieri i where s.ids=i.ids and c.idc=i.idc order by
i.nota desc
b) select s.nume, s.prenume, to_char(i.data_iscr,'dd') as ZI from studenti s, cursuri c, inscrieri i where s.ids=i.ids and
c.idc=i.idc and upper(s.nume)='POPA'and upper(s.prenume)='MARIA'

Problema nr.5
În baza de date a unei facultăţi sunt următoarele tabele:
studenti (ids N(5), nume VARCHAR2(20), prenume VARCHAR2(20), adresa VARCHAR2(40),
localitate VARCHAR2(15) )
cursuri (idc N(5), denumire VARCHAR2(30), durata N(3), nr_credite N(3))
inscrieri (idc N(3), ids N(5), data_inscriere DATE, data_finalizare DATE, nota N(5,2) )
Se cere:
a) Calculaţi şi afişaţi media aritmetică a notelor studenţilor înscrişi la cursul de ecologie, finalizat
înainte de data curentă.
b) Ştergeţi din baza de date studenţii care nu au promovat cursurile( nu au obţinut peste nota 5)

Rezolvare:

48
a) select avg(nota) as " Media aritmetica" from(select i.nota ,c.idc from studenti s, cursuri c, inscrieri i where
s.ids=i.ids and c.idc=i.idc and upper(c.denumire) ='ECOLOGIE' and i.data_finalizare < sysdate group by c.idc,
i.nota)
b) delete from studenti where ids in(select s.ids from studenti s, cursuri c, inscrieri i where s.ids=i.ids and c.idc=i.idc
and i.nota<5)

Problema nr. 6
Un magazin are baza de date formată din tabelele:
Produse (codp NUMBER(5) , nume VARCHAR2(10), culoare VARCHAR2(10), cantitatea aflată
în stoc cant_stoc NUMBER(3), pret NUMBER(5,2))
Clienti (codcli NUMBER(3) , nume VARCHAR2(50), loc VARCHAR2(15))
Vanzare (codp NUMBER(5), codcli NUMBER(3), cant NUMBER(3), datav DATE)
Se cere:
a) Să se afişeze lista produselor cu preţul între 20 şi 25 lei.
b) Să se afişeze numărul produselor de culoare albă.
Rezolvare:
a) select nume from produs where pret between 20 and 25;
b) select count(codp), culoare from produs group by culoare having culoare='alb';

Problema nr. 7
Un magazin are baza de date formată din tabelele:
Produse (codp NUMBER(5) , nume VARCHAR2(10), culoare VARCHAR2(10), cantitatea aflată
în stoc cant_stoc NUMBER(3), pret NUMBER(5,2))
Clienti (codcli NUMBER(3) , nume VARCHAR2(50), loc VARCHAR2(15))
Vanzare (codp NUMBER(5), codcli NUMBER(3), cant NUMBER(3), datav DATE)
Se cere:
a) Să se ordoneze după cod produsele vândute ieri .
b) Să se calculeze cantitatea totală cumpărată , la produsele de culoare verde.

Rezolvare:
a) select codp from vanzare where to_char(data_v,'DD')=to_char(sysdate,'DD')-1 and
to_char(data_v,'MON')=to_char(sysdate,'MON')order by codp;
b) select sum(cant) from vanzare v, produs p where v.codp=p.codp group by p.culoare having
p.culoare='verde';

Problema nr. 8
Un magazin are baza de date formată din tabelele:
Produse (codp NUMBER(5) , nume VARCHAR2(10), culoare VARCHAR2(10), cantitatea aflată
în stoc cant_stoc NUMBER(3), pret NUMBER(5,2))
Clienti (codcli NUMBER(3) , nume VARCHAR2(50), loc VARCHAR2(15))
Vanzare (codp NUMBER(5), codcli NUMBER(3), cant NUMBER(3), datav DATE)
Se cere:
a) Care este numărul de clienţi ai magazinului?
b) Care sunt clienţii care au cumpărat în total mai mult de 15 m de materiale?

Rezolvare:
a) select count(codcli) from clienti;
b) select c.nume, v.codp,sum(v.cant) from clienti c, vanzare v where c.codcli=v.codcli group by v.codp,c.nume
having sum(v.cant)>15;

Problema nr. 9
Un magazin are baza de date formată din tabelele:
49
Produse (codp NUMBER(5) , nume VARCHAR2(10), culoare VARCHAR2(10), cantitatea aflată
în stoc cant_stoc NUMBER(3), pret NUMBER(5,2))
Clienti (codcli NUMBER(3) , nume VARCHAR2(50), loc VARCHAR2(15))
Vanzare (codp NUMBER(5), codcli NUMBER(3), cant NUMBER(3), datav DATE)
Se cere:
a) Să se introducă un nou produs, printr-o comandă DML .
b) Care sunt produsele cumpărate de mai mult de 3 clienţi?

Rezolvare:
a) insert into produse ( codp,nume,culoare,cant_stoc, pret) values (6,’finet’, ‘alb’, 20, 12.4)
b) select p.nume,p.culoare, v.codp from produs p, vanzare v where p.codp=v.codp group by v.codp,p.nume,p.culoare
having count (v.codp) > 2 ;

Problema nr. 10
Un magazin are baza de date formată din tabelele:
Produse (codp NUMBER(5) , nume VARCHAR2(10), culoare VARCHAR2(10), cantitatea aflată
în stoc cant_stoc NUMBER(3), pret NUMBER(5,2))
Clienti (codcli NUMBER(3) , nume VARCHAR2(50), loc VARCHAR2(15))
Vanzare (codp NUMBER(5), codcli NUMBER(3), cant NUMBER(3), datav DATE)
Se cere:
a) Să se afişeze produsele din magazin ordonate alfabetic după nume.
b) Să se afişeze produsele cumpărate de clienţii din Brăila

Rezolvare:
a) select nume,culoare from produse order by nume
b) select p.nume, c.nume from clienti c, vanzare v, produs p where c.codcli=v.codcli and p.codp=v.codp and c.codcli
in ( select codcli from clienti where upper(loc)='BRAILA')

Problema nr.11
O companie operează cu următoarea bază de date :
Persoane (id, id_firma, nume, localitate, data_n)
Firme (id, nume, localitate)
Se cere :
a) Să se afişeze numele firmelor din localitatea Galaţi;
b) Să se afişeze numele tuturor persoanelor care lucrează la aceeaşi firmă la care lucrează
“Popescu”.

Rezolvare
a) SELECT nume FROM firme WHERE localitate=’Galati’
b) SELECT nume From persoane WHERE id_firma=(select id_firma FROM persoane WHERE nume=’Popescu’

Problema nr. 12
O companie operează cu următoarea bază de date :
Persoane (id, id_firma, nume, localitate, data_n)
Firme (id, nume, localitate)
Se cere :
a) Numărul firmelor din Galaţi;
b) Să se afişeze numele firmei care are un număr maxim de angajaţi.

Rezolvare
a) SELECT count(nume) FROM firme
b) SELECT nume FROM firme WHERE id=(select id_firma FROM persoane GROUP BY id_firma HAVING
count(*)=(select max(count(*)) FROM persoane GROUP BY id_firma))

50
Problema nr. 13
Se dă baza de date :
Prod (codp, den, culoare, stoc, pret)
Client (codcli, nume, loc)
Vanzare (codp, codcli, cant, datav)
Se cere:
a) Care este lista tuturor produselor ?
b) Care sunt clienţii din Galaţi şi zilele când aceştia au făcut cumpărături ?

Rezolvare
a) SELECT * FROM prod
b) SELECT nume, datav FROM client, vanzare WHERE loc=’Galati’ AND client.codcli=vanzare.codcli

Problema nr. 14
Se dă baza de date :
Prod (codp, den, culoare, stoc, pret)
Client(codcli, nume, loc)
Vanzare(codp, codcli, cant, datav)
Se cere:
a) Ce produse se vând cu preţuri între 100 şi 200 lei ?
b) Care sunt culorile de pânză cumpărate de Marin din Galaţi astăzi?

Rezolvare
a) SELECT * FROM prod
b) SELECT culoare FROM client, prod, vanzare WHERE loc=’Galati’ AND den=’panza’ AND nume=’Marin’ AND
datav=sysdate AND client.codcli=vanzare.codcli AND prod.codp=vanzare.codp

Problema nr. 15
Se dă baza de date :
Prod (codp, den, culoare, stoc, pret)
Client (codcli, nume, loc)
Vanzare(codp, codcli, cant, datav)
Se cere:
a) Care sunt culorile de vopsea în ordinea preţurilor ?
b) Ce produse s-au mai vândut în ziua când Marin a cumpărat vopseaua ?

Rezolvare
a) SELECT culoare FROM prod WHERE den=’vopsea’ ORDER BY pret
b) SELECT p.codp, p.den, p.culoare FROM prod p, vanzare v, client WHERE nume=’Marin’ AND den=’vopsea’
AND client. Codcli=vanzare.codcli AND prod.codp=vanzare.codp AND vanzare.datav=v.datav AND
v.codp=p.codp

Problema nr. 16
Se dă baza de date :
Prod (codp, den, culoare, stoc, pret)
Client (codcli, nume, loc)
Vanzare (codp, codcli, cant, datav)
Se cere:
51
a) Care este lista tuturor produselor cu stoc 0 ?
b) Care este cantitatea maximă de vopsea cumpărată de fiecare client ?
Rezolvare
a) SELECT * FROM prod WHERE stoc=0
b) SELECT max(cant), nume FROM vanzare, client, prod WHERE den=’vopsea’ AND client.codcli=vanzare.codcli
AND prod.codp=vanzare .codp GROUP BY vanzare.codcli

Problema nr. 17
Se dă baza de date :
Elevi (nume, prenume, clasa absn,absm)
Sali (clasa, sala)
Se cere:
a) Să se afişeze elevii cu peste 60 de absenţe nemotivate.
b) Să se afişeze sala unde învaţă ‘Ionescu’.

Rezolvare
a) SELECT * FROM elevi WHERE absn>60
b) SELECT sala FROM elevi,Sali WHERE nume=’Ionescu’ AND elevi.clasa=sali.clasa

Problema nr. 18
Se dă baza de date :
Elevi (nume, prenume, clasa ,absn,absm)
Sali (clasa, sala)
Se cere:
a) Să se afişeze elevii din clasa a 9 a .
b) Să se afişeze elevii care învaţă în sala 2.14.

Rezolvare
a) SELECT nume, prenume FROM elevi WHERE clasa=’9 a’
b) SELECT nume, prenume FROM elevi, Sali WHERE sala=’2.14’ AND sala.clasa=elevi.clasa

Problema nr. 19
Fie baza de date IT_STORE cu următoarele tabele :
Magazine(nr_mag, adresa, telefon)
Componente(nr_comp, nume, descriere, pret, nr_mag, vandut)
Clienti(id_cli, nume, adresa, telefon)
Comenzi(nr_com, nr_comp, data, id_cli)
Se cere:
a) Să se afişeze adresele magazinelor din Galaţi.
b) Care sunt clienţii care au efectuat comenzi astăzi ?

Rezolvare
a) SELECT adresa FROM magazine WHERE adresa LIKE ‘%Galati’
b) SELECT nume FROM clienti, comenzi WHERE comenzi.data=sysdate AND comenzi.id_cli=cli=clienti.id_cli

Problema nr. 20
Administratorul unei asociaţii de locatari foloseşte o bază de date pentru a ţine evidenţa locatarilor şi
apartamentelor . Fie baza de date IT_STORE cu următoarele tabele :

52
Magazine(nr_mag, adresa, telefon)
Componente(nr_comp, nume, descriere, pret, nr_mag, vandut)
Clienti(id_cli, nume, adresa, telefon)
Comenzi(nr_com, nr_comp, data, id_cli)
Se cere:
a) Să se afişeze componentele cu preţul cuprins între 100 şi 200 lei.
b) Ce componente s-au vândut astăzi şi care au fost cumpărătorii ?

Rezolvare
a) SELECT nume FROM descrieri WHERE pret BETWEEN 100 and 200
b) SELECT componente.nume, clienti.nume FROM clienti, componente, comenzi WHERE comenzi.data=sysdate
AND comenzi.nr_comp=componente.nr_comp AND comenzi.id_cli=clienti.id_cli

Problema nr. 21
La o biblioteca se tine evidenta cartilor si a cititorilor folosind doua tabele:
carti(id_carte N(50),titlu VARCHAR2(40),autor VARCHAR2(40),editura VARCHAR2(40))
cititori(id_cititor NUMBER(5), nume VARCHAR2(40),adresa VARCHAR2(40), telefon
CHAR(10), id_carte NUMBER(5))
Se cere:
a) Sa se afiseze toti autorii (distincti) care au carti in biblioteca.
b) Sa se afiseze titlul si autorul cartilor imprumutate de cititorul Ionescu Mihai.

Rezolvare:
a) select distinct autor from carti
b) select a.titlu, a.autor from carti a, cititori b where a.id_carte=b.id_carte and nume=’Ionescu Mihai’

Problema nr. 22
La o biblioteca se tine evidenta cititorilor folosind tabela:
cititori(id_cititor NUMBER(5), nume VARCHAR2(40), adresa VARCHAR2(40), telefon
CHAR(10), id_carte NUMBER(5), email VARCHARD2(20))
Se cere:
a) Sa se afiseze cititorii in ordine alfabetica.
b) Sa se afiseze numele, prenumele si telefonul cititorilor care au telefon in reteaua VODAFONE.

Rezolvare:
a) select * from cititori order by nume, prenume
b) select nume, prenume, telefon from cititori where telefon like ’__2%’

Problema nr. 23
La maternitate exista urmatoarele tabele:
bebe(nume, prenume, data, cod)
unde cod este codul copilului
data este data nasterii copilului
cods este codul spitalului
parinti(nume, prenume, cod, prenm
unde nume si prenume sunt numele si prenumele tatalui
prenma este prenumele mamei
spitale(cods, dens)
unde dens este numele spitalului
53
Se cere:
a) Sa se afiseze numele copiiilor nascuti la spitalul „Sfantul Apostol Andrei”.
b) Sa se afiseze pentru fiecare copil prenumele lui si al parintilor.
Rezolvare:
a) select b.nume, b.prenume from bebe b, spitale s where b.cods=s.cods and s.dens= ’Sfantul Apostol Andrei’
b) select b.prenume, p.prenume, p.prenma from bebe b, parinti p where b.cod=p.cod

Problema nr. 24
Informaţiile despre personalul unei societati comerciale sunt trecute in urmatoarele tabele
persoane(id_persoana, nume, prenume, adresa, data_nasterii)
copii(id_persoana, prenume_copil, data_nasterii)
Se cere:
a) Sa se afiseze numele si prenumele persoanelor in ordinea descrescatoare a varstei.
b) Sa se afiseze numele complet al fiecarui copil si data nasterii.

Rezolvare:
a) select nume, prenume from persoane order by data_nasterii
b) select p.nume, c.prenume_copil, c.data_nasterii from persoane p, copii c where p.id_persoana=c.id_persoana

Problema nr. 25
Informatiile despre personalul unei societati comerciale sunt trecute in urmatoarele tabele:
persoane(id_persoana, nume, prenume, adresa, data_nasterii)
copii(id_persoana, prenume_copil, data_nasterii)
Se cere:
a) Sa se afiseze numele, prenumele si adresa pentru cele mai tinere trei persoane din societate.
b) Sa se afiseze prenumele copiilor angajatului ‘Ionescu Marian’.

Rezolvare:
a) select numele, prenumele, adresa from (select * from persoane order by data_nasterii desc) where rownum<=3
b) select c.prenume_copil from persoane p, copii c where p.id_persoana=c.id_persoana and p.nume=’Ionescu’ and
p.prenume=’Marian’

Problema nr. 26
Se considera o tabela care contine informatii referitoare la sportivii participanti la un campionat de
gimastica si o tabela ce contine antrenorii echipelor tarilor participante(se considera ca din partea
fiecarei tari participa exact un antrenor)
sportivi(tara, nume_sportiv, nota1, nota2, nota3)
antrenori(tara, nume_antrenor)
Se cere:
a) Sa se adauge campul medie in tabela sportivi care sa contina media notelor la cele trei probe.
b) Sa se determine numarul antrenorilor .

Rezolvare:
a) alter table sportivi
add medie NUMBER(5,2)
update sportivi set medie=(nota1+nota2+nota3)/3
b) select count(nume_antrenor) from antrenori

Problema nr. 27
54
Se considera o tabela care contine informatii referitoare la sportivii participanti la un campionat de
gimnastica si o tabela ce contine antrenorii echipelor tarilor participante(se considera ca din partea
fiecarei tari participa exact un antrenor)
sportivi(tara, nume_sportiv, nota1, nota2, nota3)
antrenori(tara, nume_antrenor)
Se cere:
a) Sa se afiseze numarul de sportivi participanti din fiecare tara.
b) Sa se afiseze pentru fiecare tara participanta numele antrenorului si numele sportivului.

Rezolvare:
a) select count (nume_sportiv) from sportivi group by tara
b) select a.nume_antrenor, s.nume_sportiv from sportivi s, antrenori a where s.tara=a.tara

Problema nr. 28
Se considera o tabela care contine informatii referitoare la sportivii participanti la un campionat de
gimastica.
sportivi(tara, nume_sportiv, nota1, nota2, nota3)
Se cere:
a) Sa se afiseze tarile participante in ordine alfabetica.
b) Sa se stearga toti sportivii care au media notelor la cele trei probe mai mica decat 5.

Rezolvare:
a) select tara from sportivi order by tara
b) delete from sportivi where (nota1+nota2+nota3)/3<5.

Problema nr. 29
Fie urmatoarea tabela:
elevi (nr_matricol, nume, clasa, adresa, media, absente, absente_motivate)
Se cere :
a) Sa se afiseze pentru fiecare elev numele, clasa si media.
b) Sa se afiseze numele sefului de promotie.

Rezolvare:
a) select nume, clasa, media from elevi
b) select nume from elevi where media =(select max(media) from elevi)

Problema nr. 30
Fie urmatoarea tabela:
elevi (nume, clasa, media, adresa)
Se cere:
a) Sa se afiseze numele elevilor din clasa a 12A a caror medie este mai mare decat 8.
b) Sa se afiseze pentru fiecare clasa numarul elevilor cu media intre 5 si 6.

Rezolvare:
a) select nume from elevi where clasa = ‘12A’ and media > 8
b) select clasa, count(nume) from elevi where media between 5 and 6 group by clasa

55
Problema nr. 31
Se consideră tabelele având următoarea structură:
Produse (idpr, denumire, pret, nr_buc, idfurn)
Furnizori (idfurn, numef, localitate)
Se cere:
a) Sǎ se afişeze produsele ordonate descrescător după preţ iar produsele care au acelaşi preţ se vor
afişa ordonate alfabetic .
b) Sǎ se afişeze produsele care au preţul mai mic sau egal decât preţul produsului cu denumirea
ciocolata.
c) Sǎ se afişeze localităţile furnizorilor.

Rezolvare:
a) select * from produse order by pret desc, denumire
b) select * from produse where pret<=(select pret from produse where denumire='ciocolata'
c) select distinct localitate from produse p, furnizori f where p.idfurn=f.idfurn

Problema nr. 32
Se consideră tabelele având următoarea structură:
Produse (idpr, denumire, pret, nr_buc, idfurn)
Furnizori (idfurn, numef, localitate)
Se cere:
a) Sǎ se afişeze pentru fiecare produs denumirea şi valoarea stocului .
b) Sǎ se afişeze primele cinci înregistrări ordonate după preţ crescător .
c) Sǎ se afişeze furnizorii care nu au livrat produse.

Rezolvare:
a) select denumire, pret*nr_buc from produse
b) select * from produse where rownum<=5 order by pret
c) select numef from furnizori where numef not in (select distinct numef from produse p, furnizori f where
p.idfurn=f.idfurn)

Problema nr. 33
Se consideră tabelele având următoarea structură:
Produse (idpr, denumire, pret, nr_buc, idfurn)
Furnizori (idfurn, numef, localitate)
Clienti (idcl, idpr, numecl)
Se cere:
a) Sǎ se afişeze valoarea stocului de produse.
b) Sǎ se afişeze clienţii şi denumirile produselor achiziţionate.
c) Sǎ se afişeze denumirile furnizorilor care au livrat produse.

Rezolvare:
a) select sum(pret*nr_buc) from produse
b) select numecl, denumire from produse p, clienti c where p.idpr=c.idpr
c) select distinct numef from produse p, furnizori f where p.idfurn=f.idfurn

Problema nr. 34
Se consideră tabelele având următoarea structură:
Produse (idpr, denumire, pret, nr_buc, idfurn)

56
Clienti (idcl, idpr, numecl)
Se cere:
a) Sǎ se afişeze clienţii care au achiziţionat ciocolată .
b) Sǎ se afişeze denumirile produselor care nu au fost achiziţionate de nici un client.
c) Sǎ se afişeze clienţii care au achiziţionat produsele cele mai scumpe.

Rezolvare:
a) select numecl from produse p, clienti c where p.idpr=c.idpr and denumire='ciocolata'
b) select denumire from produse where denumire not in (select distinct denumire from produse p, clienti c where
p.idpr=c.idpr)
c)select numecl, denumire from clienti c, produse p where p.idpr=c.idpr and pret=(select max(pret)
from produs

Problema nr. 35
Se consideră tabelele având următoarea structură:
Produse (idpr, denumire, pret, nr_buc, idfurn)
Furnizori (idfurn, numef, localitate)
Clienti (idcl, idpr, numecl)
Se cere:
a) Sǎ se determine numărul produselor achiziţionate.
b) Sǎ se afişeze furnizorii ordonaţi alfabetic pe localităţi.
c) Sǎ se afişeze pentru fiecare client preţul cel mai mare pentru produsele achiziţionate.

Rezolvare:
a) select count(distinct p.idpr) from clienti c, produse p where p.idpr=c.idpr
b) select localitate, numef from furnizori order by localitate, numef
c) select numecl, max(pret) from clienti c, produse p where p.idpr=c.idpr group by numecl

Problema nr. 36
Se consideră tabelele având următoarea structură:
Angajati (id_ang, nume, id_dep, salariu, job_id)
Departamente (id_dep, denumire, manager_id)
Se cere:
a) Sǎ se afişeze angajaţii şi departamentele din care aceştia fac parte.
b) Sǎ se afişeze angajaţii ordonaţi după profesii iar in cadrul fiecărei profesii ordonaţi alfabetic.
c) Sǎ se afişeze numele fiecărui manager de departament .

Rezolvare:
a) select nume, denumire from departamente d, angajati a where d.id_dep=a.id_dep
b) select job_id, nume from angajati order by job_id, nume
c) select nume, denumire from departamente d, angajati a where d.id_dep=a.id_dep and d.manager_id=a.id_ang

Problema nr. 37
Se consideră tabelele având următoarea structură:
Angajati (id_ang, nume, id_dep, salariu, job_id)
Departamente (id_dep, denumire, manager_id)
Se cere:
a) Sǎ se afişeze cel mai mare salariu din fiecare departament.
b) Sǎ se afişeze numărul de angajaţi din fiecare departament.
c) Sǎ se afişeze toţi angajaţii din acelaşi departament cu Popescu.

Rezolvare:

57
a) select id_dep, max(salariu) from angajati group by id_dep
b) select select count(*), a.id_dep from departamente d, angajati a where d.id_dep=a.id_dep group by a.id_dep
c) select nume from angajati where id_dep=(select id_dep from angajati where nume='Popescu')

Problema nr. 38
Se consideră tabelele având următoarea structură:
Angajati (id_ang, nume, id_dep, salariu, job_id)
Departamente (id_dep, denumire, manager_id)
Se cere:
a) Sǎ se afişeze managerul lui Horia.
b) Sǎ se afişeze primii cinci angajaţi din tabelă ordonaţi descrescător după salariu.
c) Sǎ se afişeze numărul maxim de angajaţi dintr-un departament.

Rezolvare:
a) select nume from angajati where id_ang=(select manager_id from departamente where id_dep=(select id_dep from
angajati where nume='Horia'))
b) select * from angajati where rownum<=5 order by salariu desc
c) select max(count(*)) from angajati group by id_dep

Problema nr. 39
La o bibliotecă se ţine evidenţa cărţilor şi a cititorilor folosind două tabele:

carte ce contine câmpurile : id_carte NUMBER(6)- codul cărţii , titlu NUMBER(50) -titlul cărtii,
nume_autor VARCHAR2(50) numele autorului, editura VARCHAR2(40)- nume editură ,pret
NUMBER(6,2)-pretul cărtii

cititor ce conţine următoarele câmpuri: id_cit NUMBER(6)-codul cititorului, nume VARCHAR2(50)-


numele cititorului, adresa VARCHAR2(50)- adresa cititorului, telefon CHAR(10)-telefonul
cititorului, email VARCHAR2(20)- email-ul cititorului, id_carte NUMBER(6)- codul cărţii şi
data_împr DATE- data de împrumut a cărţii.

Se cere:
a) Numărul editurilor din bibliotecă.
b)Să se steargă cititorii care au împrumutat cărţi de Marin Preda în ultima lună.
Rezolvare:
a) select count(editura) from carte ;
b) delete from cititor ci , carte ca where ca.id_carte=ci.id_carte and to_char(ci.data_impr,'mon')='dec' and
ca.nume_autor ='Marin Preda';

Problema nr. 40
La o bibliotecă se ţine evidenţa cărţilor şi a cititorilor folosind două tabele:

carte ce contine câmpurile : id_carte NUMBER(6)- codul cărţii , titlu NUMBER(50) -titlul cărtii,
nume_autor VARCHAR2(50) numele autorului, editura VARCHAR2(40)- nume editură, pret
NUMBER(6,2)-preţul cărţii

cititor ce conţine următoarele câmpuri: id_cit NUMBER(6)-codul cititorului, nume VARCHAR2(50)-


numele cititorului, adresa VARCHAR2(50)- adresa cititorului, telefon CHAR(10)-telefonul
cititorului, email VARCHAR2(20)- email-ul cititorului, id_carte NUMBER(6)- codul cărţii şi
data_împr DATE- data de împrumut a cărţii.
58
Se cere:
a) Să se afişeze toate editurile care au cărţi in bibliotecă.
b) Numele cititorului,titlul cărţii şi editură pentru cea mai scumpă carte împrumutată.
Rezolvare:
a) select distinct editura from carte;
b) select ci.nume ,ca.nume_autor,ca.editura, ca.pret from carte ca, cititor ci where ca.id_carte=ci.id_carte and
ca.pret=(select max(pret) from carte);

Bibliografie

• Emanuela Cerchez – Informatica, Editura Polirom


• Tudor Sorin – Manuale de informaticǎ IX-XII, Editura LS-
INFORMAT
• Bogdan Pǎtru( - Aplicaţii în C şi C++, Editura EDUSOFT
• Liviu Negrescu – Limbajul C++, Editura Albastrǎ
• Mariana Panţâru – Manual de informaticǎ pentru clasa a XII-a,
Editura LS-INFORMAT
• Mariana Miloşescu – Manuale de infoeramticǎ IX-XII, Editura
DIDACTICǍ ŞI PEDAGIGICǍ
• Leon Livovschi, Horia Georgescu – Sinteza şi analiza algoritmilor,
Editura ştiinţificǎ şi enciclopedicǎ
• Donald Knuth – Tratat de programarea calculatoarelor, Editura
TEHNICǍ
• MEC – Subiectele propuse la Bacalaureat şi variantele alternative, în
anii 2000-2007
• Emanuela Cerchez, Marinel Şerban – Programarea în limbajul C/C++
pentru liceu , Editura POLIROM
• Emanuela Cerchez, Marinel Şerban - Manuale de infoeramticǎ IX-X,
Editura POLIROM
• Jeb Long – Fox Pro 2.6 for Windows, Editura TEORA
• Jeff Prekins – SQL fǎrǎ profesor în 14 zile, Editura TEORA

59
Cuprins

ARGUMENT .....................................................................................................
PROBLEME PENTRU ALGORITMICǍ ŞI PROGRAMARE ...............
PROBLEME PENTRU BAZE DE DATE – MODULUL FoxPro ..............
PROBLEME PENTRU BAZE DE DATE – MODULUL FoxPro ..............
BIBLIOGRAFIE ...............................................................................................

60

S-ar putea să vă placă și