Sunteți pe pagina 1din 4

Algoritmi si structuri de date (10.10.

2013) Informatica i Matematic, anul 1

ASD_C02

Algoritmi cu ramificaii Definiie: Algoritmii care pot fi descrii folosind pe lng comenzi/instruciuni de citire (n pseudocod: citeste), scriere (n pseudocod: scrie), atribuire (n pseudocod: ) i comenzi de decizie (n pseudocod: daca-atunci-altfel) sau selecie (n pseudocod: alege) se numesc algoritmi cu ramificaii. Exemple de algoritmi cu ramificaii: R1. Enunul problemei: S se determine un algoritm pentru a verifica dac un numr natural dat este divizibil sau nu, folosind criteriul de divizibilitate cu 25 (n se divide cu 25 ultimele dou cifre ale lui n formeaz un numr divizibil cu 25). Metoda de rezolvare: Algoritmul va avea ca date de intrare un numr natural, sa-l notm cu n. Numrul format din ultimele 2 cifre = restul mpririi lui n la 100. Vom verifica dac acest numr este sau nu divizibil cu 25 (adic dac se mparte fix la 25 alt variant s verificm dac este egal cu 00 sau 25 sau 50 sau 75) i n funcie de aceasta vom scrie un mesaj de genul numrul dat este / nu este divizibil cu 25). Descrierea algoritmului n pseudocod:
citeste n *n natural daca (n%100)%25=0 atunci *ultimele 2 cifre se divid cu 25? scrie n se divide cu 25 altfel scrie n nu se divide cu 25

Descrierea algoritmului n C++:


#include <iostream.h> void main() { unsigned long n; //pt a putea citi un nr intreg cat mai mare cout<<endl<<"n"; cin>>n; if (n%100%25 == 0) //ultimele 2 cifre se divid cu 25 cout<<"n se divide cu 25"; else cout<<"n nu se divide cu 25"; }

Dup rularea programului C++ (Ctrl+F9), pe ecran va apare:


n = 416275 <Enter> n se divide cu 25

sau
n = 2300627 <Enter> n nu se divide cu 25

Explicaii cod C++: Codul ncepe cu includerea fiierelor header necesare pentru a utiliza anumite funcii n programul curent; de exemplu, aici am inclus iostream.h pentru c acolo este declarat funcia de ieire cout cu ajutorul creia se pot afia mesaje i valorile unor variabile pe ecran. Orice program C/C++ trebuie s aib o funcie principal main, aici aceasta nu are parametri (ntre paranteze nu este trecut nimic similar se poate scrie void main(void)) i nu returneaz nimic (pentru c nainte apare cuvntul cheie void).

Algoritmi si structuri de date (10.10.2013) Informatica i Matematic, anul 1

ASD_C02

