Download - PCLP1_Laboratorul7

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