This shows you the differences between two versions of the page.
programare-cc:laboratoare:09 [2020/10/06 17:40] 127.0.0.1 external edit |
programare-cc:laboratoare:09 [2021/12/09 13:06] (current) viorel.mocanu [Problema 4] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laboratorul 09. ===== | + | ===== Laborator 09 - Structuri-Enumerări-Uniuni ===== |
+ | |||
+ | ==== Problema 1 (rezolvată) ==== | ||
+ | ---- | ||
+ | |||
+ | Scrieți un program în care să se definească o structură Punct ce are ca membrii coordonatele x și y. Să se citească de la tastatură coordonatele pentru un Punct p și să se afișeze sub forma (x,y). | ||
+ | Observați folosirea structurilor (definire, accesare membrii). | ||
+ | |||
+ | |||
+ | == Date de intrare == | ||
+ | ---- | ||
+ | |||
+ | Doua numere reprezentand coordonatele punctului | ||
+ | |||
+ | == Date de ieşire == | ||
+ | ---- | ||
+ | |||
+ | Punctul in formatul din exemplul oferit | ||
+ | |||
+ | == Restricţii == | ||
+ | ---- | ||
+ | |||
+ | |||
+ | == Exemplu == | ||
+ | ---- | ||
+ | |||
+ | ^ Intrare ^ Ieşire ^ | ||
+ | | 8.6 | (8.60,3.50) | | ||
+ | | 3.5 | | ||
+ | |||
+ | == Rezolvare == | ||
+ | ---- | ||
+ | |||
+ | Programul C care implementează cerinţa problemei de mai sus va fi: | ||
+ | |||
+ | <code c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | typedef struct { | ||
+ | float x, y; | ||
+ | } Punct; | ||
+ | |||
+ | int main () | ||
+ | { | ||
+ | Punct p; | ||
+ | |||
+ | printf("Introduceti x: "); | ||
+ | scanf("%f", &p.x); | ||
+ | printf("Introduceti y: "); | ||
+ | scanf("%f", &p.y); | ||
+ | |||
+ | printf("(%.2f,%.2f)\n", p.x, p.y); | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | |||
+ | |||
+ | ==== Problema 2 ==== | ||
+ | ---- | ||
+ | |||
+ | Moduri în care timpul poate fi exprimat într-un program C: | ||
+ | |||
+ | * Printr-un întreg lung (tip de date time_t, echivalent cu long int), ce reprezintă numărul de secunde față de ora 0 din 1 ianuarie 1970. | ||
+ | * Printr-o structură cu numele tm ce conține: | ||
+ | |||
+ | |||
+ | <code c> | ||
+ | struct tm { // definita in time.h | ||
+ | int tm_sec,tm_min, tm_hour; // sec (0-59), min (0-59), ora (0-23) | ||
+ | int tm_mday, tm_mon, tm_year; // zi (0-31), luna (0-11), an (dupa 1900) | ||
+ | int tm_wday; // ziua din saptamana (0-6) | ||
+ | int tm_yday; // ziua din an (0-365) | ||
+ | int tm_isdst; // +1 Daylight Savings Time, 0 No DST, -1 don't know | ||
+ | }; | ||
+ | </code> | ||
+ | |||
+ | Pentru a facilita lucrul cu date ce reprezintă timpul sunt declarate în biblioteca time.h mai multe funcții. Câteva funcții din time.h: | ||
+ | |||
+ | * time_t time(time_t*) returnează ora curentă (ca număr de secunde); această valoare se pune și la adresa trimisă ca parametru (excepție când se apelează time(NULL) - atunci se va întoarce timpul doar ca rezultat al funcției) | ||
+ | * struct tm* localtime(const time_t*) transformă o dată din format time_t în struct tm; funcția întoarce un pointer la o structură de tip tm | ||
+ | * char* asctime(const struct tm*) transformă din struct tm într-un șir de caractere ce va reprezenta data în format human-readable | ||
+ | * char* ctime(const time_t*) transformă din time_t într-un șir de caractere ce va reprezenta data în format human-readable | ||
+ | |||
+ | Să se scrie un program pentru afișarea orei și datei folosind funcțiile din time.h descrise mai sus. | ||
+ | |||
+ | |||
+ | ==== Problema 3 ==== | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Să se scrie și să se verifice o funcție pentru transformarea orei din struct tm în șir de caractere (se vor afișa oră, minut, secundă) : | ||
+ | |||
+ | char* timestr(struct tm t, char* time); | ||
+ | |||
+ | Rezultatul funcției este același cu al doilea argument și reprezintă adresa unde se depune șirul de caractere rezultat. | ||
+ | |||
+ | |||
+ | ==== Problema 4 ==== | ||
+ | ---- | ||
+ | |||
+ | Să se definească o structură pentru un vector struct vector de întregi alocat dinamic care conține: | ||
+ | |||
+ | * int* v - adresa vector | ||
+ | * int cap - dimensiune alocata (maxima) | ||
+ | * int n - dimensiune efectiva (număr de întregi stocați) | ||
+ | |||
+ | Să se scrie funcții pentru: | ||
+ | |||
+ | * inițializarea unui vector (cu o alocare initiala de memorie): void init_vector(vector *a, int nr) | ||
+ | * adăugarea unui nou element la vector (cu o eventuală realocare a vectorului): void adauga_vector(vector *a, int n) | ||
+ | * afișarea unui vector: void scrie_vector(vector a) | ||
+ | |||
+ | |||
+ | Testaţi programul adăugând pe rând, şi afişând vectorul după fiecare adăugare, numerele de la 0 la 100. | ||
+ | |||
+ | |||
+ | ==== Problema 5 ==== | ||
+ | ---- | ||
+ | |||
+ | Să se definească o structură pentru un număr complex cu componente reale (de tip float) şi funcţii pentru operatorii aritmetici cu numere complexe: | ||
+ | |||
+ | |||
+ | * adunarea: complex adunare(complex a, complex b) | ||
+ | * scăderea: complex scadere(complex a, complex b) | ||
+ | * înmulţirea: complex inmultire(complex a, complex b) | ||
+ | * ridicarea la o puterea întreagă: complex putere(complex a, int putere) | ||
+ | * afişarea sub forma (re,im): void scrie(complex a) | ||
+ | |||
+ | |||
+ | Folosind funcţiile anterioare, să se scrie un program pentru calulul valorii unui polinom de variabilă complexă cu coeficienţi reali. | ||
+ | |||
+ | |||
+ | ==== Problema 6 ==== | ||
+ | ---- | ||
+ | |||
+ | Să se scrie un program pentru citirea unor cuvinte și afișarea numărului de apariții al fiecărui cuvânt. | ||
+ | |||
+ | Problema se va rezolva în două variante diferite: | ||
+ | |||
+ | * Se va folosi un vector de char* pentru cuvinte (char **) și un vector de numere întregi. Cei doi vectori se alocă și extind dinamic (se realocă dacă este nevoie). | ||
+ | * Se va defini o structură Pereche ce conține un cuvânt și numărul lui de apariții și un vector de astfel de perechi. Vectorul se alocă și se extinde dinamic. | ||
+ | |||
+ | |||
+ | |||
+ | == Exemplu == | ||
+ | ---- | ||
+ | |||
+ | ^ Intrare ^ Ieşire ^ | ||
+ | |6 \\ unu doi \\ trei doi trei trei | unu 1 \\ doi 2 \\ trei 3| | ||
+ | |||
+ | |||