pclp1_laboratorul7

6
Laboratorul 7 1. Exemplu de programare. Problema Să presupunem că lucraţi la o firma de avocatură care are de rezolvat un caz de discriminare sexuală. Firma a obţinut un fişier cu date care conţine salariile angajaţilor unei companii. Ca un prim pas în analiza datelor, vi se cere să calculaţi media veniturilor pentru femei şi pentru bărbaţi. Intrări Fişierul de intrare accesat prin stream-ul fVenituri conţine veniturile sub forma de numere reale, iar pe fiecare linie se găseşte un singur venit. Fiecare dată este precedată de un caracter (‘F’ pentru femeie sau ‘B’ pentru bărbat). Acest cod este primul caracter de pe linie, urmat de un spaţiu si apoi de venitul corespunzător. Ieşiri Toate datele de intrare vor fi tipărite în ecou. Numărul femeilor şi media veniturilor lor. Numărul bărbaţilor şi media veniturilor lor. Discuţie Problema poate fi împărtiţă în doi paşi importanţi. Mai întâi se procesează datele de intrare, adică se contorizează şi se însumează veniturile pentru fiecare sex. Apoi se calculează mediile şi se afişează rezultatele. Cel de-al doilea pas este mai complicat şi presupune proiectarea unei bucle care cuprinde câteva subprobleme. Vom folosi un cadru general de proiectare a buclelor, parcurgând şapte paşi. 1. Care este conditia de încheiere a buclei? Condiţia de terminare este EOF în fişierul fVenituri. În pseudocod, putem scrie: WHILE NOT EOF în fVenituri 2. Cum trebuie iniţializate variabilele din condiţie? Trebuie să deschidem fişierul de date şi să facem prima citire. 3. Cum actualizăm variabilele din condiţie? Trebuie să citim o nouă linie de date. Algoritmul rezultat până acum este: Deschide fVenituri pentru citire (verifică şi corectitudinea operaţiei) Citeşte sex şi venit din fVenituri WHILE NOT EOF în fVenituri . . . (Se repetă procesul) Citeşte sex şi venituri din fVenituri 4. Care este procesul care se repetă? Pentru a calcula media trebuie să contorizăm numărul de femei şi să împărţim suma veniturilor lor la acest număr. La fel procedam şi pentru bărbaţi. Pentru că trebuie să facem o astfel de separare, procesul constă din patru paşi: - contorizăm numărul de femei - însumăm veniturile lor - contorizăm numărul de bărbaţi 1

Upload: burican-bogdan-alexandru

Post on 07-Nov-2015

221 views

Category:

Documents


2 download

DESCRIPTION

fizica

