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

Probleme Pentru Algoritmica Si Programare

Embed Size (px)

Citation preview

Page 1: Probleme Pentru Algoritmica Si Programare

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

Page 2: Probleme Pentru Algoritmica Si Programare

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

Page 3: Probleme Pentru Algoritmica Si Programare

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

Page 4: Probleme Pentru Algoritmica Si Programare

4

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 C++#include<iostream.h>void main(){int n,fp,p,fmax,fmin,pmax,pmin;cout<<”n=”; cin>>n;fp=2;pmax=0; pmin=1000;while(n!=1) { p=0; while(n%fp==0) { p++; n=n/fp; } if( p!=0) {if(p<pmin) { p=pmin; fmin=fp; } if(p>pmax) { p=pmax; fmax=fp; } } fp++; }

cout<<”pmin=”<<pmin ; cout<<fmin=”<<fmin<<endl;

cout<<”pmax=”<<pmax ;cout<<” fmax=”<<fmax;}

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ă.

LIMBAJUL PASCALprogram Problema1;uses crt;var n,max,min,d,fmin,fmax:longint; cont,m,i:byte; v:array[1..100] of longint;beginwrite('n='); readln(n);min:=maxint; max:=-maxint;d:=2; m:=0;while n<>1 dobegin cont:=0; while n mod d=0 do begin n:=n div d; inc(cont); end; if cont>0 then begin inc(m); v[m]:=d; if min>cont then begin min:=cont; fmin:=d; end; if max<cont then begin max:=cont; fmax:=d; end; end; inc(d);end;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.

Page 5: Probleme Pentru Algoritmica Si Programare

5

LIMBAJUL PASCALprogram Problema 2;var a:array[1..10,1..10] of integer; n,i,j:byte; s:integer;beginwrite('Dimensiunea matricii: '); readln(n);for i:=1 to n do for j:=1 to n do begin write('a[',i,',',j,']='); readln(a[i,j]); end;s:=0;for i:=1 to n do for j:=1 to i do inc(s,a[i,j]);writeln('Suma ceruta este: ',s);end.

LIMBAJUL C++#include<iostream.h>int i,n,j,a[20][20],s;void suma(int x){for(i=1;i<=x;i++) for(j=1;j<=i;j++) s=s+a[i][j]; cout<<s; }void main(){clrscr();cout<<"n=";cin>>n;for(i=1;i<=n;i++)for(j=1;j<=n;j++) {cout<<"a["<<i<<"]["<<j<<"]="; cin>>a[i][j]; }suma(n);}

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 PASCALprogram Problema 3;var v,v1,v2:array[1..100] of integer; n,i:byte; suma,prod,x:integer;beginwrite('Dimensiunea vectorului: ');readln(n);for i:=1 to n do begin write('v[',i,']='); readln(v[i]); v[i]:=abs(v[i]); end;for i:=1 to n do if v[i]=0 then begin v1[i]:=0; v2[i]:=0; end else begin x:=v[i]; suma:=0; prod:=1; repeat suma:=suma+(x mod 10); prod:= prod*(x mod 10); x:=x div 10; until x=0; v1[i]:=suma; v2[i]:=prod; end;writeln('Vectorul initial:');for i:=1 to n do write(v[i],' ');writeln;writeln('Vectorul cu sumele:');for i:=1 to n do write(v1[i],' ');writeln;writeln('Vectorul cu produsele:');for i:=1 to n do write(v2[i],' ');end.

LIMBAJUL C++#include<stdio.h>#include<math.h>void main (void){int n,i,v[20],v1[20],v2[20],s,p;printf("n="); scanf("%d",&n);for(i=1;i<=n;i++) {printf("v[%d]=",i); scanf("%d",&v[i]); }i=1;while(i<=n) {if(v[i]==0) { v1[i]=0; v2[i]=0; i++; } else if(v[i]<0) { v[i]=abs(v[i]); p=1; s=0; while(v[i]!=0)

{ s=s+v[i]%10; p=p*(v[i]%10); v[i]=v[i]/10; }v1[i]=-s; v2[i]=-p; i++;

} else {p=1;s=0; while(v[i]!=0) { s=s+v[i]%10; p=p*(v[i]%10); v[i]=v[i]/10; } v1[i]=s; v2[i]=p;i++; } }printf("vectorii sunt \n");for(i=1;i<=n;i++) printf("\n v1[%d]=%d",i,v1[i]);for(i=1;i<=n;i++) printf("\n v2[%d]=%d",i,v2[i]);}

Page 6: Probleme Pentru Algoritmica Si Programare

6

LIMBAJUL C++#include<iostream.h>int a,b;int cmmdc(int a,int b){int r,d,i; d=a; i=b; r=d%i; if(r==0) return i; else {while(r!=0) {r=d%i; d=i; i=r; } return d; }}void main(){ int man; cout<<"a=";cin>>a; cout<<"b=";cin>>b; if(a<b) {man=a; a=b; b=man; }cout<<cmmdc(a,b);}

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.

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 PASCAL

program Problema 5;var a,b:integer;function cmmdc(x,y:integer):integer;var r:integer;beginwhile x mod y<>0 do begin r:=x mod y; x:=y; y:=r; end;cmmdc:=y;end;

beginclrscr;writeln('Introduceti cele doua valori:'); write('a='); readln(a);write('b='); readln(b);write('Cmmdc al celor doua valori este: ',cmmdc(a,b));end.

LIMBAJUL C++#include<iostream.h>int a,b;int prim(int x){int j;if(x<=1) return 0;else if (x==2) return 1; else if (i%2==0) return 0; else for(j=3;j<=x/2;j+=2) if(x%j==0) return 0;return 1;}void main(){clrscr();cout<<"a=";cin>>a;cout<<"b=";cin>>b;for(int i=a;i<=b;i++) if(prim(i)==1) cout<<"\n nr prim este: "<<i;}

LIMBAJUL PASCALprogram Problema 4;var a,b,j:integer;function prim(x:integer):boolean;var i:integer;beginprim:=true;if x<=1 then prim:=false else if x=2 then prim:=true else if x mod 2=0 then prim=false else begin i:=3; while (i<= x div 2) and (prim=true) do if x mod i=0 then prim:=false else i:=i+2;end;

beginwriteln('Dati intervalul:'); write('a='); readln(a);write('b='); readln(b);writeln('Numerele prime din intervalul [',a,',',b,'] sunt:');for j:=a to b do if prim(j) then write(j,' ');end.

Page 7: Probleme Pentru Algoritmica Si Programare

7

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++

#include<stdio.h>int n,m,a[20][20];void elimlin(int l) { int i,j; for(i=l+1;i<=n;i++) for(j=1;j<=m;j++) a[i-1][j]=a[i][j]; n--; } void elimcol(int c) { int i,j; for(i=1;i<=n;i++) for(j=c+1;j<=m;j++) a[i][j-1]=a[i][j]; m--; }void main(){int i,j,l,c;printf("n="); scanf("%d",&n);printf("m=");scanf("%d",&m);for(i=1;i<=n;i++) for(j=1;j<=m;j++) { printf("a[%d][%d]=",i,j); scanf("%d",&a[i][j]); }printf("\n Matricea inainte de modificare este:\n"); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) printf("%3d",a[i][j]); printf("\n"); }printf("l="); scanf("%d",&l);printf("c="); scanf("%d",&c);if(l>n||l<1) printf("Introduceti o alta linie");else {elimlin(l); printf("\n Matricea dupa eliminarea liniei %d este:\n",l); for(i=1;i<=n;i++) {for(j=1;j<=m;j++) printf("%3d",a[i][j]); printf("\n"); } }if(c>m||c<1) printf("Introduceti o alta coloana");else {elimcol(c); printf("\n Matricea dupa eliminarea coloanei %d este :\n",c); for(i=1;i<=n;i++) {for(j=1;j<=m;j++) printf("%3d",a[i][j]); printf("\n"); } }}

