3
INSPECTORATUL ŞCOLAR JUDEŢEAN GALAŢI
ASOCIAŢIA PROFESORILOR DE INFORMATICĂ
“TUDOR SORIN ” DIN GALAŢI
REVISTA DE INFORMATICĂ
(iM)PULS ++
4
(Re)Descoperim. (Re)Inventăm.
La ONI 2009 s-a creat (IM)PULS++.
A prins PULS-ul olimpiadei: aşteptări, impresii, rezultate, premii, proiecte de viitor.
Ucenicii jurnalişti au pornit cu emoţie “pe teren”. S-au înarmat cu “tehnica” necesară şi au
aşteptat ieşirea de la proba scrisă a gimnaziştilor şi a liceenilor pasionaţi de informatică şi foarte bine
pregătiţi în domeniu.
Cu primul interviu, greul a trecut. La primul articol, cuvintele nu se lasau înduplecate prea
uşor să puncteze esenţialul, să surprindă emoţia concurenţilor, satisfacţia reuşitei, motivaţia pentru
viitor.
“Redacţia” a lucrat aproape nonstop la procesarea informaţiilor, la aranjarea în pagină, la
echilibrul dintre imagine şi cuvânt. S-a lucrat în plină atmosferă de concurs, simţeam şi noi tensiunea
de a face alegerea cea mai bună. De aici şi farmecul activităţii.
I-am observat pe tinerii “reporteri” cum devin din ce în ce mai pasionaţi de ceea ce fac, cum
îşi perfecţionează stilul de lucru, cum caută “scânteia” care să ţină trează atenţia cititorilor revistei.
Cu toţii aşteptam lansarea fiecărui număr în format electronic. Serile s-au încheiat foarte
târziu, abia după ce am răsfoit noul număr –la cald. Unii şi-au descoperit pasiuni, aptitudini în
domeniu, alţii au hotărât deja că jurnalismul este o opţiune pentru carieră; sigur s-au consolidat
prietenii şi experienţa a devenit o amintire plăcută.
La un an de la această ucenicie, suntem gata de a continua.
Din (IM)PULS-ul de la ONI, vrem să devină (IM)PULS-ul pentru performanţă.
Ne dorim să fie o revistă de opinie şi de informaţie interdisciplinară.
De la informatică să ajungem la ... infopoezie.
De la informaţie –la infodivertisment.
De la infoconcursuri –la infointerviuri cu specialişti.
Pe scurt,
inforevista noastră,
a celor interesaţi de rolul
INFO (informaticii / informaţiei / infoeducaţiei)
în devenirea tinerei (info)generaţii.
Punem un “+” pentru latura informativă şi un alt “+ “pentru cea infocreativă.
Aşadar, dorim (info)succes noii serii a revistei (IM)PULS++!!!
Aşteptăm colaboratori la fel de motivaţi ca ucenicii jurnalişti de la ONI!
Cu (IM)PULSUL INFO eşti la curent cu ...
Informaţia. Noutăţile. Formulele. Oportunităţile.
prof. Cătălina Burlacu
prof. Daniela Nistor, CNVA
5
PROBLEME REZOLVATE, CLASA A X-A
1. ASD(sfat: numele problemei nu are legătura cu textul sau rezolvarea acesteia )
Se spune că demult, în regiunea geto-dacilor, exista un băiat numit Deceneu. Între timp, acesta
fiind foarte isteţ a fost numit de Burebista înţeleptul dacilor. Cu timpul, acesta a rezolvat diferitele
probleme de care s-a lovit Burebista. Astfel Burebista a găsit o metoda prin care să-l elimine dintr-o
singură suliţă aruncată pe conducătorul inamicilor. Pentru asta, el trebuia să afle doar poziţia acestuia.
Burebista a aflat de la Deceneu că fiecare inamic are asociată câte o cifră şi un număr de ordine, iar
pentru a-l găsi pe lider trebuie parcurs şirul inamicilor şi eliminat unul cate unul mergând de la stânga
la dreapta din p în p luptători până rămane unul. În cazul în care se ajunge în capătul din dreapta al
şirului de luptători se continuă numărătoarea mergând în sens invers de la dreapta la stanga etc.
Cerinţă
Să se determine cifra asociată liderului inamic şi numărul său de ordine în şirul iniţial
Date de intrare
În fişierul asd.in se găsesc:
pe prima linie se află pasul p cu semnficaţiile din problemă;
n cifre reprezentând numărul inamicilor. Între cifre nu există spaţii.
Date de iesire
Pe prima linie a fişierului asd.out se vor găsi cifra corespunzătoare şefului din tribul inamic şi
numărul său de ordine.
Restricţii şi precizări
1 < p < 1000;
Pentru 30% din teste numărul cifrelor este <10
Pentru 40% din teste numărul cifrelor este >10 si <15000
Pentru 30% din teste numărul cifrelor este >15 000 si <25000
Exemplul 1
asd.in asd.out
3
82345
8 1
Explicaţie:
82345 – pornind de la 8 spre dreapta se elimină a 3-a cifră. Se obţine: 8245.
8245 – se continuă de la 4 spre dreapta se ajunge la ultima cifră (5) şi se schimbă sensul, a 3-a cifră
fiind 4 care se elimină. Se obţine: 825
825 – pornind de la 2 spre stânga se ajunge la prima cifra (8) şi se schimbă sensul, a 3-a cifră fiind 2.
Se obţine: 85
85 – se continuă de la 5 şi reluând spre stânga (fiind ultima cifră se schimbă sensul) se ajunge la prima
cifră(8) . Se schimbă sensul, urmând ca a 3 a cifră să fie 5 care se elimină. Va ramane cifra 8. Aceasta
are numărul de ordine 1 în şirul iniţial.
Exemplul 2
asd.in asd.out
4
17438
7 2
Observaţie: prima cifră din stânga are numărul de ordine 1, a doua cifră din stânga are numărul de
ordine 2 etc.
Problemă propusă de Vlad Radu- clasa a XI-a B CNMK
Profesor coordonator: Neagu Violeta CNMK
REZOLVĂRI PROBLEME
6
Rezolvare
#include<fstream.h>
#include<conio.h>
#include<iostream.h>
int main()
{int n,j,p,i,k,i1,ok;
char s[100];
fstream f("asd.in",ios::in);
fstream g("asd.out",ios::out);
f>>p;
i=1;
while(f>>s[i]) i++;
n=i-1;
i=1;j=0;i1=1;ok=1;
while(i1!=n)
{ if(s[i]!=' ')
j++;
if(j==p)
{ j=0;s[i]=' ';
if(i==n)
{while(s[n]==' ') n--;
i=n;ok=0;}
if(i==i1)
{while(s[i1]==' ')i1++;
i=i1;ok=0;}
}
if(i==n) k=-1;
else
if(i==i1) k=1;
if(ok==1) i=i+k;
else ok=1;}
g<<s[i1]<<' '<<i1; return 0;}
2. CHEIA Pentru a sparge sistemul de securitate al unui calculator, un hacker trebuie să-şi construiască un
program care va trebui să “spargă” un număr n de nivele de securitate. Printr-un nivel de securitate se
înţelege o secvenţă de numere indexate ce conţine cheia către nivelul următor.
Numărul de valori dintr-un nivel de securitate este egală cu valoarea cheii găsită pe nivelul
anterior.
Ca programul hackerului să găsească cheia pentru nivelul de securitate următor, el trebuie să
parcurgă toată secvenţa de numere de pe nivelul curent începând cu valoare de indice unu. În
continuare se avansează în cadrul aceluiaşi nivel de securitate la elementul al cărui indice se obţine
adunând de fiecare data valoarea elementului curent la indicele pe care îl deţine această valoare.
Ultima valoare parcursă din nivelul curent de securitate este cheia pentru a accesa nivelul următor.
Cunoscând aceste lucruri, hackerul ştie că nu poate ajunge la cheia finală, necesară pentru a
sparge sistemul de securitate, fără a cunoaşte cheia iniţială şi numărul de nivele de securitate, aşa că el
a investigat în continuare şi a reuşit sa găsească cele 2 valori.
Pentru fiecare test, se asigura o soluţie validă.
Cerinţă:
Să se scrie un program C++ ce parcurge cele n nivele de securitate si obţine cheia finală.
Date de intrare:
Pe prima linie din fişierul CHEIE.IN se vor găsi 2 numere naturale: n (reprezentant numărul de nivele
de securitate) 1<=n<=40 si k (reprezentând cheia iniţială a primului nivel de securitate) 2<=k<=40.
Pe a doua linie din fişier se vor găsi numerele naturale din cele n nivele de securitate (numerele vor fi
cuprinse in intervalul [-40,40] / {0}.
Date de iesire:
Pe prima linie a fişierului se va afişa un singur număr k, ce va reprezenta cheia ultimului nivel de
securitate.
"Pentru a reuşi in viaţă e foarte simplu. Lucraţi tot timpul. Să nu daţi niciodată atenţie orei. Să nu aveţi pendulă în
biroul sau laboratorul dvs. Să nu părăsiţi o lucrare pe care nu aţi terminat-o. Nu munca omoară ci sângele rău."
( T.A. Edison )
7
Exemple:
CHEIE.IN CHEIE.OUT EXPLICATII OBSERVATII
3 5
2 2 2 4 -3 3 1 4 -2
1 2 10 -1
10 Numărul de nivele este 3. Cheia
iniţială este 5, deci primul nivel de
securitate va fi: 2 2 2 4 -3,
Aşadar, cheia nivelului 2 este 4.
Nivelul 2 de securitate: 3 1 4 -2.
Cheia este 4, deci nivelul 3 va fi 1 2
10 -1. Prin parcurgerea ultimului
nivel se va obţine cheia finală, şi
anume: 10.
Datele de intrare se
consideră valide
astfel încât prin
parcurgerea unui
nivel de securitate
nu se poate trece la
nivelul următor
fără determinarea
valorii cheii!
4 4
3 2 -1 -1 1 2 1 3
2 100 -1
100 Cheia iniţială este 4, deci primul
nivel de securitate va fi: 3 2 -1 -1.
Cheia către nivelul 2 este 2, deci
nivelul 2 este: 1 2.
Cheia către nivelul 3 este 2, deci
nivelul 3 este: 13.
Cheia către nivelul 4 este 3, deci
nivelul 4 este: 2 100 -1, deci cheia
finala este 100.
Problema propusa de Jipa Radu- clasa a XI-a B, CNMK
Profesor coordonator: Neagu Violeta
Rezolvare
#include<iostream.h>
#include<fstream.h>
int v[450],n,k;
fstream f("cheia.in",ios::in);
fstream g("cheia.out",ios::out);
int main()
{int x,i,j;
f>>n>>k;
for (i=1;i<=n;i++)
{for (j=1;j<=k;j++) f>>v[j];
x=1;
for (j=1;j<=k-1;j++) x=x+v[x];
k=v[x];}
cout<<k;
f.close();
g.close();
getch();
return 0;}
"O calitate a omului, care nu mi se pare foarte
importantă este aceea de a persevera. Adesea,
în activitatea omenească esenţială este
inteligenţa. Posibilităţile nelimitate ale
inteligenţei umane se pot însă dezvolta numai
printr-o continuă perseverenţă. Niciodată să nu
uitaţi că a încerca nu este totul. Nu trebuie să
lăsaţi nicicând la jumătatea drumului ceea ce
aţi început ci trebuie să mergeţi întotdeauna
înainte, până la capăt"
( H. Coandă )
Pentru a putea întrebuinta calculatorul la studiul problemelor
concrete, omul e obligat să invete sa gandeasca exact şi abstract. –
Grigore Moisil
8
PROBLEME PROPUSE
1. (*)Pentru orice număr natural nenul n, definim n! . Prin convenţie, 0!=1.
Scrieţi un program eficient care citeşte de la tastatură un număr natural nenul n de cel mult 9 cifre şi
afişează pe ecran ultimele două cifre nenule de la sfârşitul numărului n!.
2. (*)Scrieţi un program eficient din punct de vedere al timpului de execuţie şi al spaţiului
de memorie, care citeşte de la tastatură un număr natural nenul n, cu cel mult 9 cifre şi care afişează pe
ecran cel de al n+lea termen din şirul : 0, 0,1, 0,1,2,2, 0,1,2,3,3,3, 0,1,2,3,4,4,4, 0,1,2,3,4,5,5,5,5,5,...
3. (*)Se citesc de la tastatură numere naturale cu cel mult 9 cifre, până la citirea numărului
0. Să se afişeye pe ecran cel mai mare număr citit, care are cifrele ordonate (crescător sau
descrescător). Dacă nu există un astfel de număr, se va afişa mesajul :”Nu exista!”.
4. (**)Scrieţi un program care citeşte din fişierul text „Număr.in” o fracţie zecimală şi o scrie în
fişierul “Număr.out” sub forma unei fracţii ordinare.
Exemplu1: Exemplu2:
Numar.in Număr.out Numar.in Număr.out
2,(5) 23/9 5 5/1
5. (**)Spunem că un număr b poate “înghiţi” un număr a dacă numărul a se regăseşte în
numărul b. Se citesc din fişierul text “ Numere.in“ , în această ordine b,n şi apoi n numere naturale
nenule, cu cel mult 9 cifre. Să se afişeze pe ecran, câte numere naturale dintre cele n numere citite, pot
fi “înghiţite” de numărul b. Numerele n şi b sunt numere natural nenule, cu cel mult 9 cifre fiecare.
6. (**)Fiind dat un şir x1x2 . . . xm, o subsecvenţă a este un şir z1z2 . . . zk pentru care
există şirul de indici i1 < . . . < ik astfel încât . Găsiţi cea mai lungă subsecvenţă
comună a şirurilor x1x2 . . . xm şi y1y2 . . . yn.
7. (***)Se dau două şiruri de lungimi m ¸si n. Să se determine costul minim al operaţiilor
de editare necesare pentru a transforma un şir în celălalt, prin adăugarea / ştergerea / schimbarea unui
caracter.
(Obs: schimbarea are sens dacă costul < adăugare + ştergere). Datele de intrare se citesc din
fişierul “Cost.in” iar rezultatul se va afişa pe ecran.
De pe primele două linii ale fişierului de intrare se citesc cele două şiruri: S1 şi S2 (S1 de
lungime m şi S2 de lungime n).
De pe a treia line a fişierului de intrare se citesc trei numere naturale nenule cu cel mult 3 cifre
fiecare, reprezentând respectiv : costul operaţiei de adăugare a unui caracter, costul operaţiei de
ştergere a unui caracter şi costul operaţiei de schimbare a unui caracter.
8. (***)Se consideră un triunghi de numere naturale format din n linii. Prima linie conţine
un număr, a doua, două numere,…, ultima n numere. Cu ajutorul acestui triunghi se pot forma sume de
numere în felul următor:
se porneşte cu numărul din linia 1;
Succesorul unui număr se află pe linia urmatoare plasat sub el (aceeaşi coloană) sau pe
diagonală la dreapta (coloana creşte cu 1).
Care este cea mai mare sumă care se poate forma astfel şi care sunt numerele care o alcătuiesc?
Exemplu: n=4
2
3 5
6 3 4
5 6 1 4
Se pot forma mai multe sume:
s1=2+3+6+5=16
s2=2+5+4+1=12
s3=2+3+6+6=17 – suma maximă
Cum a iesit Bill Gates din Romania ? Cu Ctrl + Alt + Del
9
9. (***)Având în vedere dezvoltarea masivă a agriculturii preconizată pentru anul 2010,
miliardarul iepuraş Petit Dodo Lapin a cumpărat în Insula Mare a Brăilei un imens teren agricol de
formă pătrată, cu aria egală cu 100000000 pogoane, pe care va planta morcovi. Pentru demararea
lucrărilor agricole, Lapin a făcut un împrumut (rambursabil în 20 ani iepureşti) la Bank Of Ceylon
(singura bancă la care dobânda este mai mică de 50% pe an!) Datorită împrumutului primit în tranşe,
iepuraşul va plantat morcovii pe rând, pe parcele pătrate, având laturile paralele cu axele de
coordonate. Interioarele pătratelor plantate sunt disjuncte! Datorită disponibilizărilor masive, numărul
delicvenţilor a crescut exponenţial în ultimul an iar Petit Dodo Lapin se aşteaptă ca terenul cultivat de
el să fie în atenţia prădătorilor! Prin urmare, iepuraşul şi-a propus să instaleze un sistem ultramodern
de supraveghere cu care să poată urmări zi şi noapte, parcelele cultivate de el. În urma proiectului
efectuat de Institutul de Proiectări , s-a hotărât ca sistemul de supraveghere să fie instalat în originea
sistemului de coordonate (în punctul O(0,0)). Din punctul de control se poate vedea o parcelă dacă
există cel puţin două puncte distincte de coordonate întregi, situate pe o latură a pătratului
corespunzător parcelei, astfel încât triunghiul determinat de originea sistemului de coordonate şi acele
două puncte să aibă interiorul disjunct cu toate celelalte parcele cultivate cu morcovi.
Se cunosc numărul n a parcelelor (pătrate) cultivate de Petit Dodo Lapin, precum şi coordonatele
colţului stânga sus şi a colţului dreapta jos ale fiecărui pătrat, Coordonatele sunt raportate la un sistem
ortogonal cu originea în punctul O(0,0).
Cerinţă
Scrieţi un program care să determine numărul parcelelor pe care miliardarul iepuraş le poate urmări
cu sistemul de suraveghere precum şi aria suprafeţei totale ocupate de parcelele vizibile din punctul de
amplasare al sistemului de supravehere ( originea sistemului de coodonate).
Date de intrare
Fişierul de intrare Lapin.in conţine pe prima linie un număr natural n, reprezentând numărul de
parcele pătrate plantate de bogatul iepuraş.
De pe fiecare din următoarele n lini ale fişierului de intrare se citesc câte 4 numere naturale,
reprezentând coordonatele colţului stânga sus şi a colţului dreapta jos a unui pătrat pe care vor fi
plantaţi morcovi.
Date de ieşire
Fişierul de ieşire Lapin.out va conţine două numere naturale reprezentând numărul parcelelor
vizible din punctul de amplasare al sistemului de supraveghere şi aria suprafeţei ocupate de acestea,
scrise pe linii diferite.
Restricţii şi precizări: 0<=n<=1000; Coordonatele colţurilor pătratelor sunt numere naturale nenule,
mai mici sau egale cu 10000.
Un program pentru calculator face ceea ce ii spui tu sa faca, nu ceea ce vrei tu sa faca.
La originea oricarei erori care este atribuita computerului vei gasi cel putin doua greseli umane, incluzand-
o pe aceea de a da vina pe computer.
Daca constructorii ar face constructiile in felul in care programatorii concep programe, atunci prima
ciocanitoare care ar veni, ar distruge civilizatia.
Erorile nedetectabile sunt infinite in varietate, spre deosebire de erorile detectabile care sunt limitate prin
definitie.
Un afisaj digital furnizeaza informatii gresite cu o precizie mai mare decat a fost posibil anterior.
10
Exemplu
Lapin.in Lapin.out Explicaţie
5
3 8 4 7
5 7 7 5
8 6 9 5
10 4 12 2
9 11 12 8
4
26
Au fost plantate
cu morcovi
5 parcele :
O
Prima parcelă are coordonatele colţului stânga sus (3,8) şi
coordonatele colţului dreapta jos (4,7);
A doua parcelă are coordonatele colţului stânga sus (5,7) şi
coordonatele colţului dreapta jos (7,5);
A treia parcelă are coordonatele colţului stânga sus (8,6) şi
coordonatele colţului dreapta jos (9,5);
A patra parcelă are coordonatele colţului stânga sus (10,5) şi
coordonatele colţului dreapta jos (12,3);
A cincea parcelă are coordonatele colţului stânga sus (9,11) şi
coordonatele colţului dreapta jos (12,8);
Sunt vizibile primele 4 parcele.
Suma ariilor parcelelor vizibile este : 4+9+4+9=26
12
11
10
9
8
7
6
5
4
3
2
1
0 1 2 3 4 5 6 7 8 9 10 11 12
Probleme propuse de profesor Balacea Georgeta-Iulia,
Colegiul Naţional “Al.I.Cuza” Galaţi
"Ştiinţa puţină îi face pe oameni pretenţioşi, în timp ce ştiinţa multă îi face modeşti, aşa
după cum spicele goale îşi înalţă spre cer capetele lor trufaşe, în timp ce spicele pline se apleacă
spre pământ sub greutatea lor"
( Leonardo da Vinci )
11
PROBLEME REZOLVATE, CLASELE XI-XII
1. Reţele de calculatoare O companie deţine mai multe reţele formate din n calculatoare. Intre calculatoarele reţelei
există un număr total de m legături directe, astfel încât în cadrul aceleiaşi reţele este posibilă
comunicarea directă sau indirectă între oricare două calculatoare. Se preconizează atacul iminent al
unui hacker care va întrerupe una dintre legaturile directe dintre două calculatoare dintr-o reţea astfel
existând posibilitatea ca reţeaua vizată să nu mai funcţioneze la parametrii optimi. O reţea este
vulnerabilă dacă există cel puţin o pereche critică de calculatoare care nu vor mai putea comunica
direct sau indirect. Numărul de perechi critice dintr-o reţea se numeşte Cnumber. Rolul
administratorului reţelelor este să determine câte astfel de reţele vulnerabile deţine compania şi care
este valoarea maximă pe care o poate avea Cnumber.
Date de intrare
Prima linie a fişierului de intrare retele.in contine numărul n al calculatoarelor din reţele
(fiecare calculator se identifică printr-un număr natural din intervalul [1,n]) şi numărul m al legăturilor
directe dintre calculatoare. Fiecare dintre următoarele m linii va conţine câte două numere întregi x şi
y cu semnificaţia: există o legatură directă între calculatoarele identificate prin x şi y.
Date de ieşire
Fişierul de ieşire retele.out va conţine două numere naturale reprezentând numărul de reţele
vulnerabile şi valoarea maximă pentru CNumber
Restricţii şi precizări:
1 n 100
retele.in retele.out
16 14
1 2
1 4
2 4
4 5
5 6
5 7
6 7
6 15
8 9
8 10
9 10
11 12
12 13
3 14
3 2
Rezolvare
#include<fstream.h>
#include<conio.h>
int a[100][100],n,m,viz[100],gasit;
int wiz[100];
int nrc; //pastreaza numarul componentei
conexe
void df(int nod)
{ wiz[nod]=1;
for(int k=1;k<=n;k++)
if(a[nod][k]==1&&wiz[k]==0) df(k);}
void linie(int l, int &d) //determina daca nodul
l este extremitatea unei muchii care nu
apartine unui ciclu
{for(int i=1;i<=n;i++)
if(a[l][i]==1)
{for(int j=1;j<=n;j++) wiz[j]=0;
a[l][i]=a[i][l]=0;
df(l);
Nu exista limbaj in care sa fie cat de cat dificil sa se scrie un program prost.
12
if(wiz[i]==0) d++;
a[l][i]=a[i][l]=1;
}
}
void dfmr(int nod)
{ viz[nod]=nrc; //se incarca numarul
componentei
for(int k=1;k<=n;k++)
if(a[nod][k]==1&&viz[k]==0) dfmr(k);
}
void main()
{int x,y,j;
fstream f;
f.open("retele.in",ios::in); //memorare matrice
de adiacenta
f>>n>>m;
for(int i=1;i<=m;i++)
{f>>x>>y; a[x][y]=a[y][x]=1;}
for(int nod=1;nod<=n;nod++)
if(viz[nod]==0)
{nrc++; dfmr(nod);}
int cd, max=0, cate=0,g;
for(i=1;i<=nrc;i++)
{ cd=0;
for(j=1;j<=n;j++)
if(viz[j]==i) linie(j,cd);
if(cd) cate++;
if(max<cd/2) max=cd/2;
}
fstream h;
h.open("retele5.out",ios::out);
h<<cate<<" "<<max;
f.close();h.close();
}
2. STAŢII
Infamul Overmind al zergilor a fost distrus şi locul de origine al protossilor din Shakuras stă acum în
ruine şi fumegând. Ca Executor şi comandant al forţelor Protoss rămase tu trebuie acum să reuneşti
populaţia neputinciosă de protossi şi să îi salvezi de zergii care încă ocupă cu nepăsare pământurile din
Shakuras. Obiectivul tău este de a prelua controlul unei baze principale a civilizaţiei Tassadariana şi va
trebui să te foloseşti de staţiile de emisie recepţie pentru că doar acestea iţi pot indica baza principală.
Există perechi de staţii de emisie-receptie care emit şi receptionează în mod direct semnale. Intre doua
perechi de staţii x şi y care comunică direct timpul de emisie este t . Semnalele la doua staţii pot
ajunge fie direct fie indirect prin intermediul altor staţii. Evident, pot exista staţii situate în baze
diferite care nu vor putea comunica semnale. Staţiile care nu emit şi nu primesc semnale sunt lipsite de
importanţă strategică. Vei putea determina o bază principală ştiind că în Ziua Q toate staţiile vor
începe să emită astfel încât fiecare staţie va transmite un mesaj tuturor celorlalte staţii din interiorul
bazei în care se află (două staţii se găsesc în interiorul aceleiaşi baze dacă sunt capabile sa-şi transmită
informaţii direct sau indirect). Semnalele între două staşii vor fi transmise pe traseele de comunicaţie
care necesită cel mai puţin timp şi se vor transmite în ambele sensuri. Datorită bruiajului nu se vor
emite concomitent mai multe semnale în interiorul aceleiaşi baze ci în mod succesiv astfel încât pentru
a-şi comunica informaţii oricare doua staţii dintr-o baza se va consuma o perioada de timp T. O bază
principală va fi indicată de o valoare minimă a lui T. Va trebui sa gaseşti această valoare.
Date de intrare
Fişierul statii.in conţine un număr natural n reprezentând numărul de staţii de emisie-recepţie. In
continuare, pe linii diferite se vor găsi triplete de numere naturale reprezentând perechile de staţii x şi y
şi timpul t de emisie de la x la y sau de la y la x
Date de ieşire
In fişierul statii.out se va scrie numărul cerut reprezentând valoarea minima a lui T. Daca nu există un
astfel de număr se va scrie 0.
Restricţii şi precizări
1<=n<=100 număr natural
1<=t<=3000 număr natural
Numărul de baze poate fi cel puţin 1 şi cel mult n.
Este mai usor sa adaptezi specificatia la program decat viceversa.
13
statii.in statii.out
8
1 2 10
1 3 5
2 4 20
3 4 3
1 4 2
2 3 4
5 6 1
6 7 2
7 8 4
6 8 1
7 5 3
24
Timp de executie 1s/test
Rezolvare
#include<fstream.h>
long pinf=400000000;
long a[101][101];
int n,m,viz[101],nrc;
void citire_cost()
{fstream f;
int i,j,x,y;
long c;
f.open("statii.in",ios::in);
f>>n;
//initializare matrice
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j) a[i][j]=0;
else a[i][j]=pinf;
while(f>>x>>y>>c) a[x][y]=a[y][x]=c;
}
void dfmr(int nod)
{ viz[nod]=nrc; //se incarca numarul
componentei
for(int k=1;k<=n;k++)
if((a[nod][k]!=pinf)&&(k!=nod)&&(viz[k]==0
)) dfmr(k);
}
void genarare_matrice_drumuri_optime()
{for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j];
}
void main()
{int x,y;
citire_cost();
genarare_matrice_drumuri_optime();
for(int nod=1;nod<=n;nod++)
if(viz[nod]==0) //se incearca parcurgerea
numai daca un nod nu a fost deja parcurs
{nrc++;
dfmr(nod);}
long s, min=pinf;;
int k,l, temp[101];
for(int i=1;i<=nrc;i++)
{s=0;k=0;
for(int j=1;j<=n;j++)
if(viz[j]==i) temp[++k]=j;
for(j=1;j<=k;j++)
for(l=1;l<=k;l++)
s=s+a[temp[j]][temp[l]];
if(s<min&&s!=0) min=s;
}
fstream g;
g.open("statii.out",ios::out);
g<<min;
g.close();
}
Probleme propuse de prof. Muşunoiu-Novetschi Mona,
Colegiul Naţional “M.Kogălniceanu” Galaţi
"Un bun profesor când îi învaţă pe alţii, învaţă şi el."
( P.L. Kapiţa )
14
PROBLEME PROPUSE CLASELE XI-XII
1. (*)De ziua îndrăgostiţilor elevii clasei a 11-a se hotarasc ca la bal să formeze la primul dans cât
mai multe perechi. Pentru aceasta nu vor ţine cont de simpatiile existente, ci vor forma perechile în
modul următor: toţi elevii se vor aşeza pe o singură linie. Prima fată din stânga şi primul băiat din
dreapta formează prima pereche apoi urmatoarea pereche va fi formată dintr-un baiat din stânga şi o
fată din dreapta şi aşa mai departe pânş nu se mai pot forma perechi. Să se afişeze perechile formate şi
elevii rămaşi. Datele se citesc din fişierul text Valy.in : De pe prima linie a fişierului se citeşte numărul
n de elevi iar de pe următoarele n linii, numele şi sexul. Datele de ieşire se vor scrie în fişierul
Valy.out.
Exemplu :
Valy.in Valy.out
10
anca f
lili f
adi b
dana f
oana f
vali b
cristi b
gina f
mimi f
gigi b
anca gigi
adi mimi
lili cristi
vali gina
raman perechile:
dana f
oana
2. (*)Se citeşte de la tastatură un număr natural n şi apoi n numere naturale.
a) Să se formeze cu numerele citite o listă liniară simplu înlănţuită.
b) Să se partiţioneze şirul de numere citite într-un numar minim de subşiruri strict crescatoare.
Exemplu :
Pentru n=9 , şi numerele 9 4 5 2 10 6 3 8 6
Se obtin trei subşiruri:
9 10
4 5 6 8
2 3 6
3. (*)Se citesc din fişierul text “Liste.in” numere întregi .
a. Să se creeze o listă liniară dublu înlănţuită cu numerele citite.
b. Să se insereze între oricare două elemente ale listei create la punctul (a) media
artitmetică a acestora. Să se afişeze pe ecran elementele listei astfel modificate.
Exemplu:
Liste.in
2,9,12,6,1
se va afişa : 2,5.5,9,10.5,12,9,6,3.5,1
4. (**) Fie n un număr natural nenul şi k un număr natural, mai mic sau egal decât 20.. Să se
calculeze lg(n) cu k zecimale exacte.
5. (**) Bisericuţe In clasa a XI-a A sunt n elevi ( eminenţi), identificaţi prin numere de la 1 la n (n≤45). Fiecare
elev are printer ceilalţi elevi ai clasei, prieteni cu care comunică mai bine. Acestora le transmite „o
bârfă” imediat după ce îl află. Dacă elevul i transmite „o bârfă” elevului j, nu este obligatoriu ca elevul
j să comunice la fel cu elevul i! (Relaţia “Transmite bârfă” nu este reflexivă şi nici simetrică. Ajutaţi
dirigintele clasei să determine numărul minim de “bisericuţe” de elevi care se pot forma cu elevii
"Timpul de care dispunem din abundenţă odată pierdut, nu mai este niciodată regăsit."( B. Franklin )
15
clasei a XI-a A, astfel încât o bârfă transmisă unui elev al „bisericuţei” să poată fi transmisă apoi
tuturor elevilor grupului.
Datele de intrare se citesc din fişierul „Barfa.in” . Acesta conţine pe prima linie un număr natural n,
reprezentând numărul de elevi ai clasei. De pe următoarele n linii se vor citi date referitoare la elevii
clasei:
Astfel, de pe fiecare linie i, 1≤i≤n se vor citi:
Numărul r al relaţiilor de forma : elevul i transmite bârfa elevului j , urmat de r numere natural
cuprinse între 1 şi n, reprezentând numărul de ordine al elevilor din clasă cărora i le transmite o bârfă.
Numerele de pe o linie sunt separate printr-un spaţiu.
Datele de ieşire se scriu în fişierul “Barfa.out”. Acesta con‟ine o singură linie pe care este scris
numărul grupurilor ce pot fi formate.
Exemplu:
Barfa.in Barfa.out
5 3
1 2
1 3
2 1 5
0
1 4
Explicaţii : Sunt 5 elevi în clasă;
elevul 1 transmite o bârfă elevului 2;
elevul 2 transmite o bârfă elevului 3;
elevul 3 transmite două bârfe: elevilor 1 şi 5;
elevul 4 nu transmite bârfe;
elevul 5 transmite o bârfă elevului 4;
Se pot forma 3 bisericuţe.
6. (**)Se citeşte din fişierul text “Cuvinte.txt” format din mai multe linii, un text alcătuit
din cuvinte formate din literele mici ale alfabetului englez, separate prin unul sau mai multe caractere
albe. Să se creeze un arbore binar de căutare care să cuprindă numai cuvintele distincte din text. Să se
scrie în fişierul de ieşire .”Distincte.txt” cuvintele din arbore, parcurs în preordine.
Probleme propuse de prof. Georgeta Balacea,
Colegiul Naţional “Al.I.Cuza”
7. (***)Bond-James Bond.
Agentul 007 se afla într-o misiune foarte dificilă.
Trebuie să se strecoare în baza teroriştilor, repectiv să
elibereze din închisoare cât mai mulţi ostatici. Se ştie ca
inchisoarea are forma unui triunghi echilateral care are
toate încăperile triunghiuri echilaterale de latură 1, ca în
figură. Pe fiecare latură a clădirii există exact n încăperi.
Fiecare perete al încăperilor unei astfel de clădiri are o
uşă, iniţial deschisă. În fiecare încăpere există un numar
de ostatici. Agentul 007 ştie că poate pătrunde în temniţă
prin unul din colţurile închisorii, oricare ar fi acesta însă
se poate deplasa în închisoare „de la vârful de intrare
spre baza triunghiului, eventual lateral”, indiferent din ce
vârf pleacă. După părăsirea unei încăperi din care au
fost luaţi banii, toate cele 3 uşi ale acesteia se închid automat şi nu mai pot fi deschise.
Cerinţă:
Să se determine numărul maxim de ostatici pe care îi poate elibera Agentul 007 şi numărul de celule
explorate.
s1
s2 s3
s5
s4
s7 s9
s6 s8
16
Intrare:
Fişier de intrare BOND.IN
N – număr natural nenul, reprezentând dimensiunea clădirii;
s1 – număr natural, reprezentând numarul de detinuti din încăperea de pe primul rând
al clădirii;
s2 s3 s4 – 3 numere naturale, reprezentând numarul de detinuti din încăperile de pe cel de-
al doilea rând al clădirii;
s5 s6 s7 s8 s9 – 5 numere naturale, reprezentând numarul de detinuti din încăperile de pe cel de-
al treilea rând al clădirii;
...
sN(N-2)+2 ... sN*N –2*N-1 numere naturale, reprezentând numarul de detinuti din încăperile de pe cel
de-al N-lea rând al clădirii.
Ieşire:
Fişier de ieşire: BOND.OUT
numar_detinuti_eliberati – suma maximă colectată.
nr – numărul de încăperi vizitate.
Restricţii
1 n 50
si sunt numere naturale, 0 si 250 i=1,2,…,N;
Exemplu
BOND.IN BOND.OUT
3 102
1 7
8 10 40
5 11 13 19 9 Explicaţie
Problemă propusă de prof. Lucian Dimitrievici,
Colegiul Naţional “M.Kogălniceanu”
8. (***)Latime
Să presupunem că dorim să desenam un arbore binar pe o foaie de matematică (în care am
numerotat liniile de sus în jos şi coloanele de la stânga la dreapta).
Desenul trebuie să respecte urmatoarele reguli:
1. Nodurile situate pe acelaşi nivel trebuie să fie desenate pe aceeaşi linie. Nivelul rădacinii arborelui
este 1 şi rădăcina va fi desenată pe linia 1. Fii rădăcinii constituie nivelul 2 şi vor fi desenaţi pe linia 2.
Fiii fiilor rădăcinii constituie nivelul 3 şi vor fi desenaţi pe linia 3 etc.
2. Pe fiecare coloană poate fi desenat un singur nod.
3. Nodurile din subarborele stâng al unui nod trebuie să fie desenate în coloanele din stânga coloanei în
care este desenat nodul respectiv, iar nodurile din subarborele drept trebuie să fie desenate în coloanele
din dreapta coloanei în care este desenat nodul respectiv.
4.Orice coloană cuprinsă între coloana cea mai din stânga în care este desenat un nod şi coloana cea
mai din dreapta în care este desenat un nod trebuie să conţină un nod.
Să notam cu L cea mai din stânga coloană în care este desenat un nod şi cu R cea mai din dreapta
coloana în care este desenat un nod. Lăţimea arborelui binar este R-L+1.
Exemplu:
1
8 10
5
40
13
9 11 19
17
Observati că lăţimea acestui arbore binar este 19.
Putem calcula lăţimea pe fiecare nivel ca fiind diferenţa dintre numarul celei mai din dreapta
coloanei care conţine un nod de pe nivelul respectiv şi numărul celei mai din stânga coloanei care
conţine un nod de pe nivelul respectiv +1.
Arborele din exemplu are 6 niveluri, lăţimile nivelurilor fiind 1, 13, 18, 18, 13, 12.
Când desenam un arbore binar după aceste reguli ne interesează şi lăţimea nivelului cu lăţime maximă
şi care este acest nivel. Daca exista mai multe niveluri cu latimea maxima, ne
interesează cel cu număarul cel mai mic.
In exemplul de mai sus lăţimea maximă a unui nivel este 18 şi ea este atinsă pe nivelurile 3 si
4, deci nivelul care ne interesează este 3.
Cerinţă
Dat fiind un arbore binar, scrieţi un program care să determine lăţimea maximă a unui nivel în arborele
desenat după regulile de mai sus şi nivelul cu numărul cel mai mic care are această lăţime.
Date de intrare
Fişierul de intrare latime.in conţine pe prima linie un număr natural N reprezentând numărul de noduri
din arbore. Nodurile sunt numerotate de la 1 la N. Fiecare dintre urmatoarele N linii conţine câte 3
numere întregi separate prin câte un spaţiu x s d cu semnificatia "fiul stâng al nodului x este s, iar fiul
drept al nodului x este d". Dacă un nod nu are fiu stang sau fiu dreptatunci s, respectiv d, pentru nodul
respectiv va avea valoarea -1. Rădăcina arborelui este nodul 1.
Date de ieşire
Fişierul de ieşire latime.out va conţine o singură linie pe care se află două numere naturale separate
printr-un singur spaţiu niv lat cu semnificaţia "cel mai mic nivel de lăţime maximă este niv, iar lăţimea
lui este lat".
Restricţii
1<=N<=1000
Exemplu
latime.in latime.out
19
1 2 3 3 18
2 4 5
3 6 7
4 8 -1
5 9 10
6 11 12
7 13 -1
8 -1 -1
9 14 15
10 -1 -1
11 16 -1
12 -1 -1
13 17 -1
14 -1 -1
15 18 -1
16 -1 -1
17 -1 19
18 -1 -1
19 -1 -1
Problemă propusă de prof. Lucian Dimitrievici,
Colegiul Naţional “M.Kogălniceanu”
18
9. (***) NU TE SUPĂRA FRATE!
Andrei şi Dorian sunt doi fraţi gemeni. Astăzi este ziua lor de naştere. Când s-au trezit, fraţii au
intrat într-o mare dilemă: cum îşi vor împărţi ei cadourile astfel încât să fie mulţumiţi. Ştiind că fiecare
cadou are o valoare (cuprinsă între 1 şi 100 inclusiv) şi că pot fi maxim 100 de cadouri, fiind şi foarte
buni la informatică, s-au hotărât să scrie un program care să-i ajute să-şi împartă cadourile frăţeşte
(sumele să fie cele mai apropiate posibil). Au reuşit!
Date de intrare:
În fişierul „cadou.in” se găsesc informaţiile referitoare la cadouri: pe prima linie numărul total de
cadouri, pe următoarea linie calorile lor.
Date de ieşire:
În fişierul „cadou.out” trebuie scrise două sume care sunt cele mai apropiate, corespunzătoare unei
împărţiri a cadourilor, pe a doua linie valorile corespunzătoare cadourilor care însumează prima sumă
gasită, pe a treia linie, valorile corespunzătoare cadourilor care însumează a doua sumă găsită.
Exemplu:
Cadou.in Cadou.out
7
28 7 11 8 9 7 27
48 49
28 11 9
7 8 7 27
Problemă propusă de profesor Popescu Mădălina,
Colegiul Naţional „Mihail Kogălniceanu” Galaţi, OLI-2008
PROBLEME REZOLVATE, CLASA A IX-A 1. NUMERE
Ioana este elevă în clasa a IX-a. Ei ii plac proprietăţile mai neobişnuite ale numerelor. De
exemplu, ea consideră că 945 este un număr interesant deoarece este primul numar impar pentru care
suma divizorilor este mai mare decat numărul însuşi.
Haideţi să o ajutăm pe Ioana să găsească numere interesante, scriind un program care
determină numărul care are cei mai mulţi divizori dintr-un interval dat . Atenţie! Dimensiunea
numerelor şi marimea intervalului dat ne vor obliga să folosim un algoritm cât mai eficient!
Date de intrare
Din fişierul text “Numere.in” se citeşte un număr natural n (1≤n≤100).
De pe urmatoarele n linii ale fişierului se citesc extremităţile celor n intervale pentru care se doreşte
determinarea numărului cu cei mai mulţi divizori. Dacă Li şi Ls reprezintă limita inferioară respectiv
limita superioară a unui interval atunci 1≤Li≤Ls≤1.000.000.000 şi 0≤Ls-Li≤10.000.
Date de ieşire
Pentru fiecare pereche de numere de pe liniile 2…n+1 din fişierul intrare se vor scrie în fişierul de
ieşire “Numere.out” două valori : NMAX NUMAR_DIVIZORI , reprezentând numărul cu cei mai
mulţi divizori (NMAX) şi numărul lui de divizori (NUMAR_DIVIZORI). Dacă într-un interval există
mai multe soluţii, se va afişa numărul cel mai mic( primul număr din interval, cu proprietatea dată)
Exemplu:
Numar.in Număr.out
5
1 10
1000 1000
2000 10000
100 590
999999900 1000000000
6 4
1000 16
75 60 64
360 24
999999900 192
Problemă propusă de prof. Ionela Fotache,
Liceul Teoretic Dunărea, OLI-2009
19
Rezolvare
/*se calculeaza numarul de divizori ai numarului natural n astfel: calculeaza toate puterile
numerelor prime din descompunerea lui n si inmulteste de fiecare data la variabila p puterea
respectiva plus 1 se parcurg toate numerele intre cele doua capete si vom retine de fiecare data
numarul cu numar maxim de divizori pana in acel moment programul devine foarte rapid daca
parcurgem numerele prime pana la sqrt(n) deoarece intre sqrt(n)=1 si n poate fi maxim un divizor
prim al lui n la puterea 1 -daca ar fi 2 atunci produsul acestora l-ar depasi pe n*/
#include<fstream.h>
#include<stdio.h>
#include<math.h>
#define integer long int
integer numardivizori(integer n)
{integer p=1, j,alfa=0;
while (n%2==0)
{n/=2;alfa++;}
p*=(alfa+1);
for(j=3;j<=sqrt(n)&& n!=1;j+=2)
{alfa=0;
while(n%j==0)
{ n/=j; alfa++;}
p*=(alfa+1);
if (n==1)break;}
if (n>1) p*=2;
return p;}
void main()
{integer m1,m2, i,j,n,nbun,ndivizori,aux,k=0;
FILE *fin, *fout;
fin=fopen("divizori16.cpp","r");
fout=fopen("divizori26.cpp","w");
fscanf(fin,"%ld\n",&n);
fin>>n;
for(i=0;i<n;i++)
{fscanf(fin,"%ld %ld\n",&m1,&m2);
nbun=m1;
ndivizori=numardivizori(nbun);
for(j=m1+1;j<=m2;j++)
{aux=numardivizori(j);
if(aux>ndivizori)
{nbun=j;ndivizori=aux;}
}
fprintf(fout,"%ld %ld\n",nbun,ndivizori);}
fclose(fin);
fclose(fout);}
2. COMOARA
Profesorul Plesneală, de la Şcoala de Farmece şi Vrăjitorii de la Hogwards, a ascuns (
pentru zile negre, de recesiune economică) în Pădurea Interzisă o comoară ce depăşea cu mult
averea oricărui alt vrăjitor !
La sfârşitul anului şcolar ( vrăjitoresc ) s-a gândit să ofere ca premiu o parte din monedele
din comoară, acelui elev din anul IV (ultimul an de studiu de la Hogwards) care va putea să o
câştige. Harry Potter s-a hotărât să participe şi el la concurs!
Comoara lui Plesneală era formată din n grămezi de monede ( fiecare grămadă i era formată
din m[i] monede). Elevul care dorea să câştige premiul, trebuia să respecte regulile impuse de
profesor :
1) Monedele trebuiau cărate de exact n spiriduşi ;
2) Elevul care dorea să câştige premiul trebuia să aleagă (una sau mai multe grămezi) din cele
n grămezi din comoară astfel încât:
a. Dacă a ales o grămadă, trebuie să ia toate monedele din acea grămadă;
b. Numărul totasl de monede rezultat din toate grămezile alese trebuie să se
împartă exact la n;
3) Numărul total de monede din grămezile alese trebuie să se fie cel mai mare posibil.
Dacă se dau numărul n de grămezi de monede, numărul m[i] de monede din fiecare
grămadă (1 i n ), ajutaţi-l pe Harry Potter să determine mulţimea grămezilor care trebuie alese
astfel încât să poată câştiga premiul oferit cu mărinimie de Plesneală !
Datele de intrare se citesc din fişierul „Comoara.in”
De pe prima linie a fişierului „Comoara.in”se citeşte numărul natural nenul n.
Ştiaţi că ... primul program scris de Bill Gates a fost X şi 0?
20
De pe următoarele n linii ale fişierului de intrare se citesc numere naturale nenule ( de pe linia i+1
se citeşte numărul m[i], reprezentând numărul de monede din grămada i).
Date de iesire se vor scrie în fişierul „Comoara.out”
In fişierul de ieşire „Comoara.out” se vor scrie grămezile alese, în ordinea crescătoare a
numărului lor de ordine, câte una pe o linie.
Restricţii
1n60
Exemple
Comoara.in Comoara.out Explicaţii
4
5
7
19
20
1
3
4
Sunt 4 grămezi de monede ( n=4)
Grămada 1 are 5 monede, grămada 2 are 7 monede, grămada
3 are 19 monede, grămada 4 are 20 monede.
Harry Potter va selecta grămezile : 1,3,4 ( va câştiga în total
44 monede)
Problemă propusă de prof. Balacea Georgeta,
Colegiul Naţional „Al.I.Cuza” – Galaţi OLI 2009
Rezolvare
#include <fstream.h>
int n,m[80],lj[80][80],a[80][80],st[80];
void main()
{ fstream f("comoara.in",ios::in);
fstream g("comoara.out",ios::out);
f>>n;
long int i,j,h,k,max,n1;
for (i=1;i<=n;i++) f>>m[i];
f.close();
for(j=1;j<=n;j++)
for(i=0;i<n;i++)
{a[i][j]=-1;
if (m[j]%n==i) a[i][j]=m[j];
h=i-(m[j]%n);
if(h<0) h+=n;
for(k=1;k<=j-1;k++)
if(a[h][k]>0 && a[i][j]<a[h][k]+m[j])
{ a[i][j]=a[h][k]+m[j]; lj[i][j]=k;}}
max=-1;h=0;
for(i=1;i<=n;i++)
if(a[0][i]>max)
{max=a[0][i];h=i;}
j=h;i=0;n1=0;
do
{n1++; st[n1]=j; h=i; i=i-m[j]%n;
if(i<0) i+=n;
j=lj[h][j];}
while (j!=0);
for(i=n1;i>=1;i--)
g<<st[i]<<endl;
g.close();}
21
PROBLEME PROPUSE
1. (*)Mǎdǎlina îndrǎgeşte mult matematica. De aceea, ea vine mai rar la ore. Când, într-o
zi, s-a intamplat sǎ fie prezentǎ, Zâna Cea Buna a Matematicii i-a oferit în dar un numǎr natural
nenul. Zâna are o baghetǎ fermecatǎ : când atinge o datǎ un numǎr, acesta se transforma în alt
numǎr natural, obţinut prin însumarea pătratelor cifrelor numǎrului iniţial. Astfel, dacǎ Madalina a
primit în dar numǎrul 314, acesta devine 9+1+16=26 dupǎ o atingetre de bagheta. La o noua
atingere, numǎrul obţinut se transformǎ, noul numǎr fiind suma cuburilor numǎrului anterior. Deci,
la o noua atingere, 26 devine 4+36=40, apoi 16. Zâna atinge numerele pânǎ cand se obţine un
pǎtrat perfect. Scrieţi un algoritm care sǎ citeascǎ numǎrul pe care îl primeşte Mǎdǎlina în dar şi
care sǎ afişeze , pe rând, numerele obţinute la fiecare atingere a baghetei fermecate.
2. (*)Se citesc de la tastatură n-1 numere naturale distincte, cuprinse intre 1 si n,
n 10000000 . Sǎ se determine care numǎr natural (mai mare sau egal cu 1 şi mai mic sau egal
cu n) nu a fost citit.
3. (*)Se citesc de la tastaturǎ n numere naturale , 1≤n≤10000000. Sǎ se scrie un program
care se determine ultima cifra a sumei factorialelor numerelor citite.
4. (**)Andrei doreşte să găsească parola pe care profa de info a instalat-o pe serverul
liceului. Aceasta era cel mai mare număr format din cifrele de control ale tuturor numerelor
naturale mai mici sau egale decât un număr natural n, stabilit la începutul anului de Consiliul
Profesoral. Scrieţi un algoritm care sǎ citeascǎ numǎrul n şi care sǎ afişeze parola corectă.
5. (**)Ionuţ, elev in clasa a 9-a A, realizeaza un program pentru urmatorul joc: se gândeşte
la un numǎr natural cuprins intre 1 si 2000000000. Calculatorul trebuie sǎ ghiceascǎ numǎrul cu
un numǎr cât mai mic de întrebari. Calculatorul continuǎ pe baza rǎspunsurilor date de elevul
Ionuţ: „mai mic”, „mai mare”.
6. (**)Sǎ se scrie un program care sǎ afişeze toate numerele perfecte , mai mici sau egale
decat un numǎr natural n, unde n are cel mult 9 cifre. Un numǎr natural este perfect dacǎ este egal
cu suma divizorilor săi proprii plus 1. Exemplu: 6=1+2+3 este număr perfect.
Probleme propuse de prof. Balacea Georgeta,
Colegiul Naţional „Al.I.Cuza”
7. (***)Joc circular La ora de sport doamna învăţătoare a îmbrăcat elevii clasei sale cu tricouri numerotate de la 1
la 2*n, i-a aşezat în cerc şi a început un joc în care îi numără din p în p şi îi elimină pe rând câte
unul . Elevii sunt eliminaţi pe rând astfel : mai întâi elevii cu tricouri cu numere pare în ordine
crescatoare, iar apoi elevii cu tricouri impare în ordine descrescătoare. Precizaţi cum ordinea în
care doamna învăţătoare a eliminat elevii clasei sale.
Restricţii 2 n15; 1p15;
Exemplu :
n=4, p=3
2 3 8 4 1 5 6 7
Problemă propusă de prof. Magdalena Grigore
Colegiul Naţional “Al.I.Cuza” Galaţi
8. (***)Iepuraş
De PAŞTE, elevii claselor a IX-a din judeţul Galaţi, au hotǎrât sǎ ducǎ în dar bǎtrânilor de la
Cǎminul de bǎtrâni dulciuri şi portocale. Fiecare elev i dintre cei n elevi care au participat la
aceastǎ acţiune, a adus la centrul de colectare câte o sacoşǎ, care conţine un numǎr de pi portocale
şi pentru a fi luat în evidenţǎ, primeşte numǎrul de ordine i. Portocalele trebuie însǎ sǎ fie
redistribuite, astfel încât în fiecare dintre cele n pungi ce vor fi dǎruite bǎtrânilor sǎ se gǎseascǎ
Daca computerele devin prea puternice, le putem organiza intr-un comitet – asta o sa le termine.
22
exact acelaşi numǎr de portocale (pentru ca bǎtrâneii sǎ nu se certe între ei)!. In concluzie, s-a
hotǎrât ca sǎ se selecteze doar acele sacoşe cu proprietatea cǎ suma numǎrului de portocale pe care
le conţin se poate împǎrţi exact la cele n pungi cu daruri care se vor duce bǎtrânilor. Sacoşele
selectate vor trebui sǎ fie aduse la centrul de colectare a darurilor de cǎtre elevi cu numere de
ordine consecutive. Determinaţi grupul de sacoşe care vor fi selectate. Dacǎ problema are mai
multe soluţii, alegeţi o soluţie pentru care numǎrul de portocale din fiecare pungǎ cu daruri este
maxim. Portocalele care rǎmân nedistribuite, vor fi dǎruite profesorilor de informaticǎ (drept şpagǎ,
sǎ se mai îndulceascǎ). Determinaţi câte portocale vor primi profesorii corupţi! Numǎrul n precum
şi numǎrul de portocale din fiecare sacoşǎ adusǎ de elevi se citesc din fişierul text “Iepuras.txt”
9. (***) Campanie electoralǎ
In campania electoralǎ pentru alegerile prezidenţiale din anul 30004 din MORANIA, o
micǎ ţǎrişoarǎ din insula SPERANŢA, Gyany Cabeli, candidat independent, se hotǎrǎşte sa-şi
focalizeze oferta pe populaţia care are venituri relativ mici. Astfel, el promite celor care îl vor vota
cǎ le va mǎri salariul, într-un mod spectaculos. Dupǎ statisticile realizate, s-a observat cǎ N
persoane înclinǎ sǎ voteze cu candidatul CABELI. Astfel, dacǎ persoana i (dintre cele N persoane
) are salariul Si(calculat în EURO), dupǎ mǎrire, va avea salariul SiN ( Si la puterea N). Totuşi,
dupǎ consultarea experţilor financiari, candidatul a realizat cǎ nu va putea sǎ-şi ţinǎ promisiunea,
având în vedere că MORANIA nu este o ţară foarte bogată. Pentru a rezolva aceastǎ problemǎ,
fǎrǎ a minţi (în mod evident) electoratul, a adǎugat la oferta sa, faptul cǎ va mǎri salariul doar
acelora care, dupǎ mǎrirea salarialǎ, vor putea sa-şi împartǎ venitul , în mod exact, tuturor celor P
pensionari din ţarǎ. Având informaţii exacte, din sondajele efectuate, relativ la numǎrul N de
susţinǎtori ai lui Gyany Cabeli , salariul acestora şi numǎrul P de pensionari, determinaţi care va
fi numǎrul de votanţi ce vor beneficia de mǎrirea salarialǎ.
Exemplu:
Pentru N=4( patru alegǎtori), P=25 (25 pensionari) şi salariile :
15
12
5
10 se va obţine rezultatul 3 .
Restricţii şi precizǎri:
20000001 N , N numǎr natural.
10000010 Si ,Si numǎr natural , Ni 1
P este numǎr natural , P 1000000
Datele de intrare se citesc din fişierul text „CAMPANIA.IN”, în urmǎtorul format:
De pe prima linie a fişierului de intrare se citesc, în ordine, numerele N şi P
De pe urmǎtoarele N linii se citesc salariile Si ale susţinǎtorilor lui Gyany Cabeli.
Datele de ieşire se vor scrie în fişierul text „SPERANTA.OUT”.
Se va scrie în fişier numǎrul determinat( numǎrul de votanţi care vor beneficia de mǎrirea
salarialǎ)
Problemă propusă de prof. Balacea Georgeta,
Colegiul Naţional „Al.I.Cuza”- OLI 2007 Galaţi
"Fără o mare perseverenţă nu există nici talente, nici genii"
( D. Mendeleev )
23
PROBLEME REZOLVATE, CLASA A V-A
1. Se citşte de la tastatură un număr natural n, n≤1000. Se citesc apoi pe rând n numere
naturale nenule, cu cel mult 9 cifre . Să se afişezea perechile de numere prietene (citite
consecutive). Dacă nu există nicio pereche de numere prietene, se va afişa mesajul “Fara prieteni
!”. Două numere se numesc prietene dacă suma divizorilor primului este egală cu celalalt şi
viceversa.
Problemă propusă de elev Alexandru Mocanu,
clasa a V-a, Colegiul Naţional “Al.I.Cuza” Galaţi
Profesor coordonator Balacea Georgeta
#include<iostream.h>
void main()
{long a[1000],j,i,pa[1000],s,n,ok=0;
cin>>n;
for(i=1;i<=n;i++) cin<<a[i];
for(i=1;i<=n;i++)
{s=0;
for(j=1;j<=a[i]/2;j++)
{if(a[i]%j==0) s=s+j;}
pa[i]=s; s=0;
for(j=1;j<=pa[i]/2;j++)
{if(pa[i]%j==0) s=s+j;}
if(s!=a[i]) pa[i]=0;}
for(i=1;i<=n;i++)
{if (pa[i]!=0)
{cout<<'('<<a[i]<<';'<<pa[i]<<')'<<endl;ok=1
}
if(!ok) cout<<”Fara
prieteni!”<<endl;}
1. Melc
Un melc parcurge o distanţă de l cm în fiecare secundă. Dupa fiecare n secunde, melcul
devine mai obosit, iar distanţa parcursă pe secundă se înjumătăţeşte. Scrieţi un program care
citeşte numerele naturale l, n şi t (t= durata totală a deplasării melcului exprimată în secunde) şi
care afişează distanţa totală pe care a parcurs-o melcul.
Date de intrare
Se citesc de la tastatură numerele naturale l ( distanţa pe care o parcurge melcul într-o secundă la
începutul deplasării sale) , n ( numărul de secunde după care melcul oboseşte iar distanţa parcursă
într-o secundă se înjumătăţeşte) şi t ( durata totală a deplasării).
Date de ieşire
Se va afişa pe ecranul monitorului distanţa totală parcursă de melc, cu două zecimale exacte.
Restricţii
0< l, n, t <30000
Exemple
Date de
intrare
Date de
ieşire
Explicaţii
7 3 8 35.00 Se citesc de la tastatură valorile :
l=7 ( la începutul deplasării melcul parcurge 4 cm pe secundă)
n=3 ( după fiecare 3 secunde melcul oboseşte iar distanţa parcursă
de el într-o secundă se înjumătăţeşte)
t=8 ( melcul se deplasează timp de 8 secunde)
Distanţa totală parcursă de melc în cele 8 secunde este de 35 cm.
Problemă propusă de prof. Joc Genia,
Colegiul Naţional “Al. I. Cuza” - OLI 2009, clasa a V-a
Rezolvare
program melc;
var n, t:integer;
d,l:real;
begin
readln(l,n,t);
24
d:=0;
while n<=t do
begin
d:=d+n*l;
l:=l*0.5;
t:=t-n;
end;
d:=d+t*l;
writeln(d:10:2); end.
Probleme propuse
1. (*)Fiind dat un număr natural n cu cel mult 9 cifre, aflaţi cifra de pe pozitia k (
numaratoarea incepe de la dreapta spre stânga)
Exemplu:
pentru n=1256634 si k=3, se va afisa cifra 6
2. (*) Screţi un program care determină numărul de zerouri cu care se termină se termina n!.
Numărul n! este egal cu produsul tuturor numerelor naturale nenule mai mici sau egale cu n.
4!=1*2*3*4=24. Exemplu:
n=15, n! se termină în 3 zerouri
3. (*) Fiind dat un număr natural cu cel puţin 3 cifre şi cel mult 9 cifre, afişaţi numărul format
prin eliminarea primei şi a ultimei sale cifre.
Exemplu:
Pentru n=786543 se va afişa 8654
4. (**) Scrieţi un program care determină prima cifră nenulă cu care se termină se termina n!.
Numărul n! este egal cu produsul tuturor numerelor naturale nenule mai mici sau egale cu n.
4!=1*2*3*4=24. 5. (**) Să se descompună un număr natural nenul cu cel mult 9 cifre în factori primi. Să se
afişeze factorul prim care apare la puterea cea mai mică şi factorul prim care apare la puterea cea
mai mare.
Exemplu : pentru n=4428 se va afişa : 4428=2^2 * 3^3 * 41
41 3
6. (**) Se citesc de la tastatură numere naturale pâna la citirea numărului 0. Să se calculeze
suma dintre primul număr citit, al treilea număr citit,….. şi produsul dintre al doilea număr citit, al
patrulea număr citit ... Nu se va ţine cont de numărul 0 nici la sumă nici la produs.
Probleme propuse de prof. Balacea Georgeta,
Colegiul Naţional „Al.I.Cuza”
7. (***) Dolars
Pătrăţel are în contul său N dolari. El află de următoarea posibilitate de a-şi mări veniturile:
primeşte o cifră nenulă c şi trebuie să insereze cifra c oriunde în numărul N, astfel încât numărul
rezultat să fie maxim posibil (contul lui mărindu-se considerabil ). Ajutaţi-l să-şi dea seama în ce
poziţie trebuie să insereze cifra C, astfel încât să aibă o sumă cât mai mare în cont.
Date de intrare De la tastatură se citesc N şi c, cu semnificaţia din enunţ.
Date de ieşire
Pe ecran se va afişa numărul maxim obţinut prin inserarea cifrei c în numărul N.
Restricţii, precizări
N are cel mult 8 cifre
Cifra c este nenulă
25
Exemplu:
N = 472
c = 3
Se va afişa: 4732
Explicaţie: Numerele care se pot obţine sunt 4723, 4732, 4372, 3472, maximul dintre acestea fiind
4732.
Problemă propusă de Filip Cristian Buruiană,
student, la concursul INFO-CNVA, 2006
8. (***) Câştig
Doi fraţi, Gigel şi Bogdănel, au reuşit să-şi pună de-o parte ceva bănuţi din alocaţie şi au
acum, Gigel o sumă A iar Bogdănel o suma B (sumele sunt date în euro). Tatăl lor, un bancher
vestit, le propune urmatoarea afacere : dacă vor lua nota 10 la teză la matematică, el le va da la
fiecare o sumă egală cu suma divizorilor comuni ai pătratelor valorilor A şi B. Cei doi fraţi sunt
mai degrabă pasionaţi de fotbal decât de matematică, dar ideea unui câştig le surâde. Insă, înainte
de a se apuca de învăţat pentru teză, ei vor să ştie ce sumă ar avea de primit, pentru a hotărî daca se
merită sau nu efortul.
Cerinţă : Scrieţi un program care citeşte sumele A şi B de la tastatură şi afişează suma pe care o va
primi fiecare dintre fraţi, în cazul în care ar lua un mult-visat 10 la teza la matematică.
Restricţii şi precizări
1A,B200
Exemplu
Date de intrare Date de
iesire
Explicatie
A=5 B=10 31 Divizorii comuni ai lui 52 si 10
2 sunt : 1, 5, 25, iar suma lor
este egala cu 31
A=14 B=21 57 Divizorii comuni ai lui 142 si 21
2 sunt : 1, 7, 49, iar suma
lor este egala cu 57
A=5 B=8 1 Singurul divizor comun al lui 52 si 8
2 este 1
Problemă propusă de prof. Mirela Voinea
la concursul INFO-CNVA, 2005
9. (***) Elevul Gygabyte LowSoft , din clasa a V-a , de ziua îndrăgostiţilor de
informatică ( 17 februarie) , împarte daruri prietenilor săi. LowSoft are foarte mulţi prieteni! S-a
gândit să cumpere bomboane de ciocolată şi să le împartă în mod egal prietenilor săi. S-a gândit ca
are numai 17 prieteni şi cumpără 11 bomboane. Apoi, numărându-şi prietenii, şi-a dat seama că
erau de fapt 1717 copii, drept urmare mai cumpără încă 1111 bomboane. Numărând din nou, vede
că are 171717 prieteni deci cumpără 111111 bomboane, şi tot aşa, de n ori, până când numără
17...171717 copii şi cumpără 11...111111 bomboane.
2*n cifre 2*n cifre
Gygabyte Lowsoft se gândeşte să împartă bomboanele în felul următor : fiecare dintre cei
17...171717 prieteni va primi un număr de bomboane egal cu suma următoarelor fracţii:
2*n cifre
17...1717
11...1111...
171717
111111
1717
1111
17
11 .
2*n cifre
Dacă suma are n termeni, n citit de la tastatură , ajutaţi-l pe săracul Lowsoft să răspundă la
următoarele întrebări:
1) Primeşte fiecare copil un număr întreg de bomboane?
26
2) Câte bomboane primeşte fiecare copil? ( răspunsul va fi scris pe ecran, sub forma unei
fracţii ireductibile)
Exemplu:
Pentru n=2 :
1) Nu
2) 17
22
Restricţii şi precizări: Date de intrare: n- numar natural nenul, cu cel mult opt cifre.
Problemă propusă de prof. Balacea Georgeta,
Colegiul Naţional „Al.I.Cuza”- OLI 2006 Galaţi
Clasa a VI-a, Probleme rezolvate
1. Seif
Hacker-ul Bombonel a fost prins de serviciile de securitate şi pentru a i se ierta faptele din
trecut a fost obligat să înceapă să lucreze pentru ei. Prima lui misiune este de a sparge o parolă a
unui seif ce deţine informaţii vitale cu privire la securitatea naţională. Fiind un profesionist, acesta
a aflat câteva informaţii despre parolă şi anume că sunt doi paşi ce trebuie urmaţi pentru a o afla.
Primul este adunarea binară a n numere, iar al doilea este de a afla suma tuturor numerelor
naturale de la 1 la rezultatul obţinut în primul pas. Parola va fi reprezentată de suma obţinută.
Bombonel însă, a fost trimis între timp în altă misiune şi te-a rugat pe tine, ca prieten al lui, să îl
ajuţi.
Date de intrare:
În fişierul hack.in se află pe prima linie numărul n şi pe următoarea linie cele n numere αi despărţite
prin spaţiu.
Date de ieşire:
Pe prima linie a fişierului hack.out se va afla parola obţinută după parcurgerea celor 2 paşi.
Restricţii:
1 n<231
1αi<215
hack.in Hack.out
3
45 52 3
351
hack.in Hack.out
4
110 5898 4438 902
1066530
Problemǎ propusǎ de catedra de informaticǎ,
CNVA- OLI 2007 Galaţi
Rezolvare
#include<fstream.h>
int x, n, i; long s, c;
void main()
{fstream f("hack12.in", ios::in), g("hack12.out", ios::out);
f>>n;
for(i=1; i<=n; i++)
{f>>x;s=s^x;}
c=s*(s+1)/2;
g<<c;f.close();g.close();}
27
2. Comoara Ascunsǎ
Pufosu, iepuraşul temerar, doreşte să-şi ascundă comoara (cei 100 morcovi gustoşi) în
seif. Pufosu însă nu poate să reţină codul (format din caractere imprimabile) cu care deschide
seiful! De aceea, s-a hotărât sa-l scrie în fişierul text „Pufosu.txt” astfel: In fişier sunt scrise mai
multe numere întregi, cuprinse între 20 şi 200. Dintre acestea, selectează doar numerele
supraperfecte, care reprezintă codurile ASCII ale caracterelor din care este compusă parola de
deschidere a seifului.
Afişaţi pe ecran parola cu care Pufosu îşi poate deschide seiful!
Un numǎr N este SUPRAPERFECT dacǎ suma S a divizorilor sǎi (exceptand numarul
insuşi) este mai mare decât N. Exemple de numere supraperfecte:
12<1+2+3+4+6;
Date de intrare:
În fişierul Pufosu.txt se află pe prima linie numerele naturale cuprinse între 20 şi 200.
Date de ieşire:
Se afişeazǎ pe ecran parola compusǎ din caracterele ale cǎror coduri ASCII sunt numerele
supraperfecte, dintre cele citite din fişierul de intrare, în ordinea în care au fost citite.
Problemǎ propusǎ de profesor Georgeta-Iulia Balacea,
Colegiul Naţional “Al.I.Cuza” – OLI 207 Galaţi
Rezolvare
#include <fstream.h>
int suma_div(int nr)
{int S=0;
for (int i=1;i<=nr/2;i++)
if(nr%i==0) S+=i;
return S;}
void main()
{int n;
fstream f("pufosu.txt",ios::in);
f>>n;
do { if(suma_div(n)>n)
cout<<(char)n; f>>n; } while(!f.eof());
f.close();}
Probleme propuse
1. (*)Fie numerele naturale nenule, mai mari sau egale decât 2, a şi b. Numărul a este un
număr natural scris în baza 10, cu cel mult 9 cifre. Numărul b este un număr natural mai mic sau
egal decât 16 şi reprezintă o bază de numeraţie. Scrieţi numărul a în baza b.
Exemplu: a= 123 ; b=2; 12310=11110112
2. (*) Daca p este un număr prim mai mare decat 5, orice numar cu p-1 cifre identice se
imparte exact la p.
Exemplu : numarul 333333 se imparte exact la 7 ; numărul 222222222 se împarte exact la
13 ; Verificaţi această proprietate pentru toate numerele naturale prime p, mai mici sau egale decât
n, unde n este un număr natural mai mare sau egal decât 5 şi mai mic sau egal decât 100.
3. (*) Problema maimuţei
Pe o insulă pustie au naufragiat 3 marinari şi o maimuţă. (Pe insulă nu mai trăieşte nici un
alt animal şi niciun alt om!). Imediat după naufragiu, marinarii au cules n nuci de cocos. Noaptea,
primul marinar se trezeşte, împarte nucile de cocos în trei grămezi egale ( cu acelaşi număr de nuci
de cocos) dar, îî ramâne o nucă pe care o dă maimuţei. După o lungă dezbatere cu sine-însuşi, ia o
grămadă pe care o ascunde bine şi pune nucile din celelalte două grămezi la loc. Apoi se culcă
mulţumit! Se scoală al doilea marinar şi împarte nucile de cocos rămase în trei grămezi egale ( cu
acelaşi număr de nuci de cocos) dar, îi ramâne o nucă pe care o dă maimuţei. După o lungă
dezbatere cu sine-însuşi, ia o grămadă pe care o ascunde bine şi pune nucile din celelalte două
grămezi la loc. Apoi se culcă mulţumit! Al treilea marinar procedează la fel. Dimineaţa marinarii
se trezesc, împart nucile de cocos în trei grămezi egale, le rămâne o nucă pe care o dau maimuţei şi
apoi ia fiecare, frăţeşte, câte o grămadă.
Dându-se un număr natural n, cu cel mult nouă cifre, determinaţi:
28
a) Cel mai mic număr natural cu maxim 9 cifre, mai mare sau egal decât n, care ar putea fi
numărul de nuci de cocos culese de cei trei marinari .
b) Pentru numărul determinat la punctul (a) afişaţi câte nuci de cocos are fiecare marinar
în total.
Exemplu: Pentru n=239 se va afişa : 241 ( numărul de nuci de cocos culese este 241)
Primul marinar are 103 nuci de cocos
Al doilea marinar are 76 nuci de cocos
Al treilea marinar are 58 nuci de cocos.
Probleme propuse de profesor Georgeta-Iulia Balacea,
Colegiul Naţional “Al.I.Cuza”
4. (**)Stoluri
De îndată ce frigul a trecut, păsările migratoare care au supravieţuit gripei aviare se
pregătesc să se întoarcă acasă. Şeful lor, un bâtlan bătrân şi înţelept, încearcă să le organizeze.
Împarte păsările în stoluri, astfel încât fiecare stol să aibă exact x păsări. Observă însă că din
ultimul stol lipseşte o pasăre. Nemulţumit, mai face o încercare: le împarte în stoluri de câte y.
Observă însă cu stupoare că din ultimul stol, tot lipseşte o pasăre. Nervos de-a dreptul, începe să le
împartă câte z în fiecare stol. Incredibil însă, din ultimul stol tot lipseşte o pasăre. Disperat, o roagă
pe barză, care e mai pricepută la matematică, să rezolve problema, să găsească ea o soluţie de
împărţire în stoluri egale.
Dar grijile bătrânului bâtlan nu s-au terminat, pentru ca el mai trebuie să raporteze la
Asociaţia Păsărilor Migratoare care e numărul de păsări care s-au întors în ţară.
Fie-vă milă de bietul bâtlan şi ajutaţi-l să afle câte păsări are în subordine, ştiind că numărul
acestora e cel mai mic cu această proprietate. Determinaţi şi câte păsări va pune barza în fiecare
stol, ştiind că încearcă să le împartă în cât mai puţine stoluri.
Date de intrare
Se citesc de la tastatură cele 3 numere, x, y şi z
Date de ieşire
Se afişează pe un rând numărul de păsări migratoare care se întorc acasă şi pe celălalt rând,
numărul de păsări din fiecare stol (dacă se poate face o împărţire în mai multe stoluri), sau mesajul
“IMPOSIBIL”, în caz contrar.
Restricţii, precizări
x, y, z (1,1000]
x,y şi z sunt diferite între ele, două câte două
Exemple 1) Date de intrare : Date de ieşire
x=6 Sunt 119 păsări
y=8
z=5
Problemă propusă de profesor Mirela Voinea,
Colegiul Naţional “V.Alecsandri”
5. (**)Număr ciudat
Ionică, elev în clasa a VI-a, este pasionat de matematică ! Cel mai mult îi plac numerele
prime ! In pauza mare, s-a gândit să genereze cel mai mic număr natural format din toate cifrele
numerelor prime mai mici sau egale decât n, unde n este un număr natural, 312n . Ajutaţi-l pe
Ionică să rezolve problema într-un timp foarte scurt : cel mult 1 scundă .
Problemǎ propusǎ de profesor Adriana Broștiuc,
Șc. gimnazială nr. 29, Galaţi
6. (**)S.O.S.
La ora de educaţie fizică domnul profesor doreşte să aranjeze cei n elevi ai claselor a VI-a
pe un singur rând. Are însă o problemă foarte mare: doi băieţi aşezaţi unul lăngă celălalt ar vorbi
29
toată ora despre box şi ar deranja pe toţi ceilalţi copii! Ajutaţi-l pe bietul profesor să afle în câte
moduri poate aranja cei n elevi ai claselor a VI-a astfel încât niciun băiat să nu aibă vecin un alt
băiat. Se citesc de la tastatură numerele naturale n(numărul total de elevi) şi b(numărul total de
băieţi din clasele a VI-a).
7. (***)Piramida lui Keops
Gigel, elev în clasa a VI-a, era pasionat de studiul istoriei antice. A găsit la biblioteca şcolii,
o carte de istorie, scrisă de HERODOT în anul 450 I.C., când a vizitat Egiptul. A descoperit acolo
o hartă a piramidei. Camera mortuară a faraonului se află chiar in mijloc, în “inima” piramidei şi
este accesibila numai din “Marea Galerie”. Până acum, nici comoara, nici mumia lui Keops, nu au
fost găsite. Gigel a studiat mai multe documente şi a descoperit un coridor secret spre „Camera
comorii”. Era totuşi o problemă: pentru a putea intra în camera comorii, trebuia descifrat un cifru.
Pe pereţii coridorului erau înscrise n numere naturale. Cifrul era cel mai mic număr natural format
din 5 cifre, compus din cifrele zecilor celor n numere naturale. Ajutaţi-l pe Gigel să descopere
cifrul pentru a intra în camera comorii!
Dacă problema nu are soluţie, afişaţi mesajul „Cifru eronat”. In caz contrar, afişaţi cifrul găsit.
Exemplu: Pentru n=5 şi numerele 10, 21, 35, 49, 86 se va afişa cifrul 12348.
Restricţii şi precizări:
5<=n<=100000 ( n este numărul de numere naturale înscrise pe pereţii coridorului)
Cele n numere naturale sunt mai mici sau egale cu 231
-1
Date de intrare:
De la tastatură se citeşte n, numărul de numere naturale.
De la tastatură se citesc cele n numere naturale.
Date de ieşire:
Cifrul determinat.
Probleme propuse de profesor Georgeta-Iulia Balacea,
Colegiul Naţional “Al.I.Cuza”-OLI-2007
8. (***)Pinochio
Pinochio, elev în clasa a VI-a, nu are rezultate foarte bune la învăţătură. La sfârşitul
semestrului I, el a rămas corigent la 6 obiecte. Bineînţeles, l-a minţit pe GEPETTO, spunându-i că
a obţinut la toate disciplinele media m , 6m 9, număr natural . Zâna cea bună, ocrotitoarea lui
Pinochio, a hotărât sa-l pedepsească: Timp de z zile, z număr natural, 2 z 365, nasul lui
Pinochio va creşte astfel: În prima zi, nasul se lungeşte cu m milimetri. În a doua zi, nasul lui
Pinochio se măreşte cu o lungime de zece ori mai mare decât a crescut în prima zi şi cu încă m
milimetri. În a treia zi, bietului Pinochio îi creşte nasul cu o lungime de zece ori mai mare decât cea
din a doua zi plus încă m milimetri. Şi tot aşa mai departe. În ultima zi ( ziua z) nasul lui Pinochio
creşte de 10 ori mai mult decât a crescut în ziua anterioară şi cu încă m milimetri. Copil sensibil,
Pinochio suferă cumplit şi plânge. Pentru a-şi şterge lacrimile, copilul foloseşte în fiecare zi o
batistă de hârtie care are lungimea ( în milimetri) egală cu lungimea cu care îi creşte nasul în ziua
respectivă. Calculaţi câţi metri de hârtie a folosit Pinochio pentru a-şi şterge lacrimile în cele z zile.
Exemplu: Pentru m=6 şi z=3 se va afişa 0,738 m .
Restricţii şi precizări:
2<=m<=9 , m număr natural
2 z 365 , z număr natural
Date de intrare:
De la tastatură se citesc m, şi z .
Date de ieşire:
Lungimea în metri a hârtiei folosite de Pinochio.
9. (***)Tema de vacanţă
La încheierea primului semestru, profesorul de informatică propune elevilor clasei a IX-a , ca temă
de vacanţă, rezolvarea a N probleme. Se ştie că un elev poate rezolva într-o oră una sau două
30
probleme şi că fiecare elev lucrează exact o oră pe zi. Determinaţi în câte moduri poate un elev îşi
poate rezolva integral tema de vacanţă. Exemplu:
Dacă N =4 ( patru probleme propuse pentru tema de vacanţǎ), un elev le poate rezolva în 5
moduri.
Restricţii şi precizǎri:
501 N , N este numǎr natural.
Date de intrare:
N – se citeşte de la tastatură
Date de ieşire:
Numărul de moduri în care un elev poate rezolva tema de vacanţă, afişat pe ecran.
Probleme propuse de profesor Georgeta-Iulia Balacea,
Colegiul Naţional “Al.I.Cuza”-OLI-2007
PROBLEME REZOLVATE CLASELE VII-VIII
1.Echilibrarea balanţei
Caracatiţa Cauchemar a sehestrat pe toţi cei x peştişori din familia lui Farnabulle :
Acesta, disperat, ar fi fǎcut orice ca sǎ poatǎ înmuia inima lui Cauchemar şi sǎ-şi elibereze
familia.
Cauchemar i-a propus lui Farnabulle sǎ rezolve urmǎtoarea problemǎ : Se dau m1 greutǎţi de k1
kg fiecare şi m2 greutǎţi de k2 kg fiecare. Caracatiţa doreşte sǎ afle toate modalitǎţile în care poate
sǎ echilibreze o balanţǎ care are pe platanul din stânga o greutate egalǎ cu x Kg (câte un kilogram
pentru fiecare peştişor captiv). Greutǎţile pot fi puse pe ambele platane. Dacǎ balanţa nu poate fi
echilibratǎ, Cauchemar va gǎti o ciorbǎ excelentǎ din toţi membrii familiei lui Farnabulle !
Rezultatele se vor scrie în fişerul text « Balanta.txt » sub forma unui tabel cu douǎ coloane , cu
linii de forma :
Stânga = Dreapta
a*ki = b*kj
unde a≤m1,b≤m2, i,j=1,2, i≠j.
Dacǎ balanţa nu poate fi echilibratǎ, se va scrie mesajul :”Pofta buna, Cauchemar!”
De exemplu:
Pentru m1 =5 şi m2=5 , k1=2 şi k2= 1, x=4.
Se va obţine :
Balanţa.txt
Sanga= Dreapta
4=4*1
4=1*2+2*1
4=2*2
4+2*1=3*2
4+4*1=4*2
Timp maxim de execuţie : 0,5 s/test
Problemǎ propusǎ de profesor Ionela Fotache,
Liceul Teoretic Dunǎrea – Galaţi
Inteligenta artificiala nu se poate compara cu prostia naturala.
31
//echilibrarea balanţei
#include<iostream.h>
#include<math.h>
void main()
{float k1,k2,m1,m2;//informatii despre greutăţi
int x;//greutatea de pe platanul din stanga
float n1,n2;//numar de greutăţi utilizate pentru echilibrare
unsigned int nrsol;//numar solutii
float c;
cout<<"echilibrare balanta cu 2 tipuri de greutăţi" <<endl;
cout<<" nr de greutăţi din fiecare tip: m1 m2 =";cin>>m1;cin>>m2;
cout<<"greutatea pentru fiecare tip :k1 k2 = ";
cin>>k1;cin>>k2;
do
{cout<<endl;
cout<<"Greutatea x (<0 pentru oprire) : ";cin>>x;
if (x>=0)
{nrsol=0;cout<<endl;
for (n1=-m1;n1<=m1;n1++)
{c=(x-n1*k1)/k2;
cout<<"rez="<<c;
if ((c-int(c))==0 && (int(abs(c)))<=m2)
{n2=int(c);nrsol++;
if(nrsol==1) cout<<endl<<"stanga-dreapta";
if (n1*n2<0)
if(n1<0)
cout<<endl<<x<< "+"<<-n1<<"*"<<k1<<"="<<n2<<"*"<<k2;
else
cout<<" "<<x<<-n2<<"*"<<k2<<"="<<n1<<"*"<<k1;
else
{cout<<x<<" ";
if (n1>0) cout<<n1<<"*"<<k1;
if (n1*n2>0) cout<<"+"; //ambele tipuri
if (n2>0) cout<<n2<<"*"<<k2;
}
cout<<endl;
}
}
if (nrsol==0) cout<<endl<<"Balanta nu poate fi echilibrata";
} }
while (x>=0);
}
2. MATRIX
Vasilicǎ este pasionat de filme SF şi programare. Filmul lui preferat este MATRIX. Are chiar
şi programe de prelucrare a fişierelor video cu ajutorul calculatorului. A realizat capturi şi a
inceput sǎ studieze amanunţit imaginile de pe ecran. Secvenţele lui favorite sunt cele care descriu
matricea reprezentatǎ ca secvenţe de biţi din celebrul film. Vasilicǎ a observat chiar anumite
similitudini între liniile care încarcǎ un ecran.
32
Doua linii se numesc similare dacǎ sunt scrise cu aceleaşi cifre binare, eventual in alta ordine.
Incantat de descoperirea sa Vasilicǎ a împǎrţit matricea în grupuri de linii similare, ba mai mult,
şi-a propus sǎ determine grupul dominant. Un grup se numeşte dominant daca va conţine un
numǎr maxim de linii similare. Inainte de a începe sǎ elaboreze un program care sǎ determine
câte linii similare are grupul dominant dintr-o matrice Vasilicǎ a realizat cǎ poate interveni şi o
astfel de problemǎ: matricea poate avea mai multe grupuri dominante. Ajutaţi-l pe Vasilicǎ sǎ
determine câte grupuri dominante are o matrice şi câte linii are fiecare grup dominant.
Date de intrare
Pe prima linie a fişierului matrix.in se aflǎ doua numere naturale M, N ( 2<=M<=3000 si
2<=N<=1000 ). Pe urmatoarele M linii se afla câte N numere naturale având valorile 0 sau 1,
reprezentând matricea.
Observaţie: cifrele binare nu sunt separate prin spaţiu.
Date de ieşire
Pe prima linie a fişierului matrix.out se vor afla doua numere naturale reprezentand numǎrul
de grupuri dominante şi numǎrul de linii similare dintr-un astfel de grup.
Exemplul 1
matrix.in
7 5
11000
00110
11110
10011
11011
01111
00110
matrix.out
2 3
1 3
Problema propusǎ de prof. Neagu Violeta,
Colegiul National “Mihail Kogǎlniceanu” Galaţi-OLI 2008
Rezolvare
#include<fstream.h>
int v[4000];
void main()
{fstream f;f.open("matrix5.in", ios::in);
int m,n;
f>>m>>n;
char x; int max=0,fv;
for(int i=1;i<=m;i++)
{int k=0;
for(int j=1;j<=n;j++)
{f>>x; k+=x-'0'; }
v[k]++;
if(v[k]>max)
{max=v[k]; fv=1;}
else
if(max==v[k]) fv++;
}
f.close();
f.open("matrix5.out",ios::out);
f<<fv<<' '<<max;}
Explicaţie: matricea contine un grup dominant care contine 3 linii
similare. Cele 3 linii similare contin aceleasi cifre binare: doua cifre
1 si trei cifre 0 fiecare.
33
Probleme propuse
1. (*)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 lor.
2. (*)Dându-se un tabel unidimensional, care conţine maxim 100 numere întregi, să se afişeze
diferenţa maximă găsită între două elemente consecutive.
3. (*)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.
Probleme propuse de prof. Neguţ Veronica,
Liceul Teoretic Dunărea
4. (**)Să se determine suma elementelor de sub diagonala principală a unei matrici patratice de
întregi,inclusiv elementele de pe diagonala principală.
Problemă propusă de prof. Novetschi Monica,
Colegiul Naţional M.Kogălniceanu
5. (**)Se dă un tablou unidimensional V cu n elemente de tip întreg. Să se determine vectorii v1
şi v2 astfel încât v1[i] să fie numărul minim format din cifrele lui v[i] şi v2[i], să fie numărul
maxim format din cifrele lui v[i].
Problemă propusă de prof. Stan Maria,
Grupul Şcolar Radu Negru 6. (**)Se dau 2 numere naturale a şi b, având acelaşi număr de cifre, n (9<n<=4000000000).
Cerinţe:
a)Calculaţi s=a+b
b)Calculaţi ultima cifră a sumei 1s+2
s+3
s+…+2008
s+2009
s.
c)Calculaţi în câte zerouri se termină numărul t!, unde t are primele 4 cifre semnificative date
de primele 4 cifre ale lui s şi ultimele 5 cifre date de ultimele 5 cifre ale produsului a*b.
Date de intrare:
Cifrele lui a si b citesc din două fişiere text cifrea.in, respectiv cifreb.in, câte una pe linie,
incepand cu cifra cea mai semnificativă pâna la cifra unităţilor pe ultima linie(a n-a).
Date de ieşire
In fişierul s1.out se vor tipări cifrele sumei s, în fişierul t1.out se vor tipări cifrele lui t! ,iar pe
monitor rezultatul de la punctul b)
Restricţii:
9<n<=4000000000
Citirea lui a şi b se va face în program sincron , succesiv citind din cele 2 fişiere cifrea.in,
cifreb.in câte o preche de cifre (ai,bi), i=1,n , de pe linia i din fiecare fişier.
7. (***)Se dau 3 balanţe notate A,B,C, aşezate alăturat, având în faţă câte n greutăţi, de un
singur tip de greutăţi standard, na, respectiv nb , nc. Pentru verificarea etalonarii corecte a
dispozitivelor se incearcă cântarirea a 3 greutăţi, Ga ,Gb ,Gc aşezate pe talerul din dreapta a fiecărei
balanţe (Ga pe balanţa A, Gb pe balanţa B, Gc pe balanţa C). Din păcate operatorul observă că
3
1i
(Gi mod ni )<>0, însă tot el observă că mutând greutăţi de tipuri diferite (conservând insă
numarul total de greutăti de fiecare tip) intre balanţe şi punând greutăţi pe talerele din stanga şi
eventual şi pe cele din dreapta, el poate să echilibreze simultan cele 3 balanţe. Se cere sa se afiseze
Indiferent ce cauti pe internet, cel putin un site cu probleme se va potrivi cu criteriile tale de cautare.
34
printr-un program in cate moduri se pot echilibra simultan cele 3 balanţe si care este varianta in
care nr de greutăţi mutate in total de la o balanţă la alta este minim.
Date de intrare:
n<150
na, nb , nc , Ga ,Gb ,Gc <100000 miligrame
Probleme propuse de profesor Şoldan Florin,
Colegiul Naţional “V.Alecsandri”
8. (***)Pofticiosul
La cofetăria „Pofticiosul”, patronul a adus n tipuri de prǎjituri, câte m prǎjituri din fiecare
sortiment. O prǎjiturǎ de tipul i (1 in) costǎ C[i] RON. Patronul aşeazǎ prǎjiturile în vitrinǎ, pe
m rânduri, astfel încât pe o coloanǎ sunt numai prajituri din acelaşi sortiment. In fiecare searǎ,
dupǎ închiderea magazinului, vânzǎtorul Mickey, foarte pofticios din fire, furǎ toate prǎjiturile
care se aflǎ în vitrinǎ, într-o zonǎ dreptunghiularǎ, având colţul din stânga sus pe linia XSTG şi
pe coloana YSTG, iar colţul opus pe linia XDR şi pe coloana YDR. Ca patronul sǎ nu observe
paguba, Petricǎ „acoperǎ” furtul: pe fiecare linie pe care existǎ spaţii libere, deplaseazǎ spre
stânga toate prǎjiturile care se aflǎ în dreapta locului liber rǎmas. Dar, lui Mickey încǎ îi mai este
foame! Astfel încât el repetǎ metoda, şi furǎ iar din prǎjituri, în acelaşi mod! Pofticiosul continuǎ
sǎ fure şi sǎ „acopere paguba” de K ori. (Pânǎ se saturǎ!).
Numǎrul n de sortimente, numǎrul m de prajituri din fiecare tip, costul fiecǎrei prǎjituri în parte ,
numǎrul K de furturi precum şi coordonatele zonelor din care Petricǎ furǎ prǎjiturile, se citesc
din fişierul text „Mickey.in”.
1) Scrieţi în fişierul text „Paguba.out” costul prǎjiturilor furate de Mickey.
2) Scrieţi în fişierul text „Paguba.out” configuraţia finalǎ a vitrinei.
De exemplu, pentru n=6 ( 6 tipuri de prǎjituri) şi m=4 (câte 4 prǎjituri din fiecare sortiment),
costurile prǎjiturilor: 1 (o prǎjiturǎ din sortimentul 1 costǎ 1 RON); 2(o prǎjiturǎ din sortimentul 2
costǎ 2 RON); 3(o prǎjiturǎ din sortimentul 3 costǎ 3 RON); 4 ; 5; 6(o prǎjiturǎ din sortimentul 6
costǎ 6 RON) şi K=2, iniţial vitrina cofetǎriei arǎta astfel:
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
Dacǎ Petricǎ furǎ prima datǎ prǎjiturile din zona (2,2) (colţul stînga sus) şi (3,3) (colţul dreapta
jos), iar a doua oara din zona (3,3) (colţul stânga sus) şi (4,4) (colţul dreapta jos), dupǎ
acoperirea pagubei, vitrina va arǎta astfel :
1 2 3 4 5 6
1 4 5 6 0 0
1 4 0 0 0 0
1 2 5 6 0 0
Iar costul prǎjiturilor furate este de 28 RON.
Restricţii şi precizǎri:
1n300
1m300
1K 100
Costul fiecǎrei prǎjituri este un numǎr natural nenul, mai mic decât 20.
35
Date de intrare:
Fişierul de intrare „Mickey.in”, conţine pe prima linie 3 numere naturale: n, m şi K,
reprezentând numǎrul de sortimente de prǎjituri(n) , numǎrul de prǎjituri din fiecare sortiment(m)
şi numǎrul de furturi(K).
Pe a doua linie a fişierului de intrare, se aflǎ n numere naturale reprezentând costurile
prǎjiturilor, separate prin câte un spaţiu.
Pe urmǎtoarele K linii se aflǎ câte 4 numere naturale nenule, reprezentând linia şi coloana
colţului stânga sus (XSTG ; YSTG) , respectiv linia şi coloana colţului dreapta jos (XDR ; YDR)
al dreptunghiului de unde Petricǎ furǎ prǎjiturile. Nu este obligatoriu ca dreptunghiul din care
Mickey va fura sǎ conţinǎ prǎjituri în fiecare loc. Numerele sunt separate prin câte un spaţiu.
Pentru exemplul dat, fişierul de intrare va arǎta astfel :
MICKEY.IN
6 4 2
1 2 3 4 5 6
2 2 3 3
3 3 4 4
Date de ieşire:
Fişierul de ieşire „Paguba.Out” va conţine pe prima linie un numǎr natural, reprezentând
costul prǎjiturilor furate.
Pe urmǎtoarele m linii, se fa afişa configuraţia finalǎ a vitrinei cu prǎjituri. Dacǎ pe linia i,
coloana j, nu se mai gǎseşte nici o prǎjiturǎ, se va afişa 0. Pe fiecare linie, numerele vor fi separate
prin câte un spaţiu.
Pentru exemplul dat, fişierul de ieşire va arǎta astfel:
28
1 2 3 4 5 6
1 4 5 6 0 0
1 4 0 0 0 0
1 2 5 6 0 0
Problemă propusă de profesor Georgeta-Iulia Balacea,
Colegiul Naţional “Al.I.Cuza”-OLI-2007
9. (***)Scufiţa Roşie In vacanţa de vară, Scufiţa Roşie s-a hotărât să-i ducă bunicuţei bolnave, în fiecare
zi, gogoşi. Fetiţa poate să-i ducă bunicuţei în prima zi o gogoaşă, în a doua zi tot o singură
gogoaşă, în a treia zi două gogoşi, în a patra zi trei gogoşi, în a cincea zi cinci gogoşi, în a
şasea zi opt gogoşi, şi aşa mai departe.
Drumul spre bunicuţa trecea însă prin pădure, iar LUPUL stătea la pândă! Era
extrem de periculos, deoarece şi LUPULUI îi plăceau tare mult gogoşile, iar fetiţa risca să-i
ducă bunicuţei coşuleţul gol, dacă se întâlnea cu Lupul.
a) Ştiind că vacanţa de vară are 50 de zile, determinaţi câte gogoşi ar trebui să ducă
Scufiţa Roşie bunicuţei bolnave în ziua Z (1Z 50).
b) Dacă se ştie că Scufiţa Roşie are de dus bunicuţei un număr G de gogoşi,
determinaţi care sunt zilele în care fetiţa ar trebui să meargă la bunicuţa, astfel încât să facă
un număr minim de drumuri.
Exemplu:
a) Dacă Z=7, Scufiţa Roşie ar trebui să ducă bunicuţei 13 gogoşi.
b) Dacă numărul de gogoşi pe care Scufiţa Roşie trebuie să-l ducă bunicuţei este 20 de
gogoşi, fetiţa merge la bunicuţa în următoarele zile: 2 ; 5 ; 7.
Restricţii şi precizări:
Z şi G sunt numere naturale, 1G 231
-1 şi 1Z 50
36
Date de intrare
Datele de intrare Z şi G, se citesc din fişierul text „Gogoasa.in” .
De pe prima linie a fişierului de intrare se citeşte numărul natural Z, iar de pe a doua linie se
citeşte numărul natural G
Date de ieşire
Datele de ieşire se scriu în fişierul text „Gogoasa.out”, cu următorul format:
Pe prima linie a fişerului se va scrie numărul de gogoşi pe care trebuie sa-l ducă
Scufiţa Roşie bunicuţei în ziua Z.
Pe următoarea linie se scriu, în ordine crescătoare, separate prin câte un spaţiu, zilele
în care Scufiţa Roşie va merge la bunica.
Pentru exemplul dat:
Fişierul de intrare „Gogoasa.in” este :
7
20
Fişierul de ieşire „Gogoasa.out” este:
13
2 5 7
Problemă propusă de profesor Georgeta-Iulia Balacea,
Colegiul Naţional “Al.I.Cuza”-OLI-2007
Legile lui Murphy despre informatica
Hardware: Acele parti ale sistemului pe care le poti lovi cu piciorul.
Software: Acele parti ale sistemului care nu functioneaza.
Hard disk: Acea componenta a sistemului care intepeneste in momentul cel mai nepotrivit cu
putinta.
Periferica: Acele componente care sunt incompatibile cu sistemul tau.
Imprimanta: Acea componenta a sistemului care se blocheaza cand nu te uiti la ea.
Cablu: Acea parte a sistemului care e prea scurta.
Backup: O operatie care niciodata nu este efectuata la timp.
Restaurare: O precedura care functioneaza perfect pana cand e nevoie de ea.
Memorie: Acea parte a sistemului computerizat care este insuficienta.
Mesaj de eroare: O solicitare de aprobare a distrugerii propriilor tale date.
Fisier: Acea parte a sistemului care nu poate fi gasita.
Procesor: Acea componenta a sistemului computerizat care este depasita tehnologic.
37
VISUAL WEB DEVELOPER - I
ASP.NET este o tehnologie Microsoft
pentru crearea de aplicaţii web şi servicii
web. ASP.NET este succesorul lui ASP
(Active Server Pages) şi beneficiază de
puterea platformei de dezvoltare .NET, şi de
setul de instrumente oferite de mediul de
dezvoltarea al aplicaţiei „Visual Studio
.NET”. Model abstract pentru programarea
Web pe partea de server, bazat pe Web Forms
interactiuneWeb condusa de evenimente
(event driven programming) componenteWeb
executate la nivel de server (proprietati şi
evenimente) suport pentru procesari stateful –
cu stare (ViewState)
Se stie că .NET Framework este un
mediu de programare obiectuală, la nivel
local/distanţă dar şi mediu de execuţie
minimizând efortul de exploatare
(deployment). De semenea oferă suport
pentru dezvoltare la nivel de client (aplicaţii
Windows desktop ori mobile) sau server –
aplicaţii/servicii Web ajungând la versiunea
4.0. Locul aplicaţiilor ASP sub platforma
.NET este reprezentat mai jos
Câteva dintre avantajele ASP .NET sunt:
1. ASP .NET are un set larg de
componente, bazate pe XML, oferind
astfel un model de programare
orientat obiect (OOP).
2. ASP .NET rulează cod compilat, ceea
ce creşte performanţele aplictiei web.
Codul sursă poate fi separat în două
fişiere, unul pentru codul executabil,
iar un altul pentru continutul paginii
(codul HTML şi textul din pagină) .
3. .NET este compatibil cu peste 20 de
limbaje diferite, cele mai utilizate
fiind Visual Basic şi C#.
Pe lângă un sistem de operare Windows
XP sau Vista, pentru a putea creea un site
ASP .NET este nevoie de:
Visual Web Developer 2008 reprezintă
unealta celor de la Microsoft cu ajutorul
căruia putem creea pagini web simplu şi fără
să scriem prea mult cod. Printre facilităţile
oferite de Web Developer amintim
următoarele:
1. Obiectele se pot adăuga cu uşurinţă. Tot ce
trebuie să facem pentru adăugarea unui buton
pe pagină este să tragem obiectul buton din
toolbox (bara de unelte). Acesta are o colecție
de obiecte (imagini, tabele, butoane) ce se pot
trage din panoul cu obiecte direct pe pagina
ce urmează a fi publicată..
2. Server integrat. Web Developer are
integrat un server web pentru a putea rula
paginile create. Programarea în ASP .NET
este server side, ceea ce înseamnă că codul
trebuie executat pe server iar apoi trebuie
retrimis browserului clientului sub formă
HTML. De această procedură se ocupă
serverul integrat.
3. Verificarea erorilor. Web Developer vă
avertizează când aţi scris o linie de cod
eronată şi vă oferă o posibilă soluţie pentru a
remedia eroarea. Aceasta ajută în corectarea
şi scrierea eficientă a codului.
4. Intellisense - se referă la afişarea tuturor
metodelor şi evenimentelor unui obiect plus o
scurtă descriere. În acest mod vom putea
vedea ce ştie fiecare obiect.
5. Debugging. Web Developer vă oferă
posibilitatea de a verifica valorile
38
variabilelor, de a urmări codul pas cu pas, sau
de a opri execuţia într-un punct anume.
Pentru a folosi baze de date, se poate
descărca SQL Server 2005 Express impreună
cu programul de management al bazei de date
SQL Server Management Studio Express.
Acesta vă oferă posibilitatea de a creea,
şterge şi modifica baze de date şi tabele cu
uşurinţă precum şi rularea de interogări.
Pachetul conţine şi .NET
FRAMEWORK 3.5, ultima versiune a
colecţiei de clase necesare pentru a putea
creea paginile web folosind funcţii foarte
folositoare şi gata implementate.
Pentru a crea un site nou în Web
Developer procedăm astfel. Click pe File ->
New WebSite
În fereastra ce apare putem alege
directorul unde vor fi stocate fişierele ASP
.NET şi limbajul de programare: C# sau
Visual Basic. În acest tutorial vom lucra cu
VB.
După alegerea directorului site-ului şi
a limbajului de programare, va apare codul
sursă pentru prima pagina a site-ului
default.aspx:
- în partea de sus-stânga putem vedea
default.aspx. Acesta e fişierul implicit al site-
ului( echivalent în HTML este index.html )
iar dacă intrăm pe site este primul ce se va
executa.
- tot în stânga sus este toolbox-ul.
Dacă trecem cu mouse-ul deasupra se va
afişa. Lângă butonul X de închidere al
toolbox-ului este autohide. La un click pe
autohide toolbox-ul va rămâne fix.
- jos-stânga vom vedea 3 butoane:
Design, Split şi Source. Dacă intrăm în partea
de Design vom vedea ceea ce se vede efectiv
pe site (butoane, tabele, etc), în partea de
Source vom vedea codul HTML iar Split va
împărţi fereastra Web Developer-ului în două
(pentru Design şi Source).
- în partea de jos la Output vom avea
evetualele mesaje de eroare sau alte mesaje.
- în dreapta-sus se află solution
explorer: lista cu fişierele site-ului. Fişierul
web.config se crează automat, dar despre el
se va discuta separat. Putem observa un semn
+ în dreptul default.aspx. Fiecare fişier aspx
are separat un fişier cu extensia vb pentru
codul server side ce va fi scris în VB.
- partea din dreapta-jos şi anume
properties va fi discutată in unul din numerele
viitoare.
În continuare selectăm partea de
Design, şi mergem cu mouse-ul deasupra
toolbox-ului.
Alegem obiectul Button (de exemplu)
şi îl tragem pe spaţiul liber pe pagină.
Apăsăm F5 şi serverul integrat va porni.
XXXX
Web Developer vă va întreba dacă
doriţi debug (click pe OK în fereastra ce
apare). Este bine să folosim debug pentru că
39
dacă apare o eroare, Web Developer ne va
semnala eroarea din linia de cod printr-un
mesaj.
În partea de design, facem un click pe
butonul recent adăugat şi vom avea
posibilitatea de a modifica/adauga Proprietăţi
şi evenimente (Properties, Events).
În secţiunea Properties vom vedea şi
vom putea modifica o multitudine de
proprietăţi ce aparţin butonului nostru, cum ar
fi culoare, font, buton vizibil sau invizibil,
textul butonului, şi altele. Aceste modificări
ţin de partea interfeţei butonului.
Vrem ca butonul nostru să execute
ceva. Pentru aceasta, facem dublu click pe
buton şi Web Developer va crea pentru noi
funcţia ataşată butonului. Functia se salveaya
implicit in fisierul default.aspx.vb. Codul
acestei funcţii se va executa când vom face
click pe buton(cand aplicaţia rulează)
Evenimentele reprezintă acţiunile ce
le execută un obiect. De exemplu, butonul
nostru poate executa un cod la click pe
acesta. Click pe buton reprezintă un
eveniment. Evenimentele le putem vedea în
fereastra Properties printr-un click pe iconiţa
fulger (iconiţa de lângă fulger reprezintă
proprietăţile)
Bibliografie:
Burada Sorin, 2008 introducere in
asp.net, Polirom, Iaşi
Tătăran Mihai, Dumitriu-Lupan Nuşa
– Introducere in .NET Framework, 2008,
suport de curs pentru elevi
http://www.aspxcode.net/visual-web-
developer-2008-express-tutorial.aspx
http://asp.net
ing. Tabacaru Gigi, Col. Th. Paul Dimo
Abu Abdullah Muhammad bin Musa al-Khwarizmi (sau Muhammed ibn Musa
Horezmi ) (în farsi tatrucserp) ,(خوارزمیAl-Horezmi) a fost un savant, astronom/astrolog,
matematician şi scriitor persan. S-a născut probabil în 780, şi a murit către anul 845 d.Hr. Este
adesea citat ca "părintele algebrei", numele acestei discipline matematice având la origine titlul
cărţii sale Hisab o jabr o muqabele. Tot de la el se trage şi cuvântul algoritm - procedeu sau sistem
de calcul.
Un algoritm înseamnă în matematică şi informatică o metodă sau o procedură de calcul,
alcătuită dintr-o succesiune de operaţii elementare necesare pentru rezolvarea unei probleme sau
categorii de probleme. De obicei algoritmii se implementează în mod concret prin programarea
adecvată a unui calculator, sau a mai multora. Din diverse motive există şi algoritmi încă
neimplementaţi, teoretici.
Algoritmul este noţiunea fundamentală a informaticii. Totul este construit în jurul
algoritmilor (şi al structurilor de date, cum ar fi tablourile, listele sau grafurile).
Câteva exemple de algoritmi:
algoritmul de construcţie a unui automobil (urmărind procedeele şi schiţele de fabricaţie);
algoritmul de folosire a unei maşini-unelte (citind manualul de folosire);
algoritmul de explorare a unui labirint în vederea găsirii unei ieşiri (una din soluţii: se ţine o
mână pe perete şi se merge fără a o dezlipi de acesta).
algoritmul (ordinea operaţiilor, sau "check list ") la decolarea unui turbojet. Acest algoritm
desigur nu ţine în mod direct de domeniul matematicii sau informaticii.
algoritm pentru Semnături Digitale
40
Proprietăţile algoritmului
Cele mai importante proprietăţi ale unui algoritm sunt următoarele:
Corectitudinea - este proprietatea algoritmului de a furniza o soluţie corectă a problemei
date. În acest sens este de dorit ca algoritmii să se bazeze pe fapte şi relaţii matematice
demonstrabile.
Caracterul univoc sau deterministic - plecând de la un set de date iniţial anume, rezultatul
este unic, sau altfel spus, repetarea execuţiei algoritmului duce întotdeauna la aceleaşi
rezultate.
Generalitatea - este proprietatea unui algoritm de a rezolva o clasă sau categorie de
probleme, şi nu doar o singură problemă particulară. Spre exemplu, un algoritm care
rezolvă doar ecuaţia 2x-6=0 este mai puţin general decât unul care rezolvă ecuaţia ax + b =
0, oricare ar fi valorile lui a şi b.
Claritatea - proprietatea algoritmului de a descrie cu exactitate şi fără ambiguităţi paşii care
trebuiesc parcurşi în rezolvarea problemei.
Verificabilitatea - acea proprietate a algoritmelor care permite ca fiecare pas să poată fi
verificat într-un timp rezonabil de către om, folosind mijloace de validare de încredere.
Optimalitatea - proprietatea unui algoritm de a se termina după un număr minim de paşi.
Spre exemplu, dacă se cere să se calculeze suma primelor n numere naturale, putem aplica
formula de calcul, şi astfel algoritmul se termină într-un singur pas, pe când dacă am aduna
toate numerele de la 1 la n, el s-ar termina abia în n paşi, şi deci nu ar fi optim.
Finitudinea - este proprietatea algoritmului de a se termina într-un număr finit de paşi.
Există şi algoritmi care nu se termină într-un număr mărginit de paşi, dar aceştia se numesc
"metode algoritmice".
Eficienţa - este proprietatea unui algoritm de a se termina nu numai într-un număr finit, ci
şi "rezonabil" de paşi, chiar dacă acesta nu este cel mai mic posibil (nu este optim).
Algorimul este ineficient şi dacă rezultatul se obţine într-un timp mai lung decât cel dorit
sau permis.
Existenţa unei intrări (datele de prelucrat). Întrucât operatorii se aplică unui operand (sau
şi mai multor operanzi deodată), este de neconceput un algoritm fără niciun operand.
Intrările permise formează împreună un set (mulţime) specific de obiecte sau valori, care se
numeşte "domeniul" algoritmului.
Existenţa unei ieşiri (rezultatele). Este de neconceput un algoritm care nu are nicio ieşire,
deoarece în acest caz intră în discuţie însăşi utilitatea sa!
Clasificarea algoritmilor
În funcţie de modul de implementare, un algoritm poate fi:
recursiv - face uz de sine însuşi, în mod repetat
iterativ (repetitiv)
serial sau paralel
deterministic sau aleatoriu (probabilistic)
exact sau aproximativ
În funcţie de metoda utilizată, un algoritm poate fi:
algoritm backtracking
algoritm divide et impera
algoritm de programare dinamică
algoritm de tip greedy
algoritmi probabilistici, genetici, euristici ş.a.
41
Etapele rezolvării unei probleme
Reprezentarea unei probleme constituie un proces complex, care comportă mai multe etape.
1. Analiza problemei
în scopul stabilirii datelor de intrare, precum şi a rezultatelor pe care trebuie să le obţinem
prin rezolvarea problemei.
2. Elaborarea unui algoritm de rezolvare a problemei.
3. Implementarea algoritmului într-un limbaj de programare.
4. Verificarea corectitudinii algoritmului propus.
Un prim pas constă în testarea programului pe diverse seturi de date de test. Seturile de date
de test trebuie elaborate cu atenţie, astfel încât să se acopere, pe cât posibil, toate variantele de
execuţie a algoritmului, inclusiv situaţii de excepţie, şi să verifice dacă fiecare subproblemă a
problemei date este rezolvată corect (dacă este posibil, se va testa separat fiecare modul de
program).
Testarea poate pune în evidenşă, eventual, omisiuni sau erori de concepţie a algoritmilor,
dar nu garantează corectitudinea algoritmului. Pentru aceasta ar trebui să testăm algoritmul pe toate
seturile posibile de date de intrare, ceea ce este practic imposibil. Din acest motiv, se impune
utilizarea unor metode formale de demonstrare a corectitudinii algoritmului, etapă de obicei
deosebit de laborioasă, necesită un aparat matematic complex.
Analiza complexităţii algoritmului.
În general, există mai mulţi algoritmi de rezolvare a unei probleme date. Pentru a alege cel
mai bun algoritm, trebuie să analizăm aceşti algoritmi în scopul determinării efecienţei lor şi, pe cât
posibil, a optimalităţii lor.
Eficienţa unui algoritm se evaluează din două puncte de vedere :
din punctul de vedere al spaţiului de memorie necesar pentru memorarea valorilor
variabilelor care intervin în algoritm (complexitate spaţiu);
din punctul de vedere al timpului de execuţie (complexitate timp).
Observaţie: Elaborarea algoritmilor nu este un proces liniar, adeseori este necesar să
revenim la o anumită etapă şi să o repetăm. De exemplu, după ce am demostrat corectitudinea
algoritmului şi am analizat eficienţa sa, ne putem pune problema de a optimiza algoritmul sau
numai implementarea sa, caz în care trebuie să revenim la cea de a doua etapă, de proiectare a
algoritmilor şi de scriere a codului, etapă urmată în mod necesar de teste de corectitudine,
eleminare a erorilor , demonstraţii de corectitudine, teste de determinare a complexităţii, analiza
teoretică a complexităţii etc.
Date
Orice algoritm lucrează cu date: date de intrare (datele pe care trebuie să le primească din
exterior), date de ieşire (datele pe care trebuie să le furnizeze algoritmul în exterior), precum şi
date de manevră (date temporare, necesare algoritmului pentru a obţine datele de ieşire pe baza
datelor de intrare)
Datele cu care lucrează algoritmii pot fi clasificate din mai multe puncte de vedere. O primă
clasificare a datelor, în funcţie de posbibilitatea de a-şi modifica valoarea este :
Constante – date care nu îşi modifică valoarea; de exemplu : 10, 3.14, “şir de caractere”,
„A‟, fals.
42
Variabile – dare care îşi modifică valoarea.
O variabilă poate fi referită pritr-un nume(identificator)(o succesiune de litere, caracterul
“_” şi cifre, primul caracter fiind obligatoriu literă) şi are asociată o valoare.Numele unei variablie
nu se schimbă pe parcursul algoritmului, dar valoarea acesteia se poate modifica.
De exemplu, pentru rezolvarea ecuaţiei de forma ax + b = 0, am utilizat două variabile a şi
b. Prin operaţia “Citeşte datele de intrare a şi b”, acestora li se asociază câte o valoare reală,
introdusă de la tastatură. Utilizarea acestor două variabile era strict necesară, pentru a respecta
generalitatea algoritmului. Dacă am fi utilizat două valori constante (de exemplu, 2 şi 8), secvenţa
de operaţii ar fi rezolvat numai ecuaţia 2x + 8 = 0 , deci nu ar fi avut utilitate.
Observaţi că la începutul algoritmului am specificat (am declarat) faptul că a şi b sunt
numere reale. Această declaraţie este necesară, pentru a cunoaşte natura valorilor care pot fi
asociate celor două variabile şi, ca urmare, operaţiile permise cu acestea. Spunem că am declarat
tipul variabile respective . O variabilă poate reţine numai valori de tipul declarat.
În funcţie de valoarea lor, datele pt fi clasificate astfel :
Date numerice – au ca valori numere (naturale, întregi sau reale);
Date alfanumerice – au ca valori caractere sau şiruri de caractere ;
Date logice – au valoarea adevărat sau fals.
Expresii
O expresie este constituită dintr-o succesiune de operanzi, conectaţi prin operatori. Un
operand poate fi o constantă, o variabilă, sau o expresie încadrată între paranteze rotunde.
Operatorii desemnează operaţiile care se execută asupra operanzilor. Operatorii care pot fi utilizaţi
într-o expresie depind de tipul operanzilor (numerici întregi, numerici reali, caractere, şiruri de
caractere sau logici).
O expresie este constituită dintr-o succesiune de operanzi, conectaţi prin operatori. Un
operand poate fi o constantă, o variabilă, sau o expresie încadrată între paranteze rotunde.
Operatorii desemnează operaţiile care se execută asupra operanzilor. Operatorii care pot fi utilizaţi
într-o expresie depind de tipul operanzilor (numerici întregi, numerici reali, caractere, şiruri de
caractere sau logici).
Evaluarea unei expresii presupune calculul valorii expresiei, prin înlocuirea valorilor
variabilelor care intervin ca operanzi în expresie şi efectuarea operaţiilor specificate de operatori.
Principiile programării structurate
Creşterea complexităţii aplicaţiilor a impus la începutul anilor `70 apariţia unei noi
paradigme în programare : programarea structurată. Scopul era de a dezvolta noi tehnici de
programare, care să permită dezvoltarea unor programe fiabile, uşor de elaborat în echipă, uşor de
depanat, de întreţinut şi de reutilizat.
Un prim principiu al programării strcturare este modulizarea. Pentru proiectarea unor
aplicaţii complexe, este necesară descompunerea problemei care trebuie rezolvată în subprobleme
relativ independente, pentru fiecare dintre aceste subprobleme scriindu-se module de program mai
simple. Fiecare modul efectuează un set de prelucrări specifice şi este relativ independent de
celelalte module, cu care comunică prin intermediul unui set de parametri, care constituie interfaţa.
Avantajele sunt multiple. Cum la orice firmă se lucrează în echipă, modulele de program pot fi
implementate de mai mulţi programatori. Modificarea unui modul nu afectează celelalte module.
Fiecare modul poate fi implementat, testat, depanat, modificat, independent de celelalte.
43
Un alt principiu fundamental este structurarea datelor şi a prelucrărilor.
Programatorul are posibilitatea de a-şi grupa datele în colecţi, organizarea după anumite reguli,
denumite structuri de date.
Prelucrările asupra datelor sunt structurare separat. Confotm teoremei de structură Böm-
Jacoppini, orice prelucrare poate fi descrisă prin compunerea a trei structuri fundamentale :
structura liniară (secvenţială), structura alternativă şi structura repetitivă.
Reprezentarea algoritmilor
Pentru ca o secvenţă de operaţii să constituie un algoritm, ea trebuie să fie clară, adică la
orice moment operaţia care urmează a fi executată trebuie să fie unic determinată, definită şi
realizabilă (să poată fi efectuată la momentul repesctiv, cu mijloacele disponibile). De-a lungul
timpului s-au impus două modalităţi de reprezentare a algoritmilor : scheme logice, limbajele de tip
pseudocod şi limbajele de programare.
Schemele logice constituie o metodă de reprezentare grafică, foarte sugestivă, dar cu o serie
de dezavantaje : se dă o egală importanţă componentelor principale ca şi detaliului, prin urmare
schemele logice devin deosebit de stufoase şi greu de urmărit; pentru aplicaţiile mai complexe,
când este necesară modularizarea, este practic imposibil de pus în evidenţă legăturile dintre module
în cadrul schemei logice.
Din acest motiv, treptat s-a impus o altă metodă de reprezentere a algoritmilor:
pseudocodul.
Un limbaj de tip pseudocod este un ansamblu de convenţii, respectate în mod sistematic,
care definesc operaţiile permise (denumite şi instrucţiuni) pentru reprezentarea algoritmilor.
Reprezentarea algoritmilor prin scheme logice
Blocul START Blocul STOP Blocul de CITIRE Blocul de SCRIERE
Blocul de atribuire
Blocul de ramificare
Pentru cazul n =2
c1 c2 … cn = 1 ( = sau logic)
ci cj = 0, i j; i,j = 1,n ( = şi logic)
START STOP
v e
c1 c2 …cn
c c
Citeşte
date_de_intrare
Scrie
date_de_ieşire
c
NU DA
44
SSttrruuccttuurriillee ffuunnddaammeennttaallee ddiinn pprrooggrraammaarreeaa ssttrruuccttuurraattăă
STRUCTURA SECVENŢIALĂ (LINIARĂ)
Schemă logică Pseudocod
S1;
S2;
.
.
.
Sn.
1) Declararea datelor
| variabila tip;
La începutul oricărui algoritm, vom preciza datele de intrare, datele de ieşire, eventualele
date de manevră, precum şi tipul acestora. Înainte de a utiliza orice variabilă, o vom declara,
precizând numele şi tipul ei. O variabilă nu poate fi declarată de mai multe ori în acelaşi algoritm.
Exemple :
| x real;
| c caracter;
| i întrg ;
2) Operaţia de citire
| Citeşte variabila1, variabila 2,........, variabila n;
Efect : Prin operaţia de citire (denumită şi operaţia de intrare) se preiau succesiv valori de la
tastatură şi se asociază, în ordine, variabilelor specificate.
3) Operaţia de scriere
| Scrie expresie 1,expresie 2,…….,expresie n;
Efect: Operaţia de scriere (denumită şi operaţia de ieşire) presupune evaluarea
în ordine a expresiilor specificate şi afişarea pe ecran a valorilor lor pe aceeaşi linie.
4) Operaţia de atribuire
| variabila expresie ;
Efect : se evaluează expresia, apoi se atribuie valoarea expresiei variabilei din membrul stâng
Instrucţiunea compusă
Limbajul Pascal Limbajul C/C++
Begin
Instrucţiune1;
Instrucţiune2;
...
Instrucţiunen;
End
{
Declaraţii;
Instrucţiune1;
Instrucţiune2;
...
Instrucţiunen;}
s1
s2
sn
45
STRUCTURA ALTERNATIVA
Schemă logică Pseudocod
Efect :
Se evaluează condiţia C
Dacă valoarea expresiei este adevărat, atunci se execută instrucţiunea_1.
Dacă valoarea expresiei este fals, se execută instrucţiunea_2.
Limbajul Pascal Limbajul C/C++
If expresie_logică then
Instricţiune1
[Else
Instrucţiune2 ]
if (expresie_logică)
Instricţiune1;
[else
Instrucţiune2; ]
Case expresie_ordinală of
Valori1 : S1 ;
Valori2 : S2 ;
…
Valorin : Sn ;
[else S;]
End
switch (expresie)
{
case expreresie1: s1; [break;]
case expreresie2: s2; [break;]
…
case expreresien: sn; [break;]
[default :S]
}
Structura repetitivă condiţională anterior (structura cât timp )
Schemă logică Pseudocod
Cât-timp condiţie_C execută Secvenţă_de_instucţiuni
ect:
Pas 1 : se evaluează expresia ;
Pas 2 : dacă valoarea expresiei este fals, se iese din instrucţiunea Cât-timp;
dacă valoarea expresiei este adevărat, se execută instrucţiunea, apoi se revine la Pas 1.
c NU DA
A I1 I2
Dacă condiţie_c
atunci
instrucţiune_1
altfel
instrucţiune_2
c
S
Da
Nu
46
Limbajul Pascal Limbajul C/C++
While expresie_logică do
Instricţiune;
while (expresie_logică)
Instricţiune;
STRUCTURA REPETITIVĂ CONDIŢIONATĂ POSTERIOR ( STRUCTURA REPETĂ
PÂNĂ CÎND )
Schemă logică Pseudocod
Execută Instrucţiune
Cât-timp expresie;
Efect:
Pas 1 : se execută instrucţiune;
Pas 2 : se evaluează expresie ;
Pas 3 : dacă valoarea expresiei este fals se iese din instrucţiunea repetitivă;
dacă valoarea expresiei este adevărat, se revine la Pas 1;
Limbajul Pascal Limbajul C/C++
Repeat
Instricţiune;
Until expresie_logică ;
do
{ Instricţiune; }
while (expresie_logică
Structura repetitivă cu contor ( structura pentru, sau cu număr cunoscut de paşi )
Schemă logică
Pseudocod
pentru v de la e1 la e2 cu pasul p execută
instrucţiune
v:=e1
v<=e2
instr
v:=succ(v)
DA NU
c
s
Da
Nu
47
Este structura cu număr finit de paşi (ciclări). Contorul este o variabilă care pleacă de la o
anumită valoare şi parcurge un interval până la o valoare finală. Parcurgerea se face în sens
crescător sau descrescător, cu pasul 1 sau nu. Uneori, parcurgerea se poate face în salturi, adică nu
neaparat din element în element (pasul 1), ci din două în două elemente, sau din trei în trei etc.
Evident, contorul, pasul şi cele două expresii vor fi neaparat valori din mulţimi care pot fi
« parcurse », de exemplu numere întregi, litere, nu şi cuvinte sau numere reale.
Limbajul Pascal Limbajul C/C++
for v:=e1 to e2 do
instrucţiune;
for (expresieinit ; expresietest ; expresiemodif ; )
instrucţiune;
for v:=e1 downto e2 do
instrucţiune;
Principiul: v primeşte valoarea expresiei e1. Apoi, se verifică dacă s-a depăşit valoarea
e2. Dacă da, ciclul se încheie, iar dacă nu, atunci se execută instrucţiunea instr, apoi v creşte
la succesorul său (în cazul numerelor întregi, de exemplu, creşte cu o unitate), apoi se reia
verificarea condiţiei de continuare a ciclului. În forma cu downto, avem un test invers de
continuare, iar în loc de succ, apare pred.
În primul caz, dacă e2<e1, atunci nu se execută nimic, trecându-se imediat după
ansamblul instrucţiunii for, iar în al doilea caz, nu se execută nimic atunci când e2>e1.
În limbajul C++
for (expresie_initializare; expresie_test; expresie_incrementare) instructiune;
unde:
expresie_initializare = iniţializarea variabilei de ciclare. Se poate şi declara
(cu valoare iniţială)
expresie_test = pentru a testa dacă se execută instrucţiunea subordonată (dacă
expresia produce o valoare diferită de 0 subordonata se execută)
expresie_modif = pentru incrementarea variabilei de ciclare
Principiul:
pas1: se evaluează expresie_initializare;
pas2: se evaluează expresie_test. Daca produce o valoare diferită de 0 se
execută instrucţiunea subordonată şi se trece la pas3. Dacă produce o valoare=0 nu se mai
execută instrucţiunea for;
pas3: se evaluează expresie_incrementare şi se revine la pas2.
Dacă, din greşeală, lipseşte expresie_test programul va cicla la nesfârşit. Se va opri
cu CTRL+PAUSE sau CTRL+ALT+DEL.
Prof. Georgeta Balacea
Prof. Luminiţa Cobzaru
Pentru a putea întrebuinta calculatorul la studiul problemelor concrete, omul e obligat să invete sa gandeasca
exact şi abstract. – Grigore Moisil
48
COMPETENŢA DIGITĂLA – O NECESITATE PERMANENTĂ A SOCIETĂŢII
Profesor Maria Stan
Grupul Şcolar „Radu Negru” Galaţi
Ritmul de ascensiune al tehnologiei
informaţionale a schimbat radical modul de
viată, de comunicare, de recepţionare a
informaţiilor.
În secolul acesta şi mai ales în cel
următor este de aşteptat ca rolul calculatorului
în viaţa noastră sa fie esenţial ; oricine va
trebui să stăpânească acest domeniu pentru a
obţine cu uşurinţă ceea ce îşi doreşte: o carieră,
un loc de muncă, succes.
Folosirea calculatorului poate fi şi o
lecţie de logică; cine înţelege regulile după
care funcţionează computerul şi lucrurile din
viaţa sa se vor desfăşura sub semnul ordinii .
Pentru a-şi croi drum în viitor, este necesară
dotarea şcolilor cu calculatoare pentru ca încă
din perioada de formare elevul, să beneficieze
de „competenţe digitale”, de arta comunicării
cu ajutorul calculatorului.
Ce înţelegem prin termenul
„competenţă digitală”? Să ne gândim în
primul rând, ce înţelegem atunci când spunem
că o persoană „ştie” să utilizeze calculatorul?
Fiecare intervievat va răspunde în mod
diferit întrebărilor de mai sus, vom obţine în
mod sigur argumente total diferite, cu puncte de
vedere diferite. În primul rând, sintagma„a
utiliza calculatorul” evocă o imagine care
cuprinde cunoştinţele şi deprinderile tehnice de
bază necesare oricărui utilizator al zilelor
noastre. În ierarhia competenţelor pe care le
achiziţionăm pe parcursul vieţii, acest tip de
cunoştinţe şi deprinderi tind să coboare spre
nivelul bazal, al deprinderilor de tipul scris-
cititului, deprinderi care ne oferă în primul rând
posibilitatea accesului la informaţie. Se poate
spune că ne aflăm în plin proces de realizare a
unui nou tip de alfabetizare.
Chiar şi numai la nivel implicit, fiecare
dintre noi acceptăm ideea că acest tip de
competenţă „funcţională”, se implică la nivel de
funcţionare cognitivă: persoana care utilizează
tehnologia informatică în activitatea sa trebuie
să înveţe să „să scrie şi să citească” dar, în
acelaşi timp, să analizeze critic, să interpreteze
şi să „contextualizeze” informaţia la care are
acces în site-uri web, forumuri de discuţie, chat
, blog-uri şialtele.
O abordare foarte largă a cunoştinţelor
de utilizarea a calculatorului (computer
literacy) a fost propusă de Shapiro şi Hughes
(1996), care descriu un curriculum pentru
învăţarea utilizării calculatorului bazat pe şapte
dimensiuni, fiecare dimensiune fiind la rândul
său o altă competenţă:
• Utilizarea instrumentelor informatice (tools
literacy) – a înţelege şi utilize instrumente IT,
inclusiv elementele hardware, software şi
multimedia.
• Utilizarea resurselor (resource literacy) – a
înţelege formele şi metodele de acces la sursele
de informaţie, în special cele afate în reţea.
• Competenţa social-structurală (social-
structural literacy) – a înţelege situaţia socială
şi producerea de informaţie.
• Căutarea informaţiei (research literacy) –
utilizarea instrumentelor TIC pentru cercetare şi
educaţie.
• Publicarea informaţiei (publishing literacy) –
abilitatea de a comunica şi publica o informaţie.
• Dezvoltarea noilor tehnologii (emerging
technology literacy) – capacitatea de a înţelege
inovaţiile în domeniul TIC şi de a lua decizii
inteligente cu privire la implementarea noilor
tehnologii.
• Atitudine critică (critical literacy) – abilitatea
de a evalua în mod critic beneficiile şi costurile
tehnologiilor informaţiei (de notat că aceasta nu
este similară “gândirii critice” despre care vom
vorbi în continuare).
Dacă elevii sunt orientaţi cu încredere
spre schimbare, ei vor simţi nevoia de a fi
instruiţi cât mai bine pentru a face faţa noilor
tipuri de profesii. Eşecul în dezvoltarea
capacităţii de a reacţiona la schimbare poate
atrage dupa sine pasivitatea şi incapacitatea de
a se acomoda la „lumea IT”.
49
Tehnologiile digitale nu trebuie să
reprezinte o simplă adăugare în planul de
învăţământ, ele trebuie sa fie integrate deplin
„în serviciul educaţiei” la toate nivelurile
sistemului şcolar. Actorii educaţionali trebuie
să fie formaţi pentru a face faţă schimbării,
incertitudinii şi inovării. Complexitatea
crescută a şcolilor şi mediilor de învaţare de
astăzi sugerează nevoia realizării într-o nouă
manieră a activităţilor educaţionale.
Astfel actul învăţării nu mai este
considerat a fi efectul demersurilor şi muncii
profesorului, ci rodul interacţiunii elevilor cu
calculatorul şi al colaborării cu profesorul.
Această schimbare în sistemul de
învăţământ, „competenţele digitale” vizează
următoarele obiective :
1. Creşterea eficienţei activităţilor de
învăţare;
2. Dezvoltarea competenţelor de
comunicare şi studiu individual.
Atingerea acestor obiective depinde de
gradul de pregătire a profesorului în utilizarea
calculatorului, de stilul profesorului, de
numărul de elevi, de interesul, cunoștințele şi
abilităţile acestora, de atmosfera din clasa şi
tipul programelor folosite, de timpul cât se
integrează softul în lecţie, de sincronizarea
explicaţiilor cu secvenţele utilizate, de metodele
de evaluare, de fişele de lucru elaborate.
De asemenea calculatorul este extrem de
util deoarece stimulează procese şi fenomene
complexe pe care nici un alt mijloc didactic nu
le poate pune atât de bine în evidenţă. Astfel,
prin intermediul lui se oferă elevilor, modelări,
justificări şi ilustrări ale conceptelor abstracte,
ilustrări ale proceselor şi fenomenelor
neobservabile sau greu observabile din diferite
motive. Calculatorul este folosit pentru
dezvoltarea capacităţilor de comunicare, pentru
colectarea, selectarea, sintetizarea si
prezentarea informaţiilor, pentru
tehnoredactarea unor referate. Astfel elevii îşi
dezvoltă capacitatea de a aprecia critic
acurateţea şi corectitudinea informaţiilor
dobândite din diverse surse.
Tehnica modernă şi învăţământul
centrat pe nevoile, dorinţele si posibilităţile
elevului impune desfăşurarea de activităţi
diferenţiate pe grupe de nivel.
Deşi avantajele utilizării TIC în educaţie
sunt numeroase, elevul nu trebuie transformat
într-un “robot” care să ştie doar să folosească
calculatorul. El trebuie să realizeze atunci când
este posibil experimentele reale, deoarece îi
dezvoltă spiritul de observaţie, capacitatea de
concentrare, răbdarea, atenţia, abilităţile
practice.
Se poate spune ca integrarea resurselor
TIC în educaţie este benefică şi duce la o
creştere a performanţelor şcolare, cu condiţia ca
elevii să posede cunoştinţe de utilizare a
calculatorului. Aceasta implică introducerea
orelor de informatica şi TIC la toate profilurile
şi la toate treptele de învăţământ. TIC nu
trebuie să fie doar un instrument pentru a
prezenta conţinuturile existente într-o altă
manieră, trebuie să ducă la modificarea
modului de gândire şi stilului de lucru la clasă
al profesorilor, cristalizate în secole de
învăţământ tradiţional, prea puţin preocupat de
personalitatea şi de posibilităţile elevului.
În concluzie putem spune că se remarcă
faptul că tendinţele dominante ale ariei
Informării & Comunicării sunt orientate spre
dezvoltarea inteligenţei economice, spre
dezvoltarea traseelor informaţionale
caracteristice noii „Societăţi Informaţionale a
secolului 21”, în care reprezentăm „starea de
fapt a prezentului şi viitorului”
Bibliografie:
1. http://marinvlada.googlepages.com
2. COMPETENŢA DIGITALĂ - ANA-
MARIA MARHAN - publicaţii WEB - 2009
3. Vlada, Marin (2009) Utilizarea
Tehnologiilor eLearning: cele mai importante
10 initiative si proiecte din Romania. Ed:
Elearning.Roman, 2009.
4.. Dertouzos, M., Ce va fi. Cum vom trăi în
noua lume a informaţiei, Bucureşti:
Ed.Tehnică, 2000.
5. Lynch, C, Information literacy and
information technology literacy: new
components in the curriculum for a digital
culture, 2004,
http://staff.cni.org/~clifford/papers/cni-info-it-
lit.html.
6. Brouwer, P.S., Critical thinking in the
information age, Journal of Educational
Technology Systems, 25(2), 2008 .
50
Elaborat de Maria si Corneliu Hahui
Matematicianul german Peter Gustav Dirichlet
(1805-1859) a elaborat un principiu extrem de
simplu cu aplicatii neasteptate in variate
domenii, principiu care-i poarta numele si pe
care-l enuntam mai jos, fiind o demonstratie de
tipul urmator : ,,daca repartizam n+1 obiecte in
n cutii atunci cel putin doua obiecte vor fi in
aceeasi cutie”.Justificare :consideram cazul cel
mai nefavorabil asezand in fiecare cutie cate un
obiect. Deci am folosit ,, n “cutii si ,, n”
obiecte. Obiectul cu numarul n+1 trebuie pus si
el intr-o cutie oarecare dar in acea cutie exista
deja un obiect. Asadar avem o cutie cu doua
obiecte. Nu este important care cutie contine cel
putin doua obiecte, nici cate obiecte sunt in
acea cutie si nici cate astfel de cutii exista.
Important este ca exista cel putin o cutie cu cel
putin doua obiecte.
In literatura matematica principiul lui Dirichlet
este intalnit si sub denumirea de ,,principiul
cutiei”, cu precizarea ca denumirea de ,,cutie”
desemneaza ,,grupe de obiecte”, stabilite dupa
anumite, iar ,,obiectele” desemneaza lucruri,
numere, figure geometrice, etc. La rezolvarea
unor probleme este util de aplicat principiul
Dirichlet generalizat.
„Daca plasam pn + 1 obiecte in n cutii, atunci
cel putin o cutie va contine cel putin
"p+1"obiecte”. Unele probleme (in special ce
tin de geometrie) se rezolva, utilizand principiul
Dirichlet in urmatoarele enunturi:
a) Daca pe un segment de lungime l sunt situate
cateva segmente cu suma lungimilor mai mare
ca l, atunci cel putin doua segmente au un punct
comun;
b) Daca in interiorul unei figuri de arie S sunt
plasate figuri cu suma ariilor mai mare decat
S, atunci exista cel putin doua dintre aceste
figuri cu un punct comun;
c) Daca figurile F1; F2; . . .; Fn cu ariile S1; S2;
. . . ; Sn respectiv sunt incluse in figura F cu
arie S si S1 + S2 + . . . + Sn > kS, atunci k + 1
din figurile F1; F2; ... ; Fn au un punct comun.
Ceea ce caracterizeaza problemele in care se
foloseste acest principiu, este dificultatea de a
le aborda pe cai cunoscute. In general principiul
cutiei este un principiu de numarare care in
ultimul timp a capatat o mare popularitate fiind
pus la baza unui numar mare de probleme,
unele chiar dificile.
Voi prezenta in continuare cateva probleme ale
caror solutii se bazeaza pe principiul de mai
sus.
6.APLICATII LA PRINCIPIUL LUI
DIRICHLET
1) Se considera 7 numere naturale. Demonstrati
ca printre numerele date, cel putin doua dau
acelasi rest la impartirea cu 6.
Solutie. La impartirea cu 6 a unui numar natural
se poate obtine unul din resturile:0, 1, 2, 3,
4,sau 5. Consideram cutia ,,i” formata din
numerele care dau restul ,,i” la impartirea cu
6.Rezulta astfel 6 cutii in care trebuie plasate 7
numere. Va exista cel putin o cutie care contine
doua sau mai multe numere care dau acelasi
rest la impartirea cu 6.
Generalizare. Fie n+1 numere. Sa se arate ca
exista cel putin doua numere care dau acelasi
rest prin impartirea la n.
2) Sa se demonstreze ca printre orice sase
numere intregi exista doua numere a caror
diferenta este divizibila prin 5.
Solutie. Conform exercitiului anterior, exista
cel putin doua numere care dau acelasi rest prin
impartire cu 5, deci diferenta lor este divizibila
cu 5.
3) Sa se arate ca oricum am alege 7 numere
patrate perfecte (distincte), exista cel putin doua
a caror diferenta se divide cu 10.
Solutie.Daca a Є N, a² impartit la 10 va da unul
din resturile: 0, 1, 4, 5, 6, 9. Deoarece avem 7
patrate perfecte si numai 6 resturi, atunci exista
cel putin doua patrate perfecte care dau acelasi
rest la impartirea cu 10, deci diferenta lor se
divide cu 10.
4) Sa se arate ca oricum am alege cinci numere
intregi, exista doua dintre acestea, care au suma
sau diferenta divizibile cu 7.
Solutie. La impartirea cu 7 a unui numar rezulta
resturile 0,1,2,3,4,5,6. Patratul sau va da la
impartirea cu 7 unul din resturile 01,2,4. Avem
cinci numere si patru resturi, rezulta conform
principiului cutiei ca cel putin doua din cele
cinci patrate dau acelasi rest la impartirea cu 7 ;
51
x² -y² se divide cu 7, deci 7 |(x-y)(x+y). cum 7
este numar prim ,avem ca 7|x-y sau 7|x+y.
5) La un turneu de sah au participat n>2
sahisti. Sa se demonstreze ca in orice moment
al turneului dinaintea ultimei runde, cel putin
doi sahisti au acelasi numar de victorii.
Solutie. In orice moment al turneului dinaintea
ultimei runde, fiecare sahist a jucat maximum
n-2 partide si a putut obtine 0, 1, 2, …..n-2
victorii, deci in total n-1 posibilitati(cutii).
Deoarece la turneu au participat n sahisti,
rezulta ca cel putin doi sahisti au acelasi numar
de victorii inaintea ultimei runde.
6) Consideram multimea A= {a1,a2,……an}cu
elemente numere intregi. Sa se demonstreze ca
A are cel putin o parte nevida cu proprietatea ca
suma elementelor sale se divide cu n.
Solutie.Daca a este numar intreg si n numar
natural, exista q si r unice astfel incat a=nq+r cu
qЄZ si r Є{0,1,…n-1}.Consideram urmatoarele
n submultimi ale luiA: A1={a1}, A2={ a1 ,a2
},……..An= {a1,a2,….an }. Notam cu Si
=a1+a2+….+.ai ,cu i=1,n ( suma elementelor
fiecarei multimi). Daca unul din numerele Si cu
i=1,n se divide cu n, problema este rezolvata.
Daca nu, cele n resturi obtinute prin impartirea
cu n a numerelor Si , apartin multimii {1, 2,
….n-1 }cu n-1 elemente diferite. Deci exista cu
siguranta doua numere Si si Sj care dau acelasi
rest la impartirea cu n. Fie S i = a1+a2+….ai si
Sj=a1+a2+….aj cele doua numere. Fie i<j ;cum
n| Si –Sj , rezulta ca submultimea este B={ai+1,
ai+2,…..aj}.
7) Consideram noua puncte intr-un patrat cu
latura de lungime 1. Sa se demonstreze ca
exista un triunghi cu varfurile in trei din cele
noua puncte a carui arie sa fie cel mult 1/8.
Solutie. Unind doua cate doua mijloacele
laturilor opuse in patratul dat, obtinem o
impartire a acestuia in patrate de arie
1/4.Oricum am plasa cele noua puncte,
intotdeauna trei se vor afla in interiorul sau pe
laturile aceluiasi patrat. Fie A, B, C cele trei
puncte situate in patratul EFGH. Sa aratam ca
aria (ABC ) <1/8.
Ducem prin A paralela la EH. Fie AQ || EH, Q
Є BC, BN ┴ AQ si CP┴AQ,
(N, P ЄAQ). Atunci avem :
SABC=SABQ+SACQ= (AQ · BN)/2 + ( AQ ·
CP)/2= AQ( BN+CP )/2 < EH ·HG/2 =SEHGF/2
=1/8 .Egalitatea se obtine cand o latura a
triunghiului coincide cu o latura a patratului si
celalalt varf al triunghiului se gaseste se afla pe
latura opusa.
8) Sa se arate ca oricum am aseza 37 puncte in
interiorul unui triunghi echilateral cu latura de
lungime 1, exista cel putin doua puncte a.i.
distanta dintre ele sa nu depaseasca 0,1(6).
Solutie. Impartim fiecare latura a triunghiului in
6 segmente cu lungimea 1/6. Prin punctele de
diviziune ducem paralele la laturile triunghiului
si obtinem 1+3+5+7+9+11=36=6² triunghiuri
echilaterale cu latura de 1/6. Consideram 37 de
puncte in triunghiul initial, cel putin doua dintre
acestea se vor afla in interiorul sau pe laturile
unui triunghi(conform principiul cutiei) cu
latura de 1/6=0,1(6), deci distanta dintre acestea
va fi cel mult 1/6.
Generalizare. Sa se arate ca oricum am aseza
n2+1 puncte in interiorul unui triunghi
echilateral cu latura de lungime 1, exista cel
putin doua puncte a.i. distanta dintre ele sa nu
depaseasca 1/n.
52
9) Punctele planului sunt colorate in doua
culori. Sa se arate ca exista doua puncte de
aceeasi culoare situate la distanta 1m.
Solutie. Consideram un triunghi echilateral cu
lungimea laturii de 1m. Varfurile triunghiului
vor desemna "obiectele" si culorile vor fi
"cutiile". Cum "obiecte" sunt mai multe decat
"cutii" rezulta, ca exista doua varfuri de aceeasi
culoare. Cum triunghiul este echilateral,distanta
dintre varfuri este 1m.
Tinem sa mentionam ca aceasta problema poate
fi rezolvata si prin alta metoda. Fie A un punct
in plan si presupunem, ca toate punctele din
plan situate la distantade 1m de A sunt de
culoare diferita de culoarea punctului A. Atunci
avem o circumferinta de raza 1 din puncte de
aceeasi culoare. Evident exista o coarda a
acestei circumferinte de lungime1m. Prin
urmare, extremitatile coardei sunt puncte de
aceeasi culoare situate la distanta de 1m.
10) Se considera in plan n puncte distincte.
Cate doua puncte determina un segment. Sa se
demonstreze ca exista doua puncte din care
pleaca acelasi numar de segmente.
Solutie. Dintr-un punct pleaca maximum n-1
segmente si minim 1. Cum avem n puncte, vor
exista doua din care pleaca acelasi numar de
segmente.
11) In interiorul patratului de latura 1 sunt
asezate cateva cercuri, avand suma lungimilor
egala cu 10. Sa se arate ca exista o dreapta, care
sa intersecteze cel putin patru din aceste
cercuri.
Solutie. Se proiecteaza cercurile pe una din
laturile patratului. Proiectia fiecarui cerc este un
segment cu lungimea egala cu lungimea
diametrului cercului respectiv. Suma tuturor
acestor segmente este 3,1. Conform
principiului Dirichlet, exista cel putin patru
segmente ce au in comun un punct.
Perpendiculara ridicata in acest punct, pe latura
patratului, va intersecta cel putin patru cercuri.
12) In plan sunt date 25 puncte, astfel incat
dintre orice trei puncte doua puncte sunt situate
la distanta mai mica ca 1. Sa se demonstreze ca
exista un cerc de raza 1 ce contine nu mai putin
de 13 din aceste puncte.
Solutie. Fie A unul din punctele date. Daca
celelalte puncte sunt in interiorul cercului S1de
raza 1 si centrul in A, atunci problema este
solutionata. Fie B unul dintre punctele situate in
exteriorul cercului S1. Examinam cercul S2 de
raza 1 si centrul B. Printre punctele A; B;
C,unde C un punct arbitrar dintre cele date,
exista doua cu distanta intre ele mai mica decat
1.Mai mult aceste puncte nu pot fi A si B.
Astfel cercurile S1 si S2 contin toate punctele
initiale.Deci, unul dintre aceste cercuri contine
cel putin 13 puncte.
Observatie. In general, cand intr-o problema se
cere sa se arate ca exista cel putin n elemente cu
o anumita proprietate, este bine sa consideram
ca exista cel mult n-1 elemente cu acea
proprietate si din analiza cazului ,, exact n-1 “,
se ajunge la solutia problemei.
Exemple. 1)Intr-o scoala sunt 731 elevi. Aratati
ca exista cel putin 3 elevi care isi serbeaza ziua
de nastere in aceeasi zi a anului.
Solutie. Presupunem ca nu exista 3 astfel de
elevi. Deci in fiecare zi a anului isi serbeaza
ziua de nastere cel mult 2 elevi.Daca in fiecare
zi a anului isi vor serba ziua de nastere doi
elevi atunci, intr-un an, vor avea aniversarea
365 2 = 730 elevi. In scoala sunt 731 elevi,
deci al 731-lea isi va serba ziua impreuna alti
doi.
2) Suma a 63 numere naturale nenule este
2000. Sa se arate ca cel putin doua dintre
acestea sunt egale.Care este cel mai mare
numar de numere egale cu proprietatea ceruta?
Solutie.Daca toate numerele sunt distincte si
cele mai mici posibile obtinem:
1+2+3+……63=2016>2000 ,deci cel putin
doua numere sunt egale. De exemplu
2+3+4+…+62+48=2000.
Daca toate numerele sunt egale, atunci:
x+x+…..+x=2000; 63x=2000 de unde x nu este
natural.Pot fi cel mult 62 numere egale, cu
proprietatea ceruta ,de exemplu
1+1+…+1+1938=2000.
Bibliografie.
1. Mircea Ganga, Teme si probleme de
matematica, Ed. Tehnica, Bucuresti, 1991.
V.A.Ufnarovski, Acvariu Matematic, "Stiinta",
Chisinau, 1988.
3. V.V.Prasolov, Zadaci po planimetrii, c.2,
Moskva, Nauka, 1991
53
Examenul de ATESTAT la informatică, certifică noţiunile teoretice şi practice abordate la clasă pe
parcursul celor 4 ani de studiu.
Pe acestea le putem grupa în trei mai categorii :
Noţiuni legate de Tehnologia informaţiei şi comunicaţiei
Noţiuni de programare
Notiuni de baze de date
REZOLVĂRI-PROGRAMARE
Subiectul 1
Să se descompună un număr natural n (n≤1.000.000) în factori primi . Să se determine numărul
divizorilor numărului n.
Exemplu:
Date de intrare Date de ieşire Explicaţie
n=3060 2^2 3^2 5^1 17^1
36
Descompunerea este 22*3
2*5*17
Numărul 3060 are (2+1)(2+1)(1+1)(1+1)=36 divizori
n=19 19 ^1
2
19 este număr prim. Are doar 2 divizori.
C++
#include<iostream.h>
#include<conio.h>
void main()
{int n,fp,p,nrdiv=1,aux;
cout<<”n=”;cin>>n;aux=n ;
fp=3;
while(n%2==0)
{ p++;n=n/fp;}
if(p) cout<<”2^”<<p<<‟ „;
nrdiv=nrdiv*(p+1);
while(n!=1)
{ p=0;
while(n%fp==0)
{ p++;n=n/fp;}
if(p){cout<<fp <<‟^‟<<p<<‟.„ ;
nrdiv=nrdiv*(p+1) ; }
fp+=2;
}
cout<<” Numarul ”<<aux<<” are "<<nrdiv<<”
divizori "<< <<endl;
}
Pascal
Program unu;
var n,x,i,d:longint;
nr,cont:byte;
begin
write('n='); readln(n);
d:=2; x:=n;
while x>1 do
begin
nr:=0;
while x mod d=0 do
begin
x:=x div d; inc(nr);
end;
if nr>0 then write(d,'^',nr,' ');
inc(d);
end;
cont:=2;
for i:=2 to n div 2 do
if n mod i =0 then inc (cont);
writeln(cont, ' divizori ');
end.
Subiectul 2
Se citeşte de la tastatură un număr n≤100 şir de n numere naturale mai mici decât 1000,
x=(x1, x2, x3,…….., xn). Scrieţi un program care afişează mesajul „da”, daca suma numerelor din şir
este un număr prim şi „nu” în caz contrar.
54
Exemplu:
Date de intrare Date de ieşire Explicaţie
n=5
x=(4,3,19,1,2)
da 29 este număr prim
n=5
x=(3,3,19,1,2)
nu 28 nu este număr prim
C++
#include<iostream.h>
#include<math.h>
int main()
{int x[100],n,i,S=0,g;
cin>>n;
for(i=1; i<=n; i++) {cin>>x[i]; S+=x[i];}
if(S<=1) g=0;
else
if(S==2) g=1;
else
if(S%2==0) g=0;
else
{g=1;
for(i=3; i<=sqrt(S); i=i+2)
if (S%i==0) g=0; }
if (g) cout<<"da"; else cout<<"nu";
}
Pascal
program doi;
var n,sw:byte;x:word;s,i:longint;
begin
write('n=');readln(n);
for i:=1 to n do
begin
write('x='); readln(x); inc(s,x);
end;
i:=2; sw:=0;
while (i<=trunc(sqrt(s))) and (sw=0) do
if s mod i=0 then sw:=1
else inc(i);
if sw=0 then write('da')
else write('nu');
end.
Subiectul 3
Se citeşte de la tastatură un număr natural n (n≤500). Se cere să se afişeze toate numerele naturale
mai mici sau egale cu n, care au exact 3 divizori.
Exemplu:
Date de intrare Date de ieşire Explicaţie
n=80 4 9 25 49 Sunt pătratele perfecte ale
numerelor prime
C++
#include<iostream.h>
void main()
{int n;
cout<<"n=";cin>>n;
for (int x=4;x<=n;x++)
{int nr=2;//orice nr admite ca divizori pe 1
si el insusi
for(int d=2;d<=x/2;d++)
if (x%d==0) nr++;
if (nr==3) cout<<x<<' ';
}}
Pascal
program trei;
var n,i,j,sw:word;
begin
write('n=');readln(n);write('4 ');
i:=3;
while i*i<=n do
begin
sw:=0;
for j:=2 to trunc(sqrt(i)) do
if i mod j=0 then sw:=1;
if sw=0 then write(i*i,' ');
inc(i,2);
end; end.
55
Subiectul 4
Scrieţi un program care afişează toate numerele naturale prime de trei cifre, ale căror oglindite sunt
tot numere prime (ex: 183 este număr prim şi 381 este tot număr prim).
C++
#include<iostream.h>
#include<math.h>
void main()
{int i,j,k,x,X,prim,d;
for(i=1;i<=9;i=i+2)
for(j=0;j<=9;j++)
for(k=i;k<=9;k=k+2)
{x=i*100+j*10+k; X=k*100+j*10+i;
prim=1;d=3;
while (prim && d<=sqrt(x))
if (x%d==0) prim=0;
else d+=2;
if (prim)
{d=3;
while(prim && d<=sqrt(X))
if(X%d==0) prim=0;
else d+=2;}
if(prim)
cout<<x<<' '<<X<<endl;}}
Pascal
program patru;
var n:word;
function prim(x:word):boolean;
var i:word;
begin
prim:=true; i:=2;
while(x mod i<>0) and(i<=sqrt(x)) do
inc(i);
if i<=sqrt(x) then prim:=false;
end;
begin
n:=101;
while n<999 do
begin
if (prim(n)) and (prim(n mod 10*100+
(n div 10 mod 10) + (n div 100))) then
writeln(n);
inc(n,2);
end;
end.
Subiectul 5
Să se afişeze numărul format prin eliminarea cifrelor pare ale unui număr n dat (n<1.000.000.000).
Exemplu:
Date de intrare Date de ieşire Explicaţie
n=1234567 1357 Am eliminat cifrele pare 2, 4, 6
n=3746801 371 Am eliminat cifrele 4, 6, 8, 0
C++
#include<iostream.h>
#include<math.h>
long n,p,k=1;
void main()
{cin>>n;
//vom forma numarul obtinut din cifrele impare
while(n>0)
{if(n%10%2==1) //daca ultima cifra e
impara
{p=n%10*k+p; k=k*10;}
n=n/10;} //elimin cifra oricum
cout<<p;
}
Pascal
program cinci;
var p,n,x:longint; h:byte;
begin
write('n='); readln(N);
x:=0;p:=1;
repeat
h:=n mod 10;n:=n div 10;
if h mod 2=1 then
begin x:=h*p+x; p:=p*10; end;
until n=0;
writeln(x);
end
56
Subiectul 6
Se citeşte de la tastatură un număr n100 şi apoi n numere naturale 10.000. Să se afişeze acele
numere dintre cele n care au suma divizorilor un număr prim. Dacă niciunul dintre cele n numere
nu are proprietatea dată , se va afişa mesajul „ Niciun număr„
Exemplu:
Date de intrare Date
de
ieşire
Explicaţie
n=7
123 289 100 54 729 10
999
289
729
Divizorii lui 123 sunt 1, 3, 41, 123. Suma
1+3+41+123=168 – nu e prim
Divizorii lui 289 sunt 1, 17, 289.
Suma 1+17+289=307 este număr prim
Divizorii lui 729: 1+3+9+27+81+243+729=1093 – prim
C++
#include<iostream.h>
#include<math.h>
int a[101],n,ok;
int suma_diviz(int a)//returneaza suma divizorilor lui
a
{int s=a; //nr insusi e divizor al sau
for(int i=1;i<=a/2;i++)
if(a%i==0)
s=s+i;
return s;}
int prim(int a)
{if(a==0 || a==1) return 0;
for(long i=2;i<=sqrt(a);i++)
if(a%i==0) return 0; //am gasit un divizor, nr nu e
prim
return 1;}//daca n-am gasit niciun divizor, nr e prim
void main()
{cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n;i++)
if(prim(suma_diviz(a[i]))==1)
{cout<<a[i]<<' ';ok=1;}
if(!ok) cout<<”Niciun numar”<<endl;}
Pascal
program sase;
var t,i,sw,n,s,x,y:word;
function prim(x:word):boolean;
var i:word;
begin
prim:=true; i:=2;
while(x mod i<>0) and(i<=sqrt(x)) do
inc(i);
if i<=sqrt(x) then prim:=false;
end;
function Sdiv(x:word):word;
var i:word;
begin
S:=1+x;
for i:=2 to x div 2 do
if x mod i=0 then S:=S+i;
Sdiv:=S;
end;
begin
write('n=');readln(n);sw:=0;
for i:=1 to n do
begin
readln(y); t:=Sdiv(y);
if prim(t) then
begin
writeln(y,'are proprietatea ceruta');
sw:=1;
end;
end;
if sw=0 then write('nu am nr cu propr');
end.
57
Subiectul 7
Se dă un vector v cu n elemente de tip intreg, n ≤ 20. Să se determine vectorii v1 şi v2 ai căror
componente îndeplinesc următoarele condiţii :
v1[i] este format din suma cifrelor lui v[i]
v2[i] este format din produsul cifrelor lui v[i].
Exemplu:
Date de intrare Date de ieşire Explicaţie
n=5
v=(2,4,21,34,56)
v1 = (2,4,3,7,11)
v2 = (2,4,2,12,30)
v[i]=43
v1[i]=4+3=7
v2[i]=4*3=12
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]); }
for(i=1;i<=n;i++)
{ 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;
}
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]);
}
Pascal
program sub7;
var n,i,h:byte;
v,v1,v2 :array[1..20] of word;
begin
write('n='); readln(n);
for i:=1 to n do
begin
write('v[',i,']='); readln(v[i]);
end;
for i:=1 to n do
begin
v1[i]:=0; v2[i]:=1;
repeat
h:=v[i] mod 10; v1[i]:=v1[i] +h;
v2[i]:=v2[i]*h; v[i]:=v[i] div 10;
until v[i]=0;
end;
for i:=1 to n do
write(v1[i],' ');
writeln;
for i:=1 to n do
write(v2[i],' ');
end.
Subiectul 8
Se consideră un vector cu n (n≤100) componente întregi x=(x1, x2, x3,…….., xn). Să se afişeze câte
elemente din vector au valoarea mai mare decât media aritmetică a componentelor vectorului.
Exemplu:
Date de intrare Date de ieşire Explicaţie
n=5
x=(4,9,12,5,10)
3
Media aritmetică este 8. Elementele mai
mari ca 8 sunt 9, 12, 10
C++
#include<iostream.h>
void main()
Pascal
program sub8;
var n,i,cont :byte;
58
{
int n,x[100],i,S=0,nr=0;
float media;
cin>>n;
for(i=1; i<=n; i++)
{cin>>x[i];S+=x[i];}
media=(float)S/n;
for(i=1; i<=n; i++)
if(x[i]>=media)
nr++;
cout<<"Numarul elementelor cu
valoare mai mare sau egala cu media
artimetica este"<<nr;
}
s:integer;
ma:real;
v:array[1..100]of integer;
begin
write('n='); readln(n);
for i := 1 to n do
begin
write ('v[',i,']='); readln(v[i]);
end;
s:=0;
for i:=1 to n do s:=s+v[i];
ma:=s/n; cont:=0;
for i := 1 to n do
if v[i] > ma then inc (cont);
writeln(cont);
end.
Subiectul 9
Fie v un vector cu format din n numere întregi, n≤100. Să se afişeze suma maximă ce se poate
obţine cu elemente din vectorul v. Numărul de elemente din sumă trebuie să fie de cel puţin 1.
Exemplu:
Date de intrare Date de ieşire Explicaţie
n=5
v=(-4,9,-12,5,10)
24 Suma maxima este
s=9+5+10=24
n=5
v=(-4, -9,-12, -5, -10)
-4 Suma maximă este
S=-4
C++
#include<iostream.h>
void main()
{int n,v[100],i,S=0,max,poz=0;
cin>>n>>v[1]; max=v[1];
if(v[1]>=0) {S=v[1];poz=1;}
for(i=2; i<=n; i++)
{cin>>v[i];
if (v[i]>=0)
{S+=v[i];poz=1;}
else if(v[i]>max) max=v[i];
if(poz==1) cout<<"suma maxima este"<<S;
else cout<<"suma maxima este "<<max;}
Pascal
program sub9;
var i:byte;
v:array[1..100] of integer;
s,max,n: integer;
begin
write('n='); readln(n);
for i:=1 to n do
begin write('v[',i,']='); readln (v[i]);
end;
s:=0; max:=-maxint;
for i:=1 to n do
begin
if v[i]>0 then s:=s+ v[i]
else
if max<v[i] then max:=v[i];
end;
if s=0 then write (max)
else write (s);end.
59
Subiectul 10
Se citeşte un vector A cu n componente numere întregi şi un vector B cu m componente numere
întregi (1≤ n,m ≤ 100). Să se afişeze câte din componentele vectorului A sunt strict mai mici decât
orice componentă a lui B.
Exemplu:
Date de intrare Date de ieşire Explicaţie
n =10
m= 8
A= ( 4, 8, 1, 9, 5, 11, 3, 43, 6,
20)
B= ( 9, 9 , 6, 9, 9, 8, 6, 9)
4 Valorile 4, 1, 5 şi 3 din A sunt mai
mici decât orice element al lui B.
C++
#include<iostream.h>
void main()
{ int a[100],b[100],n,m;
cout<<"n="; cin>>n;
for (int i=0;i<n;i++)
{cout<<"a["<<i+1<<"]=";cin>>a[i];}
cout<<"m=";
cin>>m;cout<<"b[0]=";cin>>b[0];
int min=b[0];
for (i=1;i<m;i++)
{cout<<"b["<<i+1<<"]=";cin>>b[i];
if (min>b[i]) min=b[i]; }
int nr=0;
for (i=0;i<n;i++)
if (a[i]<min) nr++;
cout<<"nr="<<nr<<endl;
}
Pascal
program sub10;
var
a,b:array[1..100] of integer;
m,n,cont,i:byte; min:integer;
begin
write ('n='); readln (n); write ('m=');
readln(m);
for i:=1 to n do
begin write ('a[',i,']='); readln (a[i]);
end;
for i:=1 to m do
begin
write ('b[',i,']='); readln (b[i]);end;
min:=maxint;
for i :=1 to m do
if b[i] < min then min:=b[i];
for i:=1 to n do
if a[i] < min then inc(cont);write
(cont);end
Subiectul 11
Se dă un vector v cu n elemente numere naturale (1≤ n ≤ 100). Se cere să se afişeze numărul cel
mai mare format cu prima cifră a fiecărei componente din v.
Exemplu:
Date de intrare Date de ieşire Explicaţie
n =4
v= ( 2341, 789, 1998, 2000)
7221 Primele cifre sunt 2, 7, 1, 2. Cel mai
mare număr ce se poate obţine cu
aceste cifre este 7221
C++
#include<iostream.h>
unsigned v[100],n;
unsigned primacifra(unsigned x)
{while (x>10) x=x/10;
return x;
}
void ordonez()
{ int sort=1;
Pascal
program sub11;
var
v,v1: array [1..100] of integer;
n,i,h,sw,aux:byte;
l: integer;
begin
write('n='); readln(n);
for i:=1 to n do
60
while (sort)
{sort=0;
for (int i=0;i<n-1;i++)
if (v[i]<v[i+1])
{unsigned aux=v[i];
v[i]=v[i+1]; v[i+1]=aux;sort=1;
}
}
}
void main()
{long nr=0;
cout<<"n=";cin>>n;
for (int i=0;i<n;i++)
{cout<<"v["<<i+1<<"]=";cin>>v[i];}
for (i=0;i<n;i++) v[i]=primacifra(v[i]);
ordonez();
for (i=0;i<n;i++) cout<<v[i];
}
begin
write ('v[',i,']='); readln (v[i]);
end;
h:=0;
for i:=1 to n do
begin
while v[i]>0 do
begin
h:=v[i] mod 10; v[i]:= v[i] div 10;
end;
v1[i]:=h;
end;
repeat
sw:=0;
for i:=1 to n-1 do
if v1[i]<v1[i+1] then
begin
aux:= v1[i];v1[i] := v1[i+1]; v1[i+1]:=
aux; sw:=1;
end;
until sw=0;
l:=0;
for i:= 1 to n do l:=l*10+ v1[i];
write(l);
end.
Subiectul 12
Să se inverseze cele două jumătăţi ale unui număr natural n. Dacă numărul are un număr impar de
cifre, cifra din mijloc rămâne pe loc. (n≤1.000.000.000)
Exemplu:
Date de intrare Date de ieşire Explicaţie
123456 456123 n=123456 => n=456123
1234567 5674123 n=1234567 => n=5674123
C++
#include<iostream.h>
#include<math.h>
long n;int a,b,c,k;
int nr_cifre(long n)
{int k=0;
while(n)
{k++; n=n/10;}
return k;
}
void main()
{cin>>n; k=nr_cifre(n);
b=n%(int)pow10(k/2); /*a doua jumatate
are k/2 cifre; pow10 returneaza un rezultat
de tip float*/
n=n/pow10(k/2); //elimin k/2 cifre
Pascal
program sub12;
var
x:longint;
t:byte;
c,s:string;
q:char;
begin
write ('x=');readln(x);
str (x,s);
t:=length(s);c:=copy (s,1,t div 2);
if t mod 2 =0 then delete (s,1,length(s)-(t div
2))
else
begin
61
if(k%2==1) //daca nr de cifre e impar
{c=n%10; //retin cifra din mijloc
n=n/10;} //si o elimin
a=n; //a este ce a mai ramas din n
if(k%2==0) n=b*pow10(k/2)+a;
else
n=b*pow10(k/2+1)+c*pow10(k/2)+a;
cout<<n;}
q:=s[(t div 2)+1];delete (s,1,length(s)-(t
div 2));
end;
if t mod 2 =0 then c:=s+c
else
c:=s+q+c;
writeln(c);
readln;
end.
Subiectul 13
Se citeşte de la tastatură un număr natural n şi un tablou unidimensional cu n numere întregi
(n≤100). Să se ordoneze crescător elementele de pe poziţiile pare ale tabloului şi descrescător
elementele de pe poziţiile impare.
Exemplu :
Date de intrare Date de ieşire Explicaţie
n=11
a={1, 5, 7, 3, 9, 1, 8, 7, 3, 1,
9}
9 1 9 1 8 3 7 5 3 7 1 a={1, 5, 7, 3, 9, 1, 8, 7, 3, 1, 9}
Şirul a devine:
a={9, 1, 9, 1, 8, 3, 7, 5, 3, 7, 1}
C++
#include<iostream.h>
int a[101],n;
void main()
{int i,j,ok,aux;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
//sortam prin metoda selectiei elementele de
pe pozitii impare
for(i=1;i<=n-2;i=i+2)
for(j=i+2;j<=n;j=j+2)
if(a[i]<a[j])
{aux=a[i];
a[i]=a[j];
a[j]=aux;
}
//sortam prin metoda bulelor elementele de
pe pozitii pare
do {ok=1;
for(i=2;i<=n-2;i=i+2)
if(a[i]>a[i+2])
{aux=a[i];
a[i]=a[i+2];
a[i+2]=aux;
ok=0;}
}while (ok==0);
for(i=1;i<=n;i++)
cout<<a[i]<<' ';
}
Pascal
program sub13;
var a:array[1..100] of word;
n,aux:word;
i,j,sw:byte;
begin
write('n=');
readln(n);
for i:=1 to n do
begin
write('a[',i,']='); readln(a[i]);
end;
repeat
i:=2; sw:=0;
while i<=n-1 do
begin
if (a[i]>a[i+2]) and (i+2<=n) then
begin
aux:=a[i]; a[i]:=a[i+2]; a[i+2]:=aux;
sw:=1; end;
if (a[i-1]<a[i+1]) and (i+1<=n) then
begin
aux:=a[i-1]; a[i-1]:=a[i+1];
a[i+1]:=aux; sw:=1;
end;
inc(i,2);
end;
until sw=0;
for i:=1 to n do
write ('a[',i,']=',a[i],' ');end.
62
Subiectul 14
Se citeşte de la tastatură un număr n<50. Să se formeze fişierul “piramida.txt” care să conţină
numerele naturale de la 1 la n, în ordine crescătoare, dispuse astfel: pe primul rând – un număr, pe al
doilea rând – 2 numere, pe al treilea rând – 3 numere etc. Ultimul rând poate să rămână incomplet.
Numerele vor fi separate printr-un singur spaţiu.
Exemplu :Date de intrare “piramida.txt” Explicaţie
n=19
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
16 17 18 19
Ultimul rând e incomplet, doar de 4
numere, până s-a ajuns la 19
C++
#include<fstream.h>
int n,k=1,p,i;
void main(){
cin>>n;
ofstream f("piramida.txt");
p=1;
while(p*(p+1)/2<=n) //linii intregi
{for(i=1;i<=p;i++)
{f<<k<<' ';
k++;}
f<<endl;
p++;}
for(i=1;k<=n;i++) //linia incompleta
{f<<k<<' ';
k++;}
f.close();}
Pascal
program sub14;
var i,j,n,nr:byte;
f:text;
begin
assign(f,'d:\bp\bin\piramida.txt');
write('n=');readln(n);
rewrite(f);
j:=1;
while j<=n do
begin
nr:=0;
while (j<=n) and (i>nr) do
begin
write (f,j,' '); inc(nr); inc(j);
end;
writeln(f);
inc(i);
end;
close(f);
end.
Subiectul 15
Să se determine suma elementelor de sub diagonală principală a unei matrici pătratice de întregi,
inclusiv elementele de pe diagonala principală. Matricea are n linii şi coloane, n≤20.
Exemplu :
Date de intrare Date de ieşire Explicaţie
n=4
3 7 8 10
1 5 2 20
7 2 9 13
8 9 1 11
56 3 7 8 10
1 5 2 20
7 2 9 13
8 9 1 11
3+1+5+7+2+9+8+9+1+11=56
63
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()
{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);}
Pascal
program sub15;
var
a: array [1..30, 1..30] of integer;
m,n,i,j: integer;
s: longint;
begin
write ('n='); 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
s:=s+ a[i,j];
writeln ('s=', s);
end.
Subiectul 16
Să se verifice dacă elementele unui vector pot forma o mulţime. Se va afişa DA sau NU. Vectorul are
n elemente numere naturale, n≤100.
Exemplu :
Date de intrare Date de ieşire Explicaţie
n=7
a=(1, 5, 7, 3, 9, 10, 8)
DA Elementele sunt distincte
n=7
a=(1, 5, 7, 3, 9, 1, 9)
NU Sunt elemente care se repetă.
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(n==0) test=0;
if(test==0)
printf("elementele pot forma o multime");
else
printf(" elementele nu pot forma o multime
Pascal
program sub16;
var v:array[1..100]of integer;
n,i,j:byte;
sw:boolean;
begin
write('n=');readln(n);
for i:=1 to n do
begin
write('v[',i,']=');readln(v[i]);
end;
sw:=true;x:=1;
for i := 1 to n-1 do
for j:=i+1 to n do
if v[i]=v[j] then
sw:=false ;
if sw=true then writeln('Elementele
vectorului SUNT distincte')
64
");
}
else
writeln('Elementele vectorului NU SUNT
distincte');
readln;
END
Subiectul 17
Scrieţi un program C/C++ care citeşte de la tastatură două valori naturale nenule m şi n (m≤10, n≤10)
şi apoi m*n numere naturale nenule cu cel mult 4 cifre fiecare, reprezentând elementele unei matrice
cu m linii şi n coloane. Programul determină apoi valorile minime de pe fiecare linie a matricei şi le
afişează pe o linie a ecranului separate prin câte un spaţiu, iar la sfârşit valoarea maximă din şirul
valorilor minime determinate anterior.
Exemplu :
Date de intrare Date de ieşire Explicaţie
m=3
n=5
5 13 7 7 3
9 6 12 9 10
3 2 5 4 7
3 6 2
6
Cea mai mică valoare de pe
prima linie a matricei este 3,
cea mai mică valoare de pe linia
a doua este 6, cea mai mică
valoare de pe linia a treia este 2
iar cea mai mare valoare dintre
ele este 6
C++
#include<iostream.h>
int minim_linie(int a[11][11],int L,int n)
{int min=a[L][1];
for(int j=2;j<=n;j++)
if(a[L][j]<min) min=a[L][j];
return min;
}
void main()
{int a[11][11],n,m,i,j,min,max;
cin>>m>>n;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
min=minim_linie(a,1,n);
max=min;
cout<<endl<<min<<" ";
for(i=2;i<=m;i++)
{min=minim_linie(a,i,n);
cout<<min<<" ";
if(min>max) max=min;
}
cout<<endl<<max;
Pascal
program sub17;
var v:array [1..10,1..10] of byte;
n,m:byte;
i,j:integer;
max,min:integer;
begin
write('m='); readln(m); write('n=');
readln(n);
for i:=1 to m do
for j:=1 to n do
begin
write('v[',i,j,']='); readln(v[i,j]);
end;
max:=0;
for i:=1 to m do
begin
min:=maxint;
for j:=1 to n do
if min>v[i,j] then min:=v[i,j];
if max<min then max:=min;
write(min,' ');
end;
write(max);
end.
65
Subiectul 18
Scrieţi un program C/C++ care citeşte de la tastatură un număr natural cu n cifre (cel mult 9 cifre) şi
construieşte în memorie o matrice cu n linii şi n coloane, numerotate de la 1 la n, formată astfel:
- elementele de pe linia 1, au toate valoarea egală cu cifra unităţilor numărului citit;
- elementele de pe linia 2, au toate valoarea egală cu cifra zecilor numărului citit;
- elementele de pe linia 3, au toate valoarea egală cu cifra sutelor;
etc.
Programul afişează pe ecran matricea astfel construită, câte o linie a matricei pe câte o linie a
ecranului, elementele de pe aceeaşi linie fiind separate prin câte un spaţiu.
Exemplu :
Date de intrare Date de ieşire Explicaţie
28731 1 1 1 1 1
3 3 3 3 3
7 7 7 7 7
8 8 8 8 8
2 2 2 2 2
Cifra unităţilor e 1, cifra zecilor e 3 etc.
C++
#include<iostream.h>
void main()
{int a[10][10],n=0,i,j;
long x,y;
cin>>x;
y=x;
while(x>0)
{n++;
x=x/10;}
x=y;i=0;
while(x>0)
{i++;
for(j=1;j<=n;j++)
a[i][j]=x%10;
x=x/10;}
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}}
Pascal
program sub18;
var n:longint;
i,j:byte
h,t,x:longint;
a: array[1..10,1..10] of longint;
begin
write ('x='); readln (x); t:=x;
while t<>0 do
begin
t:=t div 10; inc (n);
end;
for i:=1 to n do
begin
h:=x mod 10; x:=x div 10;
for j:=1 to n do a[i,j]:=h;
end;
for i:=1 to n do
begin
for j:=1 to n do write (a[i,j],' ');writeln;
end;end.
Subiectul 19
Se consideră o matrice pătratică cu n linii şi n coloane (1<n≤30), ce memorează numere întregi nenule
de cel mult două cifre fiecare.
Scrieţi un program C/C++ care citeşte de la tastatură valoarea n şi elementele matricei şi care afişează
pe ecran produsul acelor elemente de pe diagonala secundară care au proprietatea că sunt valori
minime pe coloanele lor. Dacă nu există astfel de elemente în matrice, se va afişa mesajul NU
EXISTA.
66
Exemplu :
Date de intrare Date de ieşire Explicaţie
n=4
3 7 8 10
1 5 2 20
7 2 9 13
8 9 1 11
20
3 7 8 10
1 5 2 20
7 2 9 13
8 9 1 11
10*2=20
n=4
3 7 8 20
1 5 2 20
7 8 9 13
8 9 1 11
NU EXISTA
C++
#include<iostream.h>
int minim_coloana(int a[31][31],int C,int n)
{int min=a[1][C];
for(int i=2;i<=n;i++)
if(a[i][C]<min) min=a[i][C];
return min;
}
void main()
{int a[31][31],n,i,j,min;
long p=1;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
int g=0;
for(i=1;i<=n;i++)
if(a[i][n-i+1]==minim_coloana(a,n-
i+1,n))
{p=p*a[i][n-i+1];
g=1;
}
if(g==0)
cout<<"NU EXISTA";
else
cout<<p;
}
Pascal
program sub19;
var a: array[1..30,1..30] of shortint;
n,i,j,sw:byte;
p: integer;
function minim (c:byte):shortint;
var t:byte;
min:shortint;
begin
min:=a [1,c];
for t:=2 to n do
if a[t,c] < min then min:=a[t,c];
minim:=min;
end;
begin
write ('n=');readln (n);
for i:=1 to n do
for j:=1 to n do
begin write ('a[',i,',',j,']='); readln
(a[i,j]);end;
p:=1; sw:=0;
for i:=1 to n do
if a [i,n-i+1] = minim(n-i+1) then
begin sw:=1; p:=p*a[i,n-i+1]; end;
if sw=0 then writeln ('NU')
else writeln (p);
end.
Subiectul 20
Scrieţi un program C/C++ care citeşte de la tastatură două numere naturale n şi m (m≤10, n≤10), apoi
elementele unui tablou bidimensional cu m linii şi n coloane, numere întregi distincte, de maximum 4
cifre fiecare, şi care determină cel mai mic şi cel mai mare număr din tablou şi le interschimbă.
Matricea modificată va fi afişată pe ecran, câte o linie a matricei pe o linie a ecranului, elementele
fiecărei linii fiind separate prin câte un spaţiu.
Exemplu :
67
Date de intrare Date de ieşire Explicaţie
m=5
n=4
2 24 -5 8
3 25 17 9
4 -2 13 10
5 14 12 70
6 57 36 43
2 24 70 8
3 25 17 9
4 -2 13 10
5 14 12 -5
6 57 36 43
Cel mai mic element este -5 iar
cel mai mare, 70
C++
#include<iostream.h>
void main()
{int a[21][21],n,m,i,j,min,max;
cin>>m>>n;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
min=max=a[1][1];
int x1,y1,x2,y2,aux;
x1=y1=x2=y2=1;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if(a[i][j]<min)
{min=a[i][j];
x1=i;y1=j;}
else
if(a[i][j]>max)
{max=a[i][j];
x2=i;y2=j;
}
aux=a[x1][y1];
a[x1][y1]=a[x2][y2]; a[x2][y2]=aux;
cout<< "dupa interschimbare"<<endl;
for(i=1;i<=m;i++)
{for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;}
}
Pascal
program sub20;
var a: array [1..10,1..10] of integer;
m,n,i,j, maxx, maxy, minx, miny, min ,
max,x: integer;
begin
write ('m='); readln (m);write ('n='); readln
(n);
for i:=1 to m do
for j:=1 to n do
begin
write ('a[',i,',',j,']='); readln (a[i,j]);
end;
minx:=0;miny:=0;maxx:=0;maxy:=0;
min:=maxint;max:= - maxint;
for i:=1 to m do
for j:=1 to n do
begin
if min> a[i,j] then
begin
minx:=i; miny:=j; min:=a[i,j];
end;
if max<a[i,j] then
begin
maxx:=i; maxy:=j; max:=a[i,j];
end;
end;
x:=a[minx,miny];a[minx, miny]:= a[maxx,
maxy];
a [maxx, maxy]:=x;
for i:=1 to m do
begin
for j:=1 to n do
write (a[i,j],' ');
writeln; end; end.
Subiectul 21
Să se scrie un program care să sorteze crescător liniile unei matrice cu m linii şi n coloane (m≤20, n≤20)
folosind metoda BUBBLESORT. Valorile lui m şi n şi elementele ei vor fi citite de la tastatură. După
sortare matricea se va afişa în fişierul f.out.
Exemplu :
68
Date de intrare Date de ieşire
m=4 n=5
4 3 4 2 1
3 7 12 7 4
12 3 9 4 1
81 31 6 10 7
1 2 3 4 4
3 4 7 7 12
1 3 4 9 12
6 7 10 31 81
C++
#include<iostream.h>
#include<fstream.h>
ofstream g("f.out");
void main()
{int a[21][21],n,m,i,j,y,aux;
cin>>n;
cin>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>a[i][j];
for(i=0;i<n;i++)
do
{y=1;
for(j=0;j<m;j++)
if (a[i][j]>a[i][j+1])
{ aux=a[i][j];
a[i][j]=a[i][j+1];
a[i][j+1]=aux;y=0;}
}
while(!y);
for(i=1;i<=n;i++)
{for(j=1;j<=m;j++)
g<<a[i][j]<<" ";
g<<endl;
}
}
Pascal
program sub21;
var a:array [1..20,1..20] of integer;
m,n,i,j,sw,aux:byte;
begin
write('m='); readln(m); write ('n=');
readln(n);
for i:=1 to m do
for j:=1 to n do
begin
write('a[i,j]='); readln(a[i,j]);
end;
for i:=1 to m do
begin
repeat
sw:=0;
for j :=1 to n-1 do
if a[i,j]>a[i,j+1] then
begin
aux:=a[i,j]; a[i,j]:=a[i,j+1]; a[i,j+1]:=
aux; sw:=1 ;
end;
until sw=0;
end;
if sw=0 then
for i:=1 to m do
begin
for j:=1 to n do write(a[i,j],' ');
writeln;
end;
end.
Subiectul 22
Din fişierul f.in se citeşte de pe prima linie un număr natural n (n<=20) reprezentând numărul de linii
respectiv de coloane ale unei matrice pătratice, iar de pe următoarele n linii se citesc elementele
matricei. Să se afişeze matricea, să se precizeze câte numere prime se află sub diagonala principală şi
cate numere pătrate perfecte sunt deasupra diagonalei principale.
69
Exemplu :
Date de intrare Date de ieşire Explicaţie
5
3 15 12 3 9
6 21 18 4 7
12 9 17 5 10
42 23 3 15 8
22 8 31 7 12
3 15 12 3 9
6 21 18 4 7
12 9 17 5 10
42 23 3 15 8
22 8 31 7 12
4
2
Sub diagonala principala sunt patru
numere prime: 23, 3,31,7
Deasupra diagonalei principale sunt
două pătrate perfecte:9, 4
C++
#include<fstream.h>
#include<math.h>
ifstream f("f.in"); int n;
int prim(int n)
{int k,i,j;
k=2;
for(j=2;j<=n/2;j++)
if(n%j==0) k++;
if(k==2) return 1;
else return 0;
}
void main()
{int s[21][21],b,p=0,i,j,m=0,v[50];
f>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>s[i][j];
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
cout<<s[i][j]<<" "; cout<<endl;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{if((i>j)&&(prim(s[i][j])==1)) p++;
if((i<j)&&(powl(floor(sqrt(s[i][j])),2)==s[i][j]))
m++;
}
cout<<p<<" "<<m;}
Pascal
program sub22;
var f:text;
a:array[1..10,1..10] of word;
n,i,j:byte;
function prim (x:integer):boolean;
var sw:boolean;
i:integer;
begin
sw:=true;
for i:=2 to x div 2 do
if x mod i=0 then sw:=false;
prim:=sw;
end;
begin
assign (f,'d:\BP\BIN\f.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);
for i:=1 to n do
begin for j:=1 to n do write (a[i,j], ' ');
writeln;
end;
writeln('numere prime sub diagonala
principala');
for i:= 2 to n do
for j:=1 to i-1 do
if prim (a[i,j]) then write (a[i,j], ' ');
writeln('numere patrate perfecte deasupra
diagonalei principale');
for i:= 1 to n-1 do
for j:=i+1 to n do
if sqrt (a[i,j])= trunc(sqrt(a[i,j])) then write
(a[i,j], ' ');
end.
70
Subiectul 23
Scrieţi un program care construieşte în memorie o matrice pătratică cu n linii şi n coloane (n<=20)
formată numai din valori 0,1 şi 2 astfel încât elementele de pe diagonala secundară şi cea principală să fie
egale cu 0, elementele din Nord si Sud egale cu 1, iar restul elementelor din matrice să fie egale cu 2.
Matricea va fi afişată în fişierul f.out.
Exemplu:
Date de intrare Date de ieşire
n=5 0 1 1 1 0
2 0 1 0 2
2 2 0 2 2
2 0 1 0 2
0 1 1 1 0
C++
#include<iostream.h>
#include<fstream.h>
ofstream g("f.out");
void main()
{int n,a[21][21],i,j;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) a[i][j]=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if((i>j)&&(i+j<n+1)) a[i][j]=2;
if((i>j)&&(i+j>n+1)) a[i][j]=1;
if((i<j)&&(i+j<n+1)) a[i][j]=1;
if((i<j)&&(i+j>n+1)) a[i][j]=2;
}
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
g<<a[i][j]<<" ";
g<<endl;
}}
Pascal
program sub23;
var a:array [1..30, 1..30] of byte;
f:text;
n,i,j:byte;
t,l1,l2,c1,c2,l:byte;
begin
write('n=');readln(n);
for i:=1 to n do
begin a[i,i]:=0; a[i,n-i+1]:=0; end;
l1:=1; l2:=n; c1:=1; c2:=n;
for t:=1 to n div 2 do
begin
for j:=c1+1 to c2-1 do
begin a[l1,j]:=1; a[l2,j]:=1; end;
for i:=l1+1 to l2-1 do
begin a[i,c1]:=2; a[i,c2]:=2; end;
inc(l1); inc(c1); dec(l2); dec(c2);
end;
assign(f,'d:\BP\BIN\f.art'); rewrite(f);
for i:=1 to n do
begin for j:=1 to n do write(f,a[i,j],' ');
writeln(f); end;
close(f);
end.
Subiectul 24
Se consideră fişierul f.in ce conţine pe prima linie un număr natural n (n<=20) ce semnifică numărul
de linii ale unei matrice pătratice de numere întregi iar pe următoarea linie elementele matricei în
ordinea parcurgerii acesteia pe linii. Afişaţi pe ecran suma elementelor de pe cele două diagonale ale
matricei.
Exemplu :
Date de intrare Date de ieşire
4
1 2 3 4 5 9 7 3 2 1 0 9 6 0 4 4
14 18
71
C++
#include<fstream.h>
ifstream f("f.in");
void main()
{int a[21][21],n,s=0,i,j,p=0;
f>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) f>>a[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{if(i==j) p=p+a[i][j];
if(i+j==n+1) s=s+a[i][j];
}
cout<<p<<" "<<s;
}
Pascal
program sub24;
var f: text;
n,sp,ss,x,i:byte;
begin
assign (f,'d:\bp\bin\f.in'); reset (f); readln
(f,n);
sp:=0; ss:=0;
for i:=1 to n*n do
begin
read (f,x);
if (i-1) mod (n+1)=0 then inc (sp,x) else
if (i-1) mod (n-1)=0 then inc(ss,x);
end;
write (ss,' ',sp); close (f);
end.
Subiectul 25
Fie o matrice A cu n linii şi m (n<=20, m<=20) coloane cu elemente numere întregi (n, m şi
elementele matricei se citesc de la tastatură). Se cere să se determine cel mai mare număr de pe
marginea tabloului, precum şi de câte ori apare.
Exemplu :
Date de intrare Date de ieşire Explicaţie
n= 5, m= 4
1 2 3 4
1 5 1 1
3 7 8 5
5 3 8 3
3 2 2 5
5 3 Elementele de pe contur sunt:
1 2 3 4 1 5 3 5 2 2 3 5 3 1
Cel mai mare număr este 5 şi apare de 3
ori
C++
#include<iostream.h>
#include<values.h>
void main()
{int a[21][21],i,j,n,m;
cout<<"n=";cin>>n;
cout<<"m=";cin>>m;
for (i=0;i<n;i++)
for (j=0;j<m;j++)
{cout<<"a["<<i+1<<"]["<<j+1<<"]=";
cin>>a[i][j];
}
int max=-MAXINT,nr=1;
for(j=0;j<m-1;j++)
if (max==a[0][j]) nr++;
else
if (max<a[0][j]) {max=a[0][j]; nr=1;}
for (i=0;i<n-1;i++)
if (max==a[i][m-1]) nr++;
else
Pascal
program sub25;
var a : array [1..30, 1..30] of integer;
n, m, i, j, y, max, maxint, cont : byte;
begin
write ('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;
max:= -maxint;cont:=0;
for j:=1 to m do
if a[1,j]>max then
begin cont:= 1; max:=a[1,j]; end
else
if a[1,j]=max then inc (cont);
for i:=2 to n do
if a[i,m]> max then
begin cont:= 1; max := a [i,m]; end
else
72
if (max<a[i][m-1]) {max=a[i][m-1];nr=1;}
for (j=m-1;j>=1;j--)
if (max==a[n-1][j]) nr++;
else
if (max<a[n-1][j]) {max=a[n-1][j];nr=1;}
for (i=n-1;i>=1;i--)
if (max==a[i][0]) nr++;
else
if (max<a[i][0])
{max=a[i][0]; nr=1; }
cout<<max<<' '<<nr;
}
if a [ i, m] = max then inc (cont);
for i := 2 to n -1 do
if a [ i, 1 ] > max then
begin cont:= 1 ; max := a[i,1]; end
else
if a [ i, 1 ] = max then inc (cont);
for j:=m-1 downto 1 do
if a [ n, j] > max then
begin cont:= 1 ; max := a[n,j]; end
else
if a [ n, j] = max then inc (cont);
write ( max,',','de',cont,'ori');
end.
Subiectul 26
Se citeşte de la tastatură un număr natural n (n≤50). Se cere să se formeze şi să se afişeze matricea
pătratica nxn astfel: prima linie conţine numerele de la 1 la n, de la dreapta la stanga; a doua linie
conţine următoarele n numere naturale, de la stânga la dreapta; a treia linie conţine următoarele n
numere naturale, de la dreapta la stanga etc.
Exemplu :
Date de intrare Date de ieşire Explicaţie
n=5
5 4 3 2 1
6 7 8 9 10
15 14 13 12 11
16 17 18 19 20
25 24 23 22 21
5 4 3 2 1
6 7 8 9 10
15 14 13 12 11
16 17 18 19 20
25 24 23 22 21
n=4
4 3 2 1
5 6 7 8
12 11 10 9
13 14 15 16
4 3 2 1
5 6 7 8
12 11 10 9
13 14 15 16
C++
#include<iostream.h>
int a[51][51],n;
void main()
{int i,j,k=0;
cin>>n;
for(i=1;i<=n;i++)
if(i%2==1) //parcurgem de la dreapta la
stanga
for(j=n;j>=1;j--)
a[i][j]=++k;
else //parcurgem de la stanga la dreapta
for(j=1;j<=n;j++)
a[i][j]=++k;
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
Pascal
program sub26;
var
a:array [1..50, 1..50] of word;
n,i,j:byte;
nr:word;
begin
write('n='); readln(n); nr:=0;
for i:=1 to n do
if i mod 2 =1 then
for j:=n downto 1 do
begin inc(nr); a[i,j]:=nr;end
else
for j:=1 to n do begin inc(nr); a[i,j]:=nr;
end;
for i:=1 to n do
73
cout<<a[i][j]<<'
';cout<<endl;}}
begin
for j:=1 to n do write (a[i,j], ' ');
writeln;
end;
end.
Subiectul 27
Sa se ordoneze alfabetic numele a n copii, (n <=100). Datele de intrare se vor citi de la tastatura.
Exemplu :
Date de intrare Date de ieşire
n= 4
IoAn
VasiLE
Gigel
Alecu
Alecu
Gigel
IoAn
VasiLE
C++
#include<iostream.h>
#include<string.h>
typedef struct copil
{char nume[30];
char prenume[30];
};
struct copil a[101];
int i,j,n; char man[30];
void main()
{cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{cout<<"numele este"; cin>>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<<"copiii ordonati dupa nume sunt";
for(i=1;i<=n;i++)
cout<<"\n"<<a[i].nume<<"
"<<a[i].prenume;}
Pascal
program sub27;
type st=string[20];
var v:array[1..100] of string;
x:string;
i,sw:byte;
n:word;
begin
write('n=');readln(n);
for i:=1 to n do readln(v[i]);
repeat
sw:=0;
for i:=1 to n-1 do
if v[i]>v[i+1] then
begin
x:=v[i]; v[i]:=v[i+1];v[i+1]:=x;sw:=1;
end;
until sw=0;
for i:=1 to n do writeln(v[i]);
end.
Subiectul 28
Sa se verifice dacă doua cuvinte citite de la tastatură sunt anagrame. Se va afişa Da sau NU Cuvintele
pot conţine maximum 20 de caractere reprezentând litere mari sau mici ale alfabetului englez.
74
Exemplu :
Date de intrare Date de ieşire Explicaţie
ATLASE
TESALA
DA Două cuvinte sunt anagrame dacă
au aceleaşi litere dar sunt scrise
în altă ordine ATLASE
TESELA
NU
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 doua 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 reprezinta doua
anagrame");
else
printf("\n cuvintele nu sunt anagrame ");
}
}
Pascal
program sub28;
var x,y:string[20];
h,i:integer;
begin
readln(x);readln(y);
for i:=1 to length(x) do
begin
h:=pos(x[i],y);
if h<>0 then delete(y,h,1);
end;
if y='' then writeln('da') else writeln('nu');
end.
Subiectul 29
Fişierul text numere.txt conţine pe prima linie un număr natural n (0<n<100000), iar pe a doua linie n
cifre, separate prin câte un spaţiu.Scrieţi un program C/C++ care determină cea mai mare cifră dintre
cele situate pe a doua linie a fişierului numere.txt şi numărul de apariţii ale acesteia. Valorile
determinate se vor afişa pe ecran, separate printr-un spaţiu.
75
Exemplu :
Date de intrare Date de ieşire
12
2 5 3 1 9 5 8 9 2 7 3 4
9 2
C++
#include<fstream.h>
void main()
{ int i,n,v[10];
int x;
for(i=0;i<=9;i++)
v[i]=0;
fstream f;
f.open("numere.txt",ios::in);
f>>n;
for(i=1;i<=n;i++)
{f>>x; v[x]++;
}
int cif=0, fv;
for(i=0;i<=9;i++)
if(v[i]!=0)
{cif=i;fv=v[i];}
cout<<cif<<" "<<fv;
}
Pascal
program sub29;
var v:array[1..500] of byte;
f:text;
n,i,cont,max:byte;
begin
assign(f,'d:\BP\BIN\numere.txt'); reset(f);
readln(f,n);
for i := 1 to n do
read(f,v[i]);
cont:=0; max:=0;
for i:=1 to n do
begin
if v[i]>max then
begin max:=v[i]; cont:=1; end
else
if v[i]=max then inc(cont);
end;
writeln(max,' ',cont); close(f);
end.
Subiectul 30
Fişierul numere.txt conţine pe prima linie un număr natural n (n≤100), iar pe a doua linie, separate
prin câte un spaţiu, n numere naturale nenule, cu cel mult 4 cifre fiecare. Scrieţi programul care citeşte
de la tastatură un număr natural k (k≤25), construieşte în memorie şi afişează pe ecran un tablou
unidimensional ce conţine, în ordinea în care au fost citite, numerele de pe a doua linie a fişierului
numere.txt care au cel puţin k divizori.Dacă niciunul dintre cele n numere citite nu are cel puţin k
divizori, în fişier se va scrie 0.
Exemplu :
Date de intrare Date de ieşire
n=6
100 9 400 56 7 10
k=5
100 400 56
n=3
3 5 11
0
C++
#include<fstream.h>
int nr_div(int x)
{int nd=1;
for(int i=1;i<=x/2;i++)
if(x%i==0)
nd++;
return nd;
}
Pascal
program sub30;
var f:text;
i,n,k,m:byte;
x:word;
v:array [1..100] of word;
function nrdiv(y:word): byte;
var i:word;
nr:byte;
76
void main()
{int n=0,i,v[101],k,x;
fstream f;
f.open("numere.txt",ios::in);
f>>k;
while(f>>x)
if(nr_div(x)>k)
v[++n]=x;
if(n)
for(i=1;i<=n;i++)
cout<<v[i]<<" ";
else
cout<<0;}
begin
nr:=2;
for i:=2 to y div 2 do
if y mod i=0 then inc (nr);
nrdiv:=nr;
end;
begin
assign (f,'d:\BP\BIN\numere.txt'); reset (f);
readln (f,n);
write ('k='); readln (k); m:=0;
for i:=1 to n do
begin
read (f,x);
if nrdiv (x)>= k then
begin inc (m); v[m]:= x; end;
end;
close (f);
if m=0 then rite (m)
else for i:=1 to m do write( v[i], ' ');
end.
Subiectul 31
Scrieţi un program care citeşte de la tastatură un cuvânt format din cel mult 20 de caractere, doar litere
ale alfabetului englez (cel puţin o majusculă şi cel puţin o literă mică). Programul determină
transformarea cuvântului citit prin eliminarea fiecărei litere mici a cuvântului, restul literelor
nemodificându-se, ca în exemplu. Programul afişează pe ecran cuvântul obţinut.
Exemplu :
Date de intrare Date de ieşire
baCALaUreaT CALUT
C++
#include<fstream.h>
#include<string.h>
void main()
{int n,i; char s[21];
i=0;
while(i<strlen(s))
if(s[i]>='a'&&s[i]<='z')
strcpy(s+i,s+i+1);
else i++;
cout<<s;
}
Pascal
program sub31;
var i:byte;
x:string[20];
begin
write('x=');
readln(x);
i:=1;
while i<=length(x) do
if x[i] >'Z' then delete (x,i,1)
else inc(i);
write(x);
end.
Subiectul 32
Scrieţi un program C/C++ care citeşte de la tastatură un şir de cel mult 500 de caractere (litere mici şi
mari ale alfabetului englez, cifre, puncte, virgule şi spaţii) şi afişează pe ecran cifra care apare de cele
mai multe ori în şirul citit. Dacă şirul conţine mai multe cifre cu număr maxim de apariţii, atunci se va
afişa cea mai mică dintre acestea. Dacă şirul nu conţine cifre, se va afişa pe ecran mesajul NU.
77
Exemplu :
Date de intrare Date de ieşire Explicaţie
Va lua 9,5 la matematica 10 la
informatica si 10 la romana 0 0 şi 1 apar de cele mai multe ori în
şir şi 0 este cea mai mică dintre ele
C++
#include<iostream.h>
#include<string.h>
void main()
{int n,i,v[10];//vector de frecvente
char s[501];
for(i=0;i<=9;i++) v[i]=0;
int max=0,g=0;
cin.get(s,501); n=strlen(s);
for(i=0;i<n;i++)
if(s[i]>='0' && s[i]<='9')
{v[s[i]-'0']++;
if(v[s[i]-'0']>max)
max=v[s[i]-'0'];
g=1;
}
if(g==0)
cout<<"Nu";
else
{int k=0;
for(i=0;i<=9&&k==0;i++)
if(v[i]==max) {cout<<i;
k=1;}}}
Pascal
program sub32;
var s:string ;
v:array [1..10] of byte;
max, x, i:byte;
err:integer;
begin
write('s=');
readln(s);
for i:=0 to 9 do
v[i]:=0;
for i:=1 to length(s) do
if (s[i]>='0') and (s[i]<='9') then
begin
val(s[i],x,err); inc(v[x]);
end;
max:=0;
for i:=0 to 9 do
if v[i]>max then
max := v[i]; i:=0;
while v[i]<>max do inc(i);
write(i);readln;end.
Subiectul 33
Să se afişeze toate prefixele unui cuvânt citit de la tastatură format din cel mult 20 de caractere, doar
litere ale alfabetului englez.
Exemplu :
Date de intrare Date de ieşire
Informatica Informatic
Informati
Informat
Informa
Inform
Infor
Info
Inf
In
I
C++
#include<iostream.h>
#include<string.h>
void main()
{char s[30];
cin>>s;int n=strlen(s);
Pascal
program sub33;
var x,y:string [20];
i:byte;
begin
write ('x=');readln (x);
78
for(int i=0; i<n; i++)
{for(int j=0; j<=i; j++) cout<<s[j];
cout<<endl;
}}
for i:=1 to length(x)-1 do
begin
y:=copy(x,1,length (x)-i); writeln (y);
end;
end.
Subiectul 34
Se citesc de la tastatura n cuvinte (n≤10), fiecare cuvânt având lungimea de cel mult 25 caractere. Sa
se afişeze cuvintele care îndeplinesc condiţia de palindrom (un cuvânt se numeşte palindrom dacă prin
parcurgere de la stânga la dreapta şi prin parcurgere de la dreapta la stânga generează aceeaşi valoare).
Exemplu :
Date de intrare Date de ieşire
n=4
sas cana bob daca
sas bob
C++
#include<iostream.h>
#include<string.h>
void main()
{int n,i;
char a[10][26],c[26];
cout<<"n=";cin>>n;
for (i=0;i<n;i++)
{cout<<"cuvantul "<<i+1<<":"; cin>>a[i]; }
cout<<"cuvintele palindrom sunt:";
for (i=0;i<n;i++)
{strcpy(c,a[i]); strrev(c);
if (strcmp(a[i],c)= =0)
cout<<a[i]<<" ";}}
Pascal
program sub34;
type sir=string[25];
var n:integer;
i:byte;y:sir;
function pal(x:sir):boolean;
var j:byte;
begin
pal:=true;
for j:=1 to length(x) div 2 do
if x[j]<>x[length(x)-j+1]then pal:=false;
end;
begin
write('n=');readln(n);
for i:=1 to n do
begin
write('y='); readln(y);
if pal(y) then writeln(y,' este
palindrom');
end;
end.
Subiectul 35
Se consideră fişierul text UNU.txt care conţine informaţii scrise pe mai multe linii. Copiaţi în fişierul
DOI.txt conţinutul liniilor cu număr de ordine impar.
Exemplu :
Date de intrare Date de ieşire Explicaţie
Aceasta este prima linie
23 67 informatica
#1234 ABCD
1 2 3 4 5 6 7
linia cinci
ultima linie
Aceasta este prima linie
#1234 ABCD
linia cinci
S-au copiat prima linie, a
III-a şi a V-a linie
79
C++
#include <fstream.h>
#include<iomanip.h>
void main()
{int nrlinie=0; char linie[200];
fstream f("UNU.txt",ios::in);
fstream g("DOI.txt",ios::out);
while(!f.eof())
while(f.get(linie,200))
{nrlinie++;
if(nrlinie%2)
g<<linie<<endl;
f.get();
}
f.close(); g.close();}
Pascal
program sub35;
var
x:char;
f,j:text;
begin
assign (f,'d:\bp\bin\unu.txt'); assign
j,'d:\bp\bin\doi.txt');
reset (f); rewrite (j);
while not (eof(f))do
begin
while not (eoln (f)) do
begin read (f,x); write (j,x); end;
readln (f); readln(f); writeln (j);
end;
close (f); close(j);
end.
Subiectul 36
Elaboraţi un program care scrie în fişierul text LITERE.txt toate şirurile formate din trei caractere
distincte, litere mici ale alfabetului englez. Şirurile vor fi separate prin caracterul spaţiu.
C++
#include<fstream.h>
void main()
{int i,j,k;
fstream f("LITERE.txt",ios::out);
for(i=(int)'a';i<=(int)'x';i++)
for(j=i+1;j<=(int)'y';j++)
for(k=j+1;k<=(int)'z';k++)
{f<<(char)i<<(char)j<<(char)k<<endl;
f<<(char)i<<(char)k<<(char)j<<‟ „;
Pascal
program sub36;
var
i,k,j:char;
f:text;
begin
assign(f,'litere.txt');
rewrite(f);
for i :='a' to 'z' do
for j:='a' to 'z' do
for k:='a' to 'z' do
if (i<>j) and (j<>k) and (k<>i) then
writeln (f,i,j,k,' ');
close(f);
end.
80
f<<(char)j<<(char)i<<(char)k<<‟ „;
f<<(char)j<<(char)k<<(char)i<<‟ „;
f<<(char)k<<(char)i<<(char)j<<‟ „;
f<<(char)k<<(char)j<<(char)i<<‟ „;
}f.close();
Subiectul 37
Fişierul ATESTAT.txt conţine n numere naturale(2≤n ≤230
)(cel puţin două numere pare) cu cel mult 9
cifre fiecare. Scrieţi un program care afişează pe ecran penultimul număr par citit din fişier, precum şi
numărul de ordine al acestuia. Utilizaţi un algoritm eficient din punct de vedere al memoriei utilizate
precum şi al timpului de execuţie. De pe prima linie a fişierului ATESTAT.txt se citeşte numărul natural
n. De pe următoarele n linii se vor citi cele n numere naturale.
Exemplu:
Date de intrare
Explicaţii Date de ieşire
ATESTAT.txt
5
10
11
12
13
14
15
Primul număr citit este 10, al doilea 11,..., al
cincilea număr este 15.
Ultimul număr par citit este 14, iar penultimul
este 12.
Se va afişa numărul 12. Acesta este al treilea
număr citit din fişierul de intrare.
12 3
n=5 ( se citesc 5 numere naturale de
pe de pe următoarele 5 linii ale fişie-
rului de intrare)
81
C++
#include<fstream.h>
void main()
{long n1,n2,nrordine1,nrordine2,n,i,nr;
fstream f("ATESTAT.txt",ios::in);
n1=-2;f>>n;
for(i=1;i<=n;i++)
{f>>nr;
if(nr%2==0)
if(n1==-2)
{n1=nr;nrordine1=i;n2=-1;}
else
if(n2==-1) {n2=nr;nrordine2=i;}
else
{n1=n2;nrordine1=nrordine2;
nrordine2=i;
} }
cout<<n1<<' '<<nrordine1;
f.close();
Pascal
program sub37;
var x,n : longint;
poz1,poz2,i,x1,x2:byte;
f:text;
begin
assign(f,'atestat.txt');reset(f);readln(f,n);
poz1:=0;poz2:=0;
for i:=1 to n do
begin
readln(f,x);
if x mod 2 =0 then
begin
x1:=x2; x2:=x;
poz1:= poz2; poz2:=i;
end;
end;
write (x1,' ',poz1);
close(f);
end.
Subiectul 38
Se citeşte de la tastatură o frază cu maxim 250 de caractere. Se cere să se afişeze câte semne de
punctuaţie sunt. Semne de punctuaţie se consideră . , : ; - ? !
Exemplu:
Date de intrare Date de ieşire Explicaţie
Nu-i rau, mai Stefane, sa stie si baiatul tau
oleaca de carte. Cartea iti aduce si
oarecare mangaiere. Eu, sa nu fi stiut a
citi, de mult as fi înnebunit, cate am avut
pe capul meu. Ei, mai Stefane si
Smaranduca, mai ramaneti cu sanatate, ca
eu m-am dusu-m-am. Hai, nepoate, gata
esti?”
19 Cele 19 semne de punctuaţie sunt:
- , , . . , , , . , , , - - - . , , ?
82
C++
#include<iostream.h>
#include<string.h>
char f[101],punct[]=",.:;?!-",*p;
//punct este un sir constant format din
toate semnele de punctuatie
int k;
void main()
{cin.get(f,101);
p=strtok(f,punct);//separa fraza in entitati
delimitate de semne de punctuatie
while(p)
{k++; //numara semnele de punctuatie
p=strtok(NULL,punct);}
cout<<k;}
Pascal
program sub38;
var t: set of char;
cont, k, i: byte;
x: string;
v: array [1..250] of char;
begin
read (x);t:= ['!', '.', ',', '?', ';', '-',
':'];k:=0;cont:=0;
for i:=1 to length (x) do
if ( x[i] IN t) then
begin
inc (cont); inc (k); v[k]:=x[i];
end;
writeln (cont);
for i:=1 to k do write ( v[i]);
end.
Subiectul 39
În fişierul “poezie.in” este scrisă o poezie. Se cere să se afişeze pe ecran cel mai lung vers. Dacă sunt
mai multe versuri de lungime maximă, se va afişa doar primul dintre ele. Se numără toate caracterele,
inclusiv spaţiile şi semnele de punctuaţie (un vers nu poate depăşi 200 de caractere).
Exemplu:
“poezie.in” Date de ieşire Explicaţie
Vine melcul suparat
O furnica l-a piscat
Si cum vine, pas-pas-pas
Se-ntalni cu-n carabus
Striga melcu-n gura mare:
- Nu te mai praji la soare,
Date-ncolo, nu-mi sta-n drum
Ca te iau in coarne-acum.
Date-ncolo, nu-mi sta-n drum Cel mai lung vers are 28 de
caractere
C++
#include<fstream.h>
#include<string.h>
char a[256],amax[256];int lmax,l;
void main(){
ifstream f("poezie.in");
while(f.getline(a,256)) //cat timp mai putem citi
versuri
{l=strlen(a);
if (l>lmax)//am gasit un vers mai lung
Pascal
program sub39;
var f: text;
x,s:string; max:byte;
begin
assign (f,'Poezie.in'); reset (f);
max:=0;
while not eof(f) do
begin
readln (f,s);
83
{lmax=l;
strcpy(amax,a);}//retin in amax
versul mai lung
}
cout<<amax;
}
if length (s) >max then
begin
max:= length (s); x:=s;
end;
end;
close (f);
writeln (x);
end.
Subiectul 40
Se citeşte de la tastatură un text cu maxim 250 de caractere. Să se afişeze pe ecran textul obţinut prin
înlocuirea tuturor vocalelor cu litera „a‟ sau „A‟, după cum vocala respectivă este literă mică sau literă
mare.
Exemplu:
Date de intrare Date de ieşire Explicaţie
Stiam sa recunosc si sa
deosebesc, de la prima
vedere, China de Arizona. O
astfel de abilitate e folositoare
daca te ratacesti noaptea.
Staam sa racanasc sa sa
daasabasc, da la prama vadara,
Chana da Arazana. A astfal da
abalatata a falasataare daca ta
ratacasta naaptaa.
Vocala „O‟ a fost înlocuită cu „A‟,
restul vocalelor cu „a‟.
C++
#include<fstream.h>
#include<ctype.h>
#include<string.h>
char a[251],voc[]="aeiouAEIOU";//un sir
initializat cu vocale
void main()
{cin.get(a,251);
for(int i=0;i<strlen(a);i++)
if(strchr(voc,a[i])) //daca e vocala
if(islower(a[i])) //daca e litera
mica
a[i]='a';
else a[i]='A';
cout<<a;
}
Pascal
program sub40;
var
i:byte;
st:string;
begin
writeln('Introduce-ti text:');readln(st);
for i:= 1 to length(st) do
begin
if (st[i]='i') or (st[i]='o') or (st[i]='e') or
(st[i]='u') then
st[i]:='a';
if (st[i]='I') or (st[i]='O') or (st[i]='E') or
(st[i]='U') then
st[i]:='A';
end;
write(st);
end.
Soluţiile problemelor au fost propuse de:
Prof. Neagu Violeta, Colegiul Naţional “Mihail Kogălniceanu”
Prof. Voinea Mirela, Colegiul Naţional “Vasile Alecsandri”
Prof. Georgeta Balacea, Colegiul Naţional “Alexandru Ioan Cuza”
Prof. Ilie Daniela, Colegiul Naţional “Alexandru Ioan Cuza”
Prof. Grigore Magdalena, Colegiul Naţional “Alexandru Ioan Cuza”
84
REZOLVĂRI-BAZE DE DATE
Limbajul SQL (Structured Query Language) este limbajul utilizat de majoritatea sistemelor de
baze de date relaţionale (SGBDR) pentru definirea şi manipularea datelor.
Din punct de vedere istoric ar trebui menţionat faptul că limbajul SQL a fost dezvoltat într-un
prototip de sistem de gestiune a bazelor de date relaţionale la IBM, în 1970. În 1979 corporaţia Oracle
a introdus prima implementare a limbajului SQL în varianta comercială.
Termenii utilizaţi de limbajul SQL sunt
- tabel (Table) utilizat pentru a desemna o relaţie;
- linie (row) utilizat pentru a desemna un tuplu;
- coloană (column) utilizat pentru a desemna un atribut.
Componentele pe care le cuprinde limbajul SQL sunt următoarele:
1. componenta de descriere a datelor relaţionale (limbajul de descriere a datelor - LDD),
2. componenta de manipulare a datelor relaţionale (limbajul de manipulare a datelor - LMD),
ambele fiind absolut necesare în gestiunea BD.
Pe lângă aceste componente principale, standardul SQL2 mai prevede şi alte componente ale
limbajului:
3. controlul tranzacţiilor;
4. controlul securităţii şi refacerea datelor.
Controlul tranzacţiilor conţine comenzi pentru specificarea tranzacţiilor. Unele implementări
adaugă comenzilor prevăzute în standard şi alte comenzi suplimentare de control al concurenţei şi
refacerea datelor.
Controlul securităţii şi refacerea datelor conţine comenzi de administrare a bazei de date
pentru definirea utilizatorilor şi a drepturilor acestora de acces la tabele. Această componentă este
dependentă de SGBD, iar pentru sisteme performante, administratorul BD este obiectul activităţii unei
categorii speciale de utilizatori ai BD – administratori ai BD.
Structura lexicală a limbajului SQL
Elementele unei instrucţiuni (statement) sunt:
- cuvintele cheie (key words), dintre care fac parte comenzile (SELECT, UPDATE, INSERT
etc), operatorii (AND, OR, NOT, LIKE), clauzele (WHERE, SET, VALUES etc);
- identificatorii (identifier) sunt elementele care denumesc tabela, coloana sau alt obiect BD;
SQL face diferenţa între literele mari şi mici, deci este „case-sensitive”; identificatorul care
conţine ghilimele se numeşte identificator delimitat;
- constantele (literal) reprezintă şiruri de caractere („ „), numere întregi, numere reale (ex. 3.5; 4.
; .001; 5e2), constanta NULL care simbolizează lipsa de informare, constante de tip logic (1
pentru TRUE şi 0 pentru FALSE);
- caracterele speciale, cum ar fi ; care semnifică terminarea comenzilor, . care semnifică virgula
zecimală, sau * care simbolizează operatorul de înmulţire.
Operatori SQL
operatori aritmetici binari:
+
-
*
% modulo
^ ridicarea la putere
& AND orientat pe biţi
| OR orientat pe biţi
# XOR orientat pe biţi
85
<< deplasare la stânga
>> deplasare la dreapta
operatori binari de comparaţie
<
>
<=
>=
=
<> sau != diferit
operatori aritmetici mari
@ valoarea absolută
! factorial
!! factorial, operator postfix
~ NOT orientat pe biţi
operatori de comparaţie
A BETWEEN min AND max (compară A cu două valori: min şi max)
A IN (v1,...,vn) compară A cu o listă de valori
A IS NULL
A IS NOT NULL
A LIKE model_şir
operatori logici
Operatorii logici sunt legaţi prin cuvintele cheie AND, OR, NOT şi returnează o valoare
logică TRUE, FALSE sau NULL.
operatori relaţionali
UNION (reuniune)
INTERSECT (intersecţie)
MINUS (diferenţa).
Funcţii definite în SQL
Funcţii agregat
Funcţiile agregat calculează un rezultat din mai multe linii ale unui tabel (funcţii de
totalizare):
COUNT (furnizează numărul de linii ale unui rezultat);
SUM (execută suma tuturor valorilor dintr-o coloană);
MAX (returnează valoarea cea mai mare dintr-o coloană);
MIN (returnează valoarea cea mai mică dintr-o coloană);
AVG (calculează media valorilor dintr-o coloană).
Aceste funcţii vor fi folosite în instrucţiunea SELECT.
Funcţii scalare
Funcţiile scalare primesc unul sau mai multe argumente şi returnează valoarea calculată sau
NULL în caz de eroare. Argumentele funcţiilor pot fi constante sau valori ale atributelor specificate
prin numele coloanelor corespunzătoare. Dintre funcţiile scalare amintim:
funcţii numerice
- de calcul trigonometric: sin, cos, tg, ctg etc.
- de calcul al logaritmului: ln, log, lg
- de calcul al puterilor: pow
- de rotunjire: floor, ceil etc.
86
funcţii pentru manipularea şirurilor de caractere
funcţii pentru data calendaristică
funcţii de conversie
Tipuri de date
În limbajul SQL sunt definite mai multe tipuri de date: numeric, şir de caractere, şir de biţi,
data (calendaristică), timp.
Denumirile tipurilor de date precum şi limitele acestora diferă de la un SGBD la altul, dar în
general, sunt destul de asemănătoare.
Tipul numeric include
- numere întregi: INTEGER sau INT reprezentat pe 4 octeţi;
SMALLINT reprezentat pe 2 octeţi;
- numere reale reprezentate în virgulă flotantă, cu diferite precizii:
FLOAT reprezentat pe 4 octeţi;
REAL reprezentat pe 8 octeţi;
DOUBLE [PRECISION] reprezentat pe 8 octeţi;
- numere zecimale reprezentate cu precizia dorită:
tipul NUMERIC sau DECIMAL, cu forma numeric[(p,s)], unde p este
numărul total de cifre afişate, iar s este numărul de cifre după punctul zecimal.
Tipul şir de caractere
CHARACTER (n) sau CHAR (n) definesc şiruri de caractere cu lungimea fixă.
CHARACTER VARYING sau VARCHAR (n) defineşte şirul de caractere cu lungimea variabilă.
Asemănarea dintre cele două tipuri prezentate mai sus este aceea că ambele reprezintă şiruri de
maxim n caractere, iar deosebirea este aceea că pentru şiruri cu număr de caractere mai mic ca n,
CHAR (n) completează şirul cu spaţii albe până la n caractere, iar VARCHAR (n) memorează numai
atâtea caractere câte are şirul dat.
Tipul şiruri de biţi
BIT (n) defineşte secvenţe de cifre binare (care pot lua valoarea 0 sau 1) de lungime finită n;
BIT VARYING (n) defineşte secvenţe de lungime variabilă, cu limita maximă n.
Tipuri pentru data calendaristică şi timp
DATE permite memorarea datelor calendaristice în formatul yyyy-mm-dd;
TIME permite memorarea timpului, folosind trei câmpuri hh:mm:ss;
TIMESTAMP(p) permite memorarea combinată a datei calendaristice şi a timpului, cu precizia p
pentru câmpul SECOND (al secundelor); valoarea implicită a lui p este 6;
INTERVAL este utilizat pentru memorarea intervalelor de timp.
Tipurile de date sunt „case-insensitive”, deci nu ţin cont de caracterele mari sau mici.
Bazele de date sunt colecţii de date grupate în mai multe tabele cu legături între ele.
Operaţiile ce se efectuează asupra bazelor de date sunt :
Crearea tabelelor bazei de date
Popularea cu înregistrări
Interogarea tabelelor
87
Realizarea unor formulare şi rapoarte
Crearea tabelelor
create table produse(codp INT,denumire VARCHAR2(20),codm INT, pret FLOAT);
Popularea tabelelor cu înregistrări
insert into produse values(1,'suruburi1',1,5.3)
Interogarea bazei de date reprezintă principala funcţie a unui limbaj relaţional de manipulare a
datelor. Comanda fundamentală a standardului SQL este SELECT, aceasta permiţând interogarea unei
baze de date. Interogarea reprezintă o întrebare care îşi extrage răspunsul din baza de date.
Componentele interogării se numesc clause.
Sintaxa generală a comenzii SELECT este următoarea:
SELECT [ALL/DISTINCT/UNIQUE] listă de selecţie
FROM listă de relaţii (tabele)
WHERE condiţie de căutare asupra liniilor
GROUP BY listă de atribute care permit partiţionarea
HAVING condiţie asupra partiţiilor
ORDER BY listă de atribute;
Clauzele SELECT şi FROM sunt obligatorii. SELECT specifică datele care se selectează, iar
clauza FROM specifică relaţiile din care se selectează. Restul clauzelor sunt opţionale.
Exemplu
select denumire from produse order by denumire
select nume, nr_tel from abonati where restanta =(select max(restanta) from abonati)
select count(distinct cod_pers) from automobile,proprietari where
automobile.cod_auto=proprietari.cod_auto
Ştergerea datelor
delete from produse where pret>(select avg(pret) from produse)
Modificarea datelor
Update produse set denumire=‟lapte1‟ where denumire=‟lapte‟
SUBIECTUL REZOLVARE
Subiectul 1
La o societate de productie, evidenta
produselor finite se tine într-o tabela produse
cu structura:
codp, denumire - numele produsului, codm -
codul materialului din componența produsului
pret - pretul unitar al produsului
Se cere:
a) Sa se afiseze toate produsele în ordine
alfabetica.
b) Sa se stearga toate produsele cu pret unitar
mai mare decât valoarea mediei aritmetice a
preturilor tuturor produselor din tabela.
create table produse(codp INT,denumire
VARCHAR2(20),codm INT, pret FLOAT);
a)
select denumire from produse order by denumire
b)
delete from produse where pret>(select
avg(pret) from produse)
88
SUBIECTUL REZOLVARE
Subiectul 2
Pentru situatia pe luna curenta a impulsurilor
posturilor telefonice dintr-un oras se folosețte
baza de date abonati , cu structura:
nr_tel, nume, adresa , restanta, impulsuri
Se cere :
a) Sa se afiseze pentru fiecare abonat telefonic
numele, adresa si restantele.
b) Sa se afiseze numele si numarul de telefon
pentru abonatul sau abonatii a caror restanta
are valoare maxima.
create table abonati(nr_tel
VARCHAR2(20),nume VARCHAR2(30),adresa
VARCHAR2(50),restanta FLOAT, impulsuri
INT)
a)
select nume,adresa,restanta from abonati
b)
select nume,nr_tel from abonati where restanta
=(select max(restanta) from abonati)
Subiectul 3
Creati fisierul contracte care retine date despre
contractele încheiate de un oficiu bancar
si care are urmatoarea structura:
nr_contract , nume_client , tip_operatie,
termen_achitare
Se cere:
a) Sa se afiseze numarul contractului, tipul
operatiei si termenul de achitare pentru clientul
Popescu Ion.
b) Sa se afiseze numarul clientilor care au
termen de achitare astazi.
create table contracte(nr_contract
INT,nume_client VARCHAR2(50),tip_operatie
VARCHAR2(30),termen_achitare DATE)
a)
select nr_contract,tip_operatie,termen_achitare
from contracte where nume_client='Popescu Ion'
b)
select count(nume_client) as "Clienti astazi"
from contracte where
termen_achitare=SYSDATE
Subiectul 4
Pe un platou de filmare se tine evidenta
actorilor si a filmelor în care sunt distribuiti
acestia
folosind doua tabele:
actori
id_actor ,nume , prenume , varsta , cod_film
filme
cod_film , titlu, gen_film
Se cere:
a) Sa se afiseze toti actorii (distincti) care au
vârsta <50 ani
b) Sa se afiseze titlul si genul filmului în care
joaca fiecare actor.
create table actori(id_actor INT,nume
VARCHAR2(50),prenume
VARCHAR2(50),varsta INT, cod_film INT)
create table filme(cod_film INT,titlu
VARCHAR2(50),gen_film VARCHAR2(50))
a)
select distinct nume, prenume from actori where
varsta<50
b)
select titlu,gen_film,nume,prenume from
actori,filme where
actori.cod_film=filme.cod_film
Subiectul 5
O firma are ca obiect de activitate
comercializarea obiectelor de papetarie. Pentru
gestionarea activitatii firmei se utilizeaza un
tabel cu structura :materiale, cod_material ,
denumire , cantitate, pret_unitar, valoare
Se cere:
a) Sa se afiseze înregistrarile din tabela
ordonate descrescator dupa cantitate.
create table materiale(cod_material INT,
denumire VARCHAR2(50),cantitate
INT,pret_unitar FLOAT,valoare FLOAT)
a)
select * from materiale order by cantitate desc
b)
select denumire from materiale where
valoare=(select max(valoare) from materiale)
89
SUBIECTUL REZOLVARE
b) Sa se afiseze denumirea materialului cu
valoarea maxima .
Subiectul 6
Un service auto tine evidenta activitatii în doua
tabele:
automobile
cod_auto, marca , data_in, data_out, cost,
nr_inmatr
proprietari
cod_pers , cod_auto, nume
Se cere:
a)Pentru marca DACIA afisati numarul de
autoturisme ai caror proprietari au solicitat
serviciile firmei de reparatii
b)Afisati datele persoanelor proprietare de
autoturisme care au parasit service-ul astazi.
create table automobile (cod_auto INT,marca
VARCHAR2(50),data_in DATE, data_out
DATE, cost FLOAT,nr_inmatr
VARCHAR2(30))
create table proprietari (cod_pers INT,cod_auto
INT,nume VARCHAR2(50))
a)
select count(cod_auto) as "nr_cerut" from
automobile where marca='DACIA'
b)
select nume,marca,data_out from proprietari p,
automobile a where data_out<=sysdate and
a.cod_auto=p.cod_auto
Subiectul 7
În baza de date a unei firme care închiriaza
autoturisme se gasesc doua tabele:
automobile
cod_auto , marca, data_i, cost, nr_inmatr
persoane
id_pers , nume, cod_auto, adresa
Se cere:
a)Afisati persoanele cu domiciliul în Galati
care au închiriat masini .
b)Sa se afiseze pentru fiecare marca numarul
de automobile care au la închiriere costuri
cuprinse între 100 si 500 lei.
create table persoane (id_pers INT,nume
VARCHAR2(50),cod_auto INT,adresa
VARCHAR2(50))
create table automobile(cod_auto INT,marca
VARCHAR2(50),data_i DATE,cost
FLOAT,nr_inmatr VARCHAR2(30))
a)select nume,adresa,marca,nr_inmatr,data_i,cost
from automobile,persoane where adresa like
'%Galati%' and
persoane.cod_auto=automobile.cod_auto
b)select marca,count(marca)as "nr_cerut" from
automobile1 where cost>=100 and cost<=500
group by marca
Subiectul 8
O firma de asigurari are o baza de date care
contine tabelele:
asigurare
cod_asigurare, tip_asigurare, data, cost
persoane
id_pers , cod_asigurare , nume, adresa
Cerinte:
a)Sa se afiseze persoanele asigurate, ordonate
alfabetic
b)Sa se afiseze date despre persoanele care au
asigurari de viata si locuiesc în orasul Tecuci.
create table asigurare(cod_asigurare
INT,tip_asigurare VARCHAR2(30),data
DATE,cost FLOAT)
a)
select * from persoane order by nume
b)
select nume,adresa,tip_asigurare,data,cost from
persoane3 p,asigurare a where p.adresa like
'%Tecuci%' and
p.cod_asigurare=a.cod_asigurare
Subiectul 9
Fie tabelul PRODUSE cu urmatoarele campuri:
codp - codul produsului, denp - denumirea
produsului, um– unitatea de masura, pret–
create table produse(codp VARCHAR2(2),denp
VARCHAR2(50),um VARCHAR2(2),pret
FLOAT,stoc INT,termen DATE)
a)select avg(pret) as "pret mediu" from produse4
90
SUBIECTUL REZOLVARE
pretul produsului, stoc - stoc produs , termen –
data expirarii, pentru a putea pastra datele
referitoare la produsele dintr-un magazin
alimentar.
Se cere:
a. Determinati pretul mediu pentru fiecare
produs în afara de produsul „lapte‟
b. Afisati produsele care au pretul mai mare
decât produsul ce are codul “P4”.
where denp<>'lapte'
b)
select denp,pret from produse where pret>(select
pret from produse4 where codp=‟P4‟)
Subiectul 10
Fie tabelul PRODUSE cu urmatoarele campuri:
codp - codul produsului, denp - denumirea
produsului, um– unitatea de masura, pret–
pretul produsului, stoc - stoc produs , termen –
data expirarii, pentru a putea pastra datele
referitoare la produsele dintr-un magazin
alimentar.
Se cere:
a. Afisati pretul minim pe produs.
b. Sa se afiseze ultima zi a lunii (char) în care
expira produsul cu codul “P4”
create table produse(codp VARCHAR2(2),denp
VARCHAR2(50),um VARCHAR2(2),pret
FLOAT,stoc INT,termen DATE)
a)
select min(pret) as "pret minim" from produse
b)
select last_day(termen) as "ultima zi" from
produse where codp='p4'
Subiectul 11
O firma ce se ocupa cu vanzarea materialelor
de constructii dispune de mai multe depozite
D1,
D2, D3,…. Gestiunea firmei se pastreaza in
tabelul STOCURI cu urmatoarea structura:
Denumire, Cantitate, Pret_unitar, Depozit.
Se cere:
a. Care sunt materialele existente in depozitul
D1?
b. Sa se afiseze materialele in ordinea
descrescatoare a valorii lor totale
(valoare totala=cantitate*pret unitar).
a) select * from stocuri wherw
depozit=‟D1‟;
b) select denumire,cantitate*pret_unitar as
valoare_totala from stocuri order by
valoare_totala desc;
Subiectul 12
O firma ce se ocupa cu vanzarea materialelor
de constructii dispune de mai multe depozite
D1,
D2, D3,…. Gestiunea firmei se pastreaza
intabelul STOCURI cu urmatoarea structura:
Denumire, Cantitate, Pret_unitar, Depozit.
Se cere:
a. Care este valoarea totala a materialelor?
b. Sa se ieftineasca cimentul cu 10%.
a) select sum(cantitate*pret_unitar) as
valoare totala from stocuri ;
b) select
denumire,cantitate,pret_unitar,(pret_unitar
-0.1*pret_unitar) as pret_ieftinit from
stocuri;
Subiectul 13
Fie tabelul SALARIATI cu campurile
Id_angajat, Nume, Prenume, E_mail, Telefon,
Data_angajarii, Id_functie, Salariu, Comision,
a) select nume, prenume, id_departament
from salariat where id_angajat='176';
91
SUBIECTUL REZOLVARE
Id_manager, Id_departament.
Se cere:
a. Pentru salariatul cu id-ul 176 sa se afiseze
numele, prenumele si departamentul la care
lucreaza.
b. Sa se afiseze numele salariatilor(numai
prima litera), lungimea numelui, pentru
salariatii
ale caror nume încep cu J, M, A, ordonat dupa
nume.
b) select nume, length (nume) from salariat
where upper(nume) like'J%' or
upper(nume) like 'M%' or upper(nume)
like 'A%' order by nume;
Subiectul 14
Fie tabelul SALARIATI cu campurile
Id_angajat, Nume, Prenume, E_mail, Telefon,
Data_angajarii, Id_fuctie, Salariu, Comision,
Id_manager, Id_departament.
Se cere:
a. Afiseaza salariatii cu salariul între 5000 si
12000 din departamentele 20 si 50.
b. Sa se afiseze toti salariatii (codul, nume,
salariul) care au salariul mai mare ca media
salariilor, în ordinea crescatoare a salariilor.
a) select * from salariat where
salariu>='5000' and salariu<='12000' and
id_departament='20' or
id_departament='50';
b) select * from salariat where
salariu>(select avg (salariu) from
salariat);
Subiectul 15
O firma are urmatoarea baza de date compusa
din tabelele:
Angajati ce contine urmatoarele câmpuri:
id_angajat – id-ul angajatului, nume– numele
angajatului, prenume– prenumele angajatului,
salariu – salariul angajatului, id_departament –
id-ul departamentului, data_ang – data angajarii
Departament cu urmatoarele câmpuri:
id_departament – id-ul departamentului,
denumire –
denumire departament
Se cere:
a) Sa se afiseze toti angajatii grupati pe
departamente.
b) Sa se afiseze persoanele angajate în anul
2008.
a)select
id_angajat,nume,prenume,salariu,data_ang from
angajati group by id_departament;
b) select * from angajati where
to_char(data_angaj,'yyyy')='2008'
Subiectul 16
La un magazin de calculatoare se tine evidenta
produselor vândute prin tabelele:
Produse ce are urmatoarele câmpuri: nrp –
numar produs, denp – denumire produs, pret –
pret produs, stoc – stocul produsului
Facturi cu urmatoarele câmpuri: nrf – numarul
facurii, cantv – cantitate vânduta, dataf – data
facturii, nrp – numar produs
Se cere:
a) Sa se afiseze codul produsului, pretul initial
a) select p.pret,(p.cod_p,p.pret*0.1p.pret) as
pret_majorat from produse p,facturi f
where p.cod_p=f.cod_p and
upper(denp)=‟monitor‟ and
upper(denp)=‟mouse‟;
b) select nrf,denp,cant from produse3
p,facturi3 f where dataf=to_date('27-10-
2010','dd-mm-yyyy') and f.nrp=p.nrp
92
SUBIECTUL REZOLVARE
si pretului marit cu 10% pentru toate
produsele de tip ‚Monitor‟ si ‚Mouse‟
b) Sa se afiseze numarul facturilor, denumire
produsului si cantitatea vânduta la data de
‚27.10.2008‟
Subiectul 17
O baza de date contine 2 tabele:
Persoane cu urmatoarele câmpuri: codp – codul
persoanei, nume – numele persoanei,
prenume – prenumele persoanei, localitate –
numele localitatii
Automobile cu câmpurile: numar – numarul
masinii, marca – marca masinii, codp – codul
persoanei
Se cere:
a) Sa se afiseze numele, prenumele, numarul si
marca tuturor masinilor
b) Sa se afiseze prenumele persoanelor care au
automobile de tip ‚SKODA‟ înmatriculate
în Bucuresti
a)select
p.nume,p.prenume,a.numar,a.marca from
personae p,automobile a where
p.codp=a.codp;
b)select p.prenume from personae
p,automobile a where p.codp=a.codp and
upper(marca)=‟SKODA‟ and
p.localitate=‟BUCURESTI‟;
Subiectul 18
O scoala are o baza de date cu urmatoarele
tabele:
Elevi cu câmpurile: mat – numar matricol,
clasa – clasa elevului, nume – numele elevului,
prenume – prenumele elevului, medie_gen –
media generala a elevului
Informatii cu urmatoarele câmpuri: mat –
numar matricol, lac – localitate, data_n – data
nasterii
Se cere:
a) Sa se afiseze pentru fiecare elev numele,
prenumele, localitatea si data nasterii în
ordine alfabetica
b) Sa se afiseze elevii promovati în ordine
alfabetica
a) select
e.nume,e.prenume,i.loc,i.data_n from
elevi e,informatii i where e.mat=i.mat
order by e.nume
b) select nume,prenume,medie_gen
from elevi where medie_gen >=5;
Subiectul 19
Un magazin are baza de date formata din
tabelele:
Produse (codp –codul produsului , nume –
denumire produs, culoare , cant_stoc -
cantitatea aflata în stoc, pret –pretul
produsului)
Clienti (codcli - cod client , nume – nume
client, loc - localitate client)
Se cere:
a) Sa se afiseze lista produselor cu pretul între
20 si 25 lei.
b) Sa se afiseze numarul produselor de culoare
alba, cumparate de clientul Vasilescu.
a)select * from produse where prêt between 20
and 25;
b)select count(p.cod_p) from produse p,client c
where p.cod_p=c.cod_p andculoare=‟alba‟ and
upper(nume)=‟VASILESCU‟;
93
SUBIECTUL REZOLVARE
Subiectul 20
Un magazin are baza de date formata din
tabelele:
Produse (codp –codul produsului , nume –
denumire produs, culoare , cant_stoc -
cantitatea aflata în stoc, pret –pretul
produsului)
Vanzare (codp, cant –cantitatea vanduta, datav
- data vanzarii)
Se cere:
a) Sa se ordoneze dupa cod produsele vândute
ieri.
b) Sa se calculeze cantitatea totala cumparata ,
la produsele de culoare verde.
a) select max(cant) from vanzare where
to_char(datav,‟DD‟)=to_char(sysdate,‟D
D‟)-1
b) select sum(cant_stoc) from vanzare
v,produse p where v.codp=p.codp group
by p.culoare having p.culoare=‟verde‟;
Subiectul 21
O biblioteca tine evidenta activitatii zilnice în
baza de date BIBLIOTECA. Baza de date
contine urmatoarele tabele:
CARTI(cod_carte,titlu,autor,editura )
NR_CARTI(cod_carte ,nr exemplare )
CITITORI(CNP,nume,localitate,nr_telefon)
ÎMPRUMUT(cod_carte,CNP,data_împrumut).
Se cere:
a) Sa se afiseze titlul cu cele mai multe
exemplare?
b) Sa se afiseze numele cartii cel mai putin
solicitata?
a) select c.titlu,max(nr_carti.nr_exemplare)
from cart c,nr_carti nr where
c.cod_carte=nr-carti.cod_carte;
select titlu from carti where cod_carte=(select
cod_carte from imprumuturi group by cod_carte
having count(*)=(select max(count(*)) from
imprumuturi group by cod_carte))
Subiectul 22
O societate care detine mai multe firme în
diverse orase ale tarii , tine evidenta angajatilor
utilizând o baza de date numita EVIDENTA.
Baza de date contine urmatoarele tabele:
ANGAJATI(cod, nume, prenume,
data_nasterii, data_angajarii, localitate,
id_firma, id_functie,
salariu)
FIRME(id_firma, nume_firma, localitate)
FUNCTII(id_functie, nume_functie)
Se cere:
a) Sa se afiseze datele angajatilor care ocupa
functia de administrator.
b) Sa se afiseze numele , prenumele ,
localitatea cu majuscule, pentru angajatii care
locuiesc în
„Iasi‟,‟Sibiu‟ sau „Galati‟
a)select a.nume,a.prenume,f.id_functie from
angajati a,functii fu where
upper(nume_functie)=‟ADMINISTRATOR‟;
b)select a.nume,a.prenume,upper(localitate) from
angajati a.firme fi where localitate=‟IASI‟ or
localitate=‟SIBIU‟ or localitate=‟GALATi‟;
Subiectul 23
Un magazin are baza de date formata din
tabelele:
a) select * from produse order by nume;
94
SUBIECTUL REZOLVARE
Produse (codp –codul produsului , nume –
denumire produs, culoare , cant_stoc -
cantitatea aflata în stoc, pret –pretul
produsului)
Clienti (codcli - cod client , nume – nume
client, loc - localitate client)
Se cere:
a) Sa se afiseze produsele din magazin
ordonate alfabetic dupa nume.
b) Sa se afiseze produsele cumparate de clientii
din Braila
b) select p.nume,p.culoare,p.pret from
produse p,client c where
upper(c.loc)=‟BRAILA‟;
Subiectul 24
O companie opereaza cu urmatoarea baza de
date :
Persoane (id, id_firma, nume, localitate ,
data_n – data nasterii)
Firme (id_firma, denumire, localitate)
Se cere :
a) Sa se afiseze numele firmelor din localitatea
Galati;
b) Sa se afiseze numele tuturor persoanelor
care lucreaza la aceeasi firma la care lucreaza
“Popescu”.
a)select denumire from firme where
upper(localitate)=‟GALATI‟;
b) select nume from personae where
id_firma=(select id_firma from persoane where
nume=‟Popescu‟)
Subiectul 25
O companie opereaza cu urmatoarea baza de
date :
Persoane (id, id_firma, nume, localitate ,
data_n – data nasterii)
Firme (id_firma, denumire, localitate)
Se cere :
a) Numarul firmelor din Galati;
b) Numele firmei care are un numar maxim de
angajati.
a) select count(id_firma) from firme where
lower(localitate)=‟galati‟;
b) select nume from firme where id=(select
id_firma from persoane group by id_firma
having count(*)=(select max(count(*)) from
persoane group by id_firma))
Subiect 26
Se da baza de date :
Produse (codp –codul produsului, den –
denumire produs, culoare, stoc- cantitatea
aflata in
stoc, pret – pretul produsului)
Client (codcli – cod client, nume, loc-
localitatea clientului)
Vanzare (codp, codcli, cant – cantitatea
vanduta, datav - data vanzarii)
Se cere:
a) Lista tuturor produselor .
b) Clientii din Galati si zilele când acestia au
facut cumparaturi.
a)select den from produse;
b)select c.nume,v.datav from client c,vanzare v
where c.codcli=v.codcli and
lower(c.loc)=‟galati‟;
95
SUBIECTUL REZOLVARE
Subiect 27
Se da baza de date :
Produse (codp –codul produsului, den –
denumire produs, culoare, stoc- cantitatea
aflata in
stoc, pret – pretul produsului)
Client (codcli – cod client, nume, loc-
localitatea clientului)
Vanzare (codp, codcli, cant – cantitatea
vanduta, datav - data vanzarii)
Se cere:
a) Denumirea produselor care se vând cu
preturi între 100 si 200 lei
b) Culorile de pânza cumparate astazi de Marin
din Galati?
a) select denumire from produse where prêt
between 100 and 200;
b) select culoare from produse p, client c,
vanzare v where
v.datav=to_date(sysdate,‟dd-mm-yyyy‟)
and v.codcli=c.codcli and v.codp=p.codp
and c.nume=‟Marin‟
Subiect 28
Se da baza de date :
Produse (codp –codul produsului, den –
denumire produs, culoare, stoc- cantitatea
aflata in
stoc, pret – pretul produsului)
Client (codcli – cod client, nume, loc-
localitatea clientului)
Vanzare (codp, codcli, cant – cantitatea
vanduta, datav - data vanzarii)
Se cere:
a) Sa se ordoneze produsele de tip vopsea
descrescator dupa pret.
b) Sa se afiseze produsele vândute în ziua când
Marin a cumparat vopseaua ?
a) select den,pret from produse order by
pret desc;
b) select den from produse p, vanzare v
where v.datav=(select to_date(datav,‟dd-
mm-yyyy‟) from vanzare v,client
c,produse p where c.nume=‟Marin‟ and
c.codcli=v.codcli and v.codp=p.codp and
p.den=‟vopsea‟) and v.codp=p.codp
Subiect 29
Se da baza de date :
Produse (codp –codul produsului, den –
denumire produs, culoare, stoc- cantitatea
aflata in
stoc, pret – pretul produsului)
Client (codcli – cod client, nume, loc-
localitatea clientului)
Vanzare (codp, codcli, cant – cantitatea
vanduta, datav - data vanzarii)
Se cere:
a) Care este lista tuturor produselor cu stoc 0 ?
b) Care este cantitatea maxima de vopsea
cumparata de fiecare client ?
a) select * from produse where stoc=0;
b) select max(v.cant),p.den from produse
p,vanzare v where p.codp=v.codp having
p.den=‟vopsea‟;
Subiect 30
Se da baza de date :
Elevi (nume, prenume, clasa, absn – numarul
a)select nume,prenume,clasa from elevi where
absm>60;
96
SUBIECTUL REZOLVARE
absentelor nemotivate, absm – numarul
absentelor motivate)
Sali (clasa, sala)
Se cere:
a) Sa se afiseze elevii (nume, prenume, clasa)
cu peste 60 de absente nemotivate.
b) Sa se afiseze sala unde învata „Ionescu‟.
b)select s.sala from elevi e,Sali s where
e.clasa=s.clasa and upper(nume)=‟IONESCU‟;
Subiect 31
O societate comerciala are în baza de date
urmatoarele tabele :
ANGAJATI (cod_angajat, nume ,data_nasterii
,adresa ,telefon )
SALARII(cod_angajat,salariu,
numar_ore_suplimentare,
cost_ora_suplimentare,
venit_din_ore_suplimentare, retineri,
rest_plata)
Se cere:
a)Afisati pentru toti angajatii nascuti în
perioada [d1,d2]:
(nume,adresa,salariu,rest_plata)
b)Care este venitul total numai din ore
suplimentare pentru angajatii firmei ?
a)select * from angajati where data_nasterii
between to_date(‟15-02-2010‟,‟dd-mm-yyyy‟)
and to_date(‟20-04-2010‟,‟dd-mm-yyyy‟)
b) select
a.nume,a.cod_angajat,sum(s.venit_din_ore_supli
mentare) as venit_suplimentar from angajati
a,salarii s where a.cod_angajat=s.cod_angajat;
Subiect 32
Fie baza de date IT_STORE cu urmatoarele
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)
a) Sa se afiseze numerele de telefon ale
magazinelor din Galati.
b) Care sunt clientii care au efectuat comenzi
astazi ?
a)select telefon from magazine where
upper(adresa)=‟GALATI‟;
b) select c.nume from client c,comenzi co where
c,id_cli=co.id_cli and data=sysdate;
Subiect 33
Informatiile despre personalul unei societati
comerciale sunt trecute in urmatoarele tabele
persoane(id_persoana, nume, prenume, adresa,
data_nasterii)
copii(id_persoana, prenume_copil,
data_nasterii)
Se cere:
a) Sa se afiseze numele si prenumele
persoanelor in ordinea descrescatoare a varstei
b) Sa se afiseze numele complet al fiecarui
copil si data nasterii
a) select nume,prenume from personae
order by data_nasterii desc;
b) select
p.nume,c.prenume_copil,c.data_nasterii from
personae p,copii c where
p.id_persoana=c.id_persoana;
Subiect 34 a) select nume,prenume,adresa from persoane
97
SUBIECTUL REZOLVARE
Informatiile despre personalul unei societati
comerciale sunt trecute in urmatoarele tabele:
persoane(id_persoana, nume, prenume, adresa,
data_nasterii)
copii(id_persoana, prenume_copil,
data_nasterii)
Se cere:
a) Sa se afiseze numele, prenumele si adresa
pentru cele mai tinere trei persoane din
societate
b) Sa se afiseze prenumele copiilor angajatului
„Ionescu Marian‟
where data_nasterii=(select min(data_nasterii)
from persoane)
b)select c.prenume_copil from copii c,personae
p where p.id_persoana=c.id_persoana and
upper(p.nume)=‟IONESCU‟ and
upper(p.prenume)=‟MARIAN‟;
Subiect 35
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
a) alter table sportivi add (med float);
b)select count(nume_antrenor) as
numar_antrenori from antrenori;
Subiect 36
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 afiseze numarul de sportivi participanti
din fiecare tara
b) Sa se afiseze pentru fiecare tara participanta
numele antrenorului si numele sportivului
SUBIECTUL 36
a)select count(nume_sportiv) from sportive
group by tara;
b) select s.nume_sportiv,a.nume_antrenor from
sportive s,antrenori a where s.tara=a.tara group
by tara;
Subiect 37
Se considera o tabela care contine informatii
referitoare la sportivii participanti la un
campionat
de gimastica.
sportivi(tara, nume_sportiv, nota1, nota2,
a)select tara from sportivi order by tara;
b)delete from sportivi where
((nota1+nota2+nota3)/3)<5;
98
SUBIECTUL REZOLVARE
nota3)
Se cere:
c) Sa se afiseze tarile participante in ordine
alfabetica
d) Sa se stearga toti sportivii care au media
notelor la cele trei probe mai mica decat 5
Subiect 38
Fie urmatoarea tabela:
elevi (nr_matricol, nume, clasa, adresa, media,
absente, absente_motivate)
Se cere :
c) Sa se afiseze pentru fiecare elev numele,
clasa si media
d) Sa se afiseze numele sefului de promotie
a)select nume,clasa,media from elevi;
b)select max(medie),nume from elevi;
Subiect 39
O baza de date contine 2 tabele:
PERSOANE(cod_persoana, nume,prenume
,localitate ).
AUTOMOBILE (numar ,marca
,cod_persoana).
Observatie:numarul masinii poate fi de forma
BR-10-XXY.
Se cere:
a)Afisati numele,prenumele,numarul si marca
masinii tuturor persoanelor.
b)Afisati persoanele care au automobile
‟SKODA‟ înmatriculate in Bucuresti.
a) select
p.nume,p.prenume,a.numar,a.marca from
automobile a,persoane p where
p.cod_persoana=a.cod_persoana;
b) select p.nume,p.prenume from
automobile a,persoane p where
p.cod_persoana=a.cod_persoana and
upper(a.marca)=‟SKODA‟ and to_char(a.numar)
like ‟%B%‟;
Subiect 40
În baza de date a unei scoli se gasesc
urmatoarele tabele:
PROFESORI(clasa,p_mate,p_info, p_romana,
p_chimie)
ELEVI(clasa,nume_elev,med_mate,med_roma
na,med_info, med_chimie).
Se cere:
a)Care este media rezultatelor obtinute de
profesorii de info la toate clasele?
b)Care este clasa cu cei mai multi promovati la
chimie?
a) select avg(e.med_info) as
media_rez_p_info,e.clasa from elevi e,profesori
p where e.clasa=p.clasa group by e.clasa;
b) select clasa from elevi having
count(med_chimie)=(select
max(count(med_chimie)) from elevi where
med_chimie.=5 group by clasa) group by clasa;
Soluțiile au fost propuse de profesorii: Bibicu Dorin, Prof. Zeld Jenica, Burlacu Cătălina
Liceul Teoretic „Dunarea”
99
Profir Tudor, CNVA Galaţi, Prof. Iordachi Lizeta
Reporter: Cum a inceput pasiunea ta pentru
informatică?
Tudor Profir: Tatăl meu mi-a explicat cât de
cât prin clasa a 4-a în ce constă
informatica.Mi s-a părut foarte interesant şi
de aceea m-am hotărât să mă înscriu la
profilul de mate-info.
Reporter: Spuneai că tatăl tău ţi-a insuflat
oarecum pasiunea pentru informatică.În ce a
constat pregătirea ta în timp, şi în special
acum,în anul acesta şcolar,înainte de
olimpiadă?
Tudor Profir: Mai întâi am lucrat la clasă
dintr-o culegere de probleme.Am prins
"gustul" şi am căutat câte ceva pe internet
(câteva probleme) şi am găsit siteul
infoarena.ro - un site cu o arhivă foarte vastă
de probleme, la care pot vedea pe loc
rezultatul programului. Pe parcurs, am
învăţat de acolo câteva tehnici noi, câţiva
algoritmi. Reporter: Profesorul de la clasă a
avut un cuvânt important de spus în
pregătirea ta? Mă refer la pregătirea din anul
acesta în special.
Tudor Profir: La clasă am învăţat toate
lucrurile fundamentale ale programării,dar
am lucrat mult şi singur.
Reporter: Deci să înţeleg că,într-un
fel,cheia succesului a constituit-o pentru
tine munca independentă, dorinţa ta de a
învăţa mai mult şi de a aprofunda într-un
domeniu care îţi place?
Tudor Profir: Da,dar nu numai asta. În tot
acest timp am fost îndrumat şi de un alt
profesor, de la care am avut foarte multe de
învăţat.
Reporter: Ce aşteptări ai de la această
participare?
Tudor Profir: Fiind primul an de
participare, mă voi acomoda şi sper totuşi
să obţin cel puţin una dintre menţiuni. În
orice caz, voi câştiga ceva experienţă.
Reporter: În cazul unui insucces,ce
atitudine vei adopta? Te vei lăsa descurajat
sau vei încerca şi anul viitor?
Tudor Profir: Voi încerca cu siguranţă şi
anul următor.
Reporter: Consideri că este un avantaj
faptul că ONI se ţine în Galaţi?
Tudor Profir: Da, pentru că astfel nu va
mai trebui să plec cu câteva zile înainte, să
merg cu trenul. Nu aş fi fost prea odihnit în
ziua concursului şi ar fi contat (am
experienţă de la alte olimpiade).
Reporter: În final, ce ai sfătui un tânăr de
vârsta ta, care îşi doreşte să ajungă unde eşti
şi tu acum? Ce ar trebui să facă? Cu ce
atitudine ar trebui să înceapă drumul?
Tudor Profir: În primul rând, să
muncească dacă îi place ceea ce face.Şi
apoi să nu se descurajeze orice s-ar
întâmpla. În domeniul acesta sunt şanse
mult mai mari decât în altele să ai un eşec.
Mi s-a întâmplat şi mie şi multora care au
ajuns departe. La urma urmei, oricui i se
poate întâmpla.
Era odată un tânar care cand era mic vroia să se facă un "mare" scriitor. Când i s-a cerut să definească
"mare" a spus "Vreau să scriu chestii pe care să le citească toată lumea, chestii la care lumea să reactioneze
emoțional, lucruri care să-i facă să strige, să plângă, să urle, să se zbată de durere, disperare și mânie!" Acum
lucrează pentru Microsoft și scrie mesaje de eroare....
100
Colectivul de redacţie:
Redactor şef: CĂTĂLINA BURLACU – Liceul Teoretic „Dunărea”
Redactor şef adjunct GEORGETA-IULIA BALACEA, Colegiul Naţional
“Al.I.Cuza”
Redactori principali:
o Insp. Prof. Negoiţă Camelia-ISJ Galaţi
o Stan Maria, Grupul Şcolar Radu Negru
Redactori, profesorii:
1. Mirela Voinea, Colegiul Naţional “Vasile Alecsandri”
2. Daniela Nistor, Colegiul Naţional “Vasile Alecsandri”
3. Şoldan Florin, Colegiul Naţional “Vasile Alecsandri”
4. Neagu Violeta, Colegiul Naţional “Mihail Kogălniceanu”
5. Lucian Dimitrievici, Colegiul Naţional “Mihail Kogălniceanu”
6. Novetschi Monica, Colegiul Naţional “Mihail Kogălniceanu”
7. Popescu Mădălina, Colegiul Naţional „Mihail Kogălniceanu”
8. Bibicu Dorin, Liceul Teoretic „Dunarea”
9. Zeld Jenica, Liceul Teoretic „Dunarea”
10. Joc Genia, Colegiul Naţional “Al. I. Cuza”
11. Magdalena Grigore, Colegiul Naţional “Al.I.Cuza”
12. Ilie Daniela, Colegiul Naţional “Al.I.Cuza”
13. Gheorghiu Bogdan Tecuci
14. Gheorghiu Carmen Tecuci
15. Filip Cristian Buruiană, student
Responsabili număr : CĂTĂLINA BURLACU, GEORGETA-IULIA BALACEA
COPILĂRIE
Stimaţi colegi şi elevi, vă invităm să colaboraţi la revista noastră.
Taloanele de participare la concurs vor fi colectate de profesorul coordonator şi apoi
trimise colectivului de redacţie, iar problemele rezolvate vor fi trimise pe mailul
redacţiei.
Responsabilitatea in legatura cu originalitatea si continutul stiintific al articolelor,
problemelor apartine in exclusivitate autorilor.
Aşteptăm opiniile şi propunerile voastre pe adresa revistei noastre:
REDACTIA
Talon participare concurs
Nume şi prenume………………………………….………………………………………………..
Clasa……………
Unitatea de învăţământ…………………………………………………………………………….
Profesor coordonator………………………………………………………………………………
Număr probleme rezolvate…………………………….……………………….…………………
Număr probleme propuse …………………………….……………………….…………………
NR.1/2010