pclp1_laboratorul8

8
Laboratorul 8 1. Exemplu de programare. Problema Pentru o statistică, un lanţ de magazine de mobilă doreşte să facă o comparaţie a vânzărilor din două magazine aflate în acelaşi oraş. Comparaţia se va face sub forma unui grafic ce va afişa vânzările din raioanele similare ale celor două magazine. Pentru fiecare magazin este disponibil câte un fişier de date cu următoarea structură: ID-ul raionului Nr. de zile lucratoare pentru care s-au inregistrat vanzarile Vanzarile pt. ziua 1 Vanzarile pt. ziua 2 ... Vanzarile pt. ultima zi ID-ul raionului Nr. de zile lucratoare pentru care s-au inregistrat vanzarile Vanzarile pt. ziua 1 ... Conţinului unui fişier de date pentru unul dintre magazine ar putea fi: 101 3 5388.99 2647.69 6108.05 102 3 2692.17 10922.69 7933.78 Programul afişează rezultatele în forma următoare: Grafic comparativ pentru raioanele din magazinele 1 si 2 Magazin Vanzari pe raion in mii de lei 0 5 10 15 20 25 |.........|.........|.........|.........|.........| Raionul 101 1 ***************************** Raionul 101 2 ************************** Raionul 102 1 ******************************************** Raionul 102 2 ********************************************** 1

Upload: burican-bogdan-alexandru

Post on 17-Sep-2015

217 views

Category:

Documents


2 download

DESCRIPTION

fizica

