Welcome to Scribd!
Academic Documents
Professional Documents
Culture Documents
Hobbies & Crafts Documents
Personal Growth Documents
Programare in C /C+
depozit{i}.stoc_min) ; d printf(*Numarul de comenzi : "}; scanf(*Bd", nc): for (i = 0; i < mez ive) ( printé("Comanda ta - cod: *, i}: scant (*8s", comenzi {i} .cod): printf ("Comanda %d - cantitate : ", i); scanf("%a", ecomenzi (i) .cant] ; assert (comenzi(i].cant > 0); ) ont = ent? = 0; for (i = 0; i < nos ive) ( 7+ cautam produsul in depozit: */ for (j = 0; J 0) ( |/* vector in care retinem ultima zi pentru fiecare luna: */ 136 ' printé(*Comenzile de produse inoxistente: \n"); print£ ("Cod \t\t Cantitate \n"); for (i = 0; i < entl; i++) printf ("8s \t 84d\n",neonoratel(i].cod, \ neonorate! [i] :cant); ) else Print£(*Nu au fost comenzi de produse inexistente\n*); if (ent2 > 0) [ printE(*Comenzi neonorate datorita stocuri insuficiente:* printf (*\nCod \t\t Cantitate \n" for (i = 0; i < ent2; i++) printf ("88s \t t4d\n", neonorate?(i].cod, \ neonorate? [i] .cant) ; ) else Drint£(*Stocuri suficiente pentru toate produsele\n") ; getch() : Seriefi o fimefic avand ca parametsi dowd date calendaristice (precizate prin an, lund siz), care stabileste una din situate: + Prima datd'o precede pe cea de-a dua * Cele dou date sunt egale + A dou data o arecede pe prima Functia va intoarce una din valorile ~1, 0, 1 Scrifi o funcfie naiin () care eiteste dou date calendaristce, le valideazs si stabilestc succssiunea lor eronologic Cl “Rezolvare: {in Hinclude typedef struct ¢ unsigned int an; unsigned int lune; unsigned int zi; ) data, int zite() = (21, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); 157Progeamare in CICH+. Culegere de probleme /* verificare daca anul este bisect (daca da, se intoarce © valoare nenula): */ int bigect(int an) ( return ((an %4 oO: 0) |] an & 400 0 && an % 100 ) /* verifica daca 0 data este valida (daca da, se intoarce 0 valoare nenula):*/ int e_valida(Data 4) ( 3 (dluna > 12 || d.luna <1 || dizi < 1) return 0; 7* daca anul este bisect si luna este februarie: */ {e (bisect (d.an) && d.luna 22 2) return (d.2i <= 29); /* anul nu este bigect sau luna nu este februarie: */ return (d.2i <= zile[d.luna ~ 1))7 } ” + punctie care compara 2 date calendaristice + Regultat intors: -1 daca di precede d2 > 0 daca datele sunt egale : 1 daca d2 precede ai " Ant compara date(Data di, Data a2) ( if (dl.an < d2.an) return -1; if (dilan > d2-an) return 1 fv dian = d2.an : */ {e (divluna < d2,luna) return -1; if (Gilluna > d2-luna) return 1 7* dian = @2.an si di.luna = a2.luna : */ ie (dl.2i < @2.2i) return ~ Gf (di.2i > é2.2i) return 1; /* dicen = @2,an ei di.luna = 42.luna si d.2i = G22: */ return 0 ) void main(void) ( Data di, 42; eo ( peinté("Introduceti data di (zi luna an}\n"); Beanf("8d $d 8d", &dl.2i, &dl.luna, &di.an); Lf (1e_valida (at) ) prince ("Data nu este valida, introduceti una corecta\n") } while (evalida(dt)); a0 ( printé(*Introduceti data d2 (zi luna an) \n"); seant("ed a @a", GaP, a2 tuna, edd-an)y Af (te_valida(a2}) printf ("Data nu este valida, introduceti una \ ‘ corecta!\n"); ) while (levalida(d2)); switch (compara_date(al, 42)) ( case -1: print£ ("dl precede d2\n"); break case 0: printé("Datele sunt egale\n"); break; case 1: printf ("dl urmeaza dupa a2\n"); R6_9, Defiiltipul mullime de numere rea ca ostrich ea urmatoarcle eimpar: + numrul de elemente (o valoare intreaga) + valorile elementelor (un tablou de numere reale, aviind cel mult 100 de clemente). Se vor defini funeti pent + a stabili dacd o valoare dat x aparfine sau nu unei mulfini date M + crearea multimii diferenfa a dou mulfimi. + calculul valorii unui polinom (definit printr-o structurd identicd cu a ‘mulfimii de reali) intr-un punct dat x + calculul polinomului derivat, Aceasta funcjie are doi parametri structur: polinomul dat si polinomul derivat si nu intoaree rezultat. Funefia main () « citeste un polinom dat prin gradul m i cei n-+1 coeficiengi + citeste color posibile ridacini ale polinomlui « stabileste pentru fecare rikcind multiplicitatea e. Indicatie: Componeotele X[k] pentru care P(x(k)) = 0 sunt radical eu multplictate cel pujin 1, cele pentru care P'(x{k]) = 0 sunt ridacini ew multplicitate cel pujin 2, s.amd, Radicinile simple se objin ficénd diferenja dintre mulfimea rdicinilor cu mutiplicitate cel puin I si eele eu :nultipleitate cel pun 2 ete Recolvare: Dup& cum sugereaza indicafia, pentru stabilirea mubiplicitayilor vom proceda astfel: rejinem ridacinile intr-o mulfime (notaté in program cu radi) si derivam potinomul in mod repetat, la ficcare pas elimindnd din muljimea respectiva ridicinile clrora le-am putut stabili multiplicitatca, Algoritmul continua pind cind am epuizat toate ridcinile (mulhimea devine vida). 158 199Progeamare in C/C++ Culegere de probleme oS. Winelude finclude fdefine nuax 100 typedef struct ( int card; //cardinalul muttimii double elem[NMAx]; //elenentele ) Multime; typedef struct ( int grad: double coef [NMAX] + } Polinom: (* verifica daca numarul x apartine mltimii m: */ int apartine(double x, multime m) { i < mcard; i++) m.elem(i]) return 1; (+ diferenta a 2 multimi: */ Multine diferenta(Multime mi, multime m2) ( int i; Multine dif; aif.card = 0; for (i= 0; i < ml.card; i++) { if (lapartine(mtelem{i], m2)) if.elom(dif.card++} ='ml.elem[il; 3 return di ) (* adauga un element 1a o multime: */ void adauga(double x, Multimes m) ( assert (m.card < NMAX}; muelem(m.card) = x; micard++) > #* afiseaza elementele unei muleimi: */ void afiseaza(iultime m) { int i for (i= 0; i < mecard; itt) printf (*8.21f *, m.elem(i)); printé(*\n"); ) lolol 6, STRUCTURE 7* valoarea polinawulus p in punctual x7 *7 Jdouble calc_valoare(Polinom p, double x) ( int iy Gouble val =,0.0; for (i = p.drad; i >= 0; 4 val = val * x + p.coefli); vetura val; 1 J* deriveaza polinomului p (rezultatul se pune in pd): */ void deriveaza(Polinom p, Polinoné pd) ( int i; AE (p.grad = pd.grad = 0; pd.coef {0} = 0.0; } else { pd.grad = p.grad - 1; for (i = p.grad; i > 0; i--) pa.coef[i-1] = 4 * p.coef{il; on ) ) void main(void) ( Polinom p; J/ polinomul initial Polinom pdl, pd2 // folosite pentru derivare Mulkime radacini: //radacinile polinonului Multime radi, rad2, dif; Ant i, ke int milt;//in pascl curent,radacinile au multiplicitate>s mult printf(" Gradul polinomului = *): scant ("td", &p.grad) ; assert (p.grad < IMAX); printf(* Introduceti coeficient: for (i = 0; i <=p.grad; i+) ( printé(atd = *, i}; scant ("B1E", &p.coef{i}): 3 print£(* Numarul de radacini = *); scanf("8d", aradecini.card) ; assert (radacini.card < NMAX); 161Programare in C/C++, Culegere de probleme Capitol 6, SFRUCTURI printé(*"introduceti radacinile:\n"): k= -1 7/ numara radacinile reale ale polinomulus for (i = 0; i < radacini.card; i++) ( kee: printf(*xtd ©", kd scanf("S1£", aradacini.elem{k]) if (eale_valoare(p, radacini.elem{k}) '= 0) ( peintf (*\n\t GLE NU ESTE radacina a polinomilui. \n",\ radacini .elem(%]); ke } d radacini.card = k + assert (radacini.card > 0): yrcopiem p in pal si radacini in radi, pentru a nu pierde valoarea initiala:*/ radi = radacini; pdi = pi jin primal pas, radacinile din multimea radi au multiplicitatea cel putin 1 */ mult © 1; while (radl.card > 0) ( rad2.card = 0; //multimea rad2 e initial vida deriveaza (pdt, pd2}; 7+ punem in miltimea xad2 radacinile polinomilui derivat: uv for (i = 0; 4 ¢ xadi.card; it) ( Lf (calc_valoare(pa2, radi.elem(i]) adauga(radi.elem{i], rad2); Gif = difeventa(radi, rad2); Lf (dif.cara) ( print£(*Radacinile cu miltiplicitatea td: atiseaza (dif); R6_1O, O matrice rari, adie& o matrice avand majoritatea clementelor nule, se memoreazi economic intt-o inregistrare conjinind: numiral” do lini, rmumarul de coloane, numarul de elemente nenule, precum si doi voetor, ‘unul cu clementele nenule din matrice, iar eelalalt cu pozifile Jor, fieénd sectorizarea matrci pe lini. 4 se defincasca funcjii pentru adunarea gi nmulfirea a dow matrci rare, jrecum si funefii pentru crearea structurii matrice rar& si aigarea acesteia aomatrice, Se va scrie un program care citeste gi afigeazi dou matrici rare si care apoi le adund gle iamulteste, afignd de ficare daté rezultatele. y Rezolvare: ' 1) Crearea structurit matrice rard ‘Vom crea pentru memorarea nei matrici rare o structurd cu urmatoarele edmpuri enlin, ncol — —numarul de lini/coloane nelen numarul de clemente nenule + elem = tablou cu elementele nenule * pozitii = tablou cu pozitileliniarizate ale elementelor nenule Dacé el &-lea element nenul dintr-o matrice rard se aflé pe linia I i coloana ¢, ‘tunei poziialiniarizata se calculeaza astfel pozitii[k] = 1 * ncol + ‘Numerotarea linilor si coloanelor incepe de la 0. 2) Afigarea unei matriei rare: Pentru a calcula linia gi coloana pe care se aflé elementul de pe pozitia liniarizats oz, folosim relafiile Linie = poz / ncol Colean’ = poz % ncol Deoarcee matricea rari poate avea dimensiuni foarte mari, cénd faccm afisarea nu vom refine in memorie toate linile acestsia, ci doar linia curenta (care se afigeaza in Inomentulrespectiy), Pentru ficcar nie a matillfuncja realizcaza umauourcle opera + initializeaztinia curenta cu 0 + parcurge tabloul cu elemente nenule, calcukind linia si coloana acestora gi le pune pe pozijia corespunzatoare in linia curenta, La primul element care nu mai teste situat pe linia curent’ se opreste, afigeazA linia si continua algoritmal cu linia urmatoare, tabloul cu elemente nenule parcurgindu-se in continuare din pozitia unde se ramisese inainte. 3) Adunaréa a coud matriet rare: YVeetorii pozifilor liniarizate ai matricilor rare find ordonafi strict erescator, ‘wlunarea matricilor se face interclasind cei doi vectori. Elementele aflate pe aceleasi povifi in cele doudi matrici se adund, iar celelalte se copiazd fn matricea sum. 163Programare in CIC Culegere de probleme 4) Inmutirea a dont matric rare: : ‘De aceastii data nu mai putem face interclasare, ci procedim astfel: calculdm fiecare element c[i]{/] al produsului de matrici a-b dupa formula: aata= Satine ore Deci, pentru fiecare k, vom determina. dacs in matricile a si b existh lemente nenule pe pozitile [iI[A] si (KIGT (acest Iueru este realizat de fancyia cauté_poz_matrice()). Daci exist, adaugim produsul lor fa suma de mai sus, #inelude Hinclude define NHAX 100 //numarul mim de elenente nenule din matrice typedef struct ( int nlin, ncol; // numarul de 1inii, coloane int nelem; // numarul de elemente nenule float elem[NMAX}; // olementele nenule . int pozitii(NMAXl; // pozitiile in care se afla elementele nenule } Mat_rara; /y determinarea Liniei 1 si coloanei c a unui element din + matrice, cunoscand pozitia liniarizata poz (si nunarul * de coloane din matrice - col) “ wold determina indici(int poz, int ncol, inte 1, inte ¢) poz & neal; poz / ncol; /* verificare daca in matrice exista element nenu) in pozitia * (liniarizata) poz; daca exista se intoarce indicele acestuia * in vectorul ce retine elenentele nenule (vect_poz); daca nu, * se intoarce -1 y int cauta_poz_liniara(int poz, int vact_poz{], int nelem) ( int gasit = 0; int i = 0; while (i < nelem g& !gasit) { if (vect_poz[i] == poz) gasit = 1; 7 Capitol 6. STRUCTURT TE (igasity ive; ) Af (1gasit) return -1; return i; J* asemanator cu fenctia de mai sus, dar se cauta dupa linie si coloana: */ . int cauta poz matrico(int 1, int c, Mat_rara mat) ( int poz = 1 * mat.ncol + 7 return cauta_poz_liniara(poz, mat.pozitii, mat.nelem); ) j* citivea si crearea unei matrici rare: */ Mat_rara creeaza_mat_rara() { Nat_rara mat: int lc, i printf (*Ne, de Linki: "); scanf("%d", kmat.nlin) print£(*Ne. de ccloane: *); scanf("%d", kat ncol) ; print£(*Nr. de elemente nenule: *) | scanf("td", tnat.nelem) ; print£("Introduceti elenentele nenule: \n"}; for (1 = 0; i 1) break: // s-au terminat elementele nenule de pa 71 linia cuenta Linert (J] = mat.elem(poz}; pozt+; ) printé(*\a"}: (* afisam linia curenta: */ for (i = 0; i < mat.ncol; i++) printf(*® 6.26", linertli}); y € /* adunarea a doua matrici rare (¢ <- a+b): */ [int aduna_mat_rare(Mat_rara a, Mat_rara b, Nat_raras c) ( | int poz_a, pozb, poze: // indie in vectorii cu elemente 17 nenule /* Gimensiunile matricelor trebuie sa coincida: */ Af (anlin t= b.nlin [[ a.ncol != b.neol) ( printf (*\n Natricele nu se pot aduna*); return -1; ) /* initializam matrices suma: */ a.nlin; c.ncol = a.ncol; e.nelem poz_a = poz_b = poze = 0; /* parcurge vectorii cu elemete nenule ai celor doua matricl: " while (naza < A.nelem th por h < hnelem) —( if (a.pozitiifpoz_a] == b.pozitii(poz_b}) { /* am gasit 2 elemente cu aceeasi pozitie, le adunam: */ c-elem{poz_c) = a.clem{poz_a++] + b.clem{poz_b++] c.pozitiilpozct+] = a.pozitii(poz.a - 1] cunelem++; continue; Af (a.pozitsitpoz_al > b.pozitii(pozb])“¢ /* in matricea b ne aflam la o pozitie *mai mica* decat * pozitia din a; copion elenentul in ¢ si inaintam: uv evnlin ‘euelem(poz_e] = b.elenlpoz_bl; epozitil[poz_ct+] = b.pozitiilpozbt+]s e.nelemt+; continue; ? if (a.pozitiilpoz_a) < b.pozitii(pozb)) { c-elem{poz_c] = a.elem{poz_al c.pozitii(poz_ct#] = a.pozitiilpoz_ael; e.nelens+; ) ) y+ una dintre matrici a fost parcursa in Sntregime, copiem in * © restul elementelor din cealalta: 4 Af (goz_a < a-nelen) for (7 poz_a < a.-nelem; c-elem(poz_c++] c.pozitii(poz_cl else for (; poz < b.nelem c.elem(poz_ct+] = b.elem[poz_at+], c.nelem++) cepozitil{poz_e] = b-pozitiilpoz_bl; a.elem{poz_a++], ¢.nelem++) a.-pozitii{poz_al: a + in cele doua *for'-uri de mai sus se poate observa ordinea + ir care se executa instructiunile(mai intai se face * atribuirea din corpul ciclului si apoi celelalte, * in care se increnenteaza si indicii) " return ) (+ Anmiticed 42 matrici rare (c <= a * bb: / int dnmdteste mat_rare(Mat_rara a, Mat_rara b, Mat_raraé c) int i, i int poz_a, poz, pozci //indici in vectorii cu elemente dinenule float cij; // valoarea elementului ¢{41 [5] AE (.ncol != b.nlin) ( printf (*\n Matricile nu se pot inmultir); 166, 167Programare in C/C++. Culegere de probleme Copltoll 6. STRUCTURE evnlin = a.nlin; e.ncol = b-ncol; esnelem = 0; poz_c = 0; for (i = 0; 4 < e.nlin; i++) for (j = 0; j < e.ncol; j++) ( /* calculam elementul [i,j] din matricea produs: */ ij = 0.0; for (k = 0; k < a.ncol; ket) ( /* cautam elenentele din pozitiile {i,k} ei [k.j) ina, respectiv b! ” poz_a caute_poz_matrice(i, poz_b = cauta_poz_matrice(k, 3 ky, ads bh: if (poz_a >= 0 kk por_b Dy) cij += a.elem[poz_al * b.elem{poz_bl: ) if (cig != 0.0) ¢ c.elem{poz.c} = cij: c-pozitii{pozct+] = 4 * c.ncol + 3; c-nelen++; ) ? return 1; } void main(void) ( Mat_rara a, b, 8, pr printf ("Matricea a \nt } printf£(" (numerele de Linii/coloane incep de la 1) \n*); a = creeaza_mat_rara\); printf (*Matricea b(numerotaxe indici de la 1) \n"); D = creeaza_mat_rara(); printf (* Matricea suma este aduna_mat_rare(a, b, 8); afiseaza_mat_rara(s); printf(*\n Matricea produs este: inmiltestemat_rare(a,'b, p)i afiseaza_mat_rara(p); getch() \n): \nt): 168 P61. Probleme propuse Un experfinent fizie este precizat prin numarul de determindri si valorile misurate, a) Siisedefineasetstructura experiment b) Sa se defineasea o functie avand ca parametru un experiment, care ealeu- Jeazd media aritmeticd a masuritorilor. ©) Si se serie un program care eiteste numinut de determina valorite lor si creeaza cu acestea o inregistrate si calouleazi, folosind functia de mai sus, abaterea standard : a). Si se defineascé tipul punct ca o structurd ) $a se defineascd 0 funcfc, avdnd ea parametri trei puncte, care stabileste ‘dacdacostea sunt sau nu coliniare ©) S& se serie un program care citeste un intreg 1 (n S 50) si m puncte si afigeaz numerele tripletelor de puncte coliniare. Pentru aproviziorarea unui magazin se lanseaz n comenzi (n < 100). O comand’ este precizatt prin dou’ element + tiput produsitai comandat (un tablou de 8 caractere) si + cantitatea comandata (0 valoare intra) Un produs poate fi comandat de mai multe ori, Sa se centralizeze comenzile pe produse, astfel net comenzile centralizate si se refere la prosuse diferte Dac& dou comerzi diferite i si jeu i < j se referd la un acelasi produs vom comasa fn comanéa i eantitatea comandati in si vom anula comanda j comand va fi caracterizata deci prin’ + tipul produsulai comandat, + cantitatea conandata si . + faptul ef este 0 comanda in vigoare sau a fost anulata. in procesul de centralizare a comenzilor se vor face toate comparafile posibile intre comenzi diferie, care n-au fost anulate La o disciplind eu verificare pe parcurs, ficedrui student i s-au acordat trei note la trei Iucrari de control si un ealificativ pentru activitatca la seminar (in- suificient, suficient, bine gi foarte bine), Pe baza acestor informal se acorda 0 not final in felul urmtor: se face media celor 3 note la care se adau’ 0, 0.25, 0.5 sau 0.75 conform calificativutui, iar rezultatul se trunchiaza 169)Programare in C/C++. Culegere de probleme POS. J. a) Sse deserie tipurile punct si dreapté ca tipuri structural. a). SA-se dofineaset tipul situat-ie ca un tip structard avand drept cémpuri: P67. = un tablou de 20 de caractere, * notele « trl valoritntregiintre | gi 10 gi + calificativul — -uncaracter (I, S, B,F). b). S& se defineasca © funcjic avind ca parametru o situafie, eare calculeazh nota final’, se seric un program care citeste pentru cei n studenfi + din primele 20 de poziis + calificativul — -uncaracterin pozitia 21 + cele 3 note ——_- valoriintregi, separate prin spafii % i afigoaza lista studenjilor promovati gi lista studengilor care au objinit note de 9 si 10. + numele + numele data calendaristica este exprimata prin trei valoriintregi: anul, luna gi ziva, | © porsoana este precizata prin: nume si prenume {maxim 30 de caractere) f1 data nasterii - 0 data calendaristica, ta). Sa se descrie tipurile data si persoand ca structuri, b) SA se defineascd 0 funcie avand ca parametru o persoand, functic care B py 9, caleuleaza vrsta persoanei in ani implinif ©) SA se sorie un program care citeste o list de persoane (1 este ctt “naintea listei) $i datelo lor de nagtere gi folosind functia definit& mai sus afigeaza lista persoanelor major. b) Sai se defincasca o funeje avand ca parametri doud drepte, un punet si o va riabtaintoaga, funcjie care stabileste daca cele dus dropte se interse- teazi, eaz in care caleuleazA coordonatele punctului de interseti, sau acd ot paral parametrul boolean separ situaia drepte paralele /eoncurente 10) Siise sorie un program eareeitosten drepte (1 < 100) si afiseaz8perecile de drepte paralele, iar pentru fiecare pereche de drepte neparale ~ coordonatcle punetului do interseeic. De exemplu: Drepte paralele: 1-3 2-4 Drepie concurente: 1-2 (8.0, 7.0) 1-4 (17.0,5.0) - 2-3 (4,0, 4.0) 3-4 (13.0,2.0) 170 Capitola 6, STRUCTURE Defiifi o structurd "Aivmai" avénd ca membri: un introg si dou tablouri eu ‘componente tntegi Definfi 0 funcjic care determina primul divizor al unui numar Gntrog lung, fark semn) si multiplicitatea acestuia. Funcfia are trei parametri: nmi, divizorul si multplicitatea (ultimii doi parametri reprezinta rezultate calculate de functic). Definifé 0 fincfie care primind un numar intreg determina: numarul divizorilor primi distinct, tabloul divizorilor primi si tabloul multiplictajilor divizorilor primi. Funcfia are un singur parametru - numarul intreg, iar rezultatele sunt fntocrse print-o structurd di. vana Definifi o funcjic care primeste doi parametri numere intregi si intonrce ca reaulat o structuri divmul (conjindnd numar de divizor, tabloul divizoritor si tabloul multiplcitjilor divizorilor) din care se poate calcula exmm.dc, al numerclor. Se stic ed emmde. confine divizorii comuni ai celor dows rhumere cu multiplicitijile. cele mai mic. Definiji o funcjie avand ca parametru o structurd Gi vmul, care intoarce ca rezultat ¢.m.m.d.e. Defirijio fimefiemain () careciteten numer integ| si calcueaza c.mmde, al or, Definiio structura "rational" aviind ca membri doi intregi pozitivi. Definji 0 funcyie avand ca parametri doi intregi, fucic care intoarce ca rezulat o structura rational Definti o fumcjic avand ca parametru o structurd rational, care intoarce ea rezulat numaratorul fracjei rajionale (acelasi lucra si pentru numitor). Definii o functie care simplifica o fracfie rafionala, Functia are ca parametru o structurd - fracjia rajionalé si infoarce ca rezultat tot o structurd ~ fracfia simplificata Definii 0 funcfic care adund dou’ fracfi rafionale. Funcjia are ea parametri dua structuri fragile de adunat, si intoarce ca rezultatfractiarationala suma, Definiio funcjic main () care: citegte un introg 7 $ 20 gn fracti rationale = ealouleazdsuma celor’m fracit rajionale si afigeaza rezultatul fracfic rafional, folosind funcile definite mai sus. P69. Definiji structurd "matrice” avind ca membri doi fntregi reprezentind numarul de lini, respectiv coloane ale matricii un tablou cu 2 dimensiuni (cu limitsle 10 gi 10 in care se pastreaza elementele matrice). Dofiniji o functic care inmulfeste dou matrici, Funcfia va avea 3 parametri, cele dou structuri matrici care se inmulfesc si produsul si va intoarce ca recultat 1/0 dupsi eum innnulirea matrcilor este sau mu posibild. Dafinifi o funcfic care compari o matrice cu matricea unitate. Funefia are un pparametru structura matrice de comparat gi intoarce un rezultat tntreg 0/1 imProgramare ClCH. Culeyere de probleme Definji o fanetic care initaizeazi prin ctire © structuré matrice. Func} verified dacd numarul de lini gi colome sunt mai mici sau egale cu 0, repetind citirea in caz contra. Funcjia nu are parameti $i structura inifalizat prin cite Definijio funcfie main () cafe: = citeste doud matrici ~ verificd daet una este inversaceeilate,afigind un mesaj corespunztor. Definti structurile "complex" (cimpuri parte reala si parte ima- qinara) si ‘polinom" rar cu coeficienji complecsi (cdmpuri nunar terneni,tablou coeficienti complecsi sitablou intreg expo- nenti) Definit o funcfic care adund dou numere complexe. Funcja are doi parame structuri “comp Lex" $i intoarce ca rezulito structuri "comip.ex" (suma). Definiji o funcjie care aduna dou polinoame rare cu ‘coeficienti complees Funcfia are 3 parametri: dows structuri "pol inom" si un pointer la structua polinom rezulat. Definiti funetie care initializeaza prin citre deta tastaturi o structud ppolinom. Functia nu ate parametr si intoarce o structur§ "pol inom Definii o functie care afigcaza la terminal o structur& polinom. Funcjia are ut parametnu structura si nw intoarce nine Scrieyi o functie main() care citeste dowd polinoame rare cu coeficionf ccomplecsi,calculeaza polinomul suma gil afigeaz. Indicate: in potinomul sumé se copiazi cosfcienfit si exponent celor doxt Polinoame si se adund numérul de termeni nenuli, Se reduce apoi numirul de {ermeni, comasind termenii care au acclagi exponent inte-un singur termen, im Capitolul 7 Fisiere Capitol 7. FISIERE Breviar Fisirul comine prototipurile urmatoaretor funcfi nod) + cre ean eT pointer fisieral deschis sau NULL dact opera sua iit felowe FILE pr Int Egete(FILE® pili inchiderigieral FCitete-un ener ain Tier 3 TST cearacterul eit sau EOF, ne Epute (ehay 6, FILE pry caracerul primi en params tn gr ns cel mull not Format, 1ista_expresii)’: char? Egets(chat® =, iat 8, [Cite din fcr ol PILE* pf caracter, sats pina ta nize fi *n, in foul cara pune * 0". Intorce sa NULL di a 0 TE -FUEE (GRRE? -BFIEEP BET | Copia’ sin in ierl dT ar Tnlocuieste terminator! “\O" cu *\n'. | TE SSERETPIIET SP —SHET [Cie dn ge so cou oat rmat, lista_edrese)? ntarec mame eimpun cite sa EOF, in caz de eroare sau sfiirsit de figier, Se floseie ci fig text Tae EBFIRET (PTE BE Seren Higley sub contr Tors Intoarce numa de carnctere serise sn va Tone negativa in cay de eroare, Se floseste ou figioe text. int orig); Tat fread char*— sca, THE Ta, | Gliese din fisiorin zona, fa arieole de ur int na, PILE" pe sgime la. fecare Imoarce muna de nicole folsee- fire bn Tat Twritelchar® zona, int Ta, ‘din zona, na aricole de Tan int na, FILE pf); tgime La fiocare. intoarce aumvirul de anti [TRE Tscek (RILEY pF Tong dept, | cole scrise efeetiv. Se foloseste cu fisiere Pavilion eirsoral i fier Ta Gapl oe {ef ft de inceput,pozifia Curent sam sfir= Word Fawind(PIEBY EET ong feel (FILEY pila [int feof (rte pe} TaE forror (FILE* pty ul deh oa dowectat 0 jl de inteae /iesireProgeamar iC. Culegere de probleme Capitola 7. FISTERE Fisiere binare - Probleme rezolvate 7A. SA se seric un program pentru erearea unui figior binar, avéind articole Structuri eu urmatoarele cdmpuri: + Nume depunator — ~ sir de maxim 30 de earactere + Data depunerii —o structura avand cdmpuri + Suma depust —o valoare reala, “Articotele sunt grupate pe zile in ordine cronologicd, Datele se introduc de la consol, ficcare pe tec lini, Sa se afigeze apoi continutul figerului. (Probleme tnrudite: P7_1) intregi: zi, una, an, ‘Rezolvare: Vom introduce mai tot datele fnr-o ordine aleatoare, apoi le vom sorta dup’ data. in final, vectorul de structuri va fi scris in figierul output . dat. { [Winclude #include void main (void) ( 77 Crean un vector de articole pentru a le 7 sorta ulterior dupa data depunerii. jy Aeticolul suplimentar este necesar la sortare. J) Tm plus, vom citi ceea ce am scris in fisier 7 inte-un' vector separat de articole struct { char nume(30); struct ( int 2i, luna, an; } data: double suma; } articole[20], articol, cititel20}; PILE *£; int n: J] twunarvi de articole int founds V7 Polosit la sortare (1 Citire date de intrare printi(” Introduceti numarul de articole: "); scant ("td", gn); for (int i= 0; i < ny ise) ( printé [* Tntroduceti nunele depunatorutu: Seanf ("8e", articole{i).mume) printé (" Thtroduceti data depunerii <22/LL/ARAA>: * ts Beant ("ea/sd/td", karticole[i].data.2i, \ printf (* Introduceti sua depusa: * scarf (*t1f", karticole(i] .euma) ; ) 7/ Sortam dupa data depuneril ao ( fourd = 0; for (i = 0; i < md: ies) 7) Testam cazurile in care data articolului curent este 47 ‘mai maze’ decat data articolului urmator Af ( (articole[il.data.an > articole[i+i].data.an) || \ (articole(il ‘data.an == articole[it1].data.an && \ ‘articole(i] .data.Juna > articole{i+1} .data.lunal || \ (articole(i}.data.an == articolo(i+1] data.an s& \ ‘articole(i] data, luna == articole(i+1) .data.luna && \ articole(i)-data.2i > articole[i+1}.data.zi) } ( articol = articolelil; articole[i} = articole(i+i]: articole[iti] = articol; fund = 1; } } while (found) : 1] Decchidere fisier LE ( (£ = fopen (Toutput.dat*, twb")) == MULL) { printé (" Eroare la deschiderea fisieruluit exit (2); ) // Seviem in fisier si 41 inchiden 1) Seriem intai numarui de articole furite (en, sizeof (int), 1, fh; fwrite (sarticole, sizeof(articol), n, £7 felose (f); LE C1f = fopen (Youtput.dat®,trb")) == NULL} ( printé (* Eroare la deschiderea fisierului! *); exit (1) ) fread (in, sizeof (int), 1, £7 fread (kcitite, sizeof(articol), n, £1; for (i= 0; 1 Wanclude include include include #include void main (void) { // Von citi ceea ce am scris in fisier 77 Ante-un vector de articole (pentru a testa // ca actualizarea s-a facut corect. struct ( char nume(30]; struct ( int zi, luna, any } data; double’ suma; ) articol, citite[20); FILE *f; double Suna char nume(30] ; char cont = 'D! int n; 4/ Pentru continuare 17 momarud de articole J] Deschidere fisier Af ( (£ = fopen (routput.dat",*reb")) == NULL) ( printf (* Broare la deschiderea fisierului! *); exit (1): b 176 77 Retualtzare while (toupper (cont) == 'D') { printé (" Foaie de restituire, \n"); Brintf (* Tntroduceti nunele: *); scanf ("8s", nume}; printf (+introduceti suma: *); scanf (*$1E", Gouna): 7/ Ne pozitionam...1uan in calcul pen = nr de articole fseck (f, sizeof (int), 0); articol.suna = -1.0; wnile (/fe08(£) && stremp(articol.nume, nume) != 0) fread (garticol, sizeof(articol), 1, £1; if (feof (£)) LE (guna > exticol.suma) printf ("Sima este prea mare! \n*); else articol.sume -= suma; fseek (£, ftell(f)-sizeof(articol), 0); fwrite (aarticol, sizeof(articol), 1, £7 ) flushall 0) 5 printf (* Doriti sa continuati? "); scanf (*80", gcont) ; ) fseek (f, 0, 0); fread (sn, sizeof(int), 1, £7 fread (keitite, sizeoflarticol), n, £) for (int i Len; ive . printf (* Articolul td: ts, ¥4/ta/ta, €1£\n", S42, \ eitite(i} ume, citite[i].data.2i, \ citite(i] data.luna, citite(il.data.an, \ cititeli] -suma) : fclose (£): geteh(); Pentru a sorta clementcle unui tablou V, irda Te doplasa, se erect un now tablou P, fn careun clement P, reprezintd pita po care ar avca-o elementul co- respunzitor din Vin tabloul sorta, adic& numrul de elemente care ar trebui si se giseascd inainteafiecdrui clement din tabloul sorat: 2 = numaimul(V, SV.) 173. De exemplus 7Progeamare in C/C++. Culegere de probleme Pe baza tabloului P se obfine relativ simplu pozitia (indexul) clementelor sorta din tabloul V. Cel mai mic clement se affi in V in pozilia & astfel inc&t Py turmatorul ~ in pozifia corespunzatoare lui P pentru care Py=n Daca tabloul V nu are toate clementole distinct, pentru erearea tabloului P se face modificarea: = numarulV, $¥,) +mumarul(¥, <¥,) 1, ultimul clement corespunde pozitst De exemplu: oT vis [2 on x] 1Te Problema prezinta interes in cazul in care in locul tubfoului V avem un fisier eu tp. Sortarea fisirului in raport cu o cheie (unl din cimpurile aticolelor fiscrului) revine Ja crearca unui fisier index care reprezinta un fisicr de intregi (echivalent tabloului 2), in care fiecare element x di pozifia celui de-al lea clement din fisierul sorta in fisicral inijal Si se defineascd 0 funetie, care, primind ea parametru un figier binar, ereeaza un fisicr index in raport eu 0 chic. ‘so defineased o functic, care, asociat,afigeaza articolelefisierului sortate in raport cu indexul dat Rezolvare: Vom genera vector ind (P din exemplul de mai sus) six (ea in exemplul dde mai sus). Apoi imediat, solupe sunt date de v{x{}] Fisierul binar ce congine vectorul v va fi dat ca parametru in linia de comands, T3.epp z z Winelude Wnctude Hinclude #include // Serie fisierul index pe baza fisierului de intrare FILE "index (PILE *f in) { int n, *v, tind: FILE *£ index; ” int ley /1 Yunarul elenentelor din vectorul initial care i} sunt mai mici decat elementul curent. int i, ji // Indecsi 178 Capitola 7. FISIERE, imind ca parametri un figier gi un figier index tire fisier de intrare : os ae, GEtcortane)s dr fsa); // Sumarul de elenente din v Fee sees matloe ta * eizeor ne) waa tine *) maboe (a * sizeof Gat); fread (vy sizeof ine), ny £m); rewind. (Ein) Ti catculan voctorvt index for (i Lc ise) { it = 0 for (j= 0: 3 = vid) ae di: else Af (vii) > VG) ae tay y anata) «= 281 ) secien fisierul index UTE adax = Cope (cindex.dae*,"wib")) = NULL) ¢ ‘mise Co arcare ta Goschidorea fisierulul! */ tate (2 ) Eweite (ka, sizeof (int), 2, f_index); fwrite (ind, sizeof (int), n, £index); rewind (f index); return f index; ) 17 sorteasa vectorut din fisiensl fin folosind fisiersl £ sndox (adware (fue *e ny Feu of_tadew) ¢ men, sing, 7 RE ava ine ais TM cltlte fisiere de sntcare these ten, sizeot (int); ty fin); Gade Snattes ta # slzeos ine): frond (v, bizeo! (int), ny fia); Eieea (ea, eiceos (ant), i, Eindex); fest (SoS) Taaidee (a alzeoe ane) Hided (ing, ‘izeot tint), ny finden); Croan voctorul x WORE YS nalloc (n+ atzece int): eee 179pio 7. PISTERE Programare in CIC. Culegere de probleme Sri for (is O;i white (indfaue) t= 4) auxe+; Hnelude