RSS

L5. Instructiunea repetitiva CAT TIMP

12 Aug

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:

  • 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:

  1. se stabileste valoarea de adevar a expresiei logice
  2. daca valoarea expresiei logice este ADEVARAT atunci se executa instructiunea si se reia de la pasul 1
  3. 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 pana 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!
 
7 Comments

Posted by on 12/08/2009 in C2_1. Algoritmica

 

7 responses to “L5. Instructiunea repetitiva CAT TIMP

  1. Denisa

    07/12/2013 at 16:15

    Peste o saptămână dau teza la informatică (sunt la profil de intensiv informatică) şi nu reuşisem să inţeleg in totalitate rezolvarea problemelor cu “while”.Explicaţiile dumneavoastră m-au ajutat foarte mult.Vă mulţumesc!

     
  2. Ionut

    18/12/2013 at 15:38

    La Exemplul 4 Ghiceste-mi numarul!
    mij<- 50; pasi<- 0; Initializarea by trebuie facuta cu 1? Spun asta deoarece eu cred ca in momentul in care eu am ales prima data mij=50 deja am facut un pas.

     
  3. Ionut

    18/12/2013 at 15:46

    aha..:) am inteles acum

     
  4. oana

    11/02/2014 at 15:42

    Buna….ex .2 daca b<a ce va afisa algoritmul?

     
  5. mchelariu71

    11/02/2014 at 20:44

    daca BA atunci nu se executa CAT-TIMP-ul si ramana contorul 0 si restul A, ca la impartirea lui A=5 la B=10: catul 0 si restul 5.
    Lipsea acolo un egal. “cat timp a>=b” si pentru asta iti multumesc.

     
  6. Stefania

    12/12/2015 at 20:27

    Sunt clasa a 9 a la liceu si aveam dubii f mari legate de structurile pentru si cat timp. Multumesc mult! Acum le- am inteles:))

     
  7. alex2006mihai

    02/11/2016 at 18:54

    Salut! Imi place blogul tau,chiar am ce invata ca parte teoretica din el,chiar daca trebuie sa lucrez in
    c,teoria e aceasi. Insa,ai putea sa imi arati cum se rezolva exercitiul 5,cel cu ghiceste,in programul C? chiar sunt curios🙂

     

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: