Differences

This shows you the differences between two versions of the page.

Link to this comparison view

programare-cc:laboratoare:10 [2020/10/06 17:40]
127.0.0.1 external edit
programare-cc:laboratoare:10 [2020/12/12 11:14] (current)
andrei.simescu [Problema 2]
Line 1: Line 1:
-===== Laboratorul 10. =====+===== Laboratorul 10. Pointeri la funcţii. Operatori pe biţi. =====
  
 +În acest laborator veţi învăţa să folosiţi:
 +  * Operatori pe biţi
 +  * Pointeri la funcţii
 +  * Directive de preprocesare
 +
 +==== Problema 1 ====
 +----
 +Să se scrie o funcţie pentru calculul integralei definite, pe un interval dat **[a,b]** a unei funcţii oarecare (cu rezultat real)
 +**f(x)**, prin metoda trapezelor, cu un număr dat de paşi **n**.
 +
 +Funcţia primeşte ca argument adresa funcţiei de integrat şi numărul de paşi şi va avea antetul:
 +<code c>double integrala(double (*func) (double x), double a, double b, int n) </​code>​
 +Programul principal va apela funcţia de calcul a integralei pentru două funcţii diferite şi un n suficient de mare. Se pot
 +integra functiile **sin(x)** si **cos(x)** pe intervalul **[0, PI]**.
 +
 +==== Problema 2 ====
 +----
 +=== A ===
 +Fie tipul **struct mulţime** ce poate reprezenta mulţimi cu numere în intervalul **[0..7]** astfel: bitul **i** din **a** este **1** dacă
 +numărul face parte din mulţime şi **0** altfel. Considerăm biţii numerotaţi de la dreapta spre stânga.
 +
 +<code c>
 +struct multime {
 +unsigned char a;
 +};
 +</​code>​
 +
 +De exemplu, dacă **a = 99 = (01100011)** în baza 2, atunci mulţimea va fi **{0, 1, 5, 6}**.
 +
 +Să se scrie următoarele funcţii (pt 0 <= x <= 7):
 +
 +<code c>
 +void init(struct multime *m)           // iniţializează mulţimea m cu mulţimea vidă
 +void add(struct multime *m, int x)     // adaugă pe x la mulţimea m
 +void del(struct multime *m, int x)     // şterge pe x din mulţimea m
 +void print(struct multime *m)          // afişează mulţimea m
 +int contains(struct multime *m, int x) // returnează 1 dacă x se află în mulţimea m şi 0 altfel
 +</​code>​
 +Să se scrie un program ce testează funcţiile definite mai sus.
 +
 +=== B ===
 +
 +Să se modifice structura şi funcţiile definite anterior pentru a putea reprezenta mulţimi de numere întregi, din
 +intervalul **[0, n]**, **n** întreg.
 +
 +Se va folosi un vector de **unsigned char**, fiecare reprezentând câte 8 numere din mulţime: **v[0] - [0..7]**, **v[1] - [8..15]** etc.
 +
 +Va trebui să modificaţi **struct multime** astfel încât să se poată aloca dinamic memorie pentru vector, de exemplu:
 +<code c>
 +struct multime {
 +unsigned int n;   // numărul maxim de elemente
 +unsigned char *a;
 +};
 +</​code>​
 +
 +=== Cerinţă ===
 +Se dă o serie de operaţii. Scrieţi un program care acţionează conform acestora.
 +
 +== Operatii ==
 +  * A nr - adaugă numărul nr în mulţime
 +  * D nr - elimină numărul nr din mulţime
 +  * C nr - contains( nr ) - dacă nr se află în mulţime, afişaţi DA, altfel NU
 +  * P - afişează elementele mulţimii separate prin spaţiu
 +
 +== Date de intrare ==
 +Un numar n, numarul de instructiuni urmat de o secvenţă de instrucţiuni ca mai sus, câte una pe linie
 +== Date de ieşire ==
 +Outputul cerut de secvenţă
 +== Exemplu ==
 +^ Intrare ^ Iesire ​   ^
 +|7 \\ A 5 \\ A 8 \\ P \\ C 5 \\ D 5 \\ C 5 \\ P  | 5 8 \\ DA \\ NU \\ 8  |
 +
 +==== Problema 3 ====
 +
 +Să se definească tipul structură **MATERIA** care conţine cămpurile:
 +  * **nume** - şir de 15 caractere
 +  * **ore_curs** - intreg
 +  * **tip_examen** - tip enumerare, putând avea valorile **C, S, A** (colocviu, examen de semestru sau de an)
 +Scrieţi funcţia **citire_MAT**,​ care citeşte informaţiile despre o variabilă de tip **MATERIA**.
 +Se va face validarea tuturor câmpurilor:​
 +  * **nume** - conţine doar litere sau blancuri
 +  * **ore_curs** - întreg strict pozitiv. OBS. Se presupune ca utilizatorul poate introduce doar un numar intreg, pe care il vom verifica ca este pozitiv!
 +  * **tip_examen** - doar unul din caracterele de mai sus: C, S, A
 +
 +<note important>​**Observatie**:​ Citirile se vor face cu **fgets**, deoarece numele materiei poate contine spatii. Urmatoarele citiri,
 +cat si cele precedente citirii numelui materiei se vor face tot cu **fgets** deoarece daca folosim **scanf** raman caractere
 +nescoase din buffer-ul de tastatura (new line(**'​\n'​**) de exemplu)!</​note>​
 +
 +<note tip>​**Hint:​** **atoi** pt transformare in numar intreg</​note>​
 +
 +Definiţi tabloul **PROGRAMA** de **MAX** elemente de tip **MATERIA**,​ **MAX** fiind o constantă predefinită.
 +Scrieţi funcţia **citire_PROGRAMA**,​ de tip **void**, care iniţializează tabloul **PROGRAMA**,​ prin apelul funcţiei
 +**citire_MAT**.
 +
 +Scrieţi funcţia afişare care primeşte ca parametru un caracter, un întreg şi tabloul **PROGRAMA** şi tipăreşte
 +informaţiile despre materiile din **PROGRAMA** care au **tip_examen** corespunzător caracterului şi **ore_curs** egal cu
 +întregul primit.
 +
 +Scrieţi un program care apelează funcţiile de mai sus.
 +
 +
 +==== Problema 4 ====
 +Să se definească o structură **MATRICE** care să conţină următorii membri:
 +  * **n** - numărul de linii ( **int** )
 +  * **m** - numărul de coloane ( **int** )
 +  * **a** - adresa tabloului care va contine matricea ( **int **** )
 +
 +Se vor scrie următoarele funcţii:
 +<code c>
 +/* creează o matrice de dimensiuni n x m. Funcţia va aloca memorie pentru o nouă variabilă de tip MATRICE şi pentru tabloul conţinut în această ​
 + * structură (referit prin membrul a). Funcţia va returna adresa noii variabile de tip MATRICE create.
 + */
 +MATRICE* creeaza_MATRICE(int n, int m)
 +
 +/* citeşte de la tastatură o matrice. Dimensiunile se regăsesc în cadrul matricei transmise ca parametru, ​
 + * urmând a se citi de la tastatură doar elementele tabloului. Funcţia va returna tot adresa ma.
 + */
 +MATRICE* citeste_MATRICE(MATRICE* ma)
 +
 +/* afiseaza pe ecran matricea transmisă ca parametru.
 + */
 +void scrie_MATRICE(MATRICE* ma)
 +
 +/* dacă matricile ma şi mb au aceleaşi dimensiuni, atunci funcţia returnează adresa unei noi 
 + * matrici care va conţine suma matricelor ma şi mb. În caz contrar, funcţia va returna NULL 
 + ​*(adunarea nu se poate face, deci rezultatul nu există).
 + */
 +MATRICE* aduna_MATRICE(MATRICE* ma, MATRICE* mb)
 +
 +/* dacă matricile ma şi mb se pot înmulţi, atunci funcţia returnează adresa unei noi matrici ​
 + * care va conţine produsul matricelor ma şi mb. În caz contrar, funcţia va returna NULL 
 + * (înmulţirea nu se poate face, deci rezultatul nu există).
 + */
 +MATRICE* inmulteste_MATRICE(MATRICE* ma, MATRICE* mb) 
 +</​code>​
 +Scrieti un main in care testati functiile implementate anterior!
  
programare-cc/laboratoare/10.1601995220.txt.gz · Last modified: 2020/12/11 13:00 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0