Documente Academic
Documente Profesional
Documente Cultură
1.Suma.
Se considera p numere intregi.Sa se calculeze suma:
S=1+1/n1 + 1/n2 +...+1/np.
Daca exista i apartine {1,2,...,p}astfel incat n =0,termenul corespunzator nu se
calculeaza.Totodata sa se numere valorile egale cu 0 printre numerele date.
Algoritm:
citeste p
pentru i=0,p executa:
citeste n[i]
sfarsit pentru
zerouri 0 {numarul zerourilor}
s0 {initializam suma cu 1,conform expresiei date}
pentru i=0,p executa:
citeste n[i]
daca n[i]<> 0 atunci
s s+1/n[i]
altfel
zerouri zerouri+1
sfarsit daca
sfarsit pentru
scrie s,zerouri
sfarsit algoritm.
2.Perechi.
Se considera n numere intregi.Sa se afiseze numerele de ordine ale perechilor
de elemente formate din doua numere intrgi egale.
Algoritm:
citeste n {dimensiunea sirului}
pentru i=1,n executa:
citeste x[i]
sfarsit pentru
pentru i=1,n-1 executa: {echivalent cu pentru i=2,n executa: }
daca x[i]=x[i+1] atunci {daca x[i-1]=x[i] atunci...}
scrie i,’ ’‚i+1
sfarsit daca
sfarsit pentru
sfarsit algoritm
3.Raport
Se considera n numere intregi.Sa se determine raportul dintre numarul
numerelor pare si numarul numerelor impare date.
Algoritm :
citeste n
pentru i=1,n executa:
sfarsit pentru
nrpare 0
nrimpare0
pentru i=1,n executa:
daca a[i] este impar atunci
nrimpare nrimpare+1
altfel
nrpare nrpare+1
sfarsit daca
sfarsit pentru
daca nrimpare>0 atunci
scrie nrpare/nrimpare
altfel
scrie ’Nu exista numere impare! ’
sfarsit daca
sfarsit algoritm
4.Temperaturi
Pe durata lunii iunie s-a masurat temperatura apei Marii Negre si valorile s-au
scris intr-un fisier.Stabiliti daca apa marii s-a incalzit incontinuu sau nu.
Algoritm :
pentru i=1,30 executa:
citeste t[i]
sfarsit pentru
i 1
{cat timp in a i-a zi temperatura este mai mica sau egala cu cea din a i+1-a zi}
cat timp (i<30) si (t[i]<=t[i+1]) executa :
i i+1 {trecem la urmatoarea zi}
sfarsit cat timp
{daca valoarea lui i a atins valoarea 30,inseamna ca pana acum toate}
{perechile succesive de temperaturi au respectat temperatura}
daca i=30 atunci
scrie ’Da’
altfel
scrie ’Nu’
sfarsit daca
sfarsit algoritm
5.Intrebarea sefului
Recent s-a realizat recensamantul populatiei din Romania.Un anganjat curios a
creat un fisier in care a pastrat doar anul nasterii persoanelor care locuiesc in
comuna sa natala.Seful lui,observand ca pierde timpul cu lucruri neimportante,il
acuza ca fisierul respectiv nu este bun la nimic si pentru a fi convingator il
intreaba daca poate sa spuna cate persoane nascute anterior anului 1989 traiesc
in comuna lui?
Scrieti un program sficient care raspunde la intrebarea sefului si in plus,creeaza
un fisier nou in care se vor afla anii de nastere mai mici decat 1989.
Algoritm :
citeste n {numarul locuitorilor din comuna}
pentru i=1,n executa:
citeste an[i] {anii de nastere}
sfarsit pentru
nr 0 {deocamdata nu am gasit nici un an mai mic decat 1989}
pentru i=1,n executa:
daca an[i]<1989 atunci
nr nr+1 {creste numarul anilor mai mici decat 1989}
an[nr] an[i] {peste elementul an[nr] se copiaza valoarea
an[i]}
sfarsit daca
sfarsit pentru
daca nr=0 atunci scrie ’Nu’
altfel scrie nr {numarul locuitorilor nascuti anterior lui 1989}
pentru i=1,nr executa:
scrie an[i] {anii de nastere}
sfarsit pentru
sfarsit algoritm
6.Diriginta
La sfarsitul anului,diriginta clasei trebuie sa completeze un formular in care este
intrebata cati elevi din clasa au media finala intre 9 si 10 inclusiv,cati au media
intre 8 si 9 inclusiv etc.Dar cum nu ii place sa lucreze cu statisticile,va roaga sa
scrieti un program care ii va lista datele necesare.In plus,ea va solicita ca lista sa
contina si mediile din fiecare categorie.
Algoritm:
citeste n {numarul elevilor din clasa}
pentru i=1,n executa:
citeste m[i] {mediile}
sfarsit pentru
primul 1 {primul indice al sirului curent}
ultim n {ultimul indice al sirului curent}
pentru limita:=9,5 executa: {medii posibile}
p primul {variabila auxiliara,retine primul indice al sirului curent}
aux m[primul] {prima medie o punem deoparte}
cat timp primul<ultim executa:
{cautam primul element avand proprietatea de la dreapta spre stanga}
cat timp (primul<ultim) si nu (m[ultim]>limita) executa:
ultim ultim-1
{m[ultim] are proprietatea ceruta,il scriem peste m[primul]}
sfarsit cat timp
daca primul<ultim atunci
m[primul] m[ultim]
primul primul+1
{cautam primul element care nu are proprietatea de la stanga la dreapta}
cat timp (primul<ultim) si (m[primul]>limita) executa:
primul primul+1
sfarsit cat timp
{m[primul]nu are prorpietatea ceruta,il scriem pestem[ultim]}
daca primul<n atunci
m[ultim] m[primul]
ultim ultim-1 {avansam de la sfarsit spre inceput}
sfarsit daca
sfarsit daca
sfarsit cat timp
m[primul] aux {elementul pus in aux se pune pe locul „liber”}
{daca elementul care a fost in aux are proprietatea ceruta }
{face parte din subsirul curent}
daca m[primul]>limita atunci
{indicele ultimului element care face parte din subsirul curent}
buc primul
altfel
{m[primul] face parte din subsirul care se va partitiona in continuare}
buc primul-1
sfarsit daca
scrie buc-p+1 {numarul elementelor din subsirul curent}
pentru j=p,buc executa:
scrie m[j]
primul buc+1 {indicele de inceput al subsirului care se va partitiona}
ultim n {refacem variabila ultim pentru o noua prelucrare}
sfarsit cat timp
sfarsit algoritm
7.Generare sir
Se considera urmatorul sir,construit astfel incat fiecare element algoritm lui,cu
exceptia primului,se obtine din cel precedent: 1,11,21,1211,111221,...Regula de
generare a termenilor este urmatoarea:
-se numara de la stanga la dreapta cate cifre exista in termenul precedent;
-in termenul nou se trece,pentru fiecare cifra,numarul de aparitii a cifrei si cifra.
Sa se determine al n-lea element din sir.
Algoritm:
vechi[1]1 {primul termen se initializeaza si devine imediat”vechi”}
kvechi1 {lungimea sirului este acum 1}
k1 {contor pentru termenii sirului}
cat timp k<n executa:
{algoritmul se termina,cand am determinat algoritm n-lea termen }
knou0 {deocamdata nu avem nici o cifra in noul termen}
i1
cat timp i<=kvechi executa: {vom parcurge cifrele vechiului termen}
cont1 {in cont se numara toate elementele egale cu vechi[i]}
cat timp (i<kvechi) si (vechi[i]=vechi[i+1]) executa:
contcont+1
ii+1
sfarsit cat timp
knouknou+1 {sirul va avea cu un termen mai mult}
nou[knou]cont {se trece in sirul nou numarul cifrelor curente}
knouknou+1 {mai avem nevoie de o pozitie}
nou[knou]vechi[i] {pentru cifra curenta}
ii+1 {trecem la urmatoarea cifra din termenul vechi}
sfarsit cat timp
vechinou
kvechiknou
kk+1
sfarsit cat timp
pentru i=1,knou executa:
scrie nou[i]
sfarsit pentru
sfarsit algoritm
8.Suprapunere
Se considera un tablou unidimensional A care contine n numere naturale si un
alt tablou B(avand elemente egale cu 1) de lungime k,unde k<=n.Prin
suprapunerea tabloului B peste tabloul A elementele acoperite din A isi
micsoreaza valoarea cu o unitate.Sa se stabileasca daca este posibil ca prin
aplicari succesive ale tabloului B peste tabloul A sa se obtina in A valori egale
cu 0.
Algoritm:
citirea datelor
i1
p0
pozitivadevarat {initial toate numerele din A sunt nenegative}
{cat timp numerele din A sunt nenegative si B”incape”inA}
9.Cifre comune
Sa se afiseze cifrele comune a doua numere naturale date.
Subalgoritm Creare_multime(numar,M): {subprogram procedura}
pentru cifra=0,p executa: {deocamdata multimea M este vida}
M[cifra]fals
sfarsit pentru
cat timp numar<>0 executa:
cifrarest[numar/10]
M[cifra]adevarat {cifra cifra exista in numar}
Numar[numar/10]
sfarsit cat timp
sfarsit subalgoritm
Algoritm Prime_si_inversate_prime_2:
pentru a=1,9 executa: {prima cifra din nr nu poate fi 0}
pentru b=0 la 9 executa:
{ultima cifra trebuie sa fie cel putin egala cu prima cifra}
numara*100+b*10+c
inversc*100+b*10+a
daca Prim (numar) si Prim(invers) atunci
scrie numar,invers
sfarsit daca
sfarsit daca
sfarsit pentru
sfarsit pentru
sfarsit pentru
sfarsit algoritm
Subalgoritm Scrie:
scrie textul[indice] {afisam litera cu care incepe cel mai lung cuvant}
i urm[indice] {indicele literei urmatoare}
cat timp i>0 executa: {cat timp exista urmator}
scrie textul[i]
i urm[i] {indicele literei care urmeaza dupa cea afisata}
sfarsit cat timp
sfarsit subalgoritm
14.Tija cu bile
Pe o tija verticala sudata la baza sunt dispuse n bile perforate in centru si
numerotate cu numere intregi oarecare.Se doreste eliminarea bilei etichetate cu
numarul x,folosindu-se de o alta tija verticala pe care pot fi mutate temporar
bile.Scrieti un program care citeste numerele asociate celor n bile,depune bilele
pe tija,apoi,folosind tija de manevra,elimina bila avand eticheta numarul x.
Subalgorim CautaBila(tija1,vf1,tija2,vf2,x):
vf2 0 {initializare stiva 2}
scrie ’Se extrag:’ {extragerea de pe tija 1 a bilelor pana la intalnirea
bilei avand ca eticheta numarul cautat}
cat timp (vf1>0) si (tija1[vf1]<>x) executa:
ExtragereDinStiva(tija1,vf1,nr)
scrie nr
AdaugareInStiva(tija2,vf2,nr)
sfarsit cat timp
daca tija[vf1]=x atunci {am ajuns la bila cautata care se elimina}
ExtragereDinStiva(tija1,vf1,nr)
altfel
scrie ’Nu exista bila cu eticheta’,x
sfarsit daca
sfarsit subalgoritm
Subalgoritm Muta(tija1,vf1,tija2,vf2,x):
{bilele de tija 2 sunt puse la loc pe tija 1}
cat timp vf2>0 executa:
ExtragereDinStiva(tija 2,vf2,nr)
AdaugareInStiva(tija1,vf1,nr)
sfarsit cat timp
sfarsit subalgoritm
Subalgoritm Afisare(tija1,vf1):
Scrie ’Au ramas pe tija: ’
vf2 0
cat timp vf1>0 executa:
ExtragereDinStiva(tija1,vf1,nr)
scrie nr {scrierea in fisier a bilelor ramase}
AdaugareInStiva(tija2,vf2,nr)
sfarsit cat timp
sfarsit subalgoritm
Subalgoritm Distribuie(st,varf,stive,varfuri):
pentru i=1,n executa: {initializarea celor n stive}
varfuri[i]0
sfarsit pentru
{luam bilele de pe tija initiala si le distribuim pe stive conform culorilor}
nr_bilam
cat timp varf>0 executa:
ExtragereDinStiva(st,varf,culoare)
AdaugareInStiva(stive[culoare],varfuri[culoare],nr_bila)
nr_bilanr_bila-1
sfarsit cat timp
sfarsit subalgoritm
Subalgoritm AfisareStiva(st,varf):
cat timp varf>0 executa:
ExtragereDinStiva(st,varf,nr_bila);
scrie nr_bila
sfarsit cat timp
sfarsit subalgoritm
a)Subalgoritm Corecta(s):
nlungimea sirulu de caractere s
p_deschise0
{variabila auxiliara,la sfarsit valoarea ei se atribuie identificatorului de
functie}
coradevarat
daca s[1]=’ ( ’ atunci {primul caracter il tratam separat}
p_deschisep_deschise+1
sfarsit daca
daca s[1]=’ )’ atunci
corfals
sfarsit daca
{sa nu inceapa sau sa se termine cu operator}
daca (s[1] este operator) sau (s[n] este operator) atunci
corfals
sfarsit daca
i2
cat timp (i<=n) si cor executa:
daca s[i] nu este litera si nu este operator si nu este paranteza atunci
corfals
sfarsit daca
{daca numele unei variabile este format din mai multe litere}
daca (s[i] este litera) si (s[i-1] este litera) atunci
corfals
sfarsit daca
{sau daca exista 2 operatori ce se succed,expresia nu este corecta}
daca (s[i] este operator) si (s[i-1] este operator) atunci
corfals
sfarsit daca
daca s[i]=’ ( ' atunci {se numara parantezele cand se deschid}
p_deschisep_deschise+1
{daca inaintea unei ' ( ’ avem o variabila sau ’ ) ’ ,expresia nu e corecta}
daca (s[i-1] este litera) sau (s[i-1]=’ ) ’) atunci
corfals
sfarsit daca
sfarsit daca
daca s[i]=’ ) ’ atunci {se inchide o paranteza deschisa}
daca p_deschise<=0 atunci {daca se inchide una nedeschisa}
corfals
altfel
p_deschisep_deschise-1
sfarsit daca
{daca in fata unei paranteze inchise este un operator}
daca s[i-1] este operator atunci
corfals
sfarsit daca
sfarsit daca
ii+1
sfarsit cat timp
corectacor
sfarsit subalgoritm
b)Subalgoritm Forma_postfixata(s,rezultat):
vfoper0
vfpolon0
multime{} {formam multimea de variabile din expresie}
pentru i=1,lungimea lui s executa: {prelucram fiecare caracter al expresiei}
{caracterul litera sau paranteza deschisa se introduce in polon si se adauga
la multimea de litere de care vom avea nevoie pentru a citi valorile
variabilelor}
daca s[i] este litera atunci
adaug(polon,vfpolon,s[i]) {se aduga in polon}
multime multime +s[i]
sfarsit daca
daca s[i]=’ ( ’ atunci
adaug(oper,vfoper,s[i]) {se adauga in oper}
sfarsit daca
{caracterul operator se introduce in oper}
{doi operatori consecutivi de aceeiasi prioritate se inverseaza }
daca (s[i]=’ * ’) sau (s[i]=’ / ’) sau (s[i]=’ % ’) atunci
daca (vfoper<>0) si (prioritate(oper[vfoper])=prioritate(s[i]) atunci
Extrag(oper,vfoper,ce)
Adaug(polon,vfpolon,ce)
sfarsit daca
Adaug(oper,vfoper,s[i])
sfarsit daca
{operatorii cu prioritate mica se muta din oper in polon pana cand in varful
stivei oper nu se va mai afla un operator ’ * ’,’/’ sau ’%’ }
daca (s[i]=’+’) sau (s[i]=’-’)atunci
{operatorii cu prioritate mai mare se scot din oper si se introduc in polon}
cat timp (vfoper<>0) si
(Prioritate (oper[vfoper])<prioritate(s[i])) executa:
Extrag(oper,vfoper,ce)
Adaug(polon,vfpolon,ce)
sfarsit cat timp
Adaug(oper,vfoper,s[i]) {se adauga operatorul + sau -}
sfarsit daca
{caracterul curent este paranteza inchisa:se muta toti operatoriidin oper in
polon pana la intalnirea parantezei deschise corespunzatoare}
{paranteza deschisa se elimina din oper}
daca s[i]= ’ ) ’ atunci {expresia dintre doua paranteze deschise}
{se muta in polon si se elimina din oper paranteza deschisa}
cat timp oper[vfoper]<>’ ( ’ executa:
Extrag(oper,vfoper,ce)
Adaug(polon,vfpolon,ce)
sfarsit cat timp
Extrag(oper,vfoper,ce) {eliminam ’ ( ’}
sfarsit daca
sfarsit pentru
{tot ceea ce a ramasain oper se muta in polon}
cat timp vfoper<>0 executa:
Extrag(oper,vfoper,ce)
Adaug(polon,vfpolon,ce)
sfarsit cat timp
sfarsit subalgoritm
Subalgoritm Elimin(n,ind,dim,cod,med):
{eliminam sirurile care se vor interclasa}
i1
cat timp (i<=n) si (i<>ind) executa:
i i+1
sfarsit cat timp
pentru j=i,n-1 executa: {incepand cu al i+1-lea translatam la stanga}
dim[j]dim[j+1]
cod[j]cod[j+1]
med[j]med[j+1]
sfarsit pentru
nn-1 {sirul devine mai scurt}
sfarsit subalgoritm
Subalgoritm Adaug(n,ccod,cmed,d,cod,med,dim):
{adaugam sirul interclasat}
n n+1 {sirul devine mai lung}
dim[n] d
cod[n] ccod
med[n] cmed
sfarsit subalgoritm
Subalgoritm Invers(d,cod,med):
{daca sirul de medii este ordonat crescator,inversam ordinea}
pentru i=1 ,[d/2] executa:
aux1 med[i]
med[i] med[d-i+1]
med[d-i+1] aux1
aux2 cod[i]
cod[i] cod[d-i+1]
cod[d-i+1] aux2
sfarsit pentru
sfarsit subalgoritm
18.Alegeri prezidentiale
Se apropie alegerile si organizatorii se pregatesc cu pachete de programe cu
care sa-si usureze munca in viitorul apropiat.Se prevede ca la alegerile
prezidentiale vor fi foarte multi candidati.Scrieti un program care va stabili pe
baza voturilor daca exista sau nu un castigator la aceste alegeri.Se considera ca
pentru a castiga ,un candidat trebuie sa totalizeze un numar de voturi cel putin
cu 1 mai mult decat jumatae din numarul total de voturi.
Algoritm Alegeri_prezidentiale:
citeste nr
candidat nr
cate 1 {in cate numaram voturi egale pe „segmente” de date}
cat timp nu urmeaza marca de sfarsit de fisier executa:
citeste nr
daca nr=candidat atunci {daca a aparut vot pentru acelasi candidat }
cate cate+1
altfel {daca votul nu este pentru candidatul curent}
cate cate-1 {micsoram numarul voturilor primite de candidat}
{daca prin micsorare numarul voturilor devine 0 }
daca cate=0 atunci
candidat nr {schimbam candidatul cu ultimul votat}
cate 1 {pentru acesta a aparut primul vot}
sfarsit daca
sfarsit daca
sfarsit cat timp
{am terminat prelucrarea fisierului;am iesit cu un candidat}
{deoarece nu este sigur ca acesta are suficiente voturi}
cate 0 {parcurgem fisierul din nou}
n0
cat timp nu urmeaza marca de sfarsit de fisier executa:
citeste nr
n n+1 {numaram numarul voturilor}
daca nr=candidat atunci {si numarul voturilor primite de candidat}
cate cate+1
sfarsit daca
sfarsit cat timp
daca cate >[n/2] atunci
scrie ’Da’
scrie candidat
altfel
scrie ’Nu’
sfarsit algoritm
19.Casierul unei firme trebuie sa parcurga zilnic un traseu liniar prin cele n
magazine ale sale.Magazinele sunt numerotate de la 1 la n si se parcurg zilnic in
ordinea numerelor lor de ordine,incepand cu primul magazin si terminand cu al
n-lea.(Evident casierul va trece doar o singura data prin fiecare magazin).Scopul
parcurgerii acestui traseu este efectuarea unor plati,respectiv a unor incasari.Se
stie ca exista cel putin un magazin de unde casierul va incasa bani.De asemenea
se cunosc sumele care trebuie platite,respectiv incasate.
Intr-o zi,patronul nu are bani pentru plati si cere casierului sa aleaga 2
magazine mi si mj de pe traseu,astfel incat parcurgand traseul incepand cu mi si
incheindu-l cu mj,incasarile sa reprezinte suma maxima posibila de adus inapoi
la firma.Casierul trebuie sa intre in toate magazinele aflate pe traseul ales,chiar
daca in unele trebuie sa efectueze plati.In plus,pentru a nu crea suspiciuni printre
angajatii magazinelor,patronul doreste sa fie vizitate cat mai multe magazine.
Scrieti un program care determina suma maxima posibila de incasat din
magazinele firmei.De asemenea,determinati secventa cea mai lunga de magazine
care permite obtinerea acestei sume.Daca aceeasi suma maxima se poate obtine
prin mai multe alegeri diferite,vizitand acelasi numar maxim de magazine,atunci
in fisierul de iesire se va scrie una singura,si anume cea care incepe de la
magazinul cu numarul de ordine cel mai mic.
Subalgoritm Subsecventa_1(n,T):
Max T[1] {T este sirul dat,Max este suma maxima cautata}
pentru stanga=1,n executa: {stanga este primul indice al subsecventei}
{dreapta este ultimul indice al subsecventei}
pentru dreapta=stanga,n executa:
suma 0
pentru i=stanga,dreapta executa:
suma suma +T[i]
sfarsit pentru
daca Max<suma atunci
Max suma
sfarsit daca
sfarsit pentru
sfarsit pentru
sfarsit subalgoritm
Subalgoritm Subsecventa_2(n,T):
Max T[1] {T este sirul dat,Max este suma maxima cautata }
pentru stanga=1,n executa: {stanga este primul indice al subsecventei}
suma 0 {incepand cu fiecare stanga nou,avem suma noua}
pentru dreapta=stanga,n executa:
suma suma +T[dreapta] {adaugam un element nou}
daca Max<suma atunci
Max<suma {actualizam Max}
sfarsit daca
sfarsit pentru
sfarsit pentru
sfarsit subalgoritm
Algoritm Subsir_de_suma_maxima_3:
citeste n
citeste T
MaxS_Caut T {initializarea sumei maxime}
MaxS_AiciMaxS_Caut {initializrea sumei curente}
poz_inc1
sfarsit 1
inceput1
pentru i=2,n executa: {continuam citirea numerelor}
citeste T
daca MaxS_Aici<0 executa: {daca MaxS_Aici este negativa}
MaxS_Aici T {aceasta se reinitializeaza cu T}
Poz_inc i {noul subsir posibil incepe cu pozitia i}
altfel
MaxS_AiciMaxS_Aici+T {lui MaxS_Aici i se adauga T}
daca MaxS_Caut<=MaxS_Aici atunci {se actualizeaza MaxS_Caut}
daca MaxS_Caut<MaxS_Aici atunci
MaxS_CautMaxS_Aici
inceput poz_inc
sfarsit i
altfel {in caz de egalitate}
daca inceput=poz_inc atunci
sfarsit i
sfarsit daca
sfarsit daca
sfarsit daca
sfarsit daca
sfarsit pentru
scrie MaxS_Caut
scrie inceput,’ ’,sfarsit
sfarsit algoritm