LIMBAJUL PASCALprogram Problema6;var a:array[1..10,1..10] of integer; n,m,i,j,p,q:byte;procedure elimlinie(l:byte);var j:byte;beginif l=n then dec(n) else begin for i:=l to n-1 do for j:=1 to m do a[i,j]:=a[i+1,j]; dec(n); end;end;procedure elimcoloana(c:byte);var i:byte;beginif c=m then dec(m)else begin for j:=c to m-1 do for i:=1 to n do a[i,j]:=a[i,j+1]; dec(m); end;end;procedure afisare;var i,j:byte;beginfor i:=1 to n do begin for j:=1 to m do write(a[i,j],' '); writeln; end;end;beginwriteln('Introduceti dimensiunile matricii:');write('Linii: '); readln(n);write('Coloane: ');readln(m);for i:=1 to n do for j:=1 to m do begin write('a[',i,',',j,']='); readln(a[i,j]); end;writeln('Matricea inainte de modificare este:');afisare;repeat write('Linia de eliminat:'); readln(p);until (p>=1) and (p<=n);elimlinie(p);afisare;repeat write('Coloana de eliminat:'); readln(q);until (q>=1) and (q<=m);elimcoloana(q);afisare;end.

Page 8: Probleme Pentru Algoritmica Si Programare

8

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 C++#include<stdio.h>#include<stdlib.h>void main(void){int v[20],n,i,x,st,dr,test,m;printf("n="); scanf("%d",&n);for(i=1;i<=n;i++) {printf("v[%d]=",i); scanf("%d",&v[i]); }printf("x="); scanf("%d",&x);for(i=1;i<n;i++) if(v[i]>v[i+1]) exit(0);st=1;dr=n;test=0;while(st<=dr&&!test) {m=(st+dr)/2; if(v[m]==x) {printf("\n cheia de cautare se afla pe poz. %d",m); test=1; } if(v[m]>x) dr=m-1; else if(v[m]<x) st=m+1; }if(test==0) {for(i=n;i>=1;i--) v[i+1]=v[i]; v[1]=x; n++; for(i=1;i<=n;i++) printf("\n v[%d]=%d",i,v[i]); }}

LIMBAJUL PASCALprogram 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 else if c2=n-1 then begin li:=n; ls:=1; sw1:=-1; end else begin repeat sw:=0; for i:=1 to n-1 do if v[i+1]>v[i] then begin aux:=v[i]; v[i]:=v[i+1]; v[i+1]:=aux; sw:=1; end; until sw=0; li:=1; ls:=n; end; repeat mijloc:=(li+ls) div 2; if x>v[mijloc] then li:=mijloc+sw1; if x<v[mijloc] then ls:=mijloc-sw1; until (x=v[mijloc]) or ((sw1=1) and (li>ls)) or ((sw1=-1) and (li<ls)); caut:=(x=v[mijloc]);end;beginwrite('Dimensiunea vectorului:');readln(n);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 dobegin 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.

Page 9: Probleme Pentru Algoritmica Si Programare

9

Problema nr. 8

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

LIMBAJUL C++#include<stdio.h>int x[20],y[20],z[40],n,m,k,i,j;void main(){printf("n=");scanf("%d",&n);printf("m=");scanf("%d",&m);for(i=1;i<=n;i++) {printf("x[%d]=",i); scanf("%d",&x[i]); }for(i=1;i<=m;i++) {printf("y[%d]=",i); scanf("%d",&y[i]); }x[n+1]=y[m]+1;y[m+1]=x[n]+1;i=1;j=1;for(k=1;k<=n+m;k++) if(x[i]<y[j]) { z[k]=x[i]; i++; } else {z[k]=y[j]; j++; }printf("\n Vectorul obtinut prin interclasare este:\n");for(i=1;i<=n+m;i++) printf("\n z[%d]=%d",i,z[i]);}

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 write('a[',i,']='); readln(a[i]); end; write('m='); readln(m); for i:=1 to m do begin write('b[',i,']='); readln(b[i]); end; i:=1; j:=1; k:=0; while (i<=n) and (j<=m) do if a[i]<b[j] then begin k:=k+1; c[k]:=a[i]; i:=i+1; end else if a[i]>b[j] then begin k:=k+1; c[k]:=b[j]; j:=j+1; end else begin k:=k+1;c[k]:=b[j]; j:=j+1; k:=k+1; c[k]:=a[i]; i:=i+1; end; if i<=n then 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.

Page 10: Probleme Pentru Algoritmica Si Programare

10

LIMBAJUL C++#include<stdio.h>int prim(int x){int j,test; if(x==1) return 0; test=1; //pp ca nr x este prim for(j=2;j<=x/2;j++) if(x%j==0) {test=0; break; } return test;}void main(){int n,i;clrscr();printf("n=");scanf("%d",&n);if(n>=4&&n%2==0) {for(i=1;i<=n;i++) if(prim(i)==1&&prim(n-i)==1) printf("\n suma este %d =%d+%d",n,i,n-i); }else printf("Date eronate");}

LIMBAJUL PASCALprogram Problema9;var n,i,q:word;function prim(x,k:word):boolean;beginif k=(x div 2)+1 then prim:=trueelse if x mod k=0 then prim:=false else prim:=prim(x,k+1);end;

beginwrite('Introduceti n>=4, par:'); readln(n);writeln('Perechile de valori prime sunt:');for i:=2 to n div 2 do begin q:=2; if prim(i,q) and prim(n-i,q) then writeln('(',i,',',n-i,')'); end;end.

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++#include<stdio.h>void main(){int n,v[20],poz[20],i,j,k;printf("n=");scanf("%d",&n);for(i=1;i<=n;i++) {printf("v[%d]=",i); scanf("%d",&v[i]); }printf("k=");scanf("%d",&k);for(i=1;i<=n;i++) poz[i]=1;for(i=1;i<=n-1;i++) {for(j=i+1;j<=n;j++) if(v[i]<v[j]) poz[j]++; else poz[i]++; }for(i=1;i<=n;i++) if(poz[i]==k) printf("elem este %d",v[i]);}

LIMBAJUL PASCALprogram Problema10;var v,poz,u:array[1..100] of integer; n,i,j,k:integer;beginwriteln('vector cu elemente distincte');write('n=');readln(n);for i:=1 to n do begin write('v[',i,']='); readln(v[i]); end;write('introduceti pozitia k=');readln(k);for i:=1 to n do poz[i]:=0;for i:=1 to n-1 do for j:=i+1 to n do if v[i]>v[j] then poz[i]:=poz[i]+1 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.

Page 11: Probleme Pentru Algoritmica Si Programare

11

LIMBAJUL C++#include<iostream.h>#include<string.h>typedef struct copil {char nume[30]; char prenume[30]; };struct copil a[20];int i,j,n;char man[20];void main(){cout<<"n=";cin>>n; for(i=1;i<=n;i++) {cout<<"numele este"; cin>>a[i].nume; //scanf("%s",a[i].nume);gets(a[i].nume); cout<<"prenumele este"; cin>>a[i].prenume; }for(i=1;i<=n-1;i++)for(j=1+i;j<=n;j++) if(strcmp(a[i].nume,a[j].nume)>0) {strcpy(man,a[i].nume); strcpy(a[i].nume,a[j].nume); strcpy(a[j].nume,man); strcpy(man,a[i].prenume);strcpy(a[i].prenume,a[j].prenume);strcpy(a[j].prenume,man); }cout<<"copii ordonati dupa nume sunt";for(i=1;i<=n;i++) cout<<"\n"<<a[i].nume<<" "<<a[i].prenume;}

LIMBAJUL PASCALprogram Problema11;var v:array[1..100] of string[20]; i,n,j:integer; aux:string[20];beginwrite('Introduceti numarul de elevi:'); readln(n);write('Introduceti numele elevilor:');for i:=1 to n do begin write('v[',i,']='); readln(v[i]); end; for i:=1 to n do for j:=i+1 to n do if v[i]>v[j] then begin aux:=v[i]; v[i]:=v[j]; v[j]:=aux; end;writeln('Elevii in ordinea alfabetica sunt:');for i:=1 to n dowriteln('v[',i,']=',v[i]);end.

Problema nr. 12

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

LIMBAJUL C++#include<stdio.h>void main(){int v[20],n,i,j,test;printf("n=");scanf("%d",&n);for(i=1;i<=n;i++) { printf("v[%d]= ",i); scanf("%d",&v[i]); }test=0; for(i=1;i<=n-1;i++) for(j=i+1;j<=n;j++) if(v[i]==v[j]) {test=1; break;}if(test==0) printf("elementele pot forma o multime"); else printf(" elementele nu pot forma o multime ");}

LIMBAJUL PASCALprogram Problema12;var v:array[1..100] of integer; i,j,n:integer; sw:boolean;beginwrite('Introduceti dimensiunea vectorului:');readln(n);for i:=1 to n do begin write('v[',i,']='); readln(v[i]); end; sw:=true; for i:=1 to n-1 do for j:=i+1 to n do if v[i]=v[j] then sw:=false;if sw then writeln('elementele POT forma o multime') else writeln('elementele NU POT forma o multime');end.

