Revista 1 Word

98
3 INSPECTORATUL ŞCOLAR JUDEŢEAN GALAŢI ASOCIAŢIA PROFESORILOR DE INFORMATICĂ “TUDOR SORIN ” DIN GALAŢI REVISTA DE INFORMATICĂ (iM)PULS ++

description

yh ty ityu tu tu

Transcript of Revista 1 Word

Page 1: Revista 1 Word

3

INSPECTORATUL ŞCOLAR JUDEŢEAN GALAŢI

ASOCIAŢIA PROFESORILOR DE INFORMATICĂ

“TUDOR SORIN ” DIN GALAŢI

REVISTA DE INFORMATICĂ

(iM)PULS ++

Page 2: Revista 1 Word

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

Page 3: Revista 1 Word

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

Page 4: Revista 1 Word

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 )

Page 5: Revista 1 Word

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

Page 6: Revista 1 Word

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

Page 7: Revista 1 Word

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.

Page 8: Revista 1 Word

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 )

Page 9: Revista 1 Word

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.

Page 10: Revista 1 Word

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.

Page 11: Revista 1 Word

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 )

Page 12: Revista 1 Word

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 )

Page 13: Revista 1 Word

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

Page 14: Revista 1 Word

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

Page 15: Revista 1 Word

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”

Page 16: Revista 1 Word

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

Page 17: Revista 1 Word

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?

Page 18: Revista 1 Word

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();}

Page 19: Revista 1 Word

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.

Page 20: Revista 1 Word

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 )

Page 21: Revista 1 Word

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

Page 22: Revista 1 Word

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ă

Page 23: Revista 1 Word

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?

Page 24: Revista 1 Word

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();}

Page 25: Revista 1 Word

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:

Page 26: Revista 1 Word

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

Page 27: Revista 1 Word

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ă

Page 28: Revista 1 Word

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.

Page 29: Revista 1 Word

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.

Page 30: Revista 1 Word

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.

Page 31: Revista 1 Word

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.

Page 32: Revista 1 Word

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.

Page 33: Revista 1 Word

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

Page 34: Revista 1 Word

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.

Page 35: Revista 1 Word

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

Page 36: Revista 1 Word

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ă

Page 37: Revista 1 Word

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

Page 38: Revista 1 Word

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.

Page 39: Revista 1 Word

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.

Page 40: Revista 1 Word

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.

Page 41: Revista 1 Word

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

Page 42: Revista 1 Word

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

Page 43: Revista 1 Word

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

Page 44: Revista 1 Word

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

Page 45: Revista 1 Word

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

Page 46: Revista 1 Word

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

Page 47: Revista 1 Word

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 .

Page 48: Revista 1 Word

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 ;

Page 49: Revista 1 Word

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.

Page 50: Revista 1 Word

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

Page 51: Revista 1 Word

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.

Page 52: Revista 1 Word

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.

Page 53: Revista 1 Word

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

Page 54: Revista 1 Word

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.

Page 55: Revista 1 Word

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;

Page 56: Revista 1 Word

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.

Page 57: Revista 1 Word

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

Page 58: Revista 1 Word

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

Page 59: Revista 1 Word

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.

Page 60: Revista 1 Word

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

Page 61: Revista 1 Word

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

Page 62: Revista 1 Word

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.

Page 63: Revista 1 Word

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.

Page 64: Revista 1 Word

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 :

Page 65: Revista 1 Word

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 :

Page 66: Revista 1 Word

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.

Page 67: Revista 1 Word

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.

Page 68: Revista 1 Word

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

Page 69: Revista 1 Word

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

Page 70: Revista 1 Word

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

Page 71: Revista 1 Word

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.

Page 72: Revista 1 Word

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.

Page 73: Revista 1 Word

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;

Page 74: Revista 1 Word

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.

Page 75: Revista 1 Word

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

Page 76: Revista 1 Word

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

Page 77: Revista 1 Word

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.

Page 78: Revista 1 Word

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)

Page 79: Revista 1 Word

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:

- , , . . , , , . , , , - - - . , , ?

Page 80: Revista 1 Word

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

Page 81: Revista 1 Word

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”

Page 82: Revista 1 Word

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

Page 83: Revista 1 Word

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.

Page 84: Revista 1 Word

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

Page 85: Revista 1 Word

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)

Page 86: Revista 1 Word

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)

Page 87: Revista 1 Word

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

Page 88: Revista 1 Word

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';

Page 89: Revista 1 Word

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

Page 90: Revista 1 Word

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‟;

Page 91: Revista 1 Word

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;

Page 92: Revista 1 Word

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‟;

Page 93: Revista 1 Word

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;

Page 94: Revista 1 Word

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

Page 95: Revista 1 Word

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;

Page 96: Revista 1 Word

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”

Page 97: Revista 1 Word

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

Page 98: Revista 1 Word

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:

[email protected]

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