Linia unsigned long n; reprezint o declaraie a variabilei n, local n funcia main. Pentru c se testeaz restul mpririi lui n la 100, trebuie declarat de un tip ntreg n C/C++ acestea sunt (vezi 01Tipuri de date in Borland C.doc):
Tip de date ntreg Domeniu de valori int -32768 ... 32767 unsigned int 0 ... 65535 long -2147483648 ... 2147483647 unsigned long 0 ...4294967295 Am preferat tipul unsigned long pentru c are domeniul de valori cel mai mare (pe

mulimea nr. naturale) i va permite testarea corect a oricrui numr n <= 4 294 967 295. Se citeste valoarea lui n (cin>>n), anterior afind pe ecran mesajul n= (cu cout<<n=; pentru a se ti (ct de ct) ce trebuie introdus. Apoi pentru testarea divizibilitii ultimelor dou cifre cu 25 am folosit condiia n%100%25 == 0. Aici avem trei operatori, doi operatori modulo (rest mprire) i operatorul de egalitate. Operatorii modulo au prioritate i acetia se execut n C++ de la stnga la dreapta (vezi: 03 Ordinea operatorilor in C++.doc). Aadar, nti se determin n%100 (adic numrul format din ultimele dou cifre ale lui n ca tip de date acesta trebuia s fie ntreg) apoi se determin %25 (care este 0 dac numrul format din ultimele dou cifre este divizibil cu 25 i un numr nenul n caz contrar) i la final se compar dac rezultatul este egal cu 0. De aceea, nu sunt necesare paranteze ca n (n%100)%25 == 0. Ca variabile am folosit o singur variabil; se mai putea reine numrul format din ultimele dou cifre ntr-o alt variabil, s zicem m i testarea acestuia din urm dac este divizibil cu 25:
int m = n%100; if (m%25==0) cout << n este divizibil cu 25; else cout << n este divizibil cu 25;

R2. Enunul problemei: S se scrie un algoritm pentru calculul notei finale la Examenul de Algoritmi i structuri de date. Metoda de rezolvare: S ne reamintim c pentru calculul notei finale vor conta: - nota la partea de Algoritmi (s-o notm cu nota1) - nota la partea de Structuri de Date (s-o notm cu nota2) - nota la temele pentru acas (s-o notm cu notateme) Deci datele de intrare sunt: nota1, nota2 i notateme. Valoarea notei finale se determin astfel: 40% * nota1 + 40% * nota 2 + 20% * notateme , daca nota1 , nota 2 5 notafinala = 4, altfel Descrierea algoritmului n pseudocod:
citeste nota1, nota2, notateme daca nota1 5 i nota2 5 atunci notafinala 40%*nota1 + 40%*nota2 + 20%*notafinala altfel notafinala 4 scrie notafinala

Se poate evita folosirea variabilei notafinal, afisndu-se direct rezultatul expresiei notei finale:
citeste nota1, nota2, notateme daca nota1 5 i nota2 5 atunci scrie 40%*nota1 + 40%*nota2 + 20%*notafinala altfel scrie 4

Algoritmi si structuri de date (10.10.2013) Informatica i Matematic, anul 1

ASD_C02

Descrierea algoritmului n C++:


#include <iostream.h> void main() { int nota_1,nota_2,nota_teme; cout<<endl<<"Nota_1 = "; cin>>nota_1; cout<<"Nota_2 = "; cin>>nota_2; cout<<"Nota_teme = "; cin>>nota_teme; if (nota_1>=5 && nota_2>=5) cout << 0.4*nota_1 + 0.4*nota_2 + 0.2*nota_teme; else cout<<4; }

Dup rularea programului C++ (Ctrl+F9), pe ecran va apare:


Nota_1 = 9 <Enter> Nota_2 = 8 <Enter> Nota_teme = 10 <Enter> 8.80

respectiv:
Nota_1 = 6 <Enter> Nota_2 = 4 <Enter> Nota_teme = 10 <Enter>

4 Cteva explicaii cod C++: Notele le-am declarat de tip ntreg int, iar la calculul notei finale (n cazul fericit) n loc de 40%*nota_1 +. am scris 0.4*nota_1 +. R3. Enunul problemei: S se scrie un algoritm pentru a determina greutatea ideal a unei persoane, cunoscnd nlimea h (n cm), vrsta v (n ani) i sexul s (f pentru feminin sau m pentru masculin) i folosind formulele: Gm = 50 + 0,75(h-150) + (v-20)/4, iar Gf = Gm - 10. Metoda de rezolvare: Datele de intrare sunt h, v i s. Apoi, indiferent de sexul persoanei, trebuie calculat valoarea expresiei 50 + 0,75(h-150) + (v-20)/4 (n Gm), iar la final, dac este persoan de sex feminin se mai scade 10 (din Gm) i se afieaz valoarea corespunztoare. Descrierea algoritmului n pseudocod:
citeste h, v, s Gm 50 + 0,75(h-150) + (v-20)/4 daca s = f atunci Gf Gm - 10 scrie Gf altfel scrie Gm

Se mai poate folosi o singur variabil pentru calculul greutii:


citeste h, v, s G 50 + 0,75(h-150) + (v-20)/4 *pt o persoana de sex feminin daca s = f atunci G G 10 *daca este pers fem se scade 10 din vechea val scrie G

Descrierea algoritmului n C++:


#include <iostream.h> void main() { int h,v; char s; float G; cout<<endl<<"Dati inaltimea persoanei (in cm): "; cin>>h; cout<<"Dati varsta persoanei (in ani): "; cin>>v;

Algoritmi si structuri de date (10.10.2013) Informatica i Matematic, anul 1

ASD_C02

cout<<"Dati sexul persoanei (s sau f): "; cin>>s; G = 50 + 0.75*(h-150) + (v-20)/4; //greutatea unui barbat if (s=='f') G = G - 10; //sau G-=10; //greutatea unei femei cout<<G; //se afiseaza valoarea finala a variabilei G }

Dup rularea programului C++ (Ctrl+F9), pe ecran va apare:


Dati inaltimea persoanei (in cm): 175 <Enter> Dati varsta persoanei (in ani): 30 <Enter> Dati sexul persoanei (s sau f): m <Enter> 70.75

Cteva explicaii cod C++: nlimea (pentru c este exprimat n cm) i vrsta (fiind exprimat n ani) le-am declarat de tip ntreg (am ales tipul int). Greutatea, ns este valoarea unei expresii care poate da cu virgul i atunci este declarat de tip real (am ales tipul float). n variabila G se determin valoarea greutii ca pentru o persoan de sex masculin. Apoi, dac este totui o persoan de sex feminin, se modific valoarea acestei variabile, scznd 10 din vechea valoare. La final, se afieaz valoarea final a acestei variabile.