Problema nr. 13

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

Page 12: Probleme Pentru Algoritmica Si Programare

12

LIMBAJUL C++#include<stdio.h>#include<string.h>void main(){int n,m,i,j;char s1[20],s2[20],man;printf("Primul cuvant este :");gets(s1);printf("Al doilea cuvant este:");gets(s2);n=strlen(s1);m=strlen(s2);for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(s1[i]>s1[j])

{man=s1[i]; s1[i]=s1[j]; s1[j]=man; }for(i=0;i<m-1;i++) for(j=i+1;j<m;j++) if(s2[i]>s2[j])

{man=s2[i]; s2[i]=s2[j]; s2[j]=man; }if(n!=m) printf("cuvintele nu sunt anagrame");else {int test=1; for(i=0;i<n;i++) if(s1[i]!=s2[i]) {test=0; break;} if(test==1) printf("\n cuvintele sunt anagrame"); else printf("\n cuvintele nu sunt anagrame "); }}

LIMBAJUL PASCAL

program Problema13;var s1,s2:string; i,h:integer;beginwrite('s1=');readln(s1);write('s2=');readln(s2);if length(s1)<>length(s2) then writeln(' cele doua siruri nu sunt anagrame')else begin for i:=1 to length(s1) do begin h:=pos(s1[i],s2); if h<>0 then delete(s2,h,1); end; if s2='' then writeln(' cele doua siruri sunt anagrame') else writeln(' cele doua siruri nu sunt anagrame'); end;end.

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>long p=1;int max,n,i,v[20],f,pf,nr,nrf,factor[20];long produs() {for(i=1;i<=n;i++) p=p*v[i];return p;}void main(){printf("n=");scanf("%d",&n); for(i=1;i<=n;i++) {printf("v[%d]=",i); scanf("%d",&v[i]); }produs(); i=2;while(i<=p) {if(p%i==0) {nr=0; do {p=p/i; nr++; } while(p%i==0); if(nr>max) {factor[1]=i; max=nr; nrf=1; } else if(nr==max) {nrf++; factor[nrf]=i; } }else i++;}printf("puterea maxima a unui fact prim este %d",max);printf("\nsecventa fact de putere maxima");for(i=1;i<=nrf;i++) printf(" \n%d ",factor[i]);}

LIMBAJUL PASCALprogram Problema14;var v:array[1..100] of word; n,i,sw:byte; max,fact,d,t,cont:word;procedure calcul(var x:word;w:word;var q:word);beginwhile x mod w=0 do begin x:=x div w; inc(q); end;end;beginwrite('Introduceti dimensiunea vectorului:');readln(n);for i:=1 to n do begin write('v[',i,']='); readln(v[i]); end;max:=0;fact:=0;d:=2;repeat cont:=0; sw:=0; for i:=1 to n do if v[i]>1 then begin sw:=1; t:=0; calcul(v[i],d,t); inc(cont,t); end; if cont>max then begin max:=cont; fact:=d; end; inc(d);until sw=0;writeln('Puterea maxima: ',max,' factorul: ',fact);end.

Page 13: Probleme Pentru Algoritmica Si Programare

13

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++#include<stdio.h>int n,i,j,a[20][20];int coloana(int x){int test=1; for(i=1;i<n;i++) for(j=i+1;j<=n;j++) if(a[i][x]>a[j][x]) {test=0; break;} return test; }int linie(int x){int test=1; for(i=1;i<n;i++) for(j=i+1;j<=n;j++) if(a[x][i]<a[x][j]) {test=0; break;} return test; }void main(){int k,l;printf("n=");scanf("%d",&n);for(i=1;i<=n;i++) for(j=1;j<=n;j++) {printf("a[%d][%d]=",i,j); scanf("%d",&a[i][j]); }for(k=1;k<=n;k++){ if(linie(k)==1) printf("\n linia %d este ordonata descrescator",k); if(coloana(k)==1) printf("\n coloana %d este ordonata crescator",k);}}

LIMBAJUL PASCALprogram Problema15;var a:array[1..10,1..10] of integer; n,i,j,p:byte;function veriflinie(l:byte):boolean;var j:byte;begin veriflinie:=true; for j:=1 to n-1 do if a[l,j+1]>a[l,j] then veriflinie:=false;end;function verifcoloana(c:byte):boolean;var i:byte;begin verifcoloana:=true; for i:=1 to n-1 do if a[i+1,c]<a[i,c] then verifcoloana:=false;end;beginwrite('Introduceti dimensiunea matricii:'); readln(n);for i:=1 to n do for j:=1 to n do begin write('a[',i,',',j,']='); readln(a[i,j]); end;writeln('Liniile ordonate descrescator sunt:');for p:=1 to n do if veriflinie(p) then write(p,' ');writeln('Coloanele ordonate crescator sunt:');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++#include<iostream.h>#include<string.h>#include<stdio.h>int n,i,j;char a[20][20];void main(){clrscr();printf("n=");scanf("%d",&n);cout<<"\nCuvintele sunt ";for(i=0;i<n;i++) scanf("%s",&a[i]);cout<<"\nSe formeaza rimele \n";for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(strcmp(&a[i][strlen(a[i])-2],&a[j][strlen(a[j])-2])==0) printf("\n %s %s",a[i],a[j]);}

LIMBAJUL PASCALprogram Problema16;var v:array[1..100] of string[25]; n,i,j:byte; p,q:string[2];beginwrite('Introd. numarul de cuvinte: ');readln(n);for i:=1 to n do begin write('v[',i,']='); readln(v[i]); end;writeln('Perechile de cuvinte rime sunt:');for i:=1 to n-1 do for j:=i+1 to n do begin p:=copy(v[i],length(v[i])-1,2);q:=copy(v[j],length(v[j])-1,2); if p=q then writeln(v[i],' ',v[j]); end;end.

Page 14: Probleme Pentru Algoritmica Si Programare

14

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 coloanelorSă se afişeze elementele comune şi poziţia lor de apariţie pe fiecare din liniile respectiv coloanele matricei.

LIMBAJUL C++#include<stdio.h>void main(){int nr,m,n,v[22][22],i,j,k,mi,pe_linie,pe_coloana,yesl,yesc;printf("nr de linii:"); scanf("%d",&m);printf("numarul de coloane"); scanf("%d",&n);for(i=1;i<=m;i++)for(j=1;j<=n;j++) { printf("a[%d][%d]=",i,j); scanf("%d",&v[i][j]); }yesl=0;for(i=1;i<=n;i++) { pe_linie=v[1][i]; nr=1; for(j=2;j<=m;j++) { mi=nr; for(k=1;k<=n;k++) if(v[j][k]==pe_linie) nr++; if(nr-mi>1) nr=mi+1; }if(nr==m) { printf("%d este elem comun liniilor\n",pe_linie); yesl=1; }}if(yesl==0) printf("nu exista un elem comun tuturor liniilor\n");yesc=0;for(i=1;i<=m;i++) {pe_coloana=v[i][1]; nr=1; for(j=2;j<=n;j++) { mi=nr; for(k=1;k<=m;k++) if(v[k][j]==pe_coloana) nr++; if(nr-mi>1) nr=mi+1; } if(nr==n) { printf("%d este elem comun coloanelor",pe_coloana); yesc=1; } }if(yesc==0) printf("nu exista un elem comun tuturor coloanelor\n");}

LIMBAJUL PASCALprogram 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);var j:byte;begin for j:=1 to n do if q=a[l,j] then c:=j;end;procedure coloana(q:integer;c:byte;var l:byte);var i:byte;begin for i:=1 to m do if q=a[i,c] then l:=i;end;beginwriteln('Introduceti dimensiunile matricii:'); write('Linii: ');readln(m);write('Coloane: ');readln(n);for i:=1 to m do for j:=1 to n do begin write('a[',i,',',j,']='); readln(a[i,j]); end;writeln('Elementele comune liniilor si pozitiile acestora sunt:');for p:=1 to n dobegin sw:=0;k:=0; for lin:=2 to m do begin t:=0; linie(a[1,p],lin,t); if t<>0 then begin inc(k); poz[k]:=t; end else sw:=1; end; if sw=0 then begin write('Elem.: ',a[1,p],' pe pozitiile: ',p,' '); for s:=1 to k do write(poz[s],' '); end;end;writeln('Elementele comune coloanelor si pozitiile acestora sunt:');for p:=1 to m dobegin sw:=0;k:=0; for col:=2 to n do begin t:=0; coloana(a[p,1],col,t); if t<>0 then 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.