TRANSCRIPT

  • Laboratorul 7 1. Exemplu de programare.

    Problema S presupunem c lucrai la o firma de avocatur care are de rezolvat un caz

    de discriminare sexual. Firma a obinut un fiier cu date care conine salariile angajailor unei companii. Ca un prim pas n analiza datelor, vi se cere s calculai media veniturilor pentru femei i pentru brbai.

    Intrri Fiierul de intrare accesat prin stream-ul fVenituri conine veniturile sub

    forma de numere reale, iar pe fiecare linie se gsete un singur venit. Fiecare dat este precedat de un caracter (F pentru femeie sau B pentru brbat). Acest cod este primul caracter de pe linie, urmat de un spaiu si apoi de venitul corespunztor.

    Ieiri Toate datele de intrare vor fi tiprite n ecou. Numrul femeilor i media veniturilor lor. Numrul brbailor i media veniturilor lor.

    Discuie Problema poate fi mprti n doi pai importani. Mai nti se proceseaz

    datele de intrare, adic se contorizeaz i se nsumeaz veniturile pentru fiecare sex. Apoi se calculeaz mediile i se afieaz rezultatele. Cel de-al doilea pas este mai complicat i presupune proiectarea unei bucle care cuprinde cteva subprobleme. Vom folosi un cadru general de proiectare a buclelor, parcurgnd apte pai.

    1. Care este conditia de ncheiere a buclei? Condiia de terminare este EOF n fiierul fVenituri. n pseudocod, putem scrie:

    WHILE NOT EOF n fVenituri 2. Cum trebuie iniializate variabilele din condiie? Trebuie s deschidem fiierul

    de date i s facem prima citire. 3. Cum actualizm variabilele din condiie? Trebuie s citim o nou linie de

    date. Algoritmul rezultat pn acum este: Deschide fVenituri pentru citire (verific i corectitudinea operaiei) Citete sex i venit din fVenituri WHILE NOT EOF n fVenituri . . . (Se repet procesul) Citete sex i venituri din fVenituri 4. Care este procesul care se repet? Pentru a calcula media trebuie s

    contorizm numrul de femei i s mprim suma veniturilor lor la acest numr. La fel procedam i pentru brbai. Pentru c trebuie s facem o astfel de separare, procesul const din patru pai:

    - contorizm numrul de femei - nsumm veniturile lor - contorizm numrul de brbai

    1

  • Programarea calculatoarelor i limbaje de programare I

    - nsumm veniturile lor. 5. Cum trebuie iniializat procesul? contorF i sumaF trebuie iniializate cu 0.

    contorB i sumaB trebuie iniializate de asemenea cu 0. 6. Cum se actualizeaz procesul? Cnd citim venitul unei femei, contorF se

    incrementeaz i venitul su este adunat la sumaF. Atunci cnd citim venitul unui brbat, incrementm contorB i adunm venitul lui la sumaB.

    7. Care este starea programului la ieirea din bucl? Streamul fiierului, fVenituri va fi n fail state; contorF va conine numrul de valori de intrare precedate de F; sumaF va conine suma veniturilor pentru valorile precedate de F; contorB va conine numrul de valori care nu sunt precedate de F; sumaB va conine suma valorilor care nu sunt precedate de F.

    Din aceast descriere putem vedea c bucla va conine o structur IF-THEN-

    ELSE cu o ramur pentru femei i alta pentru brbai. Fiecare ramur trebuie s incrementeze corect contorul de evenimente i s adune valoarea citit la variabila corect. Dupa ncheierea buclei, vom avea suficiente informaii pentru a calcula mediile i a afia datele cerute.

    Ipotez Trebuie s presupunem c exist cel puin o linie de date precedat de F i

    una precedat de B (sau alt liter). n caz contrar, programul genereaz erori datorate mpririlor la 0. Pentru a corecta aceast eroare, ar trebui s inserm cteva instruciuni if suplimentare care testeaz condiiile generatoare de erori.

    Programul //******************************************************** //Venituri.cpp //Acest program citeste un fisier de venituri clasificate //dupa sezul persoanelor care le realizeaza. Calculeaza //media veniturilor pentru fiecare sex. //******************************************************** #include #include #include using namespace std; int main() { char sex; int contorF; int contorB; double venit; double sumaF; double sumaB; double mediaF; double mediaB; ifstream fVenituri; cout.setf(ios::fixed, ios::floatfield);

    2

  • Programarea calculatoarelor i limbaje de programare I

    cout.setf(ios::showpoint); cout > venit;//Prima citire din fisier //Initializarea procesului contorF = 0; sumaF = 0.0; contorB = 0; sumaB = 0.0; while(fVenituri) { //Actualizarea procesului cout

  • Programarea calculatoarelor i limbaje de programare I

    Sugestii pentru test i debugging - Testai cu atenie fiecare seciune a programului pe care l scriei. - Fii ateni la buclele infinite, adic atunci cnd condiiile din instruciunea while

    nu devin niciodat false. Acesta este un motiv pentru care programul nu se mai oprete. Dac ai creat bucle infinite, verificai logica i sintaxa buclelor. Asigurai-v ca nu ai pus ; imediat dup paranteza rotund nchis de dup condiie:

    while (condiie); Instruciune

    ntr-o bucl controlat de contor, fii siguri c variabila de control este incrementat n interiorul buclei. n buclele controlate de flag, verificai dac flag-ul i-a modificat valoarea. Fii ateni la folosirea operatorilor = i == n condiiile din while.

    while (someVar = 5) //Ar fi trebuit sa fie == produce o bucl infinit. Valoarea expresiei este ntotdeauna 5 i este interpretat ca true.

    - Verificai cu atenie condiia de terminare a buclei i fii siguri c aceast condiie poate aprea n timpul execuiei buclei.

    - Folosii funcia get n locul operatorului de extracie n buclele controlate de apariia caracterului newline.

    - Simulai execuia buclelor pe hrtie. Studiai civa pai de la nceputul i civa pai de la finalul execuiei buclei pentru a v da seama cum funcioneaz ea de fapt.

    - Folosii un debugger pentru a studia evoluia cu ncetinitorul a programului. - Dac nu reuii s v dai seama care sunt valorile pe care le ia o variabil,

    folosii instruciuni de afiare utile la depanare: cout

  • Programarea calculatoarelor i limbaje de programare I

    int i=4; while (i >= 1) {

    int j = 2; while(j >= 1) { cout

  • Programarea calculatoarelor i limbaje de programare I

    apare valoarea 0, ea este ignorat. Programul se ncheie la apariia sfritului de fiier.

    11. Scriei un program care tiprete secvena tuturor combinaiilor de ore i

    minute dintr-un interval de 60 minute pe 6 coloane i 10 linii. Folosii formatul HH:MM (ex: 1:00, 12:59).

    12. Modificai programul Venituri.cpp (punctul 1, Exemplu de programare) astfel

    nct: a) S tipreasc un mesaj de eroare atunci cnd se citesc valori negative. Aceste valori vor fi omise din calcule; b) S nu fac afiri eronate atunci cnd fiierul de date nu conine nregistrri pentru brbai sau pentru femei; c) S nu ia n considerare liniile de date care nu sunt precedate de F sau B.

    13. Scriei programul C++ care accept ca intrri un numar ntreg i un caracter.

    Ieirea va fi un romb desenat cu acel caracter, care i mareste diagonala pn la dimensiunea dat de numrul ntreg. n cazul n care numrul este par, el va fi incrementat pn la urmtorul numr impar. De ex., dac am introdus numrul 7 i caracterul *, rombul va arta astfel:

    * *** ***** ******* ***** *** *

    14. Scriei programul C++ care accept la intrare un ntreg mai mare dect 1 i

    care calculeaz suma ptratelor numerelor de la 1 pn la acel ntreg. De ex., dac numrul introdus este 4, programul calculeaz suma 1+4+9+16. Ieirea va fi intregul introdus si suma, nsoite de mesaje sugestive. Programul va solicita numere pn la apariia unuia negativ, fapt care semnaleaz terminarea sa.

    6

    Laboratorul 7ProblemaIntrriIeiriDiscuieIpotezProgramulSugestii pentru test i debugging