Un numar NB scris in baza B are "cifre" cu valori intre 0 si B-1.
Pentru a obtine reprezentarea numarului N10 in baza B, trebuie sa realizam un sir de impartiri repetate la B.
Fie N10=2490 si B=8
2490 impartit la 8 produce catul 311 si restul 2.
311 impartit la 8 produce catul 38 si restul 7
38 impartit la 8 produce catul 4 si restul 6
4 impartit la 8 produce catul 0 si restul 4
Luam resturile in ordine inversa si obtinem NB=4672.
Algoritmul de mai jos urmareste exact acest tip de calcul. Se observa ca pentru constructia lui NB trebuie sa lipim fiecare rest in fata numarului NB.
citeste N10;
NB=0;
p10=1;
cat timp(N10!=0)
{
NB=NB+P10*(N10%B);
P10=P10*10;
N=N/B;
}
scrie NB.
Blog dedicat elevilor de liceu care au nevoie de aprofundarea/fixarea cunostintelor de algoritmica, programare si TIC.
Se afișează postările cu eticheta C2_1. Algoritmica. Afișați toate postările
Se afișează postările cu eticheta C2_1. Algoritmica. Afișați toate postările
marți, 2 octombrie 2012
L13. Conversia unui numar din baza B in baza 10
Un numar NB scris in baza B are "cifre" cu valori intre 0 si B-1. Problema noastra este sa determinam ce numar N10 ii corespunde lui NB pentru baza 10.
Pentru aceasta sa observam urmatorul exemplu. Un numar in baza 10, N10=2490 poate fi scris si in forma canonica, adica N10=2*10^3+4*10^2+9*10^1+0*10^0.
Fie NB=4672 scris in baza B=8. Pentru a converti NB in baza 10 trebuie sa il scriem in forma canonica.
N10=4*8^3+6*8^2+7*8^1+2*8^0. Dupa calcule se obtine valoarea N10=2490.
Practic trebuie sa calculam o suma de produse a cifrelor din NB cu puteri ale bazei. Vom folosi algoritmul de prelucrare a cifrelor unui numar (NB).
citeste NB, B;
N10=0;
PB=1;
executa{
N10=N10+(NB%10)*PB;
PB=PB*B;
NB=NB/10;
}cat timp (NB!=0);
scrie N10;
Pentru aceasta sa observam urmatorul exemplu. Un numar in baza 10, N10=2490 poate fi scris si in forma canonica, adica N10=2*10^3+4*10^2+9*10^1+0*10^0.
Fie NB=4672 scris in baza B=8. Pentru a converti NB in baza 10 trebuie sa il scriem in forma canonica.
N10=4*8^3+6*8^2+7*8^1+2*8^0. Dupa calcule se obtine valoarea N10=2490.
Practic trebuie sa calculam o suma de produse a cifrelor din NB cu puteri ale bazei. Vom folosi algoritmul de prelucrare a cifrelor unui numar (NB).
citeste NB, B;
N10=0;
PB=1;
executa{
N10=N10+(NB%10)*PB;
PB=PB*B;
NB=NB/10;
}cat timp (NB!=0);
scrie N10;
L12. Sirul lui Fibonacci
Sirul lui Fibonacci este 1, 1, 2, 3, 5, 8, 13, 21, 34, .... si are legatura cu celebrul numar de aur.
Se observa ca sirul incepe cu valorile 1 si 1 , dupa care, fiecare noua valoare se obtine prin adunarea ultimelor doua valori:
Pentru noi problema este de a determina al N-lea termen din sir.
Daca N=1 sau N=2, raspunsul este simplu, 1. In restul cazurilor trebuie ca avand mereu ultimile valori A si B, sa calculam noua valoare C=A+B.
citeste N;
A=1;B=1;
daca (N<=2) atunci scrie 1;
altfel {pentru i=3,N executa
{//calculam noua valoare
C=A+B;
//pregatim noua pereche
A=B;B=C}
scrie B;}
Se observa ca sirul incepe cu valorile 1 si 1 , dupa care, fiecare noua valoare se obtine prin adunarea ultimelor doua valori:
- F(1)=1
- F(2)=1
- F(n)=F(n-1)+F(n-2)
Pentru noi problema este de a determina al N-lea termen din sir.
Daca N=1 sau N=2, raspunsul este simplu, 1. In restul cazurilor trebuie ca avand mereu ultimile valori A si B, sa calculam noua valoare C=A+B.
citeste N;
A=1;B=1;
daca (N<=2) atunci scrie 1;
altfel {pentru i=3,N executa
{//calculam noua valoare
C=A+B;
//pregatim noua pereche
A=B;B=C}
scrie B;}
vineri, 28 septembrie 2012
L11. Cmmdc. Cmmmc
C.m.m.d.c. este acronimul (prima litera de la fiecare cuvant) de la "cel mai mare divizor comun" si se aplica pentru doua numere naturale.
Problema. Fie doua numere naturale A si B. Sa se determine cel mai mare divizor comun a lui A si B.
Sa citim iar. Practic trebuie sa determin un numar natural care sa fie divizor atat pentru A cat si pentru B. Daca sunt mai multe numere in aceasta situatie, atunci il aleg pe cel mai mare. Ceea ce ma duce cu gandul la
citeste A, B;
cmmdc=0;
pentru D=1 pana la A executa
daca (A%D==0 si B%D==0 ) atunci cmmdc=D;
scrie cmmdc;
Practic, cmmdc-ul va fi cel mult unul dintre numere. As putea sa fiu prevazator si sa aleg ca limita superioara pe cel mai mic dintre A si B. Si conditia de numitor comun se poate rescrie A%D +B%D==0.
citeste A,B
min=A; daca (min>B) atunci min=B;
pentru D=1 pana la min executa
daca (A%D +B%D==0) atunci cmmdc=D;
scrie cmmdc;
Problema nu e noua, Euclid (cca 325 - 265 î.Hr.!!!!!) s-a gandit si el la acelasi lucru si a gasit o solutie. Daca D este divizorul comun a lui A si B, atunci estista A2 si B2 asa incat:
Practic, in "lenea" lui de a calcula cmmdc(A,B), Euclid propune mereu o pereche mai mica (A-B, B) daca A>B sau (A, B-A) daca B>A. Deci, cmmdc(A, B) este
Se observa ca in primele doua cazuri trebuie sa reluam algoritmul, ceea ce ne duce cu gandul la urmatoarea secventa:
citeste A,B
cat timp (A!=B) executa
daca (A>B) atunci A=A-B;
altfel B=B-A;
scrie A;
Deci varianta 3 e de acum 2000 de ani! Intre timp, s-a mai facut o varianta. Daca A=23456 si B=89 ar trebui sa se efectueze o multime de scaderi a lui B din A. Scaderi repetate, pana nu se mai poate scadea pe B din A! Asta este o impartire si ce ramane in A este restul. In consecinta, pe cel mai mare il vom transforma in restul impartirii. Cand ne oprim? Ne vom opri cand A sau B vor fi nule, ceea ce inseamna ca cealalta valoare, nenula, va fi CMMDC.
citeste A,B;
cat timp (A*B!=0) executa //daca nici unul nu e nul....
daca (A>B) atunci A=A%B;
altfel B=B%A;
scrie A+B; //afisez valoarea nenula
Varianta 5.
Desi varianta 4 e o solutie respectabila, inca nu e de ajuns. Practic, la fiecare iteratie se executa 2 teste - cel din CAT TIMP si cel din DACA. Varianta urmatoare foloseste aceeasi idee de mai sus dar elimina unul din teste.
citeste A,B;
cat timp (B!=0) executa
{R=A%B; A=B; B=R;}
scrie B;
Analiza variantelor
Evident, ultima varianta este cea mai buna. Am explicat deja ratiunile prin care s-a trecut de la o varianta la alta. In vederea examenului de bacalaureat va trebuie toate variantele, indeosebi ultima pentru momentul cand va trebui sa programati.
Pentru calculul matematic a cmmdc pentru doua numere A si B, se realizeaza descompunerea in factori primi si apoi se considera termenii comuni, la puterea cea mai mica.
Pentru calculul matematic a cmmmc pentru doua numere A si B, se realizeaza descompunerea in factori primi si apoi se considera termenii comuni si necomuni, la puterea cea mai mare.
Practic daca as scrie produsul A*B ca inmultire intre descompunerile lor, as observa ca toti termenii existenti sunt fie parte a CMMDC, fie parte a CMMMC. De aici apare si relatia A*B=CMMDC(A,B)*CMMMC(A,B). Practic ne vom folosi de CMMMC(A,B)=A*B/CMMDC(A,B).
citeste A,B
A2=A; B2=B; //salvez separat datele initiale
//calculez CMMDC
cat timp (B!=0) {R=A%B; A=B; B=R;}
scrie "CMMDC este ", A2*B2/A.
Problema. Fie doua numere naturale A si B. Sa se determine cel mai mare divizor comun a lui A si B.
Sa citim iar. Practic trebuie sa determin un numar natural care sa fie divizor atat pentru A cat si pentru B. Daca sunt mai multe numere in aceasta situatie, atunci il aleg pe cel mai mare. Ceea ce ma duce cu gandul la
Varianta 1.
citeste A, B;
cmmdc=0;
pentru D=1 pana la A executa
daca (A%D==0 si B%D==0 ) atunci cmmdc=D;
scrie cmmdc;
Practic, cmmdc-ul va fi cel mult unul dintre numere. As putea sa fiu prevazator si sa aleg ca limita superioara pe cel mai mic dintre A si B. Si conditia de numitor comun se poate rescrie A%D +B%D==0.
Varianta 2.
citeste A,B
min=A; daca (min>B) atunci min=B;
pentru D=1 pana la min executa
daca (A%D +B%D==0) atunci cmmdc=D;
scrie cmmdc;
Varianta 3.
Problema nu e noua, Euclid (cca 325 - 265 î.Hr.!!!!!) s-a gandit si el la acelasi lucru si a gasit o solutie. Daca D este divizorul comun a lui A si B, atunci estista A2 si B2 asa incat:
- A=D*A2
- B=D*B2 si deduce ca si diferenta acestor numere are acelasi divizor comun
- A-B=D*(A2-B2)
Practic, in "lenea" lui de a calcula cmmdc(A,B), Euclid propune mereu o pereche mai mica (A-B, B) daca A>B sau (A, B-A) daca B>A. Deci, cmmdc(A, B) este
- (A-B, B) daca A>B
- (A, B-A) daca B>A
- A daca A==B
Se observa ca in primele doua cazuri trebuie sa reluam algoritmul, ceea ce ne duce cu gandul la urmatoarea secventa:
citeste A,B
cat timp (A!=B) executa
daca (A>B) atunci A=A-B;
altfel B=B-A;
scrie A;
Varianta 4.
Deci varianta 3 e de acum 2000 de ani! Intre timp, s-a mai facut o varianta. Daca A=23456 si B=89 ar trebui sa se efectueze o multime de scaderi a lui B din A. Scaderi repetate, pana nu se mai poate scadea pe B din A! Asta este o impartire si ce ramane in A este restul. In consecinta, pe cel mai mare il vom transforma in restul impartirii. Cand ne oprim? Ne vom opri cand A sau B vor fi nule, ceea ce inseamna ca cealalta valoare, nenula, va fi CMMDC.
citeste A,B;
cat timp (A*B!=0) executa //daca nici unul nu e nul....
daca (A>B) atunci A=A%B;
altfel B=B%A;
scrie A+B; //afisez valoarea nenula
Varianta 5.
Desi varianta 4 e o solutie respectabila, inca nu e de ajuns. Practic, la fiecare iteratie se executa 2 teste - cel din CAT TIMP si cel din DACA. Varianta urmatoare foloseste aceeasi idee de mai sus dar elimina unul din teste.
citeste A,B;
cat timp (B!=0) executa
{R=A%B; A=B; B=R;}
scrie B;
Analiza variantelor
Evident, ultima varianta este cea mai buna. Am explicat deja ratiunile prin care s-a trecut de la o varianta la alta. In vederea examenului de bacalaureat va trebuie toate variantele, indeosebi ultima pentru momentul cand va trebui sa programati.
Calculul CMMMC
Pentru calculul matematic a cmmdc pentru doua numere A si B, se realizeaza descompunerea in factori primi si apoi se considera termenii comuni, la puterea cea mai mica.
Pentru calculul matematic a cmmmc pentru doua numere A si B, se realizeaza descompunerea in factori primi si apoi se considera termenii comuni si necomuni, la puterea cea mai mare.
Practic daca as scrie produsul A*B ca inmultire intre descompunerile lor, as observa ca toti termenii existenti sunt fie parte a CMMDC, fie parte a CMMMC. De aici apare si relatia A*B=CMMDC(A,B)*CMMMC(A,B). Practic ne vom folosi de CMMMC(A,B)=A*B/CMMDC(A,B).
citeste A,B
A2=A; B2=B; //salvez separat datele initiale
//calculez CMMDC
cat timp (B!=0) {R=A%B; A=B; B=R;}
scrie "CMMDC este ", A2*B2/A.
L7.2. Care instructiune repetitiva este mai buna?
Desi sunteti tentati sa alegeti trebuie sa stit ca ambele instructiuni au aceeasi capacitate. Toata problema este sa verificati in algoritmul dumneavoastra daca trebuie sau nu efectuat un test inainte de executarea instructiunii/instructiunilor de repetat.
Simularea instructiunii CAT TIMP EXECUTA cu EXECUTA CAT TIMP. Instructiunea CAT TIMP EXECUTA intai testeaza si apoi executa; daca comparam secventele de executie observam ca la CAT TIMP EXECUTA intai apare un test/conditie. si apoi este identica cu EXECUTA CAT TIMP; nu ramane decat sa folosim o instructiune de test pentru aceasta conditie;
Observati ca pentru transformarea unei instructiuni cat timp in una executa cat timp, nu trebuie dacat sa identificati conditia si secventa care se repeta; apoi copiati corespunzator in sablon.
Simularea instructiunii EXECUTA CAT TIMP cu CAT TIMP EXECUTA .
Simularea instructiunii REPETA PANA CAND cu EXECUTA CAT TIMP.
Simularea instructiunii PENTRU cu CAT TIMP EXECUTA .
Simularea instructiunii CAT TIMP EXECUTA cu EXECUTA CAT TIMP. Instructiunea CAT TIMP EXECUTA intai testeaza si apoi executa; daca comparam secventele de executie observam ca la CAT TIMP EXECUTA intai apare un test/conditie. si apoi este identica cu EXECUTA CAT TIMP; nu ramane decat sa folosim o instructiune de test pentru aceasta conditie;
| cat timp (exp_logica) executa instructiune; | daca (exp_logica) atunciexecuta instructiune cat timp (exp_logica) |
Observati ca pentru transformarea unei instructiuni cat timp in una executa cat timp, nu trebuie dacat sa identificati conditia si secventa care se repeta; apoi copiati corespunzator in sablon.
Simularea instructiunii EXECUTA CAT TIMP cu CAT TIMP EXECUTA .
| executa instructiune cat timp (exp_logica); | instructiune;cat timp (exp_logica) executa instructiune; |
Simularea instructiunii REPETA PANA CAND cu EXECUTA CAT TIMP.
| repeta instructiune pana cand (exp_logica); | executa instructiune cat timp!(exp_logica) |
Simularea instructiunii PENTRU cu CAT TIMP EXECUTA .
| pentru i<-A pana la B cu pasul C executa instructiune. | i <- A;cat timp (i<=B) executa {instructiune; i<-i+C}; |
Labels:
C2_1. Algoritmica,
cat timp,
do while,
executa cat timp,
for,
instructiuni repetitive,
pentru,
transformare instructiuni repetitive,
while
marți, 6 martie 2012
L10. Algoritmi fundamentali. Divizibilitate. N este prim?
Divizibilitate
Problema. Pentru un N dat, care sunt divizorii lui N?
Multimea divizorilor lui N este cuprinsa intre valorile 1 si N. Un numar D este divizor al lui N daca N se imparte exact la D. Pentru noi, impartirea exacta inseamna ca restul impartirii lui N la D este zero. Trebuie sa cautam acele valori intre 1 si N la care N se imparte exact. Vom aifsa si vom numara aceste valori.
natural N, D, NR;
NR=0;
citeste N;
pentru D=1, N executa
daca (N%D==0) atunci { scrie D; NR=NR+1}
scrie NR;
Cu numarul de divizori putem stabili daca numarul N este prim.
daca (NR==2) atunci scrie N, " este prim!"
Este N numar prim?
Problema. Fie N un numar natural. Este N numar prim?
Conform matematicii un numar N este prim daca are drept divizori pe 1 si pe N.
Varianta 1. Ideea este sa realizam cat mai putine teste, astfel incat algoritmul sa se incheie mai repede
- D=2;
- cat timp (D<=N-1 si N%D!=0) executa D=D+1;
- daca (N%D==0) atunci scrie "divizibil"
- altfel scrie "prim"
Am redus doua teste : nu mai testam cazul D=1 si D=N. De asemenea, profitam de situatia in care gasim primul divizor pentru a iesi din repetitie. Totusi, pentru cazul in care numarul ar fi prim, inca se executa N-2 pasi.
Varianta 2. Numarul 2 este cel mai mic potential divizor. Deduc ca numarul N/2 este cel mai mare potential divizor.
- D=2;
- cat timp (D<=N/2 si N%D!=0) executa D=D+1;
- daca (N%D==0) atunci scrie "divizibil"
- altfel scrie "prim"
In aceasta varianta se executa, in cel mai rau caz, N/2 operatii. Super! Am redus munca la jumatate! Se poate mai bine?
Varianta 3. Sa cercetam, in continuare, perechile de potential divizori: 2 cu N/2, 3 cu N/3, 4 cu N/4, .... Observ ca pe masura ce primul termen creste, al doilea scade. Deduc ca, la un moment dat cei doi termeni pot fi egali. Adica ar putea fi un element X astfel incat N==X*X sa fie adevarat! In consecinta X=radical(N) . Deci ultima pereche care ar trebui studiata este cea cu radical (N).
- D=2;
- cat timp (D<=radical(N) si N%D!=0) executa D=D+1;
- daca (N%D==0) atunci scrie "divizibil"
- altfel scrie "prim"
Este cert ca radical(N)<N/2. Iata ca am obtinut un numar mai mic de operatii. Sa cercetam cat de eficienti sunt algoritmii nostri.
Numarul N=611953 este prim, spun unii.
- varianta 1 va executa 611951 pasi
- varianta 2 va executa 305 976 pasi
varianta 3 va executa 782 pasi!!!!!!!
E ceva, nu?
luni, 5 martie 2012
L9. Algoritmi fundamentali. Siruri de numere
Pentru a prelucra un sir de numere trebuie sa stim fie numarul de valori in discutie (sir cu numar cunoscut de valori), fie sa avem o valoare care sa marcheze sfarsitul sirului (de obicei - zero).
De vreme ce stim cate valori vor fi in sir (prelucrarea va fi retetat de un numar cunoscut de ori) putem folosi instructiunea FOR/PENTRU.
Valoarea zero nu face parte din sir si nu trebuie prelucrata. Nu stim exact cand primim valoarea zero (care marcheaza sfarsitul sirului), motiv pentru care la fiecare citire trebuie sa verificam daca s-a citit zero sau nu.Daca valoarea citita nu este zero avem de realizar prelucrarea ceruta de problema si o noua citire.
Prelucrarea unui sir cu numar cunoscut de valori
De vreme ce stim cate valori vor fi in sir (prelucrarea va fi retetat de un numar cunoscut de ori) putem folosi instructiunea FOR/PENTRU.
natural x, n, i;
citeste N
pentru i=1,N executa
{ citeste X;
//prelucrez X
........
}
Prelucrarea unui sir cu un numar necunoscut de valori (care se incheie cu zero)
Valoarea zero nu face parte din sir si nu trebuie prelucrata. Nu stim exact cand primim valoarea zero (care marcheaza sfarsitul sirului), motiv pentru care la fiecare citire trebuie sa verificam daca s-a citit zero sau nu.Daca valoarea citita nu este zero avem de realizar prelucrarea ceruta de problema si o noua citire.
citeste x;
cat timp (x!=0) {
//prelucrez valorea X
.........
//trec la valoarea urmatoare
citeste X
}
Probleme
- Sa se calculeze suma/produsul valorilor din sir
- Sa se determine valoarea minima/maxima dintre valorile citite.
- O valoare data Y se gaseste in sir?
- De cate ori apare o valoare data Y?
- Presupunand ca sirul reprezinta coeficientii uni polinom ( dati incepand cu gradul cel mai mic), calculati valoarea polinomului intr-un punct Y.
L8. Algoritmi fundamentali. Prelucrarea cifrelor unui numar natural
Fie N un numar natural. Avem nevoie sa prelucram pe rand cifrele unui numar natural.
In prelucrarea cifrelor numarului, cel mai usor ajungem la ultima cifra (N%10) . Dupa prelucrarea ei, ultima cifra va trebui inlaturata (N=N/10). Si totul trebuie repetat cat timp N mai are cifre (N!=0).
De vreme ca nu stim cate cifre are N, nu putem folosi intructiunea FOR/PENTRU. Raman instructiunile repetitive cu un numar necunoscut de pasi : CAT TIMP EXECUTA/WHILE si EXECUTA CAT TIMP/ DO WHILE.
Pentru CAT TIMP EXECUTA/WHILE am un contraargmuent. Algoritmul ar trebui sa fie
Daca utilizatorul doreste sa aplice algoritmul pentru valoarea zero, nu se va efectua nimic si secventa noastra nu se va executa.Evident, situatia se poate evita prin plasarea unui test inainte de CAT TIMP , care sa verifice daca N este nul.
Nu ramane decat varianta cu EXECUTA CAT TIMP/DO WHILE.
Cateva probleme clasice pentru acest algoritm:
In prelucrarea cifrelor numarului, cel mai usor ajungem la ultima cifra (N%10) . Dupa prelucrarea ei, ultima cifra va trebui inlaturata (N=N/10). Si totul trebuie repetat cat timp N mai are cifre (N!=0).
De vreme ca nu stim cate cifre are N, nu putem folosi intructiunea FOR/PENTRU. Raman instructiunile repetitive cu un numar necunoscut de pasi : CAT TIMP EXECUTA/WHILE si EXECUTA CAT TIMP/ DO WHILE.
Pentru CAT TIMP EXECUTA/WHILE am un contraargmuent. Algoritmul ar trebui sa fie
cat timp (N!=0) executa { //prel ultima cifra a lui N
.......N%10;
//stergem ultima cifra
N=N/10;
}Daca utilizatorul doreste sa aplice algoritmul pentru valoarea zero, nu se va efectua nimic si secventa noastra nu se va executa.Evident, situatia se poate evita prin plasarea unui test inainte de CAT TIMP , care sa verifice daca N este nul.
Nu ramane decat varianta cu EXECUTA CAT TIMP/DO WHILE.
executa{ //prel ultima cifra a lui N
.......N%10;
//stergem ultima cifra
N=N/10;
} cat timp (N!=0);Cateva probleme clasice pentru acest algoritm:
- Sa se numere cate cifre are numarul N
- Sa se stabileasca cate cifre pare/impare are numarul N.
- Sa se stabileasca daca N contine o cifra data, CIF.
- Sa se numere de cate ori apare cifra CIF in numarul N.
- Sa se determine cifra maxima/minima din numarul N
- Sa se construiasca "oglinditul" numarului N. Pentru N=3648 se va afisa 8463.
- Sa se stabilesca daca N este palindrom (egal cu oglinditul sau).
- Pentru un numar N dat, sa se construiasca cel mai mare numar natural care se poate forma cu cifrele lui N.
cat timp (N!=0) executa { //prel ultima cifra a lui N
.......N%10;
//stergem ultima cifra
N=N/10;
}
miercuri, 14 octombrie 2009
L7. Instructiunea EXECUTA CAT TIMP
Exista trei instructiuni (structuri) repetitive folosite in toate limbajele:
Sintaxa: executa instructiune cat timp (expr_logica)
Efect:
Observatii:
Putewti folosi aceasta instructiune pentru algortimul de prelucrare a cifrelor unui numar natural N:
executa {cif<- n%10; prelucrez cifra ; n<-n/10} cat timp (n!=0);
Exemple:
- instructiunea repetitiva cu test initial CAT TIMP (WHILE) (se foloseste cand numarul de repetitii este nedefinit)
- instructiunea repetitiva cu test final REPETA-PANA CAND/ EXECUTA CAT TIMP (DO WHILE sau REPEAT) (se foloseste cand numarul de repetitii este nedefinit)
- instructiunea repetitiva cu un numar cunoscut de pasi PENTRU (FOR) (se foloseste cand numarul de repetitii este cunoscut)
Instructiunea EXECUTA CAT TIMP
Sintaxa: executa instructiune cat timp (expr_logica)
Efect:
- se executa instructiunea
- se stabileste valoarea de adevar a expresiei logice
- daca valoarea conditiei este ADEVARAT atunci se revine la pasul 1
- daca valoarea conditiei este FALSA atunci se continua cu instructiunea de dupa EXECUTA CAT TIMP
Observatii:
- instructiunea EXECUTA CAT TIMP este o instructiune repetitiva conditionata posterior (sau cu test final)
- intai executa instructiunea de repetat si apoi verifica necesitatea repetarii; instrutiunea se executa macar o data
- secventa de operatii este: instructiune, conditie, instructiune, ... , conditie, instructiune, conditie
Putewti folosi aceasta instructiune pentru algortimul de prelucrare a cifrelor unui numar natural N:
executa {cif<- n%10; prelucrez cifra ; n<-n/10} cat timp (n!=0);
Exemple:
- sa se afiseze cifrele numarului
- sa se numere cate cifre are N
- sa se stabileasca de cate ori apare o cifra anume
- sa se determine cifra maxima/minima din numar
- sa se creeze oglinditul numarului N (N=1234 => 4321)
- sa se stabileasca daca N estre palindrom (egal cu oglinditul sau). Ex: 12321, 11, 121, ...
joi, 13 august 2009
L6. Instructiunea PENTRU - EXECUTA
Exista trei instructiuni (structuri) repetitive folosite in toate limbajele:
Sintaxa: PENTRU contor<-exp_init,exp_fin EXECUTA instructiune
Efect: pentru fiecare valoare a contorului intre expresia initiala si expresia finala se executa instructiunea;
Exemplu: pentru i <- 1,10 executa scrie " Nu ma prinzi!";
Observatii:
Exemplul 1.
intreg n,i;
citeste n;
pentru i<- 0,n executa
daca (i%2==0) atunci scrie i.
Observatii:
Exemplul 2.
Observatie:
Exemplul 3
intreg n,i,suma;
citeste n;
suma<-0;
pentru i<- 0 ,n executa suma<- suma +i;
scrie suma.
Exemplul 3.
intreg n,i,max,val;
citeste n;
citeste max;
pentru i<-2,n executa {citeste val; daca val>max atunci max<-val;};
scrie val.
- instructiunea repetitiva cu test initial CAT TIMP (WHILE) (se foloseste cand numarul de repetitii este nedefinit)
- instructiunea repetitiva cu test final REPETA-PANA CAND/EXECUTA CAT TIMP (DO WHILE sau REPEAT) (se foloseste cand numarul de repetitii este nedefinit)
- instructiunea repetitiva cu un numar cunoscut de pasi PENTRU (FOR) (se foloseste cand numarul de repetitii este cunoscut - un numar fix de ori.)
Sintaxa: PENTRU contor<-exp_init,exp_fin EXECUTA instructiune
Efect: pentru fiecare valoare a contorului intre expresia initiala si expresia finala se executa instructiunea;
Exemplu: pentru i <- 1,10 executa scrie " Nu ma prinzi!";
- pentru fiecare valoarea a variabile i, de la 1 la 10, se afiseaza " Nu ma prinzi!"
- de 10 ori se afiseaza " Nu ma prinzi!"
- daca secventa ce trebuie repetata contine mai multe instructiuni, acestea se vor grupa cu acolade
Observatii:
- practic, pentru fiecare valoare a lui i, intai se testeaza daca nu s-a depasit valoarea finala 10 si apoi se executa instructiunea;
- algoritmic, propozitia de mai sus este :
- i<-1; cat timp (i<=10) {scrie " Nu ma prinzi!"; i<-i+1; };
- practic , secventa de mai sus me explica faptul ca instructiunea pentru este o clona a instructiunii cat timp.
- instructiunea este "ceruta" daca descrierea algorimului spune "de la valoarea X la valoarea Y", "pentru primele X valori", "de X ori", ...
Exemplul 1.
- Sa se afiseze numerele pare pana la o valaore N, naturala.
intreg n,i;
citeste n;
pentru i<- 0,n executa
daca (i%2==0) atunci scrie i.
Observatii:
- algoritmul ia fiecare valoare intre 0 si n si o testeaza daca este para (restul impartirii lui i la 2 sa fie nul : i%2==0)
- se efectueaza n pasi din care jumatate sunt gresiti; trebuie o varianta mai buna
Exemplul 2.
- Aceeasi problema dar incercam sa mergem din doi in doi
- intreg n,i; citeste n; pentru i<-0,n,2 executa scrie i.
- intreg n,i; citeste n; pentru i<-0,n/2 executa scrie i*2.
Observatie:
- in primul caz, 2-ul de dupa n (i<-0,n,2 ) stabileste cresterea lui i cu 2 si nu cu 1 asa cum este implicit
- in al doilea caz, ne folosim de faltul ca valorile cautate sunt pare, divizibile cu 2;
Exemplul 3
- Sa se calculeze suma primelor N numere naturale.
- evident, stim formula n*(n+1)/2 dar sa incercam un algoritm;
- va trebui sa adunam, la o suma , toate valoarile de la 1 la n
intreg n,i,suma;
citeste n;
suma<-0;
pentru i<- 0 ,n executa suma<- suma +i;
scrie suma.
Exemplul 3.
- Se citeste un sir de N valori intregi. Sa se determine cea mai mare valoare citita (valoarea maxima dintr-un sir).
intreg n,i,max,val;
citeste n;
citeste max;
pentru i<-2,n executa {citeste val; daca val>max atunci max<-val;};
scrie val.
miercuri, 12 august 2009
L5. Instructiunea repetitiva CAT TIMP
Chiar si cu atribuirea si intructiunea de decizie, si tot nu este de ajuns. Exista probleme ce necesita repetarea unor operatii si cu ceea ce stim, nu putem face fata.
Exista trei instructiuni (structuri) repetitive folosite in toate limbajele:
Sintaxa: cat timp (expresie_logica) executa instructiunea;
Efect:
Observatii:
Exemplul 1
intreg a,b,p;
citeste a,b;
p<-0;
cat timp (b>0) executa {p<- p+a; b<- b-1;};
scrie p.
Observatii:
Exemplul 2
intreg a, b, contor;
contor<- 0;
daca (b=0) atunci scrie "nu se realizeaza impartiri la zero!";
altfel {cat timp (a>b) executa {a<- a-b; contor<-contor+1;};
scrie "catul este ", contor;
scrie "restul este ", a;
}.
Observatii:
Exemplul 3.
intreg a,b;
citeste a,b;
cmmdc<- a;
cat timp (a%cmmdc +b%cmmdc !=0) executa cmmdc<- cmmdc-1;
scrie cmmdc.
Observatii:
Exemplul 4
intreg x,m1,m2, mij, pasi;
citesc x; m1 <- 1; m2<- 100;
mij<- 50; pasi<- 0;
cat timp (mij!=x) executa
{daca (x<mij) atunci m2<- mij;
altfel m1<- mij;
mij<-(m1+m2)/2;
pasi<- pasi +1;};
scrie pasi.
Observatie:
Exemplul 5.
intreg n, suma;
citeste n;
suma <-0;
cat timp (n!=0) executa {suma<-suma+n%10; n<-n/10;};
scrie suma.
Observatie:
Exista trei instructiuni (structuri) repetitive folosite in toate limbajele:
- instructiunea repetitiva cu test initial CAT TIMP (WHILE) (se foloseste cand numarul de repetitii este nedefinit)
- instructiunea repetitiva cu test final REPETA-PANA CAND / EXECUTA CAT TIMP (DO WHILE sau REPEAT) (se foloseste cand numarul de repetitii este nedefinit)
- instructiunea repetitiva cu un numar cunoscut de pasi PENTRU (FOR) (se foloseste cand numarul de repetitii este cunoscut)
Instructiunea CAT TIMP
Sintaxa: cat timp (expresie_logica) executa instructiunea;
Efect:
- se stabileste valoarea de adevar a expresiei logice
- daca valoarea expresiei logice este ADEVARAT atunci se executa instructiunea si se reia de la pasul 1
- daca valoarea expresiei logice este FALS atunci se continua cu instructiunea de dupa CAT TIMP
Observatii:
- CAT TIMP este repetitiva conditionata anterior deoarece intai se evaluaeza conditia si apoi se executa instructiunea
- Practic, succesiunea de etape este exp logica, instructiune,exp logica, instructiune,exp logica, instructiune,...exp logica;succesiunea se incheie cu exp logica in momentul in care valoarea expresiei este FALS.
- daca pe cazul ADEVARAT trebuie sa scriem mai multe instructiuni, acestea vor fi grupate cu acolade
Exemplul 1
- Fie a si b doua valori naturale. Se se simuleze inmultirea a*b prin adunari repetate.
- P=a*b=a+a+....+a de b ori
- Expresia de mai sus spune ca a trebuie adunat la P de b ori; adica, la fiecare adunare la P a lui a putem sa scadem un 1 din b (decrementam), pentru a pastra numarul de adunari ce mai trebuie efectuat; cand b va fi zero , se va adunat a de b ori
intreg a,b,p;
citeste a,b;
p<-0;
cat timp (b>0) executa {p<- p+a; b<- b-1;};
scrie p.
Observatii:
- pentru fiecare adunare a lui a la p, scadem un 1 din b
- aceste operatii trebuie executate pentru fiecare caz in care b este pozitiv; de aceea au fost grupate cu acolade
- este algoritmul corect? Sa verificam cazurile cu zero:
- daca a este zero, atunci la P se aduna zero de b ori; practic P ramane la valoarea zero. CORECT!
- daca b este zero, conditia din CAT TIMP este falsa si atunci nu se executa instructiunile; in consecinta se afiseaza direct valoarea lui P,adica zero; CORECT!
Exemplul 2
- Fie a si b doua valori naturale. Sa se simuleze impartirea lui a la b prin scaderi repetate si sa se afiseze catul si restul.
- vom scadea din a valoarea lui b de mai multe ori, numarand intr-o variabila contor de cate ori am facut scaderea (practic variabila contor va fi catul impartirii)
- operatia se va repeta cat timp din a se mai poate scadea un b, adica cat timp a mai mare decat b
- Ce reprezinta valoarea ramasa in a? O valoare mai mica decat b? Evident, restul impartirii.
intreg a, b, contor;
contor<- 0;
daca (b=0) atunci scrie "nu se realizeaza impartiri la zero!";
altfel {cat timp (a>b) executa {a<- a-b; contor<-contor+1;};
scrie "catul este ", contor;
scrie "restul este ", a;
}.
Observatii:
- am pus intre acolade secventa in care numaram de cate ori am scazut pe b din a; erau doua instructiuni;
- este corect algoritmul? Daca incercati cazurile normale, va merge. Sa verificam cazurile speciale:
- daca a este mai mic decat b atunci cat timp nu va functiona si se va afisa direct contor (zero) si a (restul); CORECT!
- daca a este zero, atunci nu se executa cat timp si se afiseaza contor si a (0 si 0 ) CORECT!
- daca b este zero, se afiseaza mesajul de eroare si algoritmul se incheie CORECT!
Exemplul 3.
- Sa se calculeze cel mai mare divizor comun a doua valori a si b naturale.
- asa cum spune definitia, cel mai mare divizor comun trebuie sa fie o valoare, care sa divida atat pe a cat si pe b; aceasta valoare poate fi in cel mai bun caz a sau b
intreg a,b;
citeste a,b;
cmmdc<- a;
cat timp (a%cmmdc +b%cmmdc !=0) executa cmmdc<- cmmdc-1;
scrie cmmdc.
Observatii:
- expresia a%cmmdc +b%cmmdc !=0 este nula doar daca atat a%cmmdc cat si b%cmmdc sunt nule, adica cmmdc divide simultan a si b; atat timp cat aceasta conditie nu se realizeaza scadem cmmdc-ul
- ultima valoare panaa la care se poate scadea este 1, divizorul tuturor numerelor; in acest caz a si b se numesc numere prime intre ele.
Exemplul 4
- Ghiceste-mi numarul! Eu imi aleg un numar intre 1 si 100. In cati pasi il poti ghici? La fiecare incercare raspund cu SUCCES, MIC sau MARE.
- prima varianta este sa intrebam aleator; cam multi pasi!
- sa parcugem valorile de la 1 la 100; cam multi pasi!
- sa gandim! vom testa intodeauna mijlocul intervalului; in acest fel, la fiecare intrebare, elimin jumatate din cazuri.
intreg x,m1,m2, mij, pasi;
citesc x; m1 <- 1; m2<- 100;
mij<- 50; pasi<- 0;
cat timp (mij!=x) executa
{daca (x<mij) atunci m2<- mij;
altfel m1<- mij;
mij<-(m1+m2)/2;
pasi<- pasi +1;};
scrie pasi.
Observatie:
- dupa fiecare test fara succes intervalul in care cautam se ajusteaza la stanga (daca mij este mai mic decat x) sau la dreapta (daca mij este mai mare decat x)
Exemplul 5.
- Fie N un numar natural. Sa se calculeze suma cifrelor lui N.
- vom initializa o variabila suma cu zero
- trebuie ca delimitam pe rand cifrele care formeaza numarul N; putem determina rapid ultima cifra: n%10; daca o stergem (n<- n/10) putem deternima penultima cifra; s.a.m.d.
- cand ne oprim? ... cand N nu mai are cifre; deci , cand N este zero.
intreg n, suma;
citeste n;
suma <-0;
cat timp (n!=0) executa {suma<-suma+n%10; n<-n/10;};
scrie suma.
Observatie:
- instructiunea suma<-suma+n%10 creste suma cifrelor deja obtinute cu valoarea ultimei cifre a lui n.
- pentru cazul in care n este nul, cat timp nu se mai executa si se afiseza suma cu valoarea 0; Suma cifrelor lui 0 este 0. CORECT!
luni, 10 august 2009
L4. Instructiunea de decizie
Fara instructiunea de decizie sau de test (in nici un caz detest) algorimul ar fi linear. Aceasta instructiune ne ajuta in cazul in care avem o intrebare privind natura datelor folosite, a valorii lor la un moment dat.
Practic, trebuie sa punem intrebari la care algoritmul sa raspunda cu adevarat/fals; ce operatori folosim pentru a obtine raspunsuri adevarat/fals?
Operatorii logici (cu care lucreaza si logica matematica) sunt SI, SAU si NEGARE:
Exemple:
Observatii
Sintaxa:
daca (exp_logica) atunci instructiune1
[altfel instructiune2;]
Efect: Se evalueaza expresia logica; daca valoarea logia ca expresiei este ADEVARAT se executa intructiunea 1; Daca exista sectiunea ALTFEL si valoarea logica a expresiei este FALS se executa intructiunea 2; in ambele cazuri, dupa executarea intructiunii corespunzatoare si executa ce instructiune urmeaza dupa testul nostru.
Observatie. Un algoritm trebuie sa fie clar si sa poata fi inteles intr-un singur fel. Din acest punct de vedere, exista doua moduri de a scrie un algoritm:
Exemple:
intreg a,b;
citeste a,b;
daca (a>b) atunci scrie a
altfel scrie b.
intreg a;
citeste a;
daca (a>0) atunci scrie a
altfel scrie -a.
intreg a,b,max;
citeste a,b;
daca (a>b) atunci max<-a
altfel max<-b;
Scrie max.
intreg a;
citeste a;
daca (a%2 ==0) atunci scrie "Valoarea citita este para!"
altfel scrie "Valoarea citita este impara!".
intreg a,b;
real x;
citeste a,b;
daca (a!=0) atunci { x<- -b/a; scrie "Solutia ecuatiei este "; Scrie x;}
altfel scrie "Nu se poate calcula solutia ecuatiei".
Secventa { x=-b/a; scrie "Solutia ecuatiei este "; Scrie x;} trebuie gandita ca un intreg deoarece este valabila numai pentru cazul in care a este nenul; de aceea am incadrat-o intre acolade.
intreg a,b,c,delta;
real x1,x2;
citeste a,b,c;
daca (a==0) atunci scrie " Coeficientii nu formeaza ecuatie de gradul 2";
altfel {delta=b*b-4*a*c;
daca (delta<0) atunci scrie "Nu se pot calcula radacini reale "
altfel {x1<- (-b+radical(delta))/(2*a); x2<- -b-radical(delta))/(2*a);
scrie "Solutiile sunt :", x1," ", x2; }
}
Observatii:
real x,f;
citeste x;
daca (x<0) atunci f<- x*x+2*x+1
altfel daca (x>=5) atunci f<- -x+2
altfel f<- 3*x+5;
scrie f.
Practic, trebuie sa punem intrebari la care algoritmul sa raspunda cu adevarat/fals; ce operatori folosim pentru a obtine raspunsuri adevarat/fals?
Expresii cu valoare logica (adevarat/fals)
Operatori de relatie:
- ">" inseamna mai mare
- a>b are valoarea adevarat numai daca valoarea variabilei a este mai mare decat valoarea variabilei b
- "<" inseamna mai mic
- a<b are valoarea adevarat numai daca valoarea variabilei a este mai mica decat valoarea variabilei b
- ">=" inseamna mai mare egal
- a>b are valoarea adevarat numai daca valoarea variabilei a este mai mare sau egala cu valoarea variabilei b
- "<=" inseamna mai mic sau egal
- a>b are valoarea adevarat numai daca valoarea variabilei a este mai mica sau egala cu valoarea variabilei b
- " =" inseamna egal
- a=b are valoarea adevarat numai daca variabila a are aceeasi valoare cu variabila b
- "!=" inseamna diferit
- a!=b are valoarea adevarat numai daca variabila a NU are aceeasi valoare cu variabila b
Operatori logici
Operatorii logici (cu care lucreaza si logica matematica) sunt SI, SAU si NEGARE:
- Operatorul SI este un operator binar, cu doi operanzi cu valoare logica. Rezultatul operatorului SI este adevarat numai daca ambii operanzi au valoarea ADEVARAT.
- "Mie imi place fata bruneta si cu ochi albastri!"
- daca fata nu este bruneta sau nu are ochi albastri nici nu ma uit la ea (:P), ceea ce inseamna fals; daca macar una dintre conditii este falsa atunci intreaga expresie este falsa
- Operatorul SAU este un operator binar cu doi operanzi cu valoare logica. Rezultatul operatiei SAU este adevarat daca macar unul din operanzi are valoarea ADEVARAT.
- "Mie imi place fata bruneta SAU cu ochi albastri!"
- Fata nu trebuie sa aiba ambele calitati. Daca este bruneta imi place (ADEVARAT). Daca este cu ochi albastri imi place (ADEVARAT).
- Daca macar una din conditii este adevarata atunci intreaga expresie este adevarata
- Operatorul de negatie (vom folosi semnul " ! " ) schimba valoarea de adevar a expresiei: !ADEVARAT==FALS si !FALS ==ADEVARAT
Exemple:
- X apartine [-5, -2]
- (x>=-5) SI (X<=-2)
- x apartine (0, 10)
- (x>0) SI (x<10)
- x nu apartine (-7,9]
- (x<=-7) SAU (x>9)
- !(x>-7) SAU !(x<=9)
- !((X>-7) SI (x<=9))
Observatii
- prioritatea operatorilor logici: negare, SI, SAU
- in cazul expresiilor logice se pot aplica regulile lui De Morgan:
- !( exp1 si exp2) = !exp1 sau !exp2
- !(exp1 sau exp2) = !exp1 si !exp2
Instructiunea de decizie (de test; sau detest :P)
Sintaxa:
daca (exp_logica) atunci instructiune1
[altfel instructiune2;]
Efect: Se evalueaza expresia logica; daca valoarea logia ca expresiei este ADEVARAT se executa intructiunea 1; Daca exista sectiunea ALTFEL si valoarea logica a expresiei este FALS se executa intructiunea 2; in ambele cazuri, dupa executarea intructiunii corespunzatoare si executa ce instructiune urmeaza dupa testul nostru.
Observatie. Un algoritm trebuie sa fie clar si sa poata fi inteles intr-un singur fel. Din acest punct de vedere, exista doua moduri de a scrie un algoritm:
- cate o instructiune pe linie si cu marcatori la sfarsitul instructiunilor de test si repetitive (cum cere manualul)
- mai multe instructiuni pe line, separate printr-un marcator; pentru cazul cand un grup de instructiuni trebuie executate impreuna pe unul din cazurile intrtuctiunii de decizie (de exemplu ), acestea pot fi incadrate cu acolade (in limbajul C++) sau cu cuvinte rezervate (begin ... end);
- Pentru ca pdeudocodul nu este un limbaj in sine ci doar o conventie de notatii, sugerez sa folosim deja notatiile din C++;
- cand o secventa de instructiuni trebuie executate una dupa alta, datorita logicii algoritmului, acea secventa o vom incadra in acolade (de exemplu: {instructiune1; instructiune2; instructiune3; ...}); vom reveni cu amanunte.
Exemple:
- Sa se afiseze maximul a doua valori citite.
intreg a,b;
citeste a,b;
daca (a>b) atunci scrie a
altfel scrie b.
- Sa se afiseze modulul (matematic) al unui numar intreg.
intreg a;
citeste a;
daca (a>0) atunci scrie a
altfel scrie -a.
- Sa memoram valoarea maxima intr-o variabila si sa o afisam.
intreg a,b,max;
citeste a,b;
daca (a>b) atunci max<-a
altfel max<-b;
Scrie max.
- Sa se citeasca o valoare intreaga si sa se stabileasca daca s-a citit o valoare para sau nu.
intreg a;
citeste a;
daca (a%2 ==0) atunci scrie "Valoarea citita este para!"
altfel scrie "Valoarea citita este impara!".
- Fie a si b coeficientii unei ecuatii de grad 1. Sa se afiseze solutia ecuatiei a*x + b =0;
- evident x=-b/a daca a!=0;
intreg a,b;
real x;
citeste a,b;
daca (a!=0) atunci { x<- -b/a; scrie "Solutia ecuatiei este "; Scrie x;}
altfel scrie "Nu se poate calcula solutia ecuatiei".
Secventa { x=-b/a; scrie "Solutia ecuatiei este "; Scrie x;} trebuie gandita ca un intreg deoarece este valabila numai pentru cazul in care a este nenul; de aceea am incadrat-o intre acolade.
- Fie a, b si c coeficientii unei ecuatii de grad 2 (a*x^2+b*x+c=0). Sa se calculeze valorile radacinii, daca exista.
- conditia pentru a fi ecuatie de grad 2: coeficientul a trebuie sa fie nenul (a!=0)
- trebuie calculata valoarea DELTA=b*b-4*a*c
- pentru a avea solutii, valoarea DELTA trebuie sa fie pozitiva, cel putin nula;
- vom folosi radical (expr) pentru a calcula valoarea radicalului unei expresii reale/intregi
intreg a,b,c,delta;
real x1,x2;
citeste a,b,c;
daca (a==0) atunci scrie " Coeficientii nu formeaza ecuatie de gradul 2";
altfel {delta=b*b-4*a*c;
daca (delta<0) atunci scrie "Nu se pot calcula radacini reale "
altfel {x1<- (-b+radical(delta))/(2*a); x2<- -b-radical(delta))/(2*a);
scrie "Solutiile sunt :", x1," ", x2; }
}
Observatii:
- x1 si x2 sunt declarati reali pentru ca se obtin in urma radicalului si a unei impartiri
- urmariti daca algoritmul scrie concide cu termenii problemei
- pentru cazul coeficientului a nenul trebuie efectuate doua operatii (calculul lui delta si testul lui delta), motiv pentru care acestea au fost incadrate intre acolade
- la calculul solutiilor au fost puse paranteze pentru separarea numitorului si a numaratorului
- de asemenea, aici au trebuit puse acolade pentru calculul celor doua solutii si a afisarii solutiilor
- Fie o functie matematica data pe intervale. Sa se calculeze valoarea functiei intr-un punct x oarecare daca expresia functiei este:
- x^2+2*x+1 daca x<0
- 3*x+5 daca x apartine [0,5)
- -x+2 daca x>=5
- este clar ca valoarea functie difera pe cele trei intervale; va trebui sa verificam, pe rand, carui interval apartine valoarea citita pentru x;
real x,f;
citeste x;
daca (x<0) atunci f<- x*x+2*x+1
altfel daca (x>=5) atunci f<- -x+2
altfel f<- 3*x+5;
scrie f.
duminică, 9 august 2009
L3. Instructiuni intrare/iesire. Atribuirea
Instructiuni de intrare iesire
Asa cum am vazut in lectiile anterioare schema fluxului de date in rezolvarea unei probleme este urmatoarea:
Date de intrare -> Algoritm -> Date de iesire (Rezultate)
Deducem ca aven nevoie de o metoda de a prelua datele initiale (ale problemei reale) pentru a le putea prelucra in algoritm. De asemenea, avem nevoie de o metoda de a transmite rezultatul calculului nostru.
Pentru preluarea datelor vom folosi instructiunea Citeste.
- Sintaxa: Citeste variabila;
- Exemplu: Citeste a;
- Efect: Se citeste o valoarea care va fi memorata in variabila a
- Observatii:
- pentru " intreg n; citeste n " , nu putem introduce o valoare reala (3.14) deoarece variabila n este declarata ca fiind intreaga
Pentru afisarea rezultatului vom folosi instructiunea Scrie:
- Sintaxa: Scrie expresie
- Exemplu: Scrie a
- Efect:
- instructiunea Scrie afiseaza valoarea expresiei
- presupunand ca ceea ce se scrie este transmis care monitor, atunci prima instructiune scrie afiseaza sirul de caractere Rezultatul problemei iar cea de a doua afiseaza valoarea memorata in variabila a la acel moment
- Observatii
- pentruafisarea unor texte folosim text " acesta este mesajul"
- instructiunea scrie afiseaza valoarea expresiei; atunci o instructiune de tipul Scrie a+b va afisa valoarea calculata a expresiei a+b; adica se aduna valoarea lui a cu valoarea lui b si se afiseaza rezultatul expresiei
Pana acum, cel mai complicat algoritm pe care il putem scrie este cel de adunare a doua valori intregi:
Intreg a, b;
Citeste a, b;
Scrie a+b.
Daca ar fi doar atat... :P
Atribuirea
Pentru a schimba valoarea unei variabile pot folosi citirea. Daca totusi doresc ca variabila sa primeasca valoarea unei expresii calculate pe parcursul algoritmului, atunci am nevoie de atribuire:
- Sintaxa: variabila<- expresie;
- Efect: In "cutia" variabilei se memoreaza valoarea expresiei;
- Exemplu:
- intreg a; a<- 10;
- real b; fie b<- 3.14;
- sir c; fie c<- 'totul e ok';
- Observatie:
- noua valoare se memoreaza peste vechea valoare care se va pierde; adica, se inloceste vechea valoare cu cea noua
- in fiecare din exemple in variabila se memoreaza o valoare de acelasi tip cu variabila; nu putem memora intr-o variabila o valoare de alt tip:
- secventa intreg a; a<-3.14; scrie a; nu este corecta; variabila a este de tip intreg si nu poate memora o valoare reala.
- secventa real a; a<- +10; este corecta deoarece valoarea intreaga 10 este si valoare reala, conform incluziunii matematice.
- greselile frecvente sunt cele in care valori obtinute in urma unor impartiri sau radicali (valori reale) sunt atribuite unor variabile intregi
- operatiile cele mai de intalnite la atribuire sunt incrementarea (marirea cu 1 a valorii variabilei) si decrementarea (micsorarea cu 1 a valorii variabilei)
- incrementarea: a<- a+1;
- asa cum stim , intai se calculeaza valaorea expresiei (cresterea cu 1 a lui a) si apoi se memoreaza in variabila, peste vechea valoare
- decrementarea: a<- a-1;
- se calculeaza valoarea expresiei (scadereacu 1 a lui a) si apoi se memoreaza in variabila, peste vechea valoare
Exemplul 1: calculul vitezei, atunci cand stim valoarea distantei parcurse si timpul necesar;
- real viteza;
- intreg timp, distanta;
- citeste timp, distanta;
- viteza <- distanta/timp;
- scrie viteza.
Exemplul 2 (interschimbarea a doua variabile folosind auxiliar). Fie doua variabile intregi. Sa se interschimbe valorile variabilelor. Daca variabila a are valoarea 5 si variabila b are valoarea 7, dupa executarea algorimului, variabila a sa aiba valoare 7 si variabila b sa aiba valoare 5.
- intreg a, b, aux;
- citesc a, b;
- aux<-a;
- a<-b;
- b<-aux;
- scrie a, b.
- observatie: problema este similara cu urmatoarea problema. Aveti un pahar de bere (rolul variabilei a) si o halba de suc (rolul variabilei b). Pentru a schimba bauturile aveti nevoie de o cana goala (rolul variabilei aux);
- turnam in cana goala continutul paharului
- turnam in pahar continutul halbei
- turnam in halba continutul canii
- acum toate sunt in ordine; berea in halba si sucul in pahar si gana este goala; NU BEM DECAT SUCUL!
Exemplul 2 (interschimbarea valorii a doua variabile fara auxiliar). Avem aceeasi problema dar trebuie rezolvata fara o variabila in plus.
- intreg a, b;
- citeste a,b;
- a <- a+b; b<- a-b; a<- a-b;
- scrie a,b.
L2. Pseudocod. Date. Expresii
Cuvantul pseudocod provine din pseudo, care inseamna fals, si cod care se refera la textul scris intr-un limbaj de programare. Deci pseudocod inseamna un asa-zis limbaj de programare.
Pseudocodul foloseste aceeasi operatori si o exprimare la relaxata fata de un limbaj consacrat , care cere rigurozitate.
Pseudocodul, ca orice limbaj, foloseste date, variabile, operatii si instructiuni.
Pentru doritori, va prezint o varianta de pseudocod apropiata de cea din manual, limbajul Rodin a domnului profesor Dan Popa de la Univeristatea Bacau. In acest fel puteti pigmenta orele de informatica din clasa a 9-a si cu ore de laborator. :)
Datele cu care lucreaza un algoritm (scris in pseudocod) sunt:
O variabila este un simbol care se caracterizeaza prin:
Practic, o variabila se comporta ca o cutie ce poate fi folosita doar pentru ceva anume: valorile intregi in cutii pentru valori intregi si valori reale in cutii pentru valori reale; doar nu puneti zahar intr-o cutie de pantofi. :).
Din acest motiv, la inceputul algoritmului nostru in pseudocod trebuie sa specificam cu ce variabile lucram si ce tip au, ca in exemplul de mai jos:
intreg m,n
real x,y.z
logic ok, exista, este
Expresiile sunt foormate din operatori si operanzi. Formeaza expresie urmatoarele
Dintre operatorii folositi vom vorbi acum numai de cei intregi (care se folosesc numai pentru operanzi intregi):
Pseudocodul foloseste aceeasi operatori si o exprimare la relaxata fata de un limbaj consacrat , care cere rigurozitate.
Pseudocodul, ca orice limbaj, foloseste date, variabile, operatii si instructiuni.
Pentru doritori, va prezint o varianta de pseudocod apropiata de cea din manual, limbajul Rodin a domnului profesor Dan Popa de la Univeristatea Bacau. In acest fel puteti pigmenta orele de informatica din clasa a 9-a si cu ore de laborator. :)
Date
Datele cu care lucreaza un algoritm (scris in pseudocod) sunt:
- valori intregi: 12, -5, 17
- valori reale: 3.14, -1005.25, ... ; observati ca folosim punct zecimal si nu virgula ca in notatia de la matematica
- valori logice: adevarat (true) si fals (false)
- siruri de caractere: "introdu valoarea:", "rezultatul este:"
Variabile
O variabila este un simbol care se caracterizeaza prin:
- nume; se noteaza cu combinatii de litere sau cifre dar intotdeauna primul caracter este litera: a, Beta, nr1, nr2
- tip de data: intreg, real, sir de caractere, logic
- valoare: functie de tipul de data asociat, o variabila poate avea valori din cele de mai sus; valoarea memorata se poate schimba, de unde si numele de variabila;
Practic, o variabila se comporta ca o cutie ce poate fi folosita doar pentru ceva anume: valorile intregi in cutii pentru valori intregi si valori reale in cutii pentru valori reale; doar nu puneti zahar intr-o cutie de pantofi. :).
Din acest motiv, la inceputul algoritmului nostru in pseudocod trebuie sa specificam cu ce variabile lucram si ce tip au, ca in exemplul de mai jos:
intreg m,n
real x,y.z
logic ok, exista, este
Expresii
Expresiile sunt foormate din operatori si operanzi. Formeaza expresie urmatoarele
- o variabila
- variabila operator variabila
- expresie operator expresie
- operator expresie (cazul operatorilor unari de genul - (5+3) )
Dintre operatorii folositi vom vorbi acum numai de cei intregi (care se folosesc numai pentru operanzi intregi):
- semnul " - " se foloseste pentru scaderi sau ca operator unar
- semnul " + " se foloseste pentru adunari
- semnul " * " se foloseste pentru inmultiri
- semnul " / " se foloseste pentru impartiri
- semnul " % " se foloseste pentru a obtine restul impartirii primului operand la cel de al doilea
- a % b = restul impartirii lui a la b
- a % 2 = restul impartirii lui a la 2, care este 1 daca a este impar si 0 daca a este par
- a % 10 = restul impartirii lui a la 10, care este intotdeauna ultima cifra a lui a, cifra unitatilor
- prioritatea operatiilor este aceeasi ca in matematica; mai intai inmultirile si impartirile si apoi adunarile si scaderile
- se pot folosi si paranteze pentru expresiile mai complicate, dar numai perechide paranteze rotunde
- atentie la ordinea operatiilor si folosirea parantezelor rotunde (ex. ecuatia de gradul 2):
- x1=-b+ radical(b*b-4*a*c)/2*a
- x1=(-b+ radical(b*b-4*a*c))/2*a
- x1=(-b+ radical(b*b-4*a*c))/(2*a)
- care din variantele de mai sus este corecta?
- prima imparte numai radicalul la 2, rezultatul este inmultit cu a si apoi se efectueza scaderea
- al doilea exemplu pune parantezele pentru numarator dar imaprte numai la 2, rezultatul impartirii fiind inmultit cu a
- abia ultima varianta separa numitorul si numaratorul prin paranteze
L1. Notiunea de algoritm
Istoric. Definitie
Cuvantul algoritm provine de la numele unui matematician arab (Mohammed ibn-Musa al-Khowarizmi) a carui lucrari au fost traduse in latina sub numele de Algoritmus.
Definitia actuala a cuvantului algoritm :
- Ansamblu de simboluri folosite în matematică și în logică, permițând găsirea în mod mecanic (prin calcul) a unor rezultate.
- Succesiune de operații necesare în rezolvarea unei probleme oarecare
Din punctul de vederea al informaticii, algoritmul reprezinta rezolvarea etapizata, in pasi mici, elementari, a unei probleme.
Scopul folosirii algoritmului este aplicarea lui la o serie pe probleme care au aceeasi metoda de rezolvare; adica, pentru orice dateale problemei, algortimul trebuie sa se incheie cu un raspuns.
Un exemplu in acest sens este acuatia de gradul I. Exista o infinitate de ecuatii de gradul I dar toate se subscriu aceleiasi ecuatii generice A*X+B=0. Algoritmul trebuie sa rezolve aceasta ecuatie generica pentru a obtine rezultate corecte pentru intreaga clasa se ecuatii de gradul I sau sa anunte eroarea in cazul in care simbolul A ar avea valoarea 0.
Caracteristici
Deducem de aici o serie de proprietati pe care un algoritm corect trebuie sa le indeplineasca:
- sa aiba caracter de generalitate: sa rezolve o intreaga clasa de probleme de acelasi gen (pentru orice date de intrare)
- sa aiba finitudine: sa ofere un raspuns la problema si sa se incheie in timp util
- sa fie clar: calculul/etapele sa fie descriese intr-o maniera fara dubii
DATE DE INTRARE -> ALGORITM -> DATE DE IESIRE
Reprezentarea algoritmilor
S-au identificat cateva structuri folosite in descrierea unui algoritm:
- secventa: pasii sa se execute unul dupa altul
- testul: in cazul in care rezolvarea trebuie sa raspunda unei intrebari sa putem aplege traseul logic ce trebuie urmat
- repetitia: sa putem repeta o anumita secventa daca algoritmul o cere
De asemeni, pentru exprimarea algoritmilor s-au incercat metode care sa poata fi intelese de toti. Iata cateve dintre ele:
- scheme logice: metoda grafica care specifica traseul ce trebuie urmat
- pseudocod: un set de reguli de scriere , in principiu in limba engleza; pt elevi s-a simplificat, folosindu-se aceleasi notatii si limba romana (o varianta care se poate folosi in laborator gasiti la http://www.haskell.org/haskellwiki/Rodin)
- limbaj de programare: mult mai strict ca exprimare dar folosind aceleasi concepte.
Limbajul RODIN - prezentare succinta
Obs: Nu exista declaratii de variabile
Programul principal
- {... instr; ...}
Instructiuni de citire/afisare
- citeste variabila;
- scrie expresie;
- text ".... text...";
Atribuirea
- fie variabila = expresie;
Operatori logici:
- SAU, SI,
Instructiune de test
- daca (COND) atunci instr altfel instr;
Instructiuni repetitive
- cat timp (COND) {instr;...};
- executa {inst1; instr2;} atat cat (COND);
- repeta {instr1; instr2;...} pana cand (COND)
- pentru (atribuire; test ;pasul urm) {instr;...};
Abonați-vă la:
Postări (Atom)