Page 15: Probleme Pentru Algoritmica Si Programare

.

15

LIMBAJUL C++#include<stdio.h>int n,i,j,a[20][20];int minim(int i){int poz=1,min;//se determina coloana unui element de minim pe linia imin=a[i][1];for(j=2;j<=n;j++) if(min>a[i][j]) { min=a[i][j]; poz=j; }return poz;}int maxim(int j){int poz1=1,max;//se determina linia unui element de maxim pe coloana jmax=a[1][j];for(i=2;i<=n;i++) if(max<a[i][j]) { max=a[i][j]; poz1=i; }return poz1;}void main(){printf("n=");scanf("%d",&n);for(i=1;i<=n;i++) for(j=1;j<=n;j++) {printf("a[%d][%d]=",i,j);scanf("%d",&a[i][j]);}printf("\n matricea este :\n");for(i=1;i<=n;i++) { for(j=1;j<=n;j++) printf("%3d",a[i][j]); printf("\n"); }for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(minim(i)==maxim(j)) printf("\n elementul %d este un punct sa",a[i][j]); }}

LIMBAJUL PASCALprogram Problema18;var a:array[1..10,1..10] of integer; n,i,j,p,q:byte;function minim(l:byte):integer;var j:byte;min:integer;beginmin:=a[l,1];for j:=2 to n do if min>a[l,j] then min:=a[l,j];minim:=min;end;function maxim(c:byte):integer;var i:byte;max:integer;beginmax:=a[1,c];for i:=2 to n do if max<a[i,c] then max:=a[i,c];maxim:=max;end;beginwrite('Introduceti dimensiunea matricii:');readln(n);for i:=1 to n do for j:=1 to n do begin write('a[',i,',',j,']='); readln(a[i,j]); end;writeln('Elementele sa ale matricii sunt:');for p:=1 to n do for q:=1 to n do if (a[p,q]=minim(p)) and (a[p,q]=maxim(q)) then writeln(a[p,q],' pe pozitia: ',p,',',q);end.

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.

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ă.

Page 16: Probleme Pentru Algoritmica Si Programare

16

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 :anabara a vant na lipiese formează ana cu al doilea cuvânt şi al patrulea.

LIMBAJUL C++#include<stdio.h>int p,q,x,j;int prim(int n){int i,test=1;if(n==1) test=0;if(n==2) test=1;for(i=2;i<=n-1;i++) if(n%i==0) { test=0; break; }return test;}void main(){printf("x=");scanf("%d",&x); if(prim(x)==1) {for(j=x+1;j<=2*x;j++) if(prim(j)==1)

{q=j; break; } printf("p=%d si q=%d",x,q); }else { for(j=x-1;j>=2;j--) if(prim(j)==1)

{p=j; break; } for(j=x+1;j<=2*x;j++) if(prim(j)==1)

{q=j; break; } printf("p=%d si q=%d",p,q); }}

LIMBAJUL C++#include<stdio.h>#include<string.h>#include<iostream.h>void main (void){char c[20],a[20][20],s1[20],s2[20];int n,i,j;puts("cuvantul este:");gets(c);printf("n=");//nr de cuvinte din fraza ; scanf("%d",&n);for(i=1;i<=n;i++)

{ printf("Cuvantul cu nr %d este:",i); cin>>a[i]; }

for(i=1;i<=n-1;i++)for(j=i+1;j<=n;j++)

{ strcpy(s1,a[i]); strcpy(s2,a[j]); strcat(s1,s2); if(strcmp(s1,c)==0)

printf("\n cele doua cuvinte sunt %s si %s",a[i],a[j]); }

}

LIMBAJUL PASCALprogram Problema19;var n,q,t:word;function prim(x:word):boolean;var i:word;beginprim:=true;for i:=2 to x div 2 do if x mod i=0 then prim:=false;end;beginwrite('Introduceti numarul:');readln(n);q:=n;while not prim(q) do dec(q);t:=n+1;while not prim(t) do inc(t);writeln('Perechea de valori este: ',q,',',t);end.

LIMBAJUL PASCALprogram Problema20;var v:array[1..100] of string[25]; n,i,j:byte; p:string[50];beginwrite('Introd. numarul de cuvinte: ');readln(n);for i:=1 to n do begin write('v[',i,']='); readln(v[i]); end;write('Introduceti cuvantul de referinta: ');readln(p);writeln('Perechile de cuvinte care concatenate dau ',p,' sunt:');for i:=1 to n-1 do for j:=i+1 to n do if v[i]+v[j]=p then writeln(v[i],' ',v[j]);end.

Page 17: Probleme Pentru Algoritmica Si Programare

17

Problema nr. 21

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

LIMBAJUL C++#include<iostream.h>void main(){int n,c,P;cout<<"n="; cin>>n;P=1;while(n!=0){c=n%10;if (c%2==0) P=P*c;n=n/10;}cout<<"Produsul este egal cu: "<<P;}

LIMBAJUL PASCALprogram Problema21;var n,p:integer;beginwrite('n='); readln(n);p:=1;while n<>0 do begin if (n mod 10) mod 2=0 then p:=p*(n mod 10); n:=n div 10; 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 C++#include<iostream.h>#include<math.h>void main(){int n,S,g,i,j,a;cout<<"n="; cin>>n;S=0;for(i=1;i<=n;i++){cout<<"a=";cin>>a;S+=a;}g=1;for (j=2;j<=sqrt(S);j++)if (S%j==0) g=0;if(g==1) cout<<"Suma este numar prim"; else cout<<"Suma nu este numar prim";}

