Platforma Laborator PC Claudius Dan

download Platforma Laborator PC Claudius Dan

of 75

Transcript of Platforma Laborator PC Claudius Dan

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    1/75

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    2/75

    1. Descrierea mediului de lucruDev-C++Dev-C++ este un mediu integrat de dezvoltare pentru limbajul de programare C/C++ ~i este oferit gratuit de

    catre firma Bloodshed Software (Website: http://www.bloodshed.net). EI foloseste eompilatorul GCC(GNU C - Free Software Foundation) ~i poate erea fisiere executabile Win32, fie in mod consola, fie prin intermediulunei interfete grafice (GUI), ~i de asemenea biblioteci statice sau dinamiee (DLL-uri).

    Cerintele de sistem recomandate de catre autori sunt urmatoarele: sistem de operare MS-Windows 2000, XP; 32MB memorie RAM; unitate centrala (compatibila Intel) la 400 MHz; spatiu pe disc disponibil 200 ME.

    In afara distributiei sale gratuite, Dev-C++ are un numar de caracteristici care 11 fac extrem de atractiv pentruutilizare. Hra a intra in detalii, vorn remarca in mod special faptul ca interfata grafica este foarte flexibila, dar siintuitiva ~i user de folosit si include toate facilitatile necesare unui mediu de programare evoluat (editare completa,listare de functii, compilare si rulare, depanare, creare de proiecte, adaugare de biblioteci etc.).

    In aceasta lucrare se utilizeaza mediul Dev-C++ pentru programarea in limbajul C, iar compilarea surselor vaavea ca rezultat obtinerea de fisiere executabile Win32.

    1.1. Editarea unui programEditarea (adica scrierea fisierului sursd al programului) se poate face in mediul Dev-C++ In doua moduri. 0

    modalitate eficienta, recomandata in special atunci cand avem mai multe fisiere sursa, este de a crea mai intiii unProiect (meniul File, optiunile Newsi apoi Project ... ); in acest mod se permite adaugarea sau eliminareaimediata a unor fisiere si editarea legaturilor dupa compilarea tuturor fisierelor sursa, ca si un control al diferitilorparametri disponibili in mediul de programare. 0 a doua modalitate, mai simpla, este de a se crea direct un (singur)fisier sursa; aceasta metoda va fi descrisa succint si ilustrata in cele ce urmeaza,

    Presupunand ca suntem deja in interfata grafica, se selecteaza meniul File, iar din Newse alege SourceFile (sau se foloseste combinatia de taste CTRL+N), asa cum este prezentat in Figura 1.1.

    Se va deschide astfe1 0noua fereastra (numita initial Un ti tledl) in care se va scrie efectiv programul sursa,Dupa incheierea editarii, fisierul sursa trebuie salvat pe disc. Salvarea se face prin comanda Save As ... (sau

    Save) din meniul File, asa cum este ilustrat in Figura 1.2; fisierele se vor salva ca fisiere C (C source),:;;i voravea pe disc extensia ". c",

    Impo r t@Export

    rrnt Setup~Exitj - ----

    Figura 1.1. Deschiderea unui fisier sursa nou

    1.2. Compilarea programuluiUrmatoarea etapa ce trebuie parcursa este compilarea programului sursa rezultat dupa terminarea editarii, adica

    "traducerea" sa in limbajul calculatorului si obtinerea unuiprogram obiect, reprezentat in cod masina sau intr-un limbajapropiat de acesta. In cazullimbajului C, procesul de compilare :;;ieditare de legaturi se imparte de fapt intre mai multeprograme: preprocesorul, compilatorul propriu-zis, asamblorul :;;i editorul de legiituri, rezultand in final un fisierexecutabil.

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    3/75

    Open Pro je ct o r F ie . ..Reopen

    1 2 1 Savet2IM#f li .Q sa V A ti~CIosedoseNI

    Ctrl+P

    Ai t- l -F4 rnain ()int a, b , 3;pri.nt f t stnt rcducet.L pr imuI numer , a: It);

    t ecenf t v sd " , &a);t pr Lnt.f Iv Jntroduce ti a1 doilea nuue r , b : ");

    acanf ("%d", &b);a=e+b prin tf {Suma ce l.or doue numer-e este t d", SI;printf ("\nn) ;sys t.em ("PAUSE") ;return 0;

    Figura 1.2. Salvarea fisierului editatIn mediul Dev-C++ etapele sugerate anterior (practic compilarea si editarea legaturilor) sunt parcurse automat sitransparent pentru utilizator prin apelarca optiunii Compile din meniul Execute, sau folosind combinatia de tasteCtrl+F9 (Figura 1.3).

    p ri.muL nume r , a; It);acenf tv'td ", &aj;print.t'{vtnt roducet L al doi.Iee nuaer, b: "l :acenf {"%d (I, &b);s=e+b:pr tnt f tvaume ce Ior doua nume re ee t e t d", s j :printf ("\n") :system ("PAUSE");return 0;

    Figura 1.3. Optiunea de compilare a fisierului sursiiIn cazul in care nu exista erori, este creat un fisier executabil (avand extensia ". exe") care poate fi rulat, parteadejos a ferestrei interfetei grafice aratand, de exemplu, ca in Figura 1A.In cazul in care se constata erori la compilare (tipic erori sintactice), lansarea in executie nu este posibila, iarerorile sunt semnalate in fereastra Compiler (aflata in coltul din stanga jos al interfetei grafice), Figura 1.5 prezinta 0

    astfel de situatie; este yorba de acelasi exemplu (problema 2.2 din Capitolul 2), in care s-au omis intentionat ghilimclelece incadreaza specificatorul deformat % d din linia 10.Dupa ce erorile au fost inlaturate este necesar sa se faca 0 noua compilare (de remarcat faptul ca dupa fiecaremodificare adusa codului sursa, acesta trebuie recompilat). Cand compilarea a decurs bine, este permisa rulareaprogramului.

    1.3. Rularea programululRularea programului se face prin comanda Run (sau Ctrl+FlO) din meniul Execute (a se vedea si Figura

    lA). Aceasta comanda lanseaza in executie programul, tiparind eventual mesaje si rezultate pe ccranul calculatorului.

    2

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    4/75

    int'\

    p r imu.I numar , a: tt);

    pri.nt.f Iv Tn+r-oducc t L a1 doi.Lee numar , b: tt};5canf("%drr , &b);s=e+b rprintf{"Suma ce Loc doua nuae re es t .e %d", 5);pr m tf ("\nn);system ("PAUSE") ;return 0;

    8 B Compiler I ~ Resources d lh Compile Log I c : : J Debug I {9. Find Results I~ Close!

    Figura 1.4. Compilarea cu succes a fisierului sursii

    H~p

    I#include I#include l in t main ()III int a, b , s ,prin tf ("In troduce ti p r imuI nuee r, a:

    scent ( r r % d " " , &a);"J;

    . printf("Introduceti al do.iJee numer , b: ");' _ ' I I i . M i I=e+b :pr int t tv sume ce Lor doue numere eat.e %d", 5);printf ("\nn) ;system ("PAUSE") ;r$turn 0;

    Line10

    Resources I d i l l Compile Log I rd Debuq 1 (9. Find Results I ~

    Figura 1.5. 0 situatie ce conduce la erori de compilare a programului

    In aceastii etapii sunt puse in evidenta erorile la executie, cum ar fi impartirea cu zero, sau sunt puse in evidentaerorile de logica daca rezultatele sunt eronate. Dacii se descopera astfel de erori, programatorul trebuie sa se reintoarcala editarea programului sursa, sa-l recompileze si sa-l ruleze din nou.Pentru ca programul sa fie lansat in executie automat dupa compilare se poate folosi comanda Compile &

    Run (sau F9)din meniul Execute.

    3

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    5/75

    2. Prograrne simple; variabile ~iconstante,operatli de Intrare/ieslre formatate

    2.1. Probleme rezolvateIP2.11 Scrieti un program care afiseaza pe ecran un text dat.'include 'include int main () {

    printf("Acesta este un program CD);printf("\n") ;printf("creat\n");printf("de mine.");printf("\n");system("PAUSE");return 0;

    Q Programul va afisa pe ecran, dupa compilare si executie:Acesta este un program Ccreatde mine.

    - a . Discutie:Comanda #include realizeaza includerea in fisierul sursa a unui alt fisier (situat intr-un director cunoscut decatre compilator), in acest caz a unor fisiere specialc care descriu continutul unor biblioteci si care poarta denumirea de

    fisiere header, avand extensia ". h". In exemplul anterior, stdio. h este fisierul care defineste functiile standard deI/Odin biblioteca C (printre acestea numarandu-se si functiile printf ():;;i scanf ()), iar stdlib. h este un fisierce defineste un numar de functii utilitare din biblioteca standard (cum este si system () ).

    - Programul propriu-zis este descris de functia main () . Acoladele ,{' si ,} , din interiorul functiei marcheazapractic inceputul si sfarsitul programului. Instructiunile se executa secvential; in cazul anterior, succesiunea operatiilorcorespunde cu cea de scriere a comenzilor, deoarece nu se precizeaza explicit un salt la 0 alta instructiune.- Functia printf () afiseaza sirul de caractere incIus intre ghilimele, Secventa de caractere ,\n' determina

    trccerea afisarii la un rand nou ("newline"). Exista si alte secvente de caractere care determine deplasarea pozitieiurmatoare de afisare.

    - Instructiunea system (" PAUSE") are urmatorul efect: dupa afisarea rezultatelor, fcrcastra de rulare DOSramane deschisa pana cand se introduce un caracter oarecare de la tastatura, permitand astfel vizualizarca :;;iinterpretarea rezultatelor programului (in lipsa unei astfel de comenzi, fereastra se inchide automat dupa rulare),

    - Instructiunea return utilizata in main () determina intoarcerea unui cod de terminare catre sistemul deoperare (valoarea intoarsa trebuie sa fie un Intreg). Uzual, valoarea ,0' indica faptul ca programul s-a terminat normal;orice alta valoare indica faptul ca exists 0 eroare. Precizam ca toate programele din aceasta lucrare intorc valori dinmain (), desi din punct de vedere tehnic acest lucru este optional (strict formal, dcoarece instructiunea return esteplasata pe ultima linie din main () , executia programului oricum se incheie).

    Scrieti un program care citeste doua numere intregi a si b si calculeaza suma lor.#include #include int main () {

    int a, b , s;printf("lntroduceti primul numar, a: ");scanf("%d", &a);printf("Introduceti al doilea numar, b: H);scanf("%dU, &b);s a + b;printf("Suma celor doua numere este %d", s);printf("\n");system("PAUSE") ;return 0;

    4

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    6/75

    Q Daca se introdue de la tastatura, de exemplu, numerele -- 7 si 7 , programul va afisa pe ecran, dupa eompilaresi executie:

    lntroduceti primul numar, a: -7Introduceti al doilea numar, b: 7Suma celor doua numere este 0

    ~ Dlscutle:Instructiunea int a, b , e ; declara variabilele de tip intreg a, b si s. Variabila s va fi folositapentru a stoea valoarea sumei dint:re a si b.Functia scanf () citeste un earaeter introdus de la tastatura; eonform speeifieatorului ,,%d", valoarea citita vafi de tip intreg :;;iva fi stocata la adresa variabilei ce urmeaza simbolului .s.'.- Linia s = a + b; atribuie variabilei s valoarea a + b.-Linia printf("Suma celor doua numere este %d", s i, va afisa pe ecran textul Sumacelor doua numere este urmat de valoarea calculata a lui s.

    Scrieti un program eare calculeaza diferenta a doua numere intregi introduse de la tastatura,'include 'include int main () (

    int a, b;printf("Introducetj doua numere intregi: ");scanf("%d %d", &a, &b);printf("%d - %d = %d", a, b, a b);printf ("\n");system("PAUSE") ;return 0;

    Q Daca se introdue de la tastatura, de exemplu, numerele 7 si 9, programul va afisa pe eeran, dupa eompilaresi executie:

    Introduceti doua numere intregi: 7 97 - 9 = -2

    ~ Discutie:- Instructiunea scanf ("%d %d", &a, &b) i pennite eitirea de la tastatura a doua numere intregi: prima

    valoare citita va fi stocata la adresa variabilei a, eea de a doua la adresa variabilei b. De notat ea spatiul dintre eeledoua grupe de earaetere ,,%d" din "%d %d" spune functiei scanf () ea cele doua numere introduse de latastatura pot fi separate de spatii,- Este absolut corecta utilizarea unor expresii (eum este "a - b") in !ista de parametri a functieiprintf () ; ele vor fi evaluate inainte de apelul functiei. Aceasta variants este ehiar mai eficienta dedit utilizarea uncivariabile suplimentare, sa spunem c, careia sa i se atribuie valoarea "a - b" (aceasta metoda a fost folosita inproblema 2.2), deoareee reduce spatiul de memorie neeesar programului.

    Scrieti un program eare calculeaza aria unui eere de raza data; valoarea razei se va eiti de la tastatura si va fiun numar intreg.

    'include 'include int main () (/* Declaratii */

    int raza;float aria, pi 3.14;/* Comenzi */printf("Introduceti raza: ");scanf("%d", &raza);aria pi * raza * raza; /* calculul ariei */printf("Aria cercului de raza %d este %f", raza, aria);printf ("\n");system("PAUSE") ;return 0;

    5

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    7/75

    Q Daca se introduce de la tastatura, de exemplu, valoarea 3, programul va afisa:Introduceti raza: 3Aria cercului de raza 3 este 28.260000

    ~ Discutie:~ Se declara variabila r a za de tip intreg. Deoarece suprafata unui cerc nu este neaparat un numar intreg,variabila ar ia in care este calculata va fi declarata de tip real (deci se va utiliza tipul f loa t).

    ~ Variabila reala pi se initializeaza cu valoarea 3.14. Deoarece aceasta variabila nu este de fapt asociata deditvalorii constante 3.14, acelasi efect putea fi obtinut utilizand modificatorul eonst. Acesta poate fi folosit pentru acrea constante de un anumit tip; astfel, compilatorul va fi informat ca variabila care urmeaza nu poate fi modificata deprogram. Prin urmare, instructiunea float aria, pi=3 .14; din programul anterior se putea inlocui cu:

    float aria;const float pi = 3.14;~ Comentariile se pot introduce oriunde in program.

    Scrieti un program care transforms temperatura exprimata in grade Fahrenheit in grade Celsius. Se va utilizaformula: C (F~32)*5/9, unde C ~ grade Celsius (numar real), F~ grade Fahrenheit (nurnar intreg).#include #include int main{) {int gradf;float grade;

    printf{"Introduceti temperatura in grade Fahrenheit: ");scanf ("%d", &gradf);grade = (gradf - 32) * 5.0 / 9.0;printf{nTemperatura in grade Celsius este %f", grade);printf{"\n") ;system{"PAUSEn) ;return 0;Q Daca se introduce de la tastatura, de exemplu, valoarea 100,programul va afisa:

    Introduceti temperatura in grade Fahrenheit: 100Temperatura in grade Celsius este 37.777779~ Discutle:~ Dupa cum s-a cerut in enuntul problemei, se declara variabilele gradf de tip intreg si grade de tip real.

    Cele doua constante utilizate (5 si 9) se vor introduce in program sub forma ,,5.0" si respectiv ,,9. 0"; desi asupraacestui lucru vom reveni in capitolul urmator, vom spune deocamdata doar faptul ca rezultatul imparprii a doi intrcgieste un intreg, deci evaluarea expresiei ,,(gradf 32) *5/9" ar fi dus Ia un rezultat incorect (chiar dacavariabila grade a fost declarata de tip float).

    Scrieti un program care transforms masura unui unghi din grade (numar intreg) in radiani (numar real).Se va utiliza relatia de transfonnare cunoscuta: rad = grad * n /180.

    'include #include int main t ) {int grad;float rad;const float pi = 3.141593;printf("Introduceti unghiul in grade: H);scanf{"%i", &grad);rad = grad * pi / 80;printf{"Masura unghiului este de %4.2f radiani", radIi

    p r intf ("\n");system{"PAUSEH) ;return 0;

    6

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    8/75

    Q Daca se introduce de la tastatura, de exemplu, valoarea 360, programul va afisa:Introduceti unghiul in grade: 360Masura unghiului este de 6.28 radiani

    ~ Discutie:~ Dupa cum s-a aratat la partea teoretica, ca specificator de format pentru numere intregi zecimale poate fi

    utilizat atat ,,%d" cat si ,,%i"; s-a folosit aici a doua varianta,~ Fiecare caracter ce indica fonnatul variabilei poate fi precedat in cadrul unui specificator de format de un

    modificator ce va determina felul in care se va tipari valoarea. Astfel, in exemplul anterior, ,,% 4 . 2f" utilizat la adoua functie printf () are urmatoare semnificatie: se va tipari un numar real In format zecimal utilizand In total 4caractere (incluzand punctul zecimal), cu 2 cifre la partea fractionara,

    2.2. Probleme prop use1. Scrieti un program care sa va afiseze numele pe ecran, ca si seria si grupa, pe doua randuri succesive.2. Se citeste un intreg . Scrieti un program care sa afiseze: "Ati introdus numarul ...".3. Scrieti un program care citeste doi intregi i?icalculeaza produsullor.4. Scrieti un program care calculeaza lungimea unui cere de raza data; valoarea razei se va citi de la tastatura i?iva fiun numiir intreg.5. Scrieti un program care transforms temperatura exprimata in grade Celsius in grade Fahrenheit.6. Scrieti un program care transforms masura unui unghi din radiani in grade.7. Scrieti programe care calculeaza arii pentru patrat, dreptunghi, triunghi.8. Scrieti programe care calculeaza volume pentru cub, paralelipiped, piramida.

    7

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    9/75

    3. Tipurl fundamentalc de date, operatori ~iexpresil3.1. Probleme rezolvate

    IP3.11 Unniitorul program ilustreazii utilizarea tipurilor fundamentale de date in C.'include 'include int main () {

    long int i = 66000;unsigned short int u;double x, y;char b_mic, b_mare, Chiu = 66000;printf ("%ld\t%hu\n\n", i, u);x = 12.3468, y = 11.2e-2;printf("x %f sau %6.3f sau %e\n", x, x, x);printf("y = %f sau %8.4f sau %E\n\n", y, y, y);mic = 'b' , b_rnare = i81{ ch = 'm';

    printf("Codurile ASCII pentru 'b' si 'B' sunt: %d, %d\n", b_mic, b_mare);printf("Dupa '%c' urmeaza '96c'\n", b_mic, b_mic + 1);printf("Majuscula corespunzatoare lui '%c' este '%c'", ch, ch - 'a' + 'A');printf("\nn);system("PAUSEn) ;return 0;

    Q Programul va afisa pe ecran, dupa compilare si executie:66000 464x = 12.346800 sau 12.347 sau 1.234680e+OOly - 0.112000 sau 0.1120 sau 1.120000E-OOlCodurile ASCII pentru 'b' si 'B' sunt: 98, 66Dupa 'b' urmeaza fC'Majuscula corespunzatoate lui 'm' este 'M'

    ~ Discutie:Programul are, asa cum se observa, trei piifti complet distincte. In prima parte se dau douii exemple de folosire

    a numerelor intregi. Programul va afisa corect numarul 66000 declarat long int (de fapt, s-ar fi afisat corect : ; ; idad ar fi fost declarat int, deoarece pc majoritatea ca!culatoarelor curente reprezentarea interna a lui int este pe32 de biti), insii nu afiseaza corect acelasi numiir declarat unsigned short into Numere1e de tipul unsignedshort int sunt IlltotdeaUlla reprezentate pc 16 biti, gama lor fiind intre 0 si 216-1=65535; de altfel, compilatorulsemnalizeaza acest lucru printr-un mcsaj de atentionare (fereastra Compiler). Speeificatorii de format ,,%ld" si,,%hu" permit afisarea numerelor intregi zecimale de tipurile long int si respectiv unsigned short int.

    - Partca a doua ilustreaza cateva modalitati de afisare a numerelor reale. Variabilele x si y se declara detipul doub Le si se initializeaza cu doua valori concrete. In principiu, specificatorul de format ,,% f" poate fi folosit cuoricare din tipurile float sau double si afisarea se face uzual cu 6 cifre la partea fractionara. Utilizareaspecificatorului ,,%e"sau ,,%E" conduce la afisarea numarului real in fonnatul stiintific; fonnatul ,,%6. 3f" va duce laafisarea lui x cu 6 caractere in total (5 cifre plus punctul zecimal) si 3 cifre precizie pentru partea fractionara (caatare, numarul 12.3468 se va rotunji la 12.347); in sfarsit, formatul ,,%8. 4f" va ducc la afisarea lui y subforma " 0 . 1120" (deoarece liitimea campului de afisare specificatii prin format este 8, cu douii unitati mai maredecat este necesar, afisarea se completeaza cu doua spatii libere la stanga numarului),- In partea a treia a programului se exemplifica utilizarea si afisarea caracterelor. Cele trei variabile folosite suntdeclarate de tipul char; constantele caracter se scriu intre simbolurile apostrof. Compilatorul plaseaza, de exemplu,codul ASCII al lui .b ', 98, la adresa variabilci b_rni c; similar pentru celelalte douii variabile. Aceste valori pot fiutilizate, de exemplu, pentru a face diferite calcule aritmetice (dupii cum se aratii : ; ; i in program), : ; ; i se afiseaza canumere intregi daca se foloseste specificatorul de format ,% d', sau sunt reconvertite in caracterele corespunziitoare dacaeste folosit speeifieatorul ,% c '. Aceasta idee este reluata si in problema urmatoare.

    8

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    10/75

    Scrieti un program care afiseaza codul ASCII al unui caracter citit de la tastatura,#include #include int main () {

    char Chiprintf ("lntroduceti un caracter: H);ch = getch{);printf{"\nCaracterul %c are codul ASCII %3d", ch, chI;printf{"\n");system{"PAUSE") ;return 0;

    Q Daca se introduce de la tastatura, de exemplu, caracterul ,c', programul va afisa:Introduceti un caracter: Ie)Caracterul care codul ASCI 99

    a. Discutie:- Se declara variabila ch de tip caracter. Functia getch () citeste un caracter de la tastatura, adica asteapta

    pana cand este apasata0 tasta si apoi intoarce codul sau ASCII. Este 0 variants a functieide 1/0 getche () , dar spredeosebire de aceasta din urma, nu afiseaza automat pe ecran caracterul introdus de la tastatura (se mai spune ca "nu areecoupe ecran"), Precizam ca functiile getch () si getche () nu sunt functii ANSI. Bibliotecile standard ANSIpun la dispozitia utilizatorului doar functiile getc () ~i get char () care insa citesc primul caracter introdus siasteapta validarea scrierii de catre utilizator prin tasta . Caractere1e necitite, inclusiv , raman inbuffer si vor fi citite de urmatoarcle apeluri la getc () sau getchar () . Recomandamolosirea functiilor getch ()~i getche () care sunt mai flexibile.

    - Specificatorul de format ,,%3d" defineste dimensiunea minima a campului in care se va afisa numarul intreg(3 in cazul de fata); deoarece codul ASCII al lui .c' este 99 (pentru exemplul considerat anterior), deci necesita douacifre, se va tipari un spatiu suplimentar la stanga sa. De notat ca daca se indica 0 latime de camp mai mica decat estenecesar, compilatorul va aloca totusi Iatimea necesara (doar numarul de zecimale precizat prin format va fi respectatintocmai),

    Scrieti un program care aduna si inmulteste doua numere complexe exprimate sub forma z 1 = a + bi , z2 = e+ di (se citesc efectiv a, b, c, d - numere reale).Indicatie: (a + bi) + (e + di) (a + c) + (b + d)i(a + bi)(e + di) =(ae bd) + (ad + be)i

    'include 'include .int main ()

    float a, b, c, d;printf ("Introduceti zl: ");scanf ("%f %f", &a, &b);printf{"Ati introdus zl %f + %fi", a, b);printf{"\nIntroduceti z2: H);scanf ("%f %f", &c, &d);printf{"Ati introdus z2 = %f + %fi", c, d);printf{"\nzl + z2 %f + %fi", a + c, b + d);printf{"\nzl * z2 = %f + %fi ", a * c b * d, a * d + b * c);printf ("\n");system{"PAUSE") ;return 0;

    Q Dad se introduc de la tastatura, de exemplu, numerele 1.2 si 2.1, respectiv 3.4 ~i 4 .3, programul va afisa:Introduceti zl: 1.2 2.1Ati introdus zl = 1.200000 + 2.100000ilntroduceti z2: 3.4 4.3Ati introdus z2 = 3.400000 + 4.300000izl + z2 4.600000 + 6.400000izl * z2 = -4.950000 + 12.300000i

    9

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    11/75

    Urmatorul program ilustreaza utilizarea operatorilor de impartire (I) ~i modulo (%) .'include 'include .int main ()int i

    float f7, j ~4, k, 1;

    7.0, g 4.0, h;k ~ i / j;h ~ i / j;printf("7 / 4 %d sau %f", k, h); /* rezultate incorecte */h f / g;printf("\n7.0 / 4.0 ~ %f\n", h); /* rezultat corect */l~i%j;printf("Restul impartirii lui 7 la 4 este %d", 1);printf("\n") ;system ("PAUSE") ;return 0;

    Q Programul va afisa pe ecran, dupa eompilare si executie:7 / 4 1 sau 1.0000007.0 / 4.0 ~ 1.750000Restul impartirii lui 7 la 4 este 3

    Urmatorul program ilustreaza util izarea operatori lor de inerementare si deerementare.'include 'include .in t; main()

    int x , y ~ 10, z;

    x = ++y; /* secventa echivalenta cu: y++; xprintf("x %d, y = %d\n", x, y); y; */y = 10;z = --y + 5; /* secventa echivalenta cu: y--; zprintf("z %d, y ~ %d\n", z , y);

    y+5; */

    y ~ 10;x = y++; /* secventa echivalenta cu: x = y; y++; */printf("x %d, y = %d\n", x, y);y ~ 10;z = 3 * y--; /* secventa echiva1enta cu: zprin.f ("z = 96d, Y = %d", z, y);printf("\n");system("PAUSE") ;return 0;

    3 * y;y--; * /

    Q Programul va afisa pe ecran, dupa eompilare si executie:x ~, 11, Y 11z = 14, Y 9x ~ 10, Y 11z = 30, y 9

    IP3.61 Urmatorul program ilustreaza utilizarea operatorilor relationali si Iogici,'include 'include

    int main()int .i 10, j, k , 1 = 18, m, n;.int a, b, c, d, e;/* Sectiunea */j = i > 5;

    10

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    12/75

    k i >= 50;printf (nj = %d, k = %d\nn, j, k);/* Seetiunea 2 */m = i > ll) && (l < 19 II (1 > 10);printf(nm = %d\nn, m);/* Seetiunea 3 */n = 10 > 5 & & ! (10 < 9) I I 3 >= 4;printf (nn %d\n\nn, n);a=0,b,e=7,d 5,e;/* Seetiunea 4 */b = d += 2;printf(nb %d\nn, bl;/* Seetiunea 5 */b = e++ > 7;printf(nb = %d, e %d\nn, b, e);/* Sectiunea 6 */b = a == 0 && c;printf(nb = %d\nn, b);/* Sectiunea 7 */e = !a > c >= 2;p r in t.f t ?e = 96dn, e);printf (n\nn);system("PAUSEn) ;return 0;

    Q Programul va afisa pe ecran, dupa compilare si executie:j 1, k = 0ITI 1n 1b .. 7b 0, c 8b 1e = 0(1Discutie:Sectiunea 1: expresia i > 5 este evaluata "adevarat" (1 > 5), deci va primi valoarea ,1', apoi j

    expresia i >= 50 este evaluata .fals", deci va primi valoarea ,0', apoi k = o .Sectiunea 2: se executa mai intai parantezele; 0 & & 1= 0, apoi 0 I I 1Sectiunea 3: ordinea de evaluare este urmatoarea:

    1. (10 < 9) 02. ! (0) 13. 10 > 5 14. 1 && 1 I 1 05. n = 1

    Sectiunea 4: operatorii si ,,+=" au aceeasi prioritate si asociativitate de la dreapta spre stanga; prinurmare, ordinea de evaluare este urmatoarea:

    1. d += 22. b = 7

    11; in final m 1.

    3 >= 4 = 0(1 && 1) 110=1110=1

    d = d + 2 7Sectiunea 5: ordinea de evaluare este urmatoarea:

    1. c>7=02. b = 03. c++ = 8

    Sectiunea 6: "are prioritate mai mare decat ,,& s"; ordinea de evaluare este urmatoarea:1. a == 0 12. 1 && c 13. b = 1

    Sectiunea 7: ordinea de evaluare este urmatoarea:1. ! a 12. 1 > c = 0 0 >= 2 03. e = 0

    11

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    13/75

    Urmatorul program ilustreaza conversiile implicite de tip in expresii si atribuiri, ca si utilizarea operatoruluicast.

    #inelude #inelude int main () {

    /* Seetiunea 1 */int a 10, b = 3;float e = 10.0, d;int u, X, y;unsigned char eh 1, eh 2;double v;int i, j;float k, 1, fi, n, p;d=e/(a/b);printf("d = %f\n\n", d);/* Seetiunea 2 */u , x 230, y = 260;v = 10.333;u = v;eh_l = x;eh_2 = y;printf("u = %d eh 1 %d eh 2 %d\n\n", u, eh_l, eh 2);/* Seetiunea 3 */i 5, j = 4;k = i / j;1 = (float) (i / j);printf("k = %f\tl 9of\n", k , 1);m (float)i / j;n = i / (float)j;p = (float)i / (float)j;printf("m = %f\tn %f\tp = %f\n", m, n, p);printf (" (float) (4 * 6) / 5 = %f", (float) (4 * 6) / 5);printf ("\n");system("PAUSE") ;return 0;

    Q Programul va afisa pe ecran, dupa compilare ~iexecutie:d = 3.333333u 10 eh 1 230 eh 2 = 4k 1.000000 1= 1.000000m 1.250000 n .. 1.250000 P 1.250000(float) (4 * 6) / 5 = 4.800000

    ~ Discutie:Sectiunea 1: se evalueaza mai intai paranteza; irnpartirea lui a la b produce un rezultat intreg (3), ambii

    operanzi fiind intregi; aceasta valoare este apoi convertita la 0 valoare reala, deoarece tipullui e este f1a t (chiardaca rezultatul final al unei expresii va fi de tipul eel mai larg, regulile de eonversie implicita sunt aplieate operatie dupaoperatic),

    - Sectiunea 2: u primeste valoarea intreaga a lui v; ch_1 este afisat eorect, deoarece numarul intreg 230intra in gama de reprezentare a tipului uns igned char, adica [0, 255], in schimb ch_ 2 nu este afisat corect,producandu-se 0 pierdere de informatie (numai cei 8 biti inferiori ai lui y sunt copiati in ch_2).

    Observatie: putem deduce simplu valoarea ce va fi afisata pe ecran in acest ultim caz; numarul intreg 260exprimat in binar este 100000 I00, iar ultimii 8 biti codifica practic numarul intreg 4 (numarul d reprezentat in binar este100).

    - Sectiunea 3: alaturi de lucrurile discutate deja pana in acest moment, mai facem doar 0 precizare: teoretic, estesuficient sa fortam tipul unuia dintre cei doi operanzi ce realizeaza 0 operatie, deoarece eel de-al doilea operand va fiadus automat la tipul celui dintai.

    12

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    14/75

    3.2. Probleme propuse1. Scrieti un program care calculeaza si afiseaza pe ecran media aritmetica a doua numere intregi citite de la tastatura.

    Propuneti mai multe variante de a rezolva corect problema, tinand cont de faptul ca media trebuie sa fie un numarreal.

    2. Scrieti un program care citeste pe n intreg :;;iafiseaza valoarea expresiei n /( n + 1)cu patru zecimale.3. Deduceti ce afiseaza urmatorul program:'include 'include int main () {

    int i~3, j=5, koolO, x, z, u;float y;x = i * k / j + k j + 3 * i;pri.ntf ("x %d\n", x);y ~ (2 * k) / (float)(i * j) + 7;printf("y ~ %f\n", y);i ~3, j = 5, k = 10;z = --i * j++;printf("z = %d\nU, z);i ~3, j ~5, k 10;u i < j j > k;printf ("u = %d", u);printf ("\nU);system("PAUSE") ;return 0;

    4. Ce este incorect la urmatorul program?'include 'include int main () {

    int x;(float)x ~ 10.22;printf("x = %f\n");system("PAUSE");return 0;

    13

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    15/75

    4. Instructiunl conditionale,4.1.

    IN.IIProbleme rezolvate

    Urmatorul program simplu determina daca un numar intreg introdus de la tastatura este pozitiv (strict pozitivsau zero), sau strict negativ.

    #include #include int main ()

    int numar;printf("lntroduceti un numar intreg: ");scanf("%d", &numar);if (numar < 0)

    printf("Ati introdus un numar negativ!");else

    printf("Ati introdus un numar pozitiv!");p r int.f t v vn" ) ;system ("PAUSE");return 0;

    Urmatorul program simplu citeste un caracter introdus de la tastatura iii verifica daca acesta a fost caracterul.t'.

    #include #include int main ()

    char Chiprintf("Tastati un caracter: ");scanf{"%c", &ch);

    if (ch =~, 't')printf(nAti tastat It'!n);

    elseprintf(nAti tastat %c ...", ch);

    printf("\n");system("PAUSE");return 0;

    Urrnatorul program ilustreaza valorile logice "adevarat" si ,,fals" In C, folosind doua decizii simple.#include #include int main () {f(32)

    print f t vAcest. text va fi intotdeauna afisat.");/* orice valoare diferit de 0 este considerat& "adevarat"! */

    if(O) printf(nAcest text nu va fi afisat niciodata.");printf("\n");system("PAUSE");return 0;

    14

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    16/75

    Scrieti un program care calculeaza si afiseaza radacinile ecuatiei de gradul doi eu coeficienti realiax' + bx + c = 0 (coeficientii fiind cititi de la tastaturii); se va presupune, pentru simplificare, eii a*-O.

    'include 'include 'include int main()

    float a, b, c, delta, xl, x2;printf("Introduceti a (diferit de 0): ");scanf("%f", &a);printf("Introduceti b: ");scanf("%f", &b);printf("Introduceti c: ");scanf("%f", &c);delta = b * b - 4 * a * c;if (delta >= 0) {

    xl (-b + sqrt(delta)) I (2 * a); 1* functia sqrt()este definita in fisierul header 'math.h' 'kl

    x2 = (-b - sqrt(delta)) I (2 * a);printf("\nSe obtin radacini reale:\n");printf("xl = %1.3f\tx2 %1.3f", xl, x2);

    else {printf("\nSe obtin radacini complexe:\n");printf("xl %1.3f + %1.3fi", -b I (2 * a),

    sqrt(-delta) I (2 * a));printf("\nx2 = %1.3f %1.3fi", -b I (2 * a),

    sqrt (-delta) I (2 * a));printf("\n");system("PAUSE") ;return 0;

    Urmatorul program simplu ilustreaza functionarea instructiunilor if multiple.'inc1ude 'include int main ()int i 100, j -20;

    if(i > 0)if(i > 1000)

    printf("i este foarte mare!");else

    printf("i este mare");1* se va afisa "i este mare"; else-ul este asociat

    celui mai apropiat if *1if{j > 0)if (j > 1000)

    printf{"\nj este foarte mare!");else

    printf("\nj este negativ");/* se va afisa "j este negativ"; datorita fo1osirii

    acoladelor, else-ul este asociat primului if *1printf("\n");system("PAUSE") ;return 0;

    15

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    17/75

    Scrieti un program care sa determine daca trei numere intregi introduse de la tastatura pot constitui 0 datacalendaristica (nu se iau in consideratie anii bisecti sau daca luna are 30/31 zile),

    #include #include int main () {

    int zi, luna, an;printf{"Introduceti ziua: f l} ;scanf ("%d", &zi);printf("Introduceti luna: H) ;scanf("%d", &luna);printf("Introduceti anul: ");scanf ("%d", &an);if(zi > 0) & & (zi 0) && (luna 0) && (an < 10000)printf ("Poate fi data calendaristica.");

    elseprintf("Nu poate fi data din cauza anului!");else

    printf("Nu poate fi data din cauza lunii!");else

    printf ("Nu poate fi data din cauza zilei!");printf("\n");system("PAUSE") ;return 0;

    Scrieti un program care sa calculcze si sa afiseze minimul dintre doua numcrc reale citite de la tastatura, ~irespectiv maximul dintre valorile absolute a doua numere intregi, folosind operatorul conditional.

    #include #include .in t. main () {

    /* Sectiunea 1 */float a, b, min;int c, d, e, f;printf("Introduceti a: H) ;scanf("%f", &a);printf("Introduceti b: n) ;scanf("%", &b)imin= (a < b) ? a : b;/* secventa echivalenta cu:if (a < b)

    min a;elsemin b; */

    printf("Minimul dintre a si b este %f\n\n", min);/* Sectiunea 2 */printf("Introduceti c: H) ;scan f t vs.d", &c);printf("Introduceti d: H) ;scanf("%d", &d);e = (c < 0) ? -c : c; /* se calcu1eaza modulu1 lui c * /f = (d < 0) ? -d : d; /* se calculeaza modu1ul lui d */printf ("Maximul dintre I c I si I d I este %d", (e > f) ? e f) ;/* daca e>f se va afisa e, altfel se va afisa f */printf("\n");system("PAUSE");return 0;

    =============================

    16

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    18/75

    Urmatorul program ilustreaza functionarea structurii de selectie. Se citesc doua numere intregi a ~i b ~i0operatic intre ele (+, -, *, sau /) si sc va afisa rezultatul operatiei,

    #include #include int main ()int a, b;float rez;char op;

    printf("Introduceti a: H);scanf ("%d", &a);printf("Introduceti b: H);scanf("%d", &b);printf("Introduceti operatia: H);op = getche();switch (op)

    case 1+ r :printf("\nSuma este %d", a + b);break;case T _, 0printf("\nDiferenta este %d", a - b);break;case T * , .

    caseprintf("\nProdusulbreak;'/' :if(b

    este %d", a * b);0)

    printf ("\nlmpartirea nu se poate efectua!");else printf("\nCatul este %f", (float)a / (float)b);break;default:printf ("\nAti introdus un cod incorect!");

    printf("\n");system("PAUSE") ;return 0;

    Scrieti un program eare s a ealculeze si sa afiseze aria sau lungimea unui eere de raza data (numar intreg, eititde la tastatura), In functie de optiunea utilizatorului.

    #include #include .int main ()int r;float pichar c; 3.14;

    printf("Introduceti raza: H);scanf("%d", &r);printf("Introduceti optiunea, astfel:\n");printf("pentru arie: A sau a \n");printf("pentru lungime: L sau 1 \n");printf("pentru iesire din program: Q sau q \n\n");c=getch ();switch(c)default:printf("Optiune necunoscuta!");break;case 'q':case 'Q':printf("Iesire!") ;break;case 'a':case 'A':printf("Aria este: %.2f", pi * r * r);break;case '1':case'L':printf("Lungimea este: %.2f", 2 * pi * r);break;

    17

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    19/75

    printf ("\n");system("PAUSE") ;return 0;

    a. Discutie:- Sectiunile structurii de selectie pot fi plasate in orice ordine; de exemplu, asezarea lui default lainceputul structurii, ca in exemplul anterior, nu afecteaza in nici un fel functionarea programului.A;;a cum se cunoaste, instructiunile asociate unui case pot lipsi complet; aceasta permite, de exemplu, cadoua sau mai multe case sa execute aceleasi instructiuni rara sa fie nevoie de repetarea lor

    - Secventa din program realizata cu switch se putea scrie si folosind instructiuni de decizie multiple de tipulif-else-if, dar era evident mai complicat:

    if (c == T a' I I c ==. 'A')printf("Aria este: %.2f", pi * r * r);else if(c == 'I' I I c == 'L')printf("Lungimea este: %.2f",2 * pi * r);else if(c == 'q' I i c == T Q' )printf("Iesire!");else printf("Optiune necunoscuta!");=============================

    4.2. Probleme prop use1. Ce este incorect la urmatorul program? Ce va afisa programul daca dupa compilare si executie se introduce de latastatura numarul -10?'include 'include int main () {int i;

    printf("Introduceti un numar intreg: ");scanf("%d", &i);if(i > 0);printf("Ati introdus un numar pozitiv!");printf("\n");system("PAUSE") ;return 0;

    2. Scrieti un program care calculeaza :;;i afiseaza radacina ecuatiei de gradul inilii cu coeficienti reali ax + b =0(coeficientii fiind citit i de la tastatura); discutie.Indicatie: ecuatia are solutie daca a o F 0; daca a=0: daca b =0 ecuatia este nedeterminata, iar daca b o F 0ecuatia nu are solutie. '

    3. Folosind instructiuni de decizie, scrieti un program care citeste de la tastatura un numar intreg x ;;i afiseaza 0valoare y calculata astfel:

    {-x + 3, pentru x < 0

    y 3, pentru X E [0,4]3x - 9 , pentru X > 4

    4. Scrieti un program care citeste doua numere intregi de la tastatura, imparte cele doua numere si afiseaza rezultatul.Cum numitorul trebuie sa fie diferit de zero, discutati aceasta situatie in doua moduri: folosind 0dccizie if .,.else si respectiv operatorul conditional.

    5. Scrieti un program care sa calculeze :;;i sa afiseze maximul si minimul dintre trci numere intregi citite de latastatura, utilizand operatorul conditional.

    6. Scrieti un program care citeste de la tastatura un numar intreg intre 1 si 7 si afiseaza denumirea zilei din saptamanacorespunzatoare cifrei respective: 1 - luni, 2 - marti etc. Programul va semnaliza printr-un mesaj de eroare dacanumarul introdus nu a fost in intervalul solicitat.Indicatie: seva folosi 0 instructiune switch.

    18

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    20/75

    5. Cicluri5.1. Probleme rezolvate

    I ps.ll Urmatorul program simplu ilustreaza utilizarea ciclului cu test initial: se introduc continuu caractere de latastatura, pana cand este tastata litera ,q'.

    #inelude #inelude int main() {char eh;

    printf("Introdueeti un earaeter ('q' pentru terminare): H);eh geteh();while(eh != 'q') {printf("\nAti introdus %e" eh);eh = geteh ();

    printf("\n\nAti introdus q!");printf("\n");system("PAUSE");return 0;

    -a . Discutie:Accentuam faptul ca in C, ciclurile accepts pentru testarea conditiei oriee fel de expresii. Mai mult, se potrealiza operatii eomplexe in expresia ee semnifica testul de conditie; astfel, partea de program urmatoare:

    eh geteh();while(eh != 'q') {printf("\nAti introdus %e" eh);eh = geteh ();

    se poate scrie mai simplu astfel:while((eh = geteh() != 'q') {printf("\nAti introdus %e" eh);

    Urmatorul program simplu ilustreaza utilizarea ciclului eu test final: se afiseaza patratele numerelor intregicuprinse intre a i ; > i 2a, unde a este un intreg pozitiv care se citeste de la tastatura.

    #inelude #inelude .int main () {int a, b;

    printf("Introdueeti un numar intreg pozitiv 100): ");seanf("96d", &a);b = 2 * a;printf("start\n");do { printf("%d * %d = %d\n", a, a, a * al;

    a++;while (a

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    21/75

    (1Discutie:- Cu aceeasi observatie ca cca facuta la problema 5.1, ciclul cu test final din problema se mai poate scrie, deexemplu, astfel (reamintim ca un operator de incrementare sau decrementare utilizat ca prefix determina ca valoareanoua sa fie calculata inaintea evaluarii cxpresiei):

    do { printf("%d*%d} while(++a =21: ");scanf("%d", &n);s = 0;for(i = 1; i

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    22/75

    Q Daca se introduce de la tastatura, de exemplu, numarul 8, programul va afisa:Introduceti un numar natural par: 88 5126 2164 642 8

    a. Discutie:~ Programul numara descrescator, din doi in doi, de la valoarea introdusa de utilizator si pana la 2, apoi afiseaza

    aceste numere, impreuna cu cuburile acestora, pe randuri succesive.- Sunt ilustrate 0 serie de variatii in modul de utilizare ale ciclului cu contor in C:" sectiunea initializare a ciclului lipseste, deoarece contorul i este initializat practic de catre utilizator in

    afara ciclului (atentie insa ca semnul ,;' trebuie sa fie prezent!);.. testul de conditie are urmatoarea semnificatie: ciclul se reia atat timp cat i este "adevarat", adica diferit

    de zero; de asemenea, se observa ca modificarea contorului se poate face cu orice valoare, si nu numa; cu 1 (ca inPascal, de cxemplu);

    II contorul este utilizat : ; ; i in corpul cic1ului, in cazul problemei de fa!a pentru calculullui j (acest lucru esteposibil, asa cum s-a specificat si la partea teoretica, deoarece valoarea contorului nu este modificata de operatiile dincadrul ciclului).- Daca numarul introdus de la tastatura este negativ, sau pozitiv impar, cic1ul se repeta la infinit (justlflcatiaceasta afirmatiel).

    Scrieti un program care citeste de la tastatura doua numere naturale a si b, cu a < b, afiseaza numerelenaturale din intervalul [a , b ] in ordine crescatoare si apoi descrescatoare, :;;ide asemenea calculeaza siafiseaza media aritmetica a numerelor a si b.

    #include #include int main () (

    int a, b, i, s = 0;printf("Introduceti a (natural): ");scanf("%d", &a);printf("Introduceti b (natural, b>a): ");scanf("%d", &b);printf("\nNumerele dintre a si b in ordine crescatoare:\n");j_ = a;while (i = a);

    printf("\n");printf("Media aritmetica a numerelor dintre a si b: ");for (i = a; i

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    23/75

    Scrieti un program care citeste de la tastatura un numar intreg n din intervalul [0, 100], calculeaza siafiseaza pe n!

    'include 'include int main ()

    int n, i;double fact;/* variabila fact = n! este declarata 'double' deoarece

    poate avea valori care sa nu poata fi reprezentate nicicu 4 octeti! */

    printf("Introduceti un numar intreg intre a si 100: "I;scanf("%d", &n);while(n < a II n > 100)

    printf("Numarul introdus nu apartine intervalului!"I;printf("\nlntroduceti din nou numarul: "I;scanf{"%d", &n);

    if(n > 0)for (fact = 1.0, i = 2; i

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    24/75

    ~ Discutle:~ Programul foloseste un ciclu cu contor pentru a cauta divizorii; se parcurge intervalul [2, n /2],

    incrementand unitar contorul i si se cauta numerele la care n se imparte exact (n%i==O). Variabila auxiliara k,initializata cu 0, devine 1 daca s-a gasit eel putin un divizor.

    ~ Justtflcati conditia de tenninare a cicIului i

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    25/75

    Urmatorul program ilustreaza folosirea instructiunilor break si continue: se afiseaza numereleimpare dintre 1 si un numar natural ales de utilizator; trebuie sa se permita reluarea exercitiului (tara iesireadin program), daca utilizatorul doreste acest lucru, iar daca valoarea introdusa este sO, programul va tipariun mesaj de eroare :;;iva fi abandonat.

    #include #include int main() {

    int n, .i, k;char Chik co 1;do { printf("Introduceti un numar natural (>0): H);scanf("%d", &n);if(n

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    26/75

    6.1.I p 6 . 1 1

    6. Tablouri ~isiruri de caractereProbleme rezolvate

    Scrieti un program care citeste de la tastatura un vector de maxim 10 elemente intregi impreuna cudimensiunea sa efectiva si apoi afiseaza elementele sale.Precizare: Intrudit la rularea programului nu este cunoscut de la inceput numarul de elemente (el este maimic dedit 10) se va opta pentru citirea, la inceput, a numarului de elemente.

    #include 'include int main () {int v[lO], n, i;

    printf(nlntroducetj nr. de elemente: n);scanf(n%dn, &n);for(i = 0; i < n; i++) {printf("v[%d] = ", i);scanf(n%dn, &v[i]);

    printf("Valorile citite sunt:\nn);for(i = 0; i < n; i++)printt vv lsd] = %d\n", i, v[i]);

    system ("PAUSE:") ;return 0;

    Q Programul va afisa pe ecran dupa compilare si executie:Introduceti nr. de elemente: 3v[O] -1v[l] 0v[2] 1Valorile citite sunt:v[O] -1v[1] 0v[2] 1

    ~ Discutie:- Primul ciclu for citeste elementele vectorului.eel de al doilea ciclu for afiseaza valorile citite si memorate.

    Scrieti un program citeste un vector de elemente intregi, irnpreuna cu dimensiunea sa efectiva, afiseaza inordine inversa elemente1e vectorului ~icalculeaza media aritmetica a elementelor sale.

    #include #include int main () {int v[101, n, .i , s;float m;

    printf("Introduceti n: ");scanf (n%d", &n);for(i = 0; i < n; i++) {printf("v[%d] = ", i);scanf(n%dn, &v[i]);

    for(i = n - 1; i >= 0; i--)printf(n%d ", v[i]);s = 0;for(i = 0; i < n; i++)

    s += v[il;25

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    27/75

    m = (float)s / n;printf("\tma %.2f\n", m};system("PAUSE"};return 0;

    Q Programul va afisa pe ecran dupa compilare si executie:Introduceti n: 4v[O) 1v[l) 2v[2) 3v[3) 44 3 2 I rna 2.50

    ~ Discutie:~ Dupa citire numarului de clemente, 11, primul ciclu for citcste elementele vectorului.~ Al doilea ciclu for parcurge vectorul de la ultimul (i ia valoarea n - 1) pana la primuI sau clement (i >= 0)

    prin decrementarea (i --) contorului.~ Variabila s (ce va contine suma tuturor elementelor vectorului) se initializeaza cu valoarea O.Al treilea ciclu

    for parcurgc vectorul si la fiecare pas al ciclului se aduna la vechea valoare a variabilei s, valoarea lui v [i1 .~ La final, media aritmetica, rna, este calculata ~iafisata, De remarcat conversia de tip (floa t)s / n.

    Scrieti un program care citeste un vector de elemente intregi, impreuna cu dimensiunea sa efectiva, ~idetermina maximul ~iminimul dintre elementele acestui vector.

    'include 'include int main () {int v[20], n, i, max, min;

    printf("Introduceti numarul de elemente din vector: "I;scanf t t'ad ", &n);for(i = 0; i < n; i++1 {printf("v[%d] = ", il;

    scanf("%d", &v[i)};

    min = max = v[O];for(i ; .i < n; i++1if(v[i] >= max )max = v[i];if(v[i)

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    28/75

    '(1 Discutie:- Dupa citire numarului de elemente, n, primul ciclu for citeste elementele vectorului.- Variabilele min ~imax sunt initializate cu valoarea primului element din vector, v [0 1. Algoritmul parcurge

    vectorul si testeaza la fiecare pas al ciclului for pentru fiecare element v [i1, relatia sa de inegalitate in raport cumin respectiv max. In primul caz, daca v [ i 1 este mai mare dedit max, atunci elementul v [ i 1 reprezinta unmaxim local si deci valoarea lui v [ i lise atribuie variabilei max. In al do ilea caz, daca v [ i 1 este mai mic deditmin atunci elementul v [i 1 rcprezinta un minim local si deci valoarea lui v [i lise atribuie variabilei min. Lasfarsitul ciclului for, variabilele min si max contin valorile minima respectiv maxima din vectorul v.

    Scrieti un program care citeste un vector de elemente intregi, impreuna cu dimensiunea sa efectiva,ordoneaza crescator elementele vectorului si apoi afiseaza vectorul ordonat. Se va utiliza metoda de ordonare(se utilizeaza ;;itermenul sortare) denumita, in limba engleza, "bubble-sort".

    hnclude hnclude int main () {

    int v[20], n, i, ind, tmp;printf("Introduceti numarul de elemente din vector: ");scanf ("%d", &n);for(i 0; i < n; i++) {

    printf("v[%d] = ", i);scanf("%d", &v[i]);

    doind = 0;for(i 0; .i . < n - 1; i++)

    if(v[i] > v[i+l]) {tmp v[i] ;v[i] v[i+l];v[i+lJ = tmp;ind = 1;

    while (ind) ;for(i = 0; i < n; i++)

    printf("v[%d] %d\n", .i, v[i]);system("PAUSE") ;return 0;

    Q Programul va afisa pe ecran dupa compilare si executie:Introduceti numarul de elernente din vector: 4v[O) -1v[l] 4v[2] = 2v[3] 0v[O] -1v[l] 0v[2] 2v[3) = 4

    '(1 Discutie:- Primul ciclu for citeste elementele vectorului. Anterior acesteia a fost citit numarul de elemente alevectorului, n.- Programul utilizeaza 0 variabila ind, cu rol de indicator. Aceasta variabila se initializeaza cu valoarea 0inaintea unui ciclu care compara perechile succesive de elemente ale vectorului, elementul curent ;;iurmatorul. Pentruparcurgerea vectorului se foloseste un ciclu for care evolueaza de la 0 pfma la penultimul element (ultima comparatiese face intre penultimul si ultimul element). Daca 0 pereche de elemente succesive este in ordinea dorita se trece lacompararea urmatoarei perechi. Daca 0 pereche de elemente nu se afla in ordinea dorita se schimba intre cle sivariabilei ind i se atribuie valoarea 1. Parcurgerea cic1ului se reia pana cand toate elementele sunt in ordinea dorita,

    respectiv pana cand ind i;;i pastreaza valoarea 0 dupa parcurgerea intregului vector. Aceasta este metoda deordonare / sortare "bubble-sort".- Pentru interschimbarea elementelor care nu se afla in ordinea dorita se utilizeaza variabila temporara tmp.

    27

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    29/75

    Scrieti un program care citeste 0matrice de maxim 10 x 10elemente intregi, impreuna cu dimensiunile saleefective (linii respectiv coloane) si afiseaza atat matricea initiala cat si matricea avand coloanele pareinterschimbate cu coloanele impare (interschimbarea afecteaza coloanele alaturate, 0-1, 2-3 etc.).

    'include #include int main () {int A [l0] [10], m, n, .i, j, tmp;

    printf("Introduceti nr. de linii: ");scanf("%d", &m);printf("Introduceti nr. de coloane: ");scanf("%d", &n);for(i = 0; i < m; i++)for(j 0; j < n; j++) {

    p rintf t vAj s.d][%d] =" .i, j);scanf("%d", &A[i] [jJ);

    printf("\nMatricea citita este:\n");for(i = 0; i < m; i++) {for(j = 0; j < n; j++)printf("%d\t", A[iJ [jJ);printf("\n");

    for (j = 0; j < (n / 2) * 2; j += 2)for t i, = 0; i < m; i++) (tmp = A [iJ [j];AliJ [jJ c. A[iJ [j+1J;A [iJ [j +1J = tmp;

    printf("\nMatricea avand coloane1e interschimbate este:\n");for(i = 0; i < m; i++) (for(j = 0; j < n; j++)printf("%d\t",A[iJ [jJ);printf("\n");

    system("PAUSE") ;return 0;

    Q Programul va afisa pe ecran dupa compilare si executie:Introduceti nr. de linii: 2Introduceti nr. de coloane: 2A[O] [0] 1A[O] [1] 2ADJ [0] 3A[l] [1] 4Matricea citita este:1 23 4Matricea avand coloanele interschimbate este:2 14 3

    Daca se introduce 0 alta matrice rezultatul va fi:Introduceti nr. de linii: 3Introduceti nr. de coloane: 5A[O] [OJ 1A[O] [1] 2A[OJ [2] 3A[O] [3] 4A[O] [4J 5

    28

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    30/75

    A[l] [0] 6A[l] [1] 7A[l] [2] 8A[l] [3] 9A[l] [4] 10A[2] [0] 11A[2] [1] 12A[2] [2] 13A[2] [3] 14A[2] [4] 15Matricea citita este:1 2 3 4 56 7 8 9 1011 12 13 14 15Matricea avand2 17 612 11

    coloanele interschimbate4359 8 1014 13 15

    este:

    ~ Discutie:- A ten fie: daca textul problemei nu specifics in mod explicit ca avem de a face cu 0 matrice patrata, matriceaprelucrata poate avea numarul de linii diferit de eel de coloane!Citirea elementelor matricei A se face cu ajutorul a doua cicluri for imbricate: prima din ele, care utilizeazacontorul i, parcurge liniile matricei; a doua, ce utilizeaza contorul j, parcurge coloanele matricei A. Reprezentareasugestiva a parcurgerii matricei in acest caz este prezentata in Figura 6.a. Parcurgerea unei matrice se poate face, ingeneral, utilizand si parcurgerea pe coloane si apoi pe Iinii ca in Figura 6.b.

    A[l] [0] A[l] [1] (6.a)

    A[O] [0] A[O] [1]

    - Interschimbarea coloanelor pare cu cele impare se face utilizand a doua modalitate de parcurgere a matricei.Cu exceptia cazului cand n este impar, toate coloanele j se interschimba cu coloanele j+1 utilizand 0 variabilatemporara tmp pentru fiecare element A [i1 [j].

    Scrieti un program care citeste de la tastatura 0 matrice patrata de dimensiune maxima lOx 10 elementereale impreuna eu dimensiunea sa efectiva si determina ;;i afiseaza suma elementelor de pe diagonalaprincipala si de pe diagonala secundara,

    #inc1ude #include int main () {float mat [10][10];int dim, i ,j;float sum1 ~ 0.0, sum2 = 0.0;

    printf("Introduceti dimensiunea matricei patrate: H);scanf("%d", &dim);/* Citirea matricei */for(i ~ 0; i < dim; i++)for (j ~ 0; j < dim; j++) {printf("Introduceti mat[%d] [%d]: " if j);scanf("%f", &mat[i] [j]);/* Afisarea matricei citite */printf("\nMatricea introdusa este:\n\n");for(i ~ 0; i < dim; i++) {for (j 0; j < dim; j++) {printf("%1.3f\t",mat[i] [j]);

    )printf("\n");

    29

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    31/75

    /* Suma elementelor de pe diagonala principala */for(i = 0; i < dim; i++)

    suml += mat [il[iJ ;printf("\nSuma elementelor de pe diagonala principala");printf(" este %1.3f\n", suml);/* Suma elementelor de pe diagonala secundara */for(i 0; i < dim; i++)

    sum2 += mat[iJ [dim-i-lJ;printf("\nSuma elementelor de pe diagonala secundara");printf(" este %1.3f\n", sum2);system(nPAUSE") ;return 0;

    Q ProgramuI va afisa pe ecran, dupa eompilare ~iexecutie:Introduceti dimensiunea matricei patrate: 4Introduceti mat [0 J [OJ: 1Introduceti mat [0J[1J: 2Introduceti mat [OJ [2] : 3Introduceti mat [OJ [3J : 4Introduceti mat [1J [OJ: 5Introduceti mat[IJ[lJ: 6Introduceti mat [l ] [2] : 7Introduceti mat[lJ [3J : 8Introduceti mat [2] [0] : 9Introduceti mat [2 J [lJ : 10Introduceti mat [2J [2]: 11Introduceti mat [2J[3J : 12Introduceti mat [3J [OJ: 13Introduceti mat [3J [lJ : 14Introduceti mat [3J [2J : 15Introduceti mat [3] [3J : 16Matricea introdusa este:1.0005.0009.00013.000

    2.0006.00010.00014.000

    3.0007.00011.00015.000

    4.0008.00012.00016.000

    Suma elementelor de pe di..gonala principala este 34.000Suma elementelor de pe diagonala secundara este 34.000

    ~ Dlscutie:Mai intiii se citeste dimensiunea cfectiva a matrieei si apoi elerncntelc sale. Programul nu verifies faptul eadimensiunea nu depaseste dimensiunea maxima. Recomandam ea citirea dimensiunii sa se faca astfel:

    do {printf(nlntroduceti dimensiunea matricei patrate: H);scanf ("%d", &dim);

    while (dim < 1 II dim> 0);- Apoi se afiseaza matricea citita pentru a verifica datele introduse,Se calculeaza : ; ; i se afiseaza suma clementelor de pe diagonala principals. Aeeste elemente au acelasi indicepentru linii :;;icoloane.Se calculeaza si se afiseaza suma elementelor de pe diagonala secundara, Aeeste clemente au indieele eoloaneiegal eu "dimensiunea - indicele randului - I". In expresia anterioara trebuie sa scadem I pentru ea in C numaratoarea

    incepe de la O!

    Scrieti un program care citeste doua siruri de maximum 100de caractere de la tastatura, concateneaza aIdoilea sir de earaetere la primul si afiseaza rezultatul.

    'include 'include int main () {

    char sl[201J. 82[101J;int i. j;30

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    32/75

    i = j = 0;printf{"Introduceti sirul 1: ");scanf("%s", 81);printf{"Introducetj sirul 2: "I;scanf ("%s" I 82);while (sl[i] != NULL)

    i++;/* atribuie de la capatul sirului 1

    caracterele din s2 cat timp mai sunt caractere in s2 */while{s2[j] != NULL) {sl[i] = s2[j];i++;j++;

    sl[i] = NULL;printf ("%s\n", sl);system{"PAUSE") ;return 0;

    Q Daca se introduc de la tastatura sirurile "aaa" respectiv "bbb" programul va rula astfel:Introduceti sirul 1: aaaIntroduceti sirul 2: bbbaaabbb

    a. Discutie:Cele doua siruri de caractere, s 1 si s2, sunt citite cu ajutorul functiei scanf () .Primul ciclu whi Le parcurge sir I pana la capat prin detectarea conditiei s 1 [i 1 == NULL. Din acel

    moment caracterele din al doilea sir se adauga in continuare in primul sir cu al doilea ciclu while. Al doilea cicluwhi Le se putea scrie condensat astfel: while ( (s I [i ++ 1 s2 [j++ 1 ) != NULL);

    ~- Se remarca utilizarea operatorului de post-incrementare. Cat timp rezultatul atribuirii s 1 [i 1 = s2 [j 1 nueste NULL, adica sir2 nu s-a terminat, se incrementeaza i, apoi se incrementeaza j. Corpul instructiunii whilecontine 0 instructiune vida intrucat atribuirile sunt realizate direct in conditia instructiunii,

    La iesirea din al do ilea ciclu whi Ie, pentru a marca sfarsitul sirului concatenat, se atribuie s 1 [i I= NULL.Problema se poate rezolva si apeland functia standard strcat () astfel:

    #include #include lfinclude int main () (char sl[201], s2[10l];

    printf{"Introduceti sirul 1: ");scanf{"%s", sl);printf{"Introduceti sirul 2: ");scanf{"%s", 52);strcat{sl, s2);printf{"%s\n", sl);system{"PAUSE") ;return 0;

    Scrieti un program care citeste un sir de maximum 100 de caractere de la tastatura :;;iapoi citeste inca uncaracter separat, care se va elimina din sirul de caractere daca el exista in sir. Programul va afisa rezultatul.

    #include #include int main{) (charsir[101], c;int .i, j;

    printf{"Introduceti sirul de caractere\n");printf{"apoi caracterul ce se doreste eliminat "I;

    31

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    33/75

    printf("separat prin spatiu\n");scanf{"%s %c", sir, &c);

    for(i ~ j ~ 0; sir[i] !~ NULL; i++)if (sir[i] !o c)

    sir[j++] sir[i];sir[j] NULL;printf ("%s\n", sir);

    system("PAUSE") ;return 0;

    Q Daca se introduc de la tastatura sirul "or ar Ii respectiv caracterul '0, programul va rula astfel:Introduceti sirul de caractereapoi caracterul ce se doreste eliminat separat prin spatiuorar 0rar

    ~ Discutie:~ Ciclul for parcurge sirul de caractere, sir. Cit timp nu s-a atins sfarsitul sirului, adica sir [i] != NULL,

    se testeaza daca elementul curent este diferit de caracterul ce se doreste eliminat, sir [i] != c,:;;i daca da atuncielementul curent din sir se pastreaza pe pozitia curenta prin atribuirea sir[j++] sir[il, echivalenta cusecventa: sir [j] = sir [i]; j++; (j se incrementeaza pentru a pregati urmatoarea iteratie). Daca elementulcurent este identic cu caracteruI ce se doreste eliminat, atunci atribuirea anterioara nu are loc, astfel ca in urmatoareleiteratii, sir [j], care este urmatorul element din sir, va fi suprascris cu primul caracter diferit de c intalnit insir.

    ~ De remarcat atribuirea sir [j ] NULL care marcheaza sfarsitul de sir.

    Scrieti un program care citeste un sir de maximum 100 de caractere de la tastatura si afiseaza acest :;;irinordine inversa,

    'include 'include

    int main () {char sir[lOl];int i ~0;scanf("%s", sir);

    while(sir[i] '~NULL)i++;

    while (i >~ 0) {i--;printf("%c", sir[i]);

    system("PAUSE") ;return 0;

    Q Daca de la tastatura se introduce :;;il1JI"abed n, programul va rula astfel:abeddcba

    32

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    34/75

    6.2. Probleme propuse1. Scrieti un program care citeste de la tastatura un vector de maximum 50 de numere intregi si determina numarul

    elementelor impare ale vectorului.2. Scrieti un program care citeste de la tastatura doi vectori de maximum 100 de clemente intregi (numarul

    elementelor poate fi diferit) apoi determina si afiseaza intersectia celor doi vectori (adica elementele comune celordoi vectori).

    3. Scrieti un program care citeste de la tastatura un vector de maximum 20 de clemente intregi ;;i mterschimbaelementele de pe pozitii pare cu cele de pc pozitiile impare.

    4. Scrieti un program care citeste de la tastaturii un vector de maximum 30 de clemente intregi si sorteaza in ordinecrescatoare doar elementele de pe pozitiile impare.

    5. Scrieti un program care citeste de la tastatura un vector de maximum 15 elcmente intregi si insereaza un elementpe 0 pozitie k. Precizare: se vor citi de la tastatura vectorul impreuna cu dimensiunea sa efectiva, elementul ce sedoreste inserat precum si pozitia unde se doreste inserat elementul.

    6. Scrieti un program care citeste de la tastatura 0 matrice patrata de dimensiuni maxime lOx 10 e1emente reale,afiseaza matricea transpusa si apoi calculeaza suma elementelor matricei.

    7. Scrieti un program care citeste de la tastatura 0 matrice de dimensiuni maxime lOx 10 clemente intregi apoidetermina si afiseaza elementele maxime de pe fiecare linie.

    8. Scrieti un program care citeste de la tastatura 0 matrice patrata de dimensiuni maxime 100 x 100 clemente realeapoi calculeaza suma elementelor de sub si de deasupra diagonalei principale.

    9. Scrieti un program care citeste de la tastatura doua matrice A si B (de dimensiuni maxime 10 x 10 clemente reale)apoi calculeaza produsullor. Precizare: programul va sernnala cazul in care cele doua matrice nu se pot inrnulti,

    10. Scrieti un program care citeste de la tastatura doua siruri de caractere (de maximum 51 de caractere fiecare) :;;ielimina toa te caracterele continute in al do ilea sir din primul sir,Exemplu: sirl = "abedabed", sir2 = "ad" si trebuie sa rezulte "bebe".

    11. Scrieti un program care citeste de la tastatura doua siruri de caractere (de maximum 11 caractere fiecare) siafiseaza pc ecran numarul de aparitii ale caracterelor din primul sir in eel de al doilea sir,Exemplu: sirl = "abc", sir2 = "aacde"si trebuie sa rezulte "a 2, b = 0 r e = 1"

    12. Scrieti un program care citeste de la tastatura doua siruri de caractere (de maximum 41 de caractcre fiecare) ~idetermina de cate ori apare secventa de caractere din al doilea sir in primul.Exemplu: sirl = "abedabce", sir2 = "ab"si programul trebuie sa afiseze "Sirul ab apare de 2 ori".

    13. Scrieti un program care citeste de la tastatura doua siruri de caractere (de maximum 31 de caractere fiecare) sitransforma caractcrelc majuscule in minuscule :;;icaracterele minuscule in majuscule.Exemplu: sir "abedABC";;i programul trebuie sa afiseze "ABCDabe".

    33

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    35/75

    7. Alte tipurl de date:structuri, uniuni, tipul enumerat7.1.

    I p 7 . 1 1Probleme rezolvate

    Scrieti un program care citeste dateIepentru un grup de eel muIt 10persoane si afiseaza datele citite.Precizari: Pentru ficcare pcrsoana se vor mcmora numele, prenumele si data nasterii. Datele fiecareipersoane va fimemorat sub forma unei structuri. Data nasterii va fi tot 0 structura care va avea campurile zi,luna si an.

    #include 'include int main () {struct dataint zi;char luna[12j;

    int an;) ;struct persoana {char nume[20j;char prenume[20j;struct data datan;) ;struct persoana grup[10j;int if n;do ( printf(nlntroduceti numaru1 de persoane: n);scanf (n%dn, &n);while n 10));for(i ~ 0; i < n; i++)

    do printf(nNume Prenume An Luna Zi\nn);scanf(n%s\t%s\t%d\t%s\t%dn,&grup[ij .nume, &grup[ij .prenume,&grup[ij .datan.an, &grup[ij .datan.luna,&grup[ij .datan.zi);whi1egrup[ij .datan.an < 0) IIgrup[ij .datan.z.i= 31)));

    printf(nNume Prenume An Luna Zi\nn);for(i ~ 0; i < n; i++)printf(nl%s\tl%s\tl%d\tl%s\tl%d\tl\nn,grup[ij .nume, grup[ij .prenume, grup[ij .datan.an,grup[ij.datan.luna, qrup Ii].datan.zi);

    printf(n\nn);system(npAUSEn) ;return 0;

    Q Programul va afisa:Introduceti numarul de persoane: 2Nume Prenume An Luna ZiPOPA Marius 1980 Mai 22Nume Prenume An Luna ZinUTA Ioana 1981 Iunie 2Nume Prenume An Luna ZiIPOPA IMarius 11980 IMai 122IDUTA IIoana 11981 lLunie 12

    34

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    36/75

    ~ Discutie:~ In programul anterior se definesc doua structuri: data si persoana. Structura persoana utilizeaza un

    camp datan care este de tipul struct data.~ Variabila grup este un tablou de 10 elemente de tipul persoana.Primul ciclu do ~ while citeste numarul de persoane, n, care trebuie sa fie un numar pozitiv si mai mic

    dedit 10. Deci corpul ciclului va fi executat pana cand n va fi in intervalul [1,10].- Al doilea cic1u for citeste element cu element persoanele din variabila grup. De notat ea elementul

    grup l il are 3 campuri: primele doua (nume, prenume) sunt de tipul sir de caractere in timp ce al treilea este detipul struct datan. Al treilea camp are la randul sau trei alte campuri: zi, luna si an. Deci pentru accesareaacestor subcampuri avem nevoie de operatorul "." aplicat de d O U G ori asupra unei variabile de tipul q rup . i J .

    ~ Al treilea ciclu f or afiseaza rezuItateIe citite de la tastatura ca un tabel sub forma:1 Nume 1 Prenume 1 An 1 Luna 1 Zi I

    Scrieti un program care citeste doua numere complexe de la tastatura, calculeaza si afiseaza suma celor douanumere complexe.Precizare: Un numar complex se va memora sub forma unei structuri cu campurile real si imago

    'include 'include int main(void) {

    typedef structfloat real;float imag;complex;complex a, b, sum;printf("Introduceti partea reala a primului nr.: H);scanf("%f", &a.real);printf{"Introduceti partea imaginara a primului nr.: ");scanf("%f", &a.imag);pri.n f ("Introduceti partea reala celui de al doilea nr. : ");scanf("%f", &b.real);printf(Hlntroduceti partea imaginara celui de al H);printf ("doilea nr.: ");scanf("%f", &b.imag);sum.rea]sum.imag a.real + b.real;a.imag + b.imag;printf("Suma celor doua numere complexe este: H) ;printf('t %.2f + (%.~f) * i\nll, sum.real, 5um.imag);system ("PAUSE");return 0;

    Programul va afisa:Introduceti partea reala a primului nr.: 1.2Introduceti parte a imaginara a primului nr.: 1.0Introduceti partea reala a celui de al doilea nr.: -0.2Introduceti partea imaginara a celui de al doilea nr.: 0Suma celor doua numere complexe este: 1.00 + (1.00) * i

    ~ Discutie:Declaratia typedef introduce un tip utilizator cu numele complex. Structura are doua campuri: real :;;i

    imag de tipul f loa t. a, b si sum sunt cele trei variabile utilizate in cadrul programului. a si b se citesc de latastatura iar rezultatul sumei complexe se atribuie variabilei sum. Aceasta atribuire se poate face numai utilizandoperatorul "." pentru a selecta individual campurile real :;;i imago De notat ci'i atribuirea sum = a + b nu esteposibila in C.

    Scrieti un program care citeste si stocheaza doua momente succesive de timp, ce reprezinta, de exemplu,momentul la care a plecat un atlet ~i respectiv a sosit un atlet intr-o competitie. Programul va afisa timpulscurs intre cele doua momente.

    35

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    37/75

    #include #include int main () {

    struct timp {int ora; /* ora */int min; /* minutul */int sec; /* secunda */

    ) ;struct timp start, stop;int start_int, stop_intiprintf("Introduceti start: H) ;scanf("%d:%d:%d", &start.ora, &start.min, &start.sec);printf("Introduceti stop:");scanf("%d:%d:%d", &stop.ora, &stop.min, &stop.sec);start int - start.ora * 3600 + start.min * 60 + start. sec;stop_int = stop. ora * 3600 + stop.min * 60 + stop. sec;printf("timp: %d s\n", stop_int - start .int.j :system("PAUSE");return 0;

    Q Programul va afisa:Introduceti start: 10:11:10Introduceti stop: 10:12:11tirnp: 61 s

    ~ Discutie:start si stop reprezinta doua variabile care stocheaza ora, minutul si secunda in care a plecat respectiv a

    terminat proba atletul. start int si stop_int reprezinta echivalentul In secunde al celor doua momente detimp. Relatia de calcul are in vedere faptul ca 0ora are 3600 de secunde iar un minut are 60 de secunde, Diferenta dintrecele doua variabile, stop_int - start_in t, reprezinta echivalentul in secunde al timpului efectuat.

    Scrieti un program care determina spatiul de memorie ocupat de 0 structura.#include #include struct exempluint i;

    int *p;double d;char str[80];

    )s;int main ()

    printf("Structura exemplu are dimensiunea: %d octeti.", sizeof(struct exemplu));printf("\n");system("PAUSE") ;return 0;

    Q Programul va afisa:Structura exemplu are dimensiunea: 96 octeti.

    Scrieti un program care codeaza :;;idecodeaza un intreg folosind uniuni prin inversarea ordinii octetilor carecompun numarul intreg. Pentru valorile variabilelor din program, se va afisa:10 codat este: 167772160167772160 decodat este: 10

    36

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    38/75

    'include 'include int encode(int i);int main ()int i;int in;union coddecodint num;char c[4];

    crypt;unsigned char Chiprintf("Intoduceti un numar intreg: H);scanf ("%d", &in);/* codarea intregului */crypt.num in;ch = crypt.c[O];crypt.c[O] = crypt.c[3];crypt.c[3] ~'ch;ch = crypt.c[lcrypt.c[l] =crypt.c[2] = Chii = crypt.num;printf("%d codat este: %d\n", in, i);/* decodarea intregului */crypLnum = i;ch crypt.c[O];crypt.c[O] = crypt.c[3];crypt.c[3] = Chich = crypt.c[l];crypt.c[l] = crypt.c[2];crypt.c[2] Chiin = crypt.num;printf("%d decodat este: %d", i, in);printf("\n");system("PAUSE") ;return 0;

    Q Programul va afisa pe ecran, dupa compilare si executie:Intoduceti un numar intreg: 1010 codat este: 167772160167772160 decodat este: 10

    ~ Discutle:Prin intermediul unci uniuni se pot accesa octetii care compun un numar intreg.Scrieti un program care memoreaza pe rand, in acelasi spatiu de memorie, un caracter, un numar intreg siunnumar real.

    'include linclude .int main () {union (char c;int i;float f;

    ) u;u.c = 'A';printf("Un caracter: %c\n", u.c);u.i = 65;printf("Codul ASCII: %d\n", u.i);

    37

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    39/75

    printf("Caracterul urmator: %c\n", u.c + 1);u.f = u.i + 0.14;printf("Un float: %.2f\n", u.f);u.f 3.14;u.i = 2;printf("Aria cercului de raza %d: %.2f\n", u.i, u.f * u.i * u.i);system("PAUSE") ;return 0;

    Q Programul va afisa:Un caracter: ACodul ASCII: 65Caracterul urmator: BUn float: 65.14Aria cercului de raza 2: 0.00

    'z1 Discutle:In cadrul programului sc defineste 0 variabila u avand tipuI "union". Variabila poate stoca la un momentdat un caracter, un intreg sau un numar real.- Primcle doua linii dupa declararea variabilei atribuie variabilei u, in campul c (adica u , c) valoarea IA I.Variabila este apoi tiparita cu ajutorul speeifieatorului de format %c pentru earactere.Urmatoarele trei linii ilustreaza atribuirea valorii 65, de data aceasta, campului i.In acest punct al executieiprogramului, valoarea campului c este distrusa. Tiparirea se va face utilizand specificatorul de format %d.A treialinie ilustreaza tiparirea caracterului asociat codului ASCII imediat urmator, Intrucat codul ASCII are valoarea 65 (elavand asociat caracterul IA '), programul va afisa caracterul IB I.Urmatoarele 2 linii atribuie campului f 0 valoare egala cu vechea valoare a campului i (adica 65) la carese aduna 0.14. De remarcat faptul ca vechea valoare, 65, se pierde numai dupa ce a avut loc atribuirea, adicaordineaoperatiilor se desfasoara astfel incat se aduna intai 65 cu 0.14 ~i apoi se atribuie lui u. f valoarea 65.14. In acestmoment, u . i i;;ipierde valoarea 65.Ultimele trei linii ilustreaza calculul ariei unui cere intr-un mod gresit, In primele doua linii atribuirile u. f

    = 3.14 (adica numarul PI);;i u. i = 2 (adica raza cercului) au ca efect modificarea valoarea lui PI astfel incatrezultatul final este In mod gresit altul dccat eel asteptat, Intrucat 0variabila de tipul enumerat poate lua valori de maimulte tipuri in timpul executiei programului, in lucrul cu uniuni trebuie avut grija ca la orice moment de timp sa fie stinttipul datei ce se afla stocat in variabila uniune.Reluati problema anterioara dar construiti si 0 metoda care va permite sa aflati in orice moment tipulinformatiei stocate.

    'include 'include int main () (struct (int tip;union (char c;int i;float f;

    ) u;} z;z.u.c = TAl;z.tip = 0;z.u.f 3.1415;z.tip 2;switch (z.Lip) (case 0: printf("Un caracter: %c\n", z.u.c);break;case 1: printf("Un intreg: %d\n", z.u.i);break;case 2: printf("Un float: %f\n", z.u.f);break;default: printf("Format necunoscut\n");break;

    system("PAUSE") ;return 0;

    Q Programul va afisa:Un float: 3.141500

    38

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    40/75

    ~ Discutie:~ Acest program ilustreaza utilizarea unei uniuni, u, in cadrul unei structuri, z. Structura are un camp, tip, de

    tipul intreg, Valorile pe care Ie ia campul tip (de exemplu: 0pentru caractere, 1pentru intregi ~i 2pentru real), pot fimodificate la momentul atribuirii unui subcamp al uniunii, u. Astfel, in orice moment de timp se cunoaste tipul stocatin campul u dupavalorile carnpului tip.

    ~ Instructiunea swi tch decide, functie de valoarea din campul tip (0, 1, 2), cum trebuie afisatavariabila z.

    Scrieti un program care calculeaza media notelor obtinute la probele de verificare (laborator, partial siexamen) ale unei materii (fizicd, biologie si chimie) utilizand tipul enumerat.

    #include #include

    int main() {typedef enum {laborator, partial, examen) didactic;didactic activitate;typedef enum {fizica, biologie, chimie) materii;materii materielfloat nota, suma;for(materie = fizica; materie

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    41/75

    7.2. Probleme propuse1. Scrieti un program care citeste de Ia tastatura un vector de elernente complexe, calculeazii si afiseaza suma

    cornplexa a tuturor elementelor sale.

    2. Scrieti un program care citeste de la tastatura un vector de elemente complexe, calculeaza :]i afiseaza produsulcomplex al tuturor elementelor sale.3. Sa se modifice programul P7.3 astfel incat sa nu mai afiseze numai numarul total de secunde, ci ;;i t impul efectuat

    sub forma: ore : minute : secunde.Exemplu: 3700 secunde reprezinta lora, I minut si 40 de secundeadica i.L:1: 40".

    4. Scrieti un program care citeste de la tastatura un vector de coordonate ale unei structuri impreuna cu maseleplasate la coordonatele respective si calculeaza centrul de greutate al structurii.Precizari:- ficcare coordonata impreuna cu mas a asociata se va memora intr-o structura definita astfel:typedef struct

    float x, y, masa;} punct;- punctele se vor memora intr-o matrice definita astfel:punct mase[MAX];- structura va putea fi alcatuita din eel mult 100 de puncte.

    5. Modificati programul P7.8 astfel incat sa memoreze numele materiilor si notele obtinute in structuri.6. Scrieti un program care mernoreaza scorurile obtinute de eel mult 10 jucatori impreuna cu numele jucatorilor,

    Informatiile se vor memora intr-o matrice constituita din structuri definite astfel:typedef struct {char nume[20];int scor;jucator;

    7. Scrieti un program care implementeaza 0 agenda telefonica sub forma unei structuri cu urmatoarea definitie:typedef struct {char nume[20];char prenume[20];char adresa[20];unsigned int cod_postal;unsigned int prefix; unsigned int nurnar;unsigned int mobil;intrare;

    8. Scrieti un program care scrie octetii care formeaza 0 valoare de tip double sub forma zecimala in ordineaoctet-, octets, octets, octets, octets, octets, octets; ;; i octets; unde octet- este octetul eel mai semnificativ iar octet.,este octetul eel mai putin semnificativ.Precizdri:- ordinea in rnemorie a octetilor depinde de platforma de calcul: exists calculatoare de tip "BIG_ENDIAN", lacare primul octet din memorie este eel mai putin semnificativ :;;ide tip "LITTLE_ ENDIAN" la care primul octeteste eel mai semnificativ, Va trebui ca mai intiii sa stabiliti ce tip de calculator folositi :;;iapoi sa parcurgeti octetiiin ordinea corespunzatoare;pentru a accesa octetii care formeaza un numar de tip double utilizati uniunea:

    typedef union {char octet[8];double numar;valoare;

    40

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    42/75

    8. Functii simple; recurslvitate8.1.

    I P8.11Probleme rezolvate

    Scrieti un program care calculeaza integrala unei functii oarecare, intr-un interval [a, b ] ale carui limite sevor citi de la tastatura. Utilizatorul va specifica si numarul de subintervale de discretizare. Metoda deintegrare este metoda dreptunghiurilor.

    #include #include float f(float x)

    return (x * x - x + 1);

    int main () {float a, b, intg, eps;int n; /* numaI~J de subintervale */int i;printf("Introduceti limita de inceput a intervalului: H);scanf("%f", &a);printf("Introduceti limita de sfarsit a intervalului: H);scanf("%f", &b);printf("Introduceti numarul de subintervale H);printf("de discretizare: H);scanf("%d", &n};

    eps = (b - a) / n; /* pasul integrarii */intg = f(a) * eps; /* primul dreptunghi */for(i = 1; i

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    43/75

    for(i a; i 1

    Calculul factorialului se va realiza cu ajutorul unci functii recursive.'inc1ude 'inc1ude int factoria1(int n)

    if (n == 1)return 1;elsereturn (n * factorial(n 1));

    int main ()int if j, k, n;do {

    printf("Introduceti n: ");scanf("%d", &n);

    while(n < 1);k = factorial(n);p ri.nt f ("%d! = %d\n", n, k);system("PAUSE") ;return 0;

    Q Programul va afisa pe ecran, dupa compilare si executie:Introduceti n: 1212! = 479001600

    ~ Discutie:Programul verificii valoarea introdusii deoarece 0 valoare eronatii poate conduce la executarea la nesfarsit a

    functiei factorial (). Functia factorial () sc auto-apeleaza panii cand se ajunge la factorial de l.=============================

    Scrieti un program care citeste doua numere naturale a ~i b si calculeaza :;;iafiseaza eel mai mare divizorcomun, c.m.m.d.c., al celor doua numere. Cel mai mare divizor comun se va calcula recursiv astfel:

    42

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    44/75

    {a d ac a zz=b

    c.m.m.d.c.( a, b ) c.m.m.d.c.( a, b - a) daca b > ac.m.m.d.c.( a - b , b ) daca b < a

    'include 'include int cmmdc(int a, int b)

    if (a ~~ b)return a;

    if(a > b)a cmmdc(a

    if(a < b)a ~ cmmdc(a, b - a);

    b, b);

    return a;

    int main () (int i, j, k, a, b;scanf{"%d", &a);scan f t r' sd ?, &b);k ~ cmmdc(a, b);p r i.nt f Lv s d ? , k);printf(U\nU);system("PAUSE") ;return 0;

    a. Dlscutie:- Se remarca faptul ca functia cmmdc ( ) implementeaza exact definitia matematica formulata in enunt.

    Programul principal nu face dedit sa citeasca cele doua numere, sa apeleze functia cmmdc () si sa afiseze rezultatul.

    Scrieti un program care citeste un numar I?i stabileste si afiseaza dad numarul este prim sau nu. Se va scriesi utiliza 0 functie care verifies daca un numar este prim.

    'include 'include int divizibil(int n , int il {

    if (n % i ~~ 01return 0;

    elsereturn 1;

    int main (I {int n, i;printf(U ntroduceti un numar natural: uI;scant t vsd ", &nl;i ~;while (i < n) {

    if (divizibil(n, il IIi++;else i ~+l;

    printf(UNu este prim\nUI;}if (i ~= n)

    printf(UEste prim\nUI;system(UPAUSEU) ;return 0;

    43

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    45/75

    Q Programul va afisa pe ecran, dupa compilare si executie:Introduceti un numar natural: 397Este prim

    ~ Discutie:- Pentru a verifica daca un numar, n, este prim se parcurge intervalul (1, n) :?ipentru fiecare numar din intervalse verifies daca acesta este divizor al lui n. Atunci cand am gasit un divizor inseamna cilnumarul nu este prim si iesimdin ciclul while (i devine n + I). Functia divizibil veri fica daca contorul i care parcurge intervalul divide pe n.Daca il divide returneaza 0 iar daca nu 11divide returneaza 1.

    Scrieti un program care citeste doua numere naturale n si p si calculeaza cu ajutorul unei functii recursivevaloarea expresiei rI'. Valoarea expresie va fi afisata. Functia rI' se va defini astfel:

    n P = { n p-ln n daca p =1daca p > 1'include 'include int putere(int n, int p) {

    if (p == 1)return n;

    elsen n * putere(n, p - 1);return n;

    int main() (int .i , j, k, n, p;printf("Introduceti 2 numere naturale: n);scanf ("%d", &n);s can f t vsd ". &p);k = putere(n, p);printf ("%d\n", k);system("PAUSE") ;return 0;

    Q ProgramuI va afisa pe ecran, dupa compilare si executie:Introduceti 2 numere naturale: 2 1665536

    ~ Discutie:_. Functia putere implementeaza direct definitia propusa. Ea se poate scrie mai compact astfel:

    int putere(int n, int p)if (p != 1)n = n * putere(n, p - 1);

    return n;

    =============================Scrieti un program care calculeaza media aritrnetica a elementelor unui vector cu ajutorul unei functii.

    'include 'include float medie(int x, float s , int z, int n) {

    S = S + z;if (x == n)

    s = s / n;return s;

    44

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    46/75

    int main () (int .i, n, v[10];float s , k;printf("n = ");scanf("%d", &n);for(i 1; i

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    47/75

    Scrieti un program care determina si afiseaza lungimea unui sir de maxim 200 de caractere cu ajutorul uncifunctii.linclude linclude tnt lungime{char sir[J)int i;

    for{i = 0; sirIi] != '\0'; i++);return i;intmain{){char sir[201J;

    printf{"Introduceti sirul dorit:\n");gets{sir) ;printf{"Lungimea sirului este de %d caractere\n",lungime{sir;system{"PAUSE") ;return 0;

    Q Programul va afisa pe ecran, dupa compilare si executie:Introduceti sirul dorit:Acesta este sirul a carui lungime 0dorim.Lungimea sirului este de 42 caractere

    ~ Discutie:~ Citirea sirului de caractere se realizeaza apeland functia gets () . Asa cum am mai precizat in Capitolul 6,folosirea acestei functii este nerecomandabila. Pentru citirea sirului de caractere recornandarn utilizarea instructiunilor:fgets (sir, 201, stdin);if{sir[strlen{sir)-lJ == '\n') sir[strlen{sir)-lJ '\0' ;Cea de a doua instructiune elimina caracterul "newline" din sirul citit.Functia lungime () primeste ca parametru un vector de caractere. Lungimea sirului de caractere este

    detenninat prin oprirea ciclului for la intalnirea earaeterului '\ 0 ' . Se remarca utilizarea instructiunii vide pentruciclul for. Functia lungime () functioneaza similar cu functia standard strlen ().

    IPS.I0 IScrieti un program care citeste de la tastatura 0 matrice patrata dc dimensiune maxima lOx 10 elementereale impreuna cu dimensiunea sa efectiva si determina ;;i afiseaza suma elementelor de pe diagonalaprincipals si de pe diagonala secundara. Se vor scrie si utiliza functii separate pentru: citirca matricci,scricrca matricei, calculul surnei de pe diagonala principala si calculul sumei de pe diagonala secundara.Precizare: estc vorba de rcluarea problemei P6.6 dar cu utilizarca unor functii.'include linclude void citeste{float mat[J [ OJ, tnt dim) {

    .int i, j;for{i = 0; i < dim; i++)for{j = 0; j < dim; j++) {printf{"Introduceti mat[%dJ [%dJ: " i, j);scanf ("%f", &mat [iJ[jJ);

    float suma1{float mat[J [10J, i.n t dim) {int ,j;float sum = 0;for{i = 0; i < dim; i++)sum += mat lillil:return sum;

    float suma2{float mat[] [10], .int. dim) {int i, j;float sum = 0;for{i 0; i < dim; i++)sum += mat[iJ [dim-i-1];return sum;

    46

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    48/75

    void tip_mat (float mat [] [10], int dim)int if j;printf("\nMatricea introdusa este:\n\n");for(i = 0; i < dim; i++) {

    for (j = 0; j < dim; j++) {printf("%1.3f\t"fmat[i] [j]);

    printf ("\n");

    int main () {float matrice [10] [10];int dim;do {

    printf("Introduceti dimensiunea matricei patrate: H);scanf ("%d" f &dim);

    while (dim < 1 I I dim> 10);citeste(matricef dim);print (matricef dim);printf("\nSuma elementelor de pe diagonala principala");printf(" este %1.3f\n", suma1(matrice, dim));printf("\nSuma elementelor de pe diagonala secundara");printf(" este %1.3f\n", suma2(matrice, dim));system("PAUSE") ;return 0;

    Q Programul va afisa pe ecran, dupa compilare si executie:Introduceti dimensiunea matricei patrate: 4Introduceti mat [0] [0] : 1Introduceti mat [0] [1] : 2Introduceti rnat [0] [2] : 3Introduceti mat [OJ [3] : 4Introduceti mat [1J[0] : 5Introduceti mat [1] [1] : 6Introduceti mate ][2] : 7Introduceti mat [1] [3] : 8Introduceti mat [2] [0]: 9Introduceti mat [2J [lJ : 10Introduceti mat.[2] [2J : 11Introduceti mat [2] [3] : 12Introduceti mat [3] [0] : 13Introduceti mat [3] [1] : 14Introduceti mat [3] [2] : 15Introduceti mat [3] [3] : 16Matricea introdusa este:1.0005.0009.00013.000

    2.0006.00010.00014.000

    3.0007.00011.00015.000

    4.0008.00012.00016.000

    Suma elernentelor de pe diagonala principa1a este 34.000Surna elementelor de pe diagonala secundara este 34.000

    ~ Discutie:- Functia cite ste () realizeaza citirea efectiva a elementele matricei folosind proprietatea particulars a

    tablourilor de a putea fi modificate intr-o functie astfel incat modificarile s a fie permanente. Functia tip_mat ()afiseaza matricea citita. Functiile sumal () ~i suma2 () calculeaza suma clementelor de pe diagonala principala si,respectiv, de pe diagonala secundara. Programul principal citeste dimensiunea efectiva a matricei ~iapeleaza functiiledefinite anterior.

    47

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    49/75

    8.2. Probleme propuse1. Scrieti un program C care citeste de la tastatura un vector de maximum 10 numere intregi impreuna cu

    dimensiunea sa efectiva si separa acest vector In doi vectori: primul vector va fi format din numerele pare dinvectorul initial iar eel de al doilea va fi format din numerele impare din vectorul initial. Citirea vectorului se vaface cu ajutorul unei functii cu prototipul:void cit_vect(int v[lO], int dim);

    2. Reluati programul anterior, dar pentru fonnarea vectorilor scrieti si utilizati dona functii avand prototipurile:int pare (int v[lO], int par_v[lO]);int impare(int v[lO], int impar v[lO]);

    Functii le vor returna nurnarul valori lor pare si respectiv, nurnarul valorilor impare.3. Scrieti un program C care calculeaza suma complexa a elementelor dintr-un tablou unidimensional de numere

    complexe.Precizdri:a. Tabloul de numere complexe va fi decIarat utilizand urmatoarele definitii:typedef structfloat rei

    float im;complex;complex vector[lO];

    b. Elementcle tabloului se eitese de la tastatura, element eu element, iar pcntru fiecare element, partea reala sipartea imaginara,c. Scrieti cate 0 functie care calculeaza partea reala si, respectiv, partea imaginara a sumei a doua numerecomplexe. Prototipurile acestor functii sunt:float suma_re(complex a, complex b);float suma_im(complex a, complex b);

    Suma globala ceruta se va calcula folosind functiile definite anterior.4. Reluati programul anterior dar pentru ealculul sumei a doua numere complexe scrieti si utilizati 0 functie avand

    prototipul:complex suma(complex a, complex b);

    5. Scrieti un program C care citeste de la tastatura 0 matrice de numere reale de dimensiuni maxime 100 x 100impreuna cu dimensiunile sale efective si afiseaza elementele maxime de pe fiecare linie si apoi de pe fiecarecoloana.Precizari:a. Pentru deterrninarea maximului de pe linii I coloane se va serie si utiliza 0 functie eu prototipul:float max_vec(int dim, float vec[lOO]);

    b. Se vor forma, pe rand, vectori din fiecare linie si apoi din ficcare coloana,6. Scrieti un program care citeste un numar natural si calculeaza si afiseaza secventa Halberstam a acestui numar,

    Precizdri:a. Secventa Halberstam a unui nurnar se calculeaza astfel: daca nurnarul este par el se imparte la 2; daca nurnarul

    este impar se aduna 3 si se aduna 1; se reiau operatiile pana cand valoarea ajunge egala cu 1.b. Calculul numarului urmator al secventei Halberstam se va face cu ajutorul unei functii,

    7. Scrieti 0 functie care afiseaza 0 intrebare si citeste raspunsul utilizatorului care poate fi doar .d', pentru "da", sau.n', pentru .nu"; citirea se rep eta pana cand raspunsul este ,d' sau .n'. Scrieti apoi un program care verifiesfunctionarea corecta a functiei.Precizare: Prototipul functiei este:int ok(char s[l);

    8. Scrieti 0 functie care calculeaza suma de plata pentru 0 activitate primind numarul de ore lucrate ~isalariul orar.Daca numarul de ore lucrate este mai mic decat sau egal cu 40 se plateste salariul orar. Pentru orele euprinse intre40 si 60 salariul orar creste cu 50 %. Pentru orele care depasesc 60 se plateste dublu, Scrieti si programul principalcare veri fica functionarea functiei.

    48

  • 5/12/2018 Platforma Laborator PC Claudius Dan

    50/75

    9. Scrieti 0 functie care cauta toatc spatiile dintr-un sir de caractere ~ile inlocuieste cu semnul ,-' returnand numarulde spatii inlocuit, Prototipul functiei este:int inlocuieste(char sir[]);

    Scrieti si programul principal care verifica functionarea functiei,10. Scrieti 0 functie care determina :;;ireturneaza momentul sosirii primului tren intr-o statie de cale ferata. Functiaprimeste ca argumente momentul plecarii din static si 0 structura care contine orele de plecare ~ide sosire.Precizdri:a. Structura pentru memorarea programului de circulatie a unui tren va fi definita astfel:

    typedef struct momentint ora;int mi