citeștem,n
(numerenaturale)
┌dacă m>n atunci
│ n←→m
└■
┌dacă m%2=0 atunci
│ m←m+1
└■
┌câttimpm≤nexecută
│ m←m+2
│ scrie ‘*’
└■ a. Scrieți succesiunea de caractere afișate în urma executării algoritmului dacă se citesc, în această ordine, numerele 2 și 9.
b. Dacă pentru n se citește numărul 79, scrieți două numere nenule care pot fi citite pentru m astfel încât, în urma executării algoritmului, pentru fiecare dintre acestea, să se afișeze de 40 de ori caracterul *
c.Scrieți în pseudocod un algoritm echivalent cu cel dat, înlocuind structura cât timp...execută cu o structură repetitivă cu test final.
va rog daca puteti sa si explicati
Răspunsuri la întrebare
Punctul A :
Se citeste m=2 si n=9.
Conditia 2>9 (m>n) este falsa, deci instructiunea din interior nu se executa
Conditia 2%2==0 (m%2==0) este adevarata, deci se executa m←m+1 (m primeste valoarea 3)
Deci pana acum m=3 si n=9
Se evalueaza 3<=9 (m<=n) adevarat se executa
- m devine 5
- Se afiseaza *
Se evalueaza 5<=9 (m<=n) adevarat se executa
- m devine 7
- Se afiseaza *
Se evalueaza 7<=9 (m<=n) adevarat se executa
- m devine 9
- Se afiseaza *
Se evalueaza 9<=9 (m<=n) adevarat se executa
- m devine 11
- Se afiseaza *
Se evaluaza 11<=9 (m<=n) fals. Nu se mai executa nimic
Programul s-a terminat.
Deci s-au afisat 4 stelute.
Raspuns : ****
Punctul B :
Daca modificam datele de intrare de la punctul a observam ca :
- Daca inainte de executarea buclei repetitive m=5 si n=9 se afiseaza 3 stelute
- Daca inainte de executarea buclei repetitive m=1 si n=9 se afiseaza 5 stelute
- Daca inainte de executarea buclei repetitive m=1 si n=11 se afiseaza 6 stelute
Deci numarul de stelute afisate are formula unde n si m sunt doua numere impare inaintea executarii secventei repetitive (n>=m).
Daca urmarim algoritmul observam ca avem cateva rute posibile prin care putem ajunge la bucla repetitiva :
- Daca m este mai mare decat n atunci are loc interschimbarea. Deci aici avem doua posibilitati care duce la un rezultat diferit - Fie m > n sau fie n >m.
- Daca m este par atunci se mareste cu o unitate. Deci aici avem doua posibilitati. Fie m este par fie este impar. Cele doua pot duce la un rezultat diferit.
Varianta I : m<n
Deci daca stim ca numarul de stelute este egal cu 40 iar n=79 putem aplica formula gasita de noi mai sus.
40=(79-m)/2+1
39=(79-m)/2
78=79-m
m=1
Deci inaintea executarii buclei repetitive, n trebuie sa aiba valoarea 79 si m valoarea 1.
Varianta I.a : m este impar
O solutie ar fi n=79 si m=1.
Varianta I.b: m este par
O alta solutie posibila ar fi n=79 si m=0 (stiind ca m este par acesta va fi marit cu o unitate). Dar in cerinta se precizeaza clar ca aceste numere trebuie sa fie nenule, deci aceasta nu e o solutie valida.
Varianta II : m>n
Stiind ca se citeste n=79 si m > n, va avea loc interschimarea m primeste valoarea 79 iar n primeste fosta valoarea a lui n.
Stim ca m=79 (este impar), deci trece nemodificat de a doua structura alternativa.
Daca aplicam formula gasita de doi mai sus pentru m=79 si 40 de stelute :
40=(n-79)/2+1
39=(n-79)/2
78=n-79
n= 157
Aceasta este valoarea lui n inainte de bucla repetitiva. Mergand inver stim ca am facut o interschimare (deci datele de intrare sunt m=157 si n = 79)
Raspuns :
n=79 si m=1
n=79 si m=157
Nota : La determinarea formulei am luat doar cazul in care cele doua numere sunt impare. Ar merita sa incercam si cazul in care n este par. E posibil sa gasim inca cateva solutie a problemei. Cerinta a cerut doar doua cazuri, eu m-am oprit aici.
Punctul C
Stim ca cele doua tipuri de structuri repetitive pot fi transformate din una in alta. Transformarea structurii "cat timp" in "repeta..." o ai atasata in imagine.
Pe exemplul nostru :
┌cât timp m≤n execută
│ m←m+2
│ scrie ‘*’
└■
Devine :
┌dacă m<=n atunci
│ ┌repetă
│ │ m←m+2
│ │ scrie ‘*’
│ └până când m>n
└■
Restul programului ramane neschimbat. Algoritm complet :
┌dacă m>n atunci
│ n←→m
└■
┌dacă m%2=0 atunci
│ m←m+1
└■
┌dacă m<=n atunci
│ ┌repetă
│ │ m←m+2
│ │ scrie ‘*’
│ └până când m>n
└■