LIMBAJUL PASCALprogram Problema22;var x,n,s,i:integer; sw:boolean;beginwrite('n='); readln(n);s:=0;for i:=1 to n do begin write('x='); readln(x); s:=s+x; end;sw:=true;for i:=2 to s div 2 do if s mod i =0 then sw:=false;if sw then writeln('suma numerelor ',s,' este un nr.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++#include<iostream.h>#include<math.h>void main(){int n,k;cout<<"n=";cin>>n;k=0;do {n=n/2;k++;}while (n%2==0);if (n==1) cout<<"Numarul este o putere a lui 2"; else cout<<"Numarul nu este o putere a lui 2";}

LIMBAJUL PASCALprogram Problema23;var n,cont,aux:integer;beginwrite('n='); readln(n); cont:=0;aux:=n;while n mod 2 =0 do begin cont:=cont+1; n:=n div 2; end;if n=1 then writeln('numarul ', aux,' este 2 la puterea ',cont) else writeln(' numarul ', aux ,' nu este o putere a lui 2'); end.

Page 18: Probleme Pentru Algoritmica Si Programare

18

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++#include<iostream.h>#include<string.h>void main(){char text[70],c[]="aeiou";int n,i,x=0;cout<<"Introduceti textul: "<<endl;cin.get(text,70);n=strlen(text);for(i=0;i<n;i++)if((strchr(c,text[i])!=0)&&(strchr(c,text[i+1])!=0)){cout<<text[i]<<text[i+1]<<" ";x++;}cout<<endl;cout<<x;}

LIMBAJUL PASCALprogram Problema24;var s:string[70]; cont,i:integer; m:set of char;beginwrite('s='); readln(s);cont:=0;m:=['a','e','i','o','u','A','E','I','O','U'];for i:=1 to length(s)-1 do if (s[i] in m) and (s[i+1] in m) then begin cont:=cont+1; writeln(s[i],' ',s[i+1]); end;writeln('numarul de perechi de vocale consecutive este:',cont);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 C++#include<iostream.h>void main(){int n,s,v[100],i,k;cout<<"n="; cin>>n; s=0;cout<<"k="; cin>>k;for(i=0;i<n;i++){cout<<"inaltime="; cin>>v[i];if(v[i]>k) s++;}cout<<"s="<<s;}

LIMBAJUL PASCALprogram Problema25;var a:array[1..100] of word; h,n,i,cont:integer;beginwrite('numarul de persoane:'); readln(n);for i:=1 to n do begin write('inaltimea persoanei ', i,' este:'); readln(a[i]); end; write('inaltimea citita este:');readln(h); cont:=0; 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 C++#include<iostream.h>void main(){float a[20][20];int i,j,n,m,s;cout<<"n="; cin>>n;cout<<"m="; cin>>m;s=0;for(i=0;i<n;i++)for(j=0;j<m;j++){cout<<"a["<<i<<"]["<<j<<"]="; cin>>a[i][j];if(a[i][j]>0) s++;}cout<<"nr pozitive="<<s;}

LIMBAJUL PASCALprogram Problema26;var a:array[1..20,1..20] of real; i,j,n,m,cont:integer; sw:boolean;beginwrite('n='); readln(n); write('m='); readln(m);for i:=1 to n do for j:=1 to m do begin write('a[',i,',',j,']='); readln(a[i,j]); end;cont:=0;for i:=1 to n do begin sw:=true; for j:=1 to m do if a[i,j]<0 then sw:=false; if sw then cont:=cont+1; end;writeln('numarul de linii cu elem. strict pozitive este:',cont);end.

Page 19: Probleme Pentru Algoritmica Si Programare

19

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.

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.

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++#include<iostream.h>void main(){int v[100],i,j,n,s,max;cout<<"n="; cin>>n;for(i=0;i<n;i++){cout<<"v["<<i<<"]="; cin>>v[i];}max=0;j=0;while(j!=n){s=0; s+=v[j]+v[j+1]; if(s>max) max=s; j++;}cout<<"diferenta maxima="<<max;}

LIMBAJUL C++#include<iostream.h>void main(){int a,v[100],i,j,n,x;cout<<"n=";cin>>n;for(i=0;i<n;i++)cin>>v[i];for(i=0;i<n;i++)if(v[i]%2==0) cout<<v[i]; for(i=n;i>=0;i--)if(v[i]%2!=0) cout<<v[i]; }

LIMBAJUL C++#include<iostream.h>void main(){int v[20],n,i,s=0,nr=0;float m=0;cout<<"n="; cin>>n;for(i=0;i<n;i++){cout<<"v["<<i<<"]="; cinv[i];}for(i=0;i<n;i++) s+=v[i];m=s/n;for(i=0;i<n;i++)if(v[i]>m) nr++;cout<<"nr="<<nr;}

LIMBAJUL PASCALprogram Problema28;var v:array[1..100] of integer; n,i,p:integer;beginwrite('n='); readln(n);for i:=1 to n do begin write('v[',i,']='); readln(v[i]); end; writeln('numerele pare in ordine inversa sunt:'); for i:=n downto 1 do if v[i] mod 2=0 then write(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.

LIMBAJUL PASCALprogram Problema27;var a:array[1..100] of integer; i,n,d:integer;beginclrscr;d:=-maxint;write('n='); readln(n);for i:=1 to n do begin write('a[',i,']=');readln(a[i]); end; for i:=1 to n-1 do if d<(abs(a[i]-a[i+1])) then d:=abs(a[i]-a[i+1]);writeln('diferenta maxima dintre doua elem. consecutive este:',d);end.

LIMBAJUL PASCALprogram Problema29;var a:array[1..100] of integer; n,i,cont:integer; ma:real;beginwrite('n='); readln(n);for i:=1 to n do begin write('a[',i,']='); readln(a[i]); end; cont:=0;ma:=0;for i:=1 to n do ma:=ma+a[i];ma:=ma/n;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.

Page 20: Probleme Pentru Algoritmica Si Programare

20

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 C++#include<iostream.h>void main(){int a[10][10],n,m,i,j;cout<<"n=";cin>>n;cout<<"m=";cin>>m;for(i=1;i<=n;i++)for(j=1;j<=m;j++){cout<<"a["<<i<<"]["<<j<<"]=";cin>>a[i][j];}for(j=1;j<=m;j++) cout<<a[1][j]<<" ";for(i=2;i<=n;i++) cout<<a[i][m]<<" ";for(j=m-1;j>=1;j--) cout<<a[n][j]<<" ";for(i=n-1;i>1;i--) cout<<a[i][1]<<" ";}

LIMBAJUL PASCALprogram Problema30;var a:array[1..100,1..100] of integer; n,m,i,j:integer;beginwrite('n='); readln(n);write('m=');readln(m);for i:=1 to n do for j:=1 to m do begin write('a[',i,',',j,']='); readln(a[i,j]); end;writeln('Afisarea conturului in sens retrograd:');for j:=1 to m do write(a[1,j],' ');for i:=2 to n do write(a[i,m],' ');for j:=m-1 downto 1 do write(a[m,j],' ');for i:=n-1 downto 2 do write(a[i,1],' ');writeln;writeln('Afisarea conturului in sens trigonometric:');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 C++#include<fstream.h>int a[21][21],n;ifstream f("mat.in");int main(){f>>n;int i,j;for(i=1;i<=n;i++)

for(j=1;j<=n;j++) f>>a[i][j];int ok=1;for(i=1;i<=n-1 && ok;i++)

for(j=1;j<=n-i && ok;j++)if(a[1][1]%2!=a[i][j]%2)

ok=0;cout<<(ok==1?"DA":"NU");return 0;}

LIMBAJUL PASCALprogram Problema31;var f:text; a:array[1..10,1..10] of word; n,i,j,ci,cp:byte;beginassign(f,'d:\bp\bin\mat.in'); reset(f);readln(f,n);for i:=1 to n do begin for j:=1 to n do read(f,a[i,j]); readln(f); end;close(f);cp:=0; ci:=0;for i:=1 to n-1 do for j:=1 to n-i do if a[i,j] mod 2 =0 then inc(cp) else inc(ci);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.

Page 21: Probleme Pentru Algoritmica Si Programare

21

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.

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 C++#include<fstream.h>#include<ctype.h>int a[32];char c;ifstream f("text.in");ofstream g("text.out");int main(){f>>c;while(!f.eof()){

if (isalpha(c))a[toupper(c)-65]++;

f>>c;}

for(int i=0;i<26;i++) if(a[i]) g<<(char)(i+65)<<' '<<a[i]<<endl;return 0;}

LIMBAJUL PASCALprogram Problema33;var f,g:text; c:char; v:array[1..256] of word; i:byte;beginassign(f,'d:\bp\bin\text.in'); assign(g,'d:\bp\bin\text.out');reset(f); rewrite(g);for i:=ord('A') to ord('Z') do v[i]:=0;while not(eof(f)) do begin while not(eoln(f)) do begin read(f,c); if c<>' ' then inc(v[ord(upcase(c))]); end; readln(f); end;close(f);for i:=ord('A') to ord('Z') do if v[i]<>0 then writeln(g,chr(i),' ',v[i]);close(g);end.

LIMBAJUL C++#include<iostream.h>int n;int nr_div(int n){int nd=1;for(int i=1;i<=n/2;i++)

if(n%i==0) nd++;return nd;}int main(){cin>>n;int i,k,puternic=1;k=nr_div(n);for(i=1;i<=n-1&& puternic;i++)

if(k<=nr_div(i))puternic=0;

if(puternic) cout<<"Numarul "<<n<<" este puternic";

else cout<<"Numarul "<<n<<" nu este puternic";return 0;}

LIMBAJUL PASCALprogram Problema32;var n,t,j:word; sw:string[25];function nr(x:word):word;var q,i:word;beginq:=2;for i:=2 to x div 2 do if x mod i=0 then inc(q);nr:=q;end;beginwrite('Introduceti numarul:');readln(n);sw:='PUTERNIC';t:=nr(n);for j:=1 to n-1 do if nr(j)>=t then sw:='NU ESTE PUTERNIC';writeln(sw);end.

Page 22: Probleme Pentru Algoritmica Si Programare

22

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 C++#include<fstream.h>ifstream f("frecv.in");ofstream g("frecv.out");struct nod

{int info,fr; nod *next;}*p,*u;

int n,a;nod* cauta(nod *p,int n){for(nod*c=p;c;c=c->next)

if(c->info==n) return c;return 0;}void adauga(nod *&p,int n){nod *c;c=new nod;c->info=n; c->fr=1;c->next=p;p=c;}void listare(nod *p){for(nod *c=p;c;c=c->next) g<<c->info<<"->"<<c->fr<<endl;}int main(){f>>n;for(int i=1;i<=n;i++){

f>>a; nod *c=cauta(p,a); if(c) c->fr++; else adauga(p,a); }

listare(p);return 0;}

