Exemplu de interpretare a cerintei pana la limbaj natural si transformarea din limbaj natural in cod.
Cerinta: Se citeste un sir de numere reale pana la intalnirea lui 0. Sa se determine media aritmetica a elementelor negative si media aritmetica a elementelor pozitive.
Cerinta unei probleme ne spune tot ce trebuie sa stim pentru a rezolva problema, adica pentru a scrie programul care sa aiba efectul dorit. Din acest motiv cerinta este o alaturare de "cuvinte cheie". Fiecare cuvant din cerinta ne da o anumita informatie. De fapt, putem spun 18518x2312s e ca cerinta contine in mod condensat intreg programul, fiind o descriere sintetizata, in limbaj natural, a codului pe care trebuie sa il scriem. Din acest motiv cerinta este foarte importanta si trebuie sa o analizam cu foarte mare atentie.
Analiza cerintei:
"se citeste un sir" - observam ca trebuie sa citim de la tastatura de mai multe ori (un sir). Avand o singura operatie(citirea unei valori) pe care trebuie sa o repetam(sir de valori) ne dam seama de existenta in program a unei bucle in care vom face citirea. Deocamdata nu stim ce tip de bucla este.
"numere reale" - ne indica tipul de date al variabilei in care vom face citirea: float.
"se citeste.pana la intalnirea lui 0" - prin expresia "pana la" se introduce o limitare. Aceasta limitare este corelata cu bucla pe care am descoperit-o mai sus. De altfel, limitarea ne da conditia de oprire a buclei. Conform acestei limitari ne punem intrebarea: stim de cate ori se va executa bucla pana la intalnirea limitarii Raspunsul este: nu. Acest raspuns ne indica tipul buclei. Avand in vedere ca nu stim de cate ori se va executa bucla, aceasta va fi o bucla while.
Am terminat de analizat prima fraza din cerinta si deja stim "cum arata" aproape jumatate din program.
"sa se determine media aritmetica" - cum se calculeaza media aritmetica?; Suma numerelor impartita la numarul lor. Deci trebuie sa retinem doua valori: suma numerelor citite si numarul numerelor citite. Ne dam seama de prezenta a doua variabile, una in care sa retinem suma (sumn) si una in care sa numaram cate numere am citit (countn). Tipul acestor variabile este dat de continutul lor: sum va retine suma unor numere reale, deci continutul ei va fi real float; count va retine numarul de numere, adica un numar intreg int.
"a elementelor negative" - intalnim o alta restrictie, de data aceasta cu semnificatie diferita. Ne spune ca din numerele pe care le citim trebuie sa le selectam pe cele negative. Cu alte cuvinte, am intalnit o decizie (if); daca numarul intalnit este negativ vom face prelucrarea necesara (adunarea la suma si numerotarea).
"si media aritmetica a elementelor pozitive" - la fel ca mai sus, apar alte doua variabile pentru suma(sump) si numarul de numere(countp) pozitive, precum si o alternativa la decizia de mai sus.
Descrierea in limbaj natural:
Analiza cerintei este un proces de gandire. Acesta se concretizeaza in descrierea in limbaj natural a problemei. Fata de cerinta, aceasta etapa este mai detaliata. Practic, descrierea in limbaj natural o construim prin corelarea rezultatelor analizei.
Descriere: "Folosim o bucla while pentru citirea numerelor intr-o variabila reala, pana intalnim 0. Pentru fiecare numar verificam semnul. Daca este negativ il adunam la sumn si incrementam countn, altfel il adunam la sump si incrementam countp. Dupa ce am citit si prelucrat numerele, facem calculul mediei (sumn/count, respectiv sump/countp) si afisam rezultatele."
Analiza cerintei si descrierea in limbaj natural sunt proprii fiecarei persoane, fiind rezultate ale gandirii. Nu exista un mod unic de a realiza aceste etape. Ceea ce am scris mai sus nu este decat o exemplificare a modului meu de gandire. Totusi, in descrierea in limbaj natural apar, automat, anumite formulari sau cuvinte care indica proprietati sau elemente ale programului.
Interpretarea pana la program:
In constructia programului incepem cu elementele obligatorii ale limbajului.
void main()
In interiorul functiei main scriem codul pe care il obtinem prin interpretarea descrierii in limbaj natural.
Numerele pe care le citim de la tastatura trebuie sa le retinem intro variabila (nr
"pana intalnim 0" - conditia buclei while trebuie sa fie adevarata atata timp cat numarul citit este diferit de 0 (nr != 0). Observam ca aceasta conditie depinde de valoarea variabilei nr. Trebuie sa ne gandim la situatiile limita; una din situatiile limita este prima verificare a conditiei. Cand conditia este verificata prima data nr trebuie sa aiba o valoare valida citim primul numar (cin >> nr) inainte de bucla.
"pentru fiecare numar" - indica faptul ca ceea ce urmeaza va fi continut in bucla while.
"daca este negativ" - if(nr < 0).
"il adunam la sumn si incrementam countn
"altfel" - else
"il adunam la sump si incrementam countp
"dupa ce am citit si prelucrat numerele" - indica faptul ca urmatoarele instructiuni se scriu in afara buclei while.
"facem calculul si afisam rezultatele" - cout << sumn / countn; cout << sump / countp
Nici cerinta si nici descrierea in limbaj natural nu ne dau informatii referitoare la unele situatii limita, cum ar fi prima evaluare a unei conditii sau prima utilizare a unei variabile. De aceea trebuie sa ne asiguram ca variabilele sunt initializate.
Programul final este:
#include <iostream.h>
void main()
else
}
cout << "Media aritmetica a elementelor < 0 este: " << sumn / countn;
cout << "Media aritmetica a elementelor > 0 este: " << sump / countp;
|