TRANSCRIPT

  • Laboratorul 8 1. Exemplu de programare.

    Problema Pentru o statistic, un lan de magazine de mobil dorete s fac o comparaie

    a vnzrilor din dou magazine aflate n acelai ora. Comparaia se va face sub forma unui grafic ce va afia vnzrile din raioanele similare ale celor dou magazine. Pentru fiecare magazin este disponibil cte un fiier de date cu urmtoarea structur: ID-ul raionului Nr. de zile lucratoare pentru care s-au inregistrat vanzarile Vanzarile pt. ziua 1 Vanzarile pt. ziua 2 ... Vanzarile pt. ultima zi ID-ul raionului Nr. de zile lucratoare pentru care s-au inregistrat vanzarile Vanzarile pt. ziua 1 ...

    Coninului unui fiier de date pentru unul dintre magazine ar putea fi: 101 3 5388.99 2647.69 6108.05 102 3 2692.17 10922.69 7933.78

    Programul afieaz rezultatele n forma urmtoare: Grafic comparativ pentru raioanele din magazinele 1 si 2 Magazin Vanzari pe raion in mii de lei 0 5 10 15 20 25 |.........|.........|.........|.........|.........| Raionul 101 1 ***************************** Raionul 101

    2 ************************** Raionul 102 1 ******************************************** Raionul 102 2 **********************************************

    1

  • Programarea calculatoarelor i limbaje de programare I

    Intrri Cele dou fiiere de date (magazin1 i magazin2).

    Ieire Graficul prezentat mai sus.

    Discuie Citirea datelor din fiiere se face dup metoda cunoscut deja. Se deschid

    fiierele, se citesc ID-urile raionului, numrul de zile pentru care s-au facut nregistrri i vnzrile zilnice. Dup procesarea datelor pentru raion, n ambele magazine, se poate trece la raionul urmtor pn la epuizarea datelor de intrare. Pentru ca citirea celor dou fiiere se face similar, putem folosi o funcie comun pentru citirea lor. Tot ce trebuie s facem este s transmitem numele fiierului ca parametru. Funcia ne va furniza vnzrile totale pentru fiecare raion.

    O alt funcie va realiza afiarea rezultatelor n forma dorit. n acest program sunt trei bucle: una n funcia main (pentru citirea i procesarea datelor), a doua n funcia de citire a datelor pentru un raion i una n funcia de afiare. Bucla din funcia main testeaz EOF pentru ambele fiiere de date. Bucla din funcia TiparesteDate este puin mai special. Variabila care controleaz bucla este decrementat cu 500 la fiecare iteraie.

    Ipotez Fiecare fiier de date este ordonat dup ID-ul raionului.

    Programul //*********************************************** //Grafic.cpp //Programul genereaza graficul vanzarilor lunare //pe raioane pentru doua magazine ale unei retele //de magazine de mobila, permitand comparatia //pe raioane similare din cele doua magazine //*********************************************** #include #include //Pentru setw() #include //Pentru operatii I/O cu fisiere using namespace std; void CitesteDate(ifstream&, int&, double&); void TiparesteDate(int, int, double); void TiparesteHeader(); int main() { int raionID1; //ID-ul raionului pt. magazinul 1 int raionID2; //ID-ul raionului pt. magazinul 2 double vanzari1; //Vanzarile din magazinul 1 double vanzari2; //Vanzarile din magazinul 2 ifstream magazin1; //Fisierul de date pt. magazinul 1 ifstream magazin2; //Fisierul de date pt. magazinul 2

    2

  • Programarea calculatoarelor i limbaje de programare I

    magazin1.open("magazin1.dat"); magazin2.open("magazin2.dat"); if(!magazin1 || !magazin2) //Verifica deschiderea fisierelor de date { cout

  • Programarea calculatoarelor i limbaje de programare I

    if(!fisierDate) //Verifica daca fisierul a fost vid (EOF) return; //Daca da, iese din functie fisierDate >> numZile; vanzariRaion = 0.0; //Initializeaza controlul buclei de citire zi = 1; while(zi > vanzare; vanzariRaion = vanzariRaion + vanzare; //Actualizeaza variabila de control al buclei zi++; } } void TiparesteDate( /*in*/ int raionID, //ID-ul raionului /*in*/ int numMagazin, //Numarul magazinului /*in*/ double vanzariRaion) //Vanzarile totale/raion { cout

  • Programarea calculatoarelor i limbaje de programare I

    2. Date fiind declaraiile const int ANGLE = 90; char letter; int number;

    artai care dintre urmtorii parametri actuali pot fi transmii prin valoare, prin referin sau amndou: a) letter b) ANGLE c) number d) number+3 e) 23 f) ANGLE * number g) abs(number)

    3. Avnd urmtoarele date de intrare: 3 2 4

    artai ce va tipri urmtorul program: #include using namespace std; void Test( int&, int&, int& ); int main() { int var1; int var2; int var3; Test(var1, var2, var3); var2 = var2 + 10; cout var1; var1 = var2 * var3 + var1; }

    4. Numerotai instruciunile marcate i artai care este ordinea n care sunt

    executate: #include using namespace std; void Functie( int&, int& ); int main() { int numar1; int numar2; ___ cout

  • Programarea calculatoarelor i limbaje de programare I

    ___ Functie(numar1, numar2); ___ cout valoare1; ___ valoare2 = valoare1 + 10; }

    5. Ce afieaz programul de mai jos? De ce? #include using namespace std; void Test(int&,int); int main() {

    int variabila1; variabila1 = 12; int variabila2; variabila2 = 14; Test(variabila1, variabila2); cout

  • Programarea calculatoarelor i limbaje de programare I

    7. Scriei o funcie numit GetNonBlank care s foloseasc funcia cin.get pentru citirea caracterelor din stream-ul standard de intrare i s returneze primul caracter diferit de blank pe care l ntlnete. Aceast funcie ar trebui s aib acelai comportament ca o citire care folosete operatorul >>.

    8. Folosind funcia cin.get pentru citirea caracterelor de pe stream-ul standard

    de intrare, scriei funcia SkipToBlank care s aib acelai comportament cu funcia cin.ignore.

    9. Scriei un program C++ care citete caractere reprezentnd numere n baza 2

    dintr-un fiier de date pe care le convertete n baza 10. Numerele zecimale vor fi afiate pe coloane, cu un cap de tabel explicativ. Fiecare numr binar se gsete n fiier inversat, adic prima cifr intlnit este, de fapt, cifra cea mai din dreapta a numrului. Programul citete cte o cifr. Pe msur ce se citete cte o cifr, ea este transformat n corespondentul zecimal nmulind-o cu 2 ridicat la putere (puterea se stabilete n funcie de poziia cifrei binare n numr). n fiier se va gsi cte un singur numr pe o linie.

    10. Scriei un program care s numere cuvintele dintr-un text, eliminnd spaiile

    suplimetare dintre cuvinte, n cazul n care apare mai mult de unul (funcia WhitespaceToBlank). Textul este citit dintr-un fiier i este afiat pe ecran.

    11. Calculai calendarul n functie de ziua sptmnii n care este 1 ianuarie din

    anul respectiv. Considerai c anul este bisect dac el este divizibil cu 4 (dei determinarea unui an bisect este puin mai complicat). Numrul de luni pentru care se afieaz calendarul este citit de la utilizator. Verificai ca toate datele de intrare s se ncadreze n intervalele corecte. Sugestie: Putei folosi o funcie de afiare a calendarului pentru o lun, avnd ca parametri ziua din sptmn n care ncepe acea lun i numrul zilelor din lun. Zilele sptmnii pot fi numerotate de la 1 la 7. Programul trebuie s se comporte astfel (datele introduse de utilizator sunt prezentate cu litere ingrosate): Care 2007

    este anul pentru care doriti afisarea calendarului?

    In ce zi din saptamana este ziua de 1 ianuarie 2007? (1 pentru ni, 2 pentru marti, etc.) lu

    2 Pe2 ntru cate luni din anul 2007 doriti afisarea calendarului?

    2007 Ianuarie L M M J V S D 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Februarie L M M J V S D 1 2 3 4

    7

  • Programarea calculatoarelor i limbaje de programare I

    5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

    12. Scriei o funcie recursiv power(base, exponent) care returneaz valoarea baseexponent. De exemplu, power(3, 4) = 3*3*3*3. Presupunei c exponent este un ntreg mai mare sau egal cu 1. Indicaie: Pasul de recursie folosete relaia baseexponent = base baseexponent- i condiia de terminare apare cnd exponent este 1.

    13. Generarea numerelor aleatoare. Scrierea unui program care implementeaz

    distribuiia crilor n jocul Solitaire presupune folosirea unui mecanism prin care crile sunt alese la ntmplare. Funcia rand() din biblioteca cstdlib genereaz un numr ntreg cu valoarea cuprins ntre 0 i RAND_MAX, o constant simbolic definit, de asemenea, n biblioteca cstdlib. Programul urmtor genereaz un numr cuprins ntre 1 i 52, pentru a alege la ntmplare una dintre cele 52 de cri dintr-un pachet:

    #include #include using namespace std; int main() { srand(time(0)); cout