LIMBAJUL PASCALprogram Problema34;type ref=^inr; inr=record nr:integer; ap:byte; adr:ref; end;var b,c,d:ref; f,g:text; x:integer; n,i:word;procedure creare;beginnew(b);c:=b;d:=b;c^.nr:=x;c^.ap:=1;c^.adr:=nil;end;procedure adaug;var sw:byte;beginif b=nil then creare elsebeginsw:=0;c:=b;while c<>nil dobegin if c^.nr=x then begin inc(c^.ap); sw:=1; end; c:=c^.adr;end;if sw=0 then begin new(c); c^.nr:=x; c^.ap:=1; d^.adr:=c; d:=c; d^.adr:=nil; end;end;end;beginassign(f,'d:\bp\bin\frecv.in'); assign(g,'d:\bp\bin\frecv.out');reset(f);rewrite(g);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.

Page 23: Probleme Pentru Algoritmica Si Programare

23

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ă.

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.

LIMBAJUL C++#include<iostream.h>int n,m,p,a[101],b[101],c[101];void citeste(int x[101],int &k){cin>>k;for(int i=1;i<=k;i++) cin>>x[i];}int apartine(int x[101],int k,int nr){for(int i=1;i<=k;i++)

if(x[i]==nr) return 1;return 0;}int main(){citeste(a,n);citeste(b,m);memcpy(c,b,sizeof(b));p=m;for(int i=1;i<=n;i++)

if(!apartine(b,m,a[i])) c[++p]=a[i];for(i=1;i<=p;i++)

cout<<c[i]<<' ';return 0;}

LIMBAJUL PASCALprogram Problema35;type vector=array[1..200] of word;var a,b,c:vector; n,m,k,i:byte;function exista(x:word;q:vector;z:byte):boolean;var h:byte;beginexista:=false;for h:=1 to z do if x=q[h] then exista:=true;end;beginwrite('Introd. dimens. primului vector: '); readln(m);for i:=1 to m do begin write('a[',i,']='); readln(a[i]); end;write('Introd. dimens. celui de-al doilea vector: '); readln(n);for i:=1 to n do begin write('b[',i,']='); readln(b[i]); end;k:=1; c[k]:=a[1];for i:=2 to m do if not exista(a[i],c,k) then 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.

Page 24: Probleme Pentru Algoritmica Si Programare

24

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.

Problema nr. 38 Se consideră un tablou bidimensional a cu n linii şi n coloane (1 ≤n ≤50) componente întregi. Se cere ca 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 C++#include<fstream.h>#include<ctype.h>int n;char c;ifstream f("sir.in");int main(){f>>n;f.get(c);int nr=0;while(!f.eof()){

nr++;if(c=='\n'){cout<<nr<<endl; nr=0;}f>>n;f.get(c);}

cout<<nr+1;return 0;}

LIMBAJUL C++#include<iostream.h>#include<string.h>struct pers{char nume[30];

int varsta;}a[30];int n;int main(){int i,j,ord;cin>>n;for(i=1;i<=n;i++)

{cin.get();cin.get(a[i].nume,30);cin>>a[i].varsta;}

do{ ord=1;for(i=1;i<n;i++)if(strcmp(a[i].nume,a[i+1].nume)>0) {pers aux=a[i]; a[i]=a[i+1]; a[i+1]=aux; ord=0;}

}while(!ord);for(i=1;i<=n;i++)

cout<<'('<<a[i].nume<<','<<a[i].varsta<<") ";return 0;}

LIMBAJUL PASCALprogram Problema36;var f:text; x:integer; cont:word;beginassign(f,'d:\bp\bin\sir.in');reset(f);writeln('Numarul de valori de pe fiecare rand este:');while not eof(f) do begin cont:=0; while not eoln(f) do begin read(f,x); inc(cont); end; writeln(cont); readln(f); end;close(f);end.

LIMBAJUL PASCALprogram Problema37;uses crt;type pers=record nume:string[20]; varsta:byte; end;var v:array[1..100] of pers; n,i,sw:byte; aux:pers;beginwrite('Introd. nr de persoane: ');readln(n);for i:=1 to n do begin write('Nume: '); readln(v[i].nume); write('Varsta: '); readln(v[i].varsta); end;repeat sw:=0; for i:=1 to n-1 do if v[i].nume>v[i+1].nume then begin aux:=v[i]; v[i]:=v[i+1]; v[i+1]:=aux; sw:=1; end;until sw=0;writeln('Lista alfabetica este:');for i:=1 to n do writeln(v[i].nume,' ',v[i].varsta);end.

Page 25: Probleme Pentru Algoritmica Si Programare

25

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).

LIMBAJUL C++#include <iostream.h>int n,a[5][5];void citire(){cout<<”n=”;cin>>n;for (int i=1;i<=n;i++)for (int j=1;j<=n;j++){cout<<"a["<<i<<","<<j<<"]=";cin>>a[i][j];}}void schimba_l(int i,int j){int k,aux;for(k=1;k<=n;k++){aux=a[k][j];a[k][j]=a[k][i];a[k][i]=aux;}}void schimba_c(int i,int j){int k,aux;for(k=1;k<=n;k++){aux=a[j][k];a[j][k]=a[i][k];a[i][k]=aux;}}void scrie(){for( int i=1;i<=n;i++){cout<<endl;for(int j=1;j<=n;j++) cout<<a[i][j]<<" ";}}void main(){ citire(); int ok,i,j,k=1; do{ ok=1; for(i=1;i<=n-k;i++)

if(a[i][i]>a[i+1][i+1]){ok=0;schimba_l(i,i+1);

schimba_c(i,i+1);} k++; }while(!ok); scrie();}

LIMBAJUL PASCALprogram Problema38;var a:array[1..10,1..10] of integer; n,i,j,sw:byte;procedure schimblinii(x,y:byte);var r:byte; aux:integer;beginfor r:=1 to n do begin aux:=a[x,r];a[x,r]:=a[y,r]; a[y,r]:=aux; end;end;procedure schimbcoloane(x,y:byte);var r:byte; aux:integer;beginfor r:=1 to n do begin aux:=a[r,x];a[r,x]:=a[r,y];a[r,y]:=aux; end;end;beginwrite('Dimensiunea matricii: ');readln(n);for i:=1 to n do for j:=1 to n do begin write('a[',i,',',j,']='); readln(a[i,j]); end;repeat sw:=0; for i:=1 to n-1 do if a[i,i]>a[i+1,i+1] then begin schimblinii(i,i+1); schimbcoloane(i,i+1); sw:=1; end;until sw=0;writeln('Matricea dupa ordonarea DP este:');for i:=1 to n do begin for j:=1 to n do write(a[i,j],' '); writeln; end;end.

Page 26: Probleme Pentru Algoritmica Si Programare

26

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.

LIMBAJUL C++#include<iostream.h>int v[100],n,k;void citire(){cout<<"n=";cin>>n;cout<<"k=";cin>>k;for (int i=1;i<=n;i++){cout<<"v["<<i<<"]=";cin>>v[i];}}void ordonare_c(int i,int j){int aux,ok,q=1;do{ok=1; for (int u=i;u<=j-q;u++) if (v[u]>v[u+1]) {aux=v[u];v[u]=v[u+1];v[u+1]=aux;ok=0;}q++;}while (!ok);}void ordonare_d(int i,int j){int aux,ok,q=1;do{ok=1; for (int u=i;u<=j-q;u++) if (v[u]<v[u+1]) {aux=v[u];v[u]=v[u+1];v[u+1]=aux;ok=0;}q++;}while (!ok);}void main(){citire();ordonare_c(1,k);ordonare_d(k+1,n);for(int i=1;i<=n;i++) cout<<v[i]<<" ";}

LIMBAJUL PASCALprogram Problema39;type vector=array[1..100] of integer;var i,k:byte; x:vector; n:byte;procedure citire(var x:vector;var y:byte);var i:byte;begin write('Dimens. vectorului: '); readln(y); for i:=1 to y do begin write('x[',i,']='); readln(x[i]); end;end;procedure sortare(a,b:byte);var sw:byte; aux:integer;beginif a=1 thenrepeat sw:=0; for i:=a to b-1 do if x[i]>x[i+1] then begin aux:=x[i]; x[i]:=x[i+1]; x[i+1]:=aux; sw:=1; end;until sw=0elserepeat sw:=0; for i:=a to b-1 do if x[i]<x[i+1] then begin aux:=x[i]; x[i]:=x[i+1]; x[i+1]:=aux; sw:=1; end;until sw=0end;beginn:=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.

Page 27: Probleme Pentru Algoritmica Si Programare

27

LIMBAJUL C++#include<iostream.h>#include<math.h>int v[100],n,dmax;void citire(){ cin>>n;for (int i=1;i<=n;i++){cout<<"v["<<i<<"]=";cin>>v[i];}}int nrdiv(int x){int i,nd=0;for(i=1;i<sqrt(x);i++) if (x%i==0) nd=nd+2;return nd;}void main(){citire();dmax=0;for(int i=1;i<=n;i++) if (dmax<nrdiv(v[i])) dmax=nrdiv(v[i]);for (i=1;i<=n;i++) if (dmax==nrdiv(v[i])) cout<<v[i]<<" ";}

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: '); readln(y); for i:=1 to y do begin write('x[',i,']='); readln(x[i]); end;end;

function nr(q:word):word;var a,i:word;begina:=2;for i:=2 to q div 2 do if q mod i=0 then inc(a);nr:=a;end;

beginclrscr;n:=0;citire(x,n);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.

Page 28: Probleme Pentru Algoritmica Si Programare

PROBLEME PENTRU BAZE DE DATEMODULUL 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

Page 29: Probleme Pentru Algoritmica Si Programare

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şiINDEX 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 varComanda 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

Page 30: Probleme Pentru Algoritmica Si Programare

ReadComanda @...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

Page 31: Probleme Pentru Algoritmica Si Programare

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_alist? ‘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_blist

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 elevi1list? ‘Continutul fisierului ELEVI1 fara elevii din clasa a XII-a’delete for occurs("XII",upper(clasa))=1listpack

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 venitlistselect sum(suma) as cheltuieli_total from evidenta where chelt_ven=.F. into table cheltlistclose alluse evidentacalculate sum(suma) for chelt_ven=.F. to total_cheltuielicalculate sum(suma) for chelt_ven=.T. to total_venituriif (total_cheltuieli>total_venituri)? ‘Persoana a imprumutat ‘ ,total_cheltuieli-total_veniturielse if (total_cheltuieli<total_venituri)? ‘Persoana a economisit ‘ ,total_venituri- total_cheltuielielse

31

Page 32: Probleme Pentru Algoritmica Si Programare

? ‘Persoana a cheltuit exact cat a castigat ‘endifendifuse

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 d1Input 'Data d2' to d2use evidentacalculate sum(suma) for chelt_ven=.F. and between (data,d1,d2)=.T. to total_cheltuielicalculate 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 rezultateuse rezultatecalculate max(suma) to suma_maximaselect suma,luna from rezultate where suma=suma_maxima into table rez1? 'Luna cu venitul maxim'listclose all use rezultatecalculate min(suma) to suma_minimaselect suma,luna from rezultate where suma=suma_minima into table rez2? 'Luna cu venitul minim'listclose 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 stocuriclearlistreplace all valoare with cant*pret_ulist input 'Introduceti numarul depozitului' to xcalculate sum(valoare) for depozit=x to val_totala? 'valoarea totala din depozitul ',x,' este ',val_totalause

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

Page 33: Probleme Pentru Algoritmica Si Programare

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 rezultatelist ? ‘Depozitele fara niciun material ’list for val_depo=0select sum(cant) as val_cant ,denumire from stocuri group by denumire into table rezultatelist? ‘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 xuse stocuri? 'Continutul fisierului inainte de ieftinire'listreplace 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 'listuse

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 stocuriinput 'Introduceti numele materialului' to xdelete for denumire=xlistpack? 'Stocurile dupa stergerea materialului ',xlistinput 'Introduceti numele materialului' to yreplace all pret_u with pret_u+pret_u*0.5,valoare with cant*pret_u for denumire=y? 'Materialul ' ,y, ' scumpit 'listuse

33

Page 34: Probleme Pentru Algoritmica Si Programare

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’listSELECT 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 mSELECT 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 ‘,mlistSELECT count(cod_pers) as nr_auto,marca from automobile group by marca into table rezultatelistcalculate max(nr_auto) to maxim? ‘marca de automobil cu cele mai multe automobile ‘list nr_auto,marca for nr_auto=maximcalculate 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 xselect 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

Page 35: Probleme Pentru Algoritmica Si Programare

listselect 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 rezultatlist

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 xselect 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 ',xlist 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

Page 36: Probleme Pentru Algoritmica Si Programare

select count(cod_carte) from imprumut where cod_carte=x into table rezlist? '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 rezultatlist

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 rezultatlist input 'Introduceti data imprumutului!' to x? 'adresa cititorilor care au imprumutat carti pe data de ',xselect c.localitate,i.data_impr from cititori c,imprumut i where c.cnp=i.cnp and i.data_impr=x into table rezultatlist

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 rezultatlist? '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_imprumuturicalculate min(nr_imprum) to impr_minselect 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 rezultatlist

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

Page 37: Probleme Pentru Algoritmica Si Programare

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 cititoriindex on nume to ialfabeticlist? '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 rezultatlist

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 rezultatlist? ‘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 rezultatlist

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 mediireplace 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

Page 38: Probleme Pentru Algoritmica Si Programare

listselect 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'listinput 'Introduceti disciplina' to xdelete for disciplina=xpack? 'Continutul fisierului RAPORT dupa stergerea inregistrarilor aferente disciplinei ' ,xList

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 informatiilistclose alluse elevireplace 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 elevireplace all medie with (mediescris+medieoral)/2replace all promovat with "da" for medie>=5 replace all promovat with "nu" for medie<5

SORT TO ord ON medie /DUSE ordDISPLAY ALL FIELDS nume,prenume,medie,promovat

38

Page 39: Probleme Pentru Algoritmica Si Programare

Problema nr. 22Să 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.dbfCOPY TO promovat FIELDS nume,prenume,clasa,medie FOR medie>=5USE elevi.dbfCOUNT TO a FOR medie<5DECLARE matrice (4)[a,4]))COPY TO ARRAY matrice FIELDS nume,prenume,clasa FOR medie<5CREATE TABLE nepromovat (nume c(15),prenume c(20),clasa c(5),nrcorig n(1))USE nepromovatAPPEND FROM ARRAY matrice?'Cei promovati sunt:'?USE promovatDISPLAY ALL ?'Cei nepromovati sunt:'?USE nepromovatDISPLAY ALL

Problema nr. 23Să 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 alocatiiCOPY STRUCTURE TO au.dbf FIELDS nume,prenume,dn,sexCOUNT 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 auAPPEND FROM ARRAY matriceLIST

SORT TO aloc ON nume,prenume ASCENDING USE alocLIST

Problema nr. 24Să 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

Page 40: Probleme Pentru Algoritmica Si Programare

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.dbfcâ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.dbfCOUNT 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.dbfAPPEND FROM ARRAY matrice?'BAZA FETELOR'DISPLAY ALLWAIT* 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 ALLAnalog pt baieti?'Fete:'?USE feteDISPLAY ALL ?'Baieti:'?USE baietiDISPLAY ALL

Problema nr. 25Să 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 alocLIST

Problema nr. 26Să 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

Page 41: Probleme Pentru Algoritmica Si Programare

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 OFFUSE atestatDELETE ALL FOR (mediescris<5).or.(medieoral<5).or.(medie<5)LISTSET DELETED ON SORT TO ramasi ON medie /d FIELDS nume,prenume,medieUSE ramasiLISTSET DELETED OFF

Problema nr. 27Să 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 eleviAVERAGE medie TO x1?x1AVERAGE medie TO x2 for clasa='12a'?'media clasei 12a', x2?'Clasa 12A'COUNT TO y FOR (medie<x2)and(clasa='12A')?y

Problema nr. 28Să 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. 29Să 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

Page 42: Probleme Pentru Algoritmica Si Programare

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 nReadList valoare for nume=n and achitat=’da’COUNT FOR achitat=’nu’ TO x?’numarul de restantieri’, x

Problema nr. 30Să 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.

Rezolva re list nume, prenume,valoare for achitat=’nu’

SUM valoare FOR achitat=’nu’ to x ?’suma totala restanta’, x

Problema nr. 31Se considera baza de date BIBLIO.DBF cu urmatoarea structura:

Nr_legitim: N,3- numărul de legiţimatie al cititoruluiNume: C,20- numele cititoruluiNr._inv. : N,3- numărul de inventar al cărţii împrumutateData_imprum: D- data împrumutului cărţiiTitlu: C,15- titlul cărţiiAutor : C,15- autorul cărţiiEditura : C,15- editura cărţiiPret: N,10- preţul cărţiiAn_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 xGo topLocate for nr_inv=x?Iif(found()=.t.,nume,"cartea nu e imprumutata")Sort to fis on an_aparitiUse fisTotal to fis1 on an_aparitiUse fis1Calculate max(cod) to aBrowse fields an_apariti for cod=a

42

Page 43: Probleme Pentru Algoritmica Si Programare

Problema nr. 32 Se consideră baza de date BIBLIO.DBF cu urmatoarea structură:

Nr_legitim: N,3- numărul de legiţimatie al cititoruluiNume: C,20- numele cititoruluiNr._inv. : N,3- numărul de inventar al cărţii împrumutateData_imprum: D- data împrumutului cărţiiTitlu: C,15- titlul cărţiiAutor : C,15- autorul cărţiiEditura : C,15- editura cărţiiPret: N,10- preţul cărţiiAn_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 1990c) 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. 33O 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\12aUSE bolnavSORT TO fis ON grupaUSE fisTOTAL TO fis1 ON grupaUSE fis1BROWSECALCULATE MAX(cod) TO aBROWSE FIELDS grupa FOR cod=aUSE bolnavSORT TO fis ON diagnosticUSE fisTOTAL TO fis1 ON diagnosticUSE fis1SORT TO fis2 ON numeUSE fis2BROWSE 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

Page 44: Probleme Pentru Algoritmica Si Programare

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 xBROWSEUSE bolnavBROWSECALCULATE CNT() FOR diagnostic='artrita' AND grupa='AB4'SORT TO fis ON grupaUSE fisTOTAL TO fis1 ON grupa FOR diagnostic='anemie'USE fis1CALCULATE MAX(cod) TO aBROWSE 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>5REPLACE ALL admis with.F. FOR proba1<5 or proba2<5 or proba3<5REPLACE 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 aaccept"nume gresit" to bGO topLOCATE FOR nume_pren=bREPLACE nume_pren WITH aLIST 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

Page 45: Probleme Pentru Algoritmica Si Programare

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))>7SORT TO admisi.dbf ON Media/d,nume_pren/A FOR Admis=.T.USE admisi.dbfBROWSESORT TO respinsi.dbf ON nume_pren/A FOR Admis=.F.USE respinsi.dbfBROWSECALCULATE CNT() TO aUSE D:\Lucru\admisi.dbfCALCULATE CNT() TO bCALCULATE avg(media)

Problema nr. 37Să 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>=5REPLACE ALL media WITH (proba1+proba2+proba3)/3 FOR admis=.T.SORT TO fis ON nume_pren /AUSE fisBROWSEUSE capacitateBROWSESORT TO fis1 ON media /dUSE fis1BROWSEUSE capacitateCALCULATE CNT() FOR MONTH(data_n)=11COPY TO neadmisi.dbf FOR admis=.F. AND (proba1>=8 OR proba2>=8 OR proba3>=8)USE neadmisiBROWSE

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

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

45

Page 46: Probleme Pentru Algoritmica Si Programare

Rezolvare use eleviwait "a) Afisati nume,nota1,nota2,media:"list nume,nota1,nota2,(nota1+nota2)/2select nume,nota1,nota2,(nota1+nota2)/2 as media from eleviwait "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 candidatNotar (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 ccalculate avg((notar+notam)/2) to m for clasa=c?c," media generala=",mwait "2)"list for notar>=8 and notam>=8wait "3)"calculate max(notar) to r?rcalculate 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.DBFcodv (N(2)) Cod vagoncodt (N(2)) Codul trenului de care este atasat vagonultipv (N(1)) Tipul vagonului/ clasa; ex: 1 sau 2locurit (N(2)) Numarul total de locuri al vagonuluiPerechea (codv, codt) este unică.LOCURI.DBFcodt (N(2)) Codul trenului de care este atasat vagonulcodv (N(2)) Cod vagonlocuriv (N(2)) Numarul de locuri vandute din vagondata (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

Page 47: Probleme Pentru Algoritmica Si Programare

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 dataselect 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 datawait "punctul 2) "input "cod tren=" to ctselect 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 numeb. 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

Page 48: Probleme Pentru Algoritmica Si Programare

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.prenumeb) 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 descb) 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

Page 49: Probleme Pentru Algoritmica Si Programare

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. 6Un 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. 7Un 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. 8Un 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. 9Un magazin are baza de date formată din tabelele:

49

Page 50: Probleme Pentru Algoritmica Si Programare

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. 10Un 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 numeb) 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.11O 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”.

Rezolvarea) 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. 12O 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.

Rezolvarea) SELECT count(nume) FROM firmeb) 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

Page 51: Probleme Pentru Algoritmica Si Programare

Problema nr. 13Se 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 ?

Rezolvarea) SELECT * FROM prodb) SELECT nume, datav FROM client, vanzare WHERE loc=’Galati’ AND client.codcli=vanzare.codcli

Problema nr. 14Se 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?

Rezolvarea) SELECT * FROM prodb) 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. 15Se 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 ?

Rezolvarea) SELECT culoare FROM prod WHERE den=’vopsea’ ORDER BY pretb) 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. 16Se dă baza de date :Prod (codp, den, culoare, stoc, pret)Client (codcli, nume, loc)Vanzare (codp, codcli, cant, datav)Se cere:

51

Page 52: Probleme Pentru Algoritmica Si Programare

a) Care este lista tuturor produselor cu stoc 0 ?b) Care este cantitatea maximă de vopsea cumpărată de fiecare client ?

Rezolvarea) SELECT * FROM prod WHERE stoc=0b) 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. 17Se 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’.

Rezolvarea) SELECT * FROM elevi WHERE absn>60b) 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.

Rezolvarea) 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. 19Fie 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 ?

Rezolvarea) 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. 20Administratorul 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

Page 53: Probleme Pentru Algoritmica Si Programare

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 ?

Rezolvarea) SELECT nume FROM descrieri WHERE pret BETWEEN 100 and 200b) 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. 21La 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 cartib) select a.titlu, a.autor from carti a, cititori b where a.id_carte=b.id_carte and nume=’Ionescu Mihai’

Problema nr. 22La 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, prenumeb) select nume, prenume, telefon from cititori where telefon like ’__2%’

Problema nr. 23La maternitate exista urmatoarele tabele:bebe(nume, prenume, data, cod)unde cod este codul copilului data este data nasterii copilului cods este codul spitaluluiparinti(nume, prenume, cod, prenm unde nume si prenume sunt numele si prenumele tatalui prenma este prenumele mameispitale(cods, dens)unde dens este numele spitalului

53

Page 54: Probleme Pentru Algoritmica Si Programare

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_nasteriib) select p.nume, c.prenume_copil, c.data_nasterii from persoane p, copii c where p.id_persoana=c.id_persoana

Problema nr. 25Informatiile 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<=3b) 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)/3b) select count(nume_antrenor) from antrenori

Problema nr. 27

54

Page 55: Probleme Pentru Algoritmica Si Programare

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 tarab) select a.nume_antrenor, s.nume_sportiv from sportivi s, antrenori a where s.tara=a.tara

Problema nr. 28Se 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 tarab) delete from sportivi where (nota1+nota2+nota3)/3<5.

Problema nr. 29Fie 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 elevib) select nume from elevi where media =(select max(media) from elevi)

Problema nr. 30Fie 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 > 8b) select clasa, count(nume) from elevi where media between 5 and 6 group by clasa

55

Page 56: Probleme Pentru Algoritmica Si Programare

Problema nr. 31Se 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, denumireb) 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. 32Se 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 produseb) 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. 33Se 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 produseb) select numecl, denumire from produse p, clienti c where p.idpr=c.idprc) select distinct numef from produse p, furnizori f where p.idfurn=f.idfurn

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

56

Page 57: Probleme Pentru Algoritmica Si Programare

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. 35Se 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.idprb) select localitate, numef from furnizori order by localitate, numefc) select numecl, max(pret) from clienti c, produse p where p.idpr=c.idpr group by numecl

Problema nr. 36Se 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_depb) select job_id, nume from angajati order by job_id, numec) select nume, denumire from departamente d, angajati a where d.id_dep=a.id_dep and d.manager_id=a.id_ang

Problema nr. 37Se 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

Page 58: Probleme Pentru Algoritmica Si Programare

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_depc) select nume from angajati where id_dep=(select id_dep from angajati where nume='Popescu')

Problema nr. 38Se 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. 39La 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. 40La 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

Page 59: Probleme Pentru Algoritmica Si Programare

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

Page 60: Probleme Pentru Algoritmica Si Programare

Cuprins

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

60