LUCRAREA NR

Documente similare
Microsoft Word - CarteC.doc

Limbaje de Programare Curs 5 – Siruri de caractere

SUBPROGRAME

Limbaje de Programare Curs 6 – Functii de intrare-iesire

Microsoft Word - CarteC.doc

L7

Limbaje de programare Pointeri. Alocare dinamică (continuare) 26 noiembrie 2012

E_d_Informatica_sp_SN_2014_bar_10_LRO

Microsoft Word - PCLP2_Curs_4_2019.doc

Microsoft PowerPoint - ImplementareLimbaj [Read-Only] [Compatibility Mode]

E_d_Informatica_sp_MI_2015_bar_02_LRO

Operatorii in C Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici O

Limbaje de Programare Curs 8 – Fisiere

Subiectul 1

Procesarea Imaginilor - Laborator 1: Introducere în utilizarea bibliotecii OpenCV 1 1. Introducere în utilizarea bibliotecii OpenCV 1.1. Introducere S

Laborator 2 Incompatibilităţi/Diferenţe între C şi C++ Completări C++ Supraîncărcarea (redefinirea) numelui de funcţii În C nu este permisă existenţa

Slide 1

Programarea şi utilizarea calculatoarelor

Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011

PCLPII-C16(9)

Top

Propunator: Morar Florin Colegiul National Silvania Zalau Discipina: Informatica Nivel liceal, cls. XII 1.Să se scrie în limbajul C/C++ definiţia comp

Object Oriented Programming

Microsoft Word - CarteC.doc

Slide 1

Programarea şi utilizarea calculatoarelor

1. Operatii cu matrici 1 Cerinte: Sa se realizeze functii pentru operatii cu matrici patratice (de dimensiune maxima 10x10). Operatiile cerute sunt: A

Microsoft PowerPoint - Curs_SDA_4_RO_2019_v2.pptx

Slide 1

Microsoft PowerPoint - Curs_SDA_3_RO_2019_v2.pptx

Matrici și vectori în VBA În VBA, o matrice este un grup de variabile de același tip. De ce ar trebui să utilizați o matrice? Presupunem că ați vrut s

Declaraţii. Instrucţiuni 19 octombrie 2005 Programarea calculatoarelor 2. Curs 3b Marius Minea

Laborator 3

PRELEGERE XIII PROGRAMAREA CALCULATOARELOR ŞI LIMBAJE DE PROGRAMARE Noţiunea de funcţie - continuare VI. Funcţii recursive O funcţie se poate activa n

tehnologii web

Microsoft Word _POO_Lab_1_Modificari_v01.htm

Microsoft Word - c6.doc

Lab6LCD

Diapositive 1

Programarea calculatoarelor. Note de curs Marius Minea 1 Introducere în programarea în C 1.1 Funcţii în limbajul C Calcule şi funcţii La origine, rolu

SIRURI DE CARACTERE in C++ O constanta de tip sir de caractere de declara intre doua caractere. In memoria interna, o constanta de acest tip este reti

Programarea şi utilizarea calculatoarelor

Aggregating Data

Laborator 2 - Încapsularea Programare Orientată pe Obiecte Tema 2.1 Să se analizeze programul EX2.C Indicatii 2.1 A nu se uita de fisierul EX2.H Tema

proiectarea bazelor de date

Interfețe și Protocoale de Comunicații Arduino-Port Paralel Arduino. Laborator 1- Portul Paralel 1 Caracteristici generale Arduino UNO este o placă de

Microsoft PowerPoint - Curs_SDA_9_RO_2019_v2.pptx

ALGORITMICĂ. Seminar 3: Analiza eficienţei algoritmilor - estimarea timpului de execuţie şi notaţii asimptotice. Problema 1 (L) Să se determine număru

Preprocesorul C Funcţii cu numǎr variabil de argumente 6 decembrie 2005 Programarea calculatoarelor 2. Curs 10 Marius Minea

Scrieţi pe foaia de examen răspunsul pentru fiecare dintre cerinţele următoare

Microsoft Word - Software pentru ordonarea multirang a componentelor unei colectivitati.doc

Microsoft PowerPoint - Curs_SDA_10_RO_2019_v1.pptx

Microsoft Word - O problema cu bits.doc

Paradigme de Programare

Grile si probleme siruri de caractere in C++ ŞIRURI DE CARACTERE Itemii următori sunt preluaţi din variantele de bacalaureat În secvenţa de i

Managementul Resurselor Umane

PHP (II)

Tablouri unidimensionale Problema 1 Să se determine mulţimea cifrelor unui număr natural n > 0, dat. Exemplu: n= Cifre = {1,2,3,7} Se cere să s

Declararea variabilelor

C++ Probleme

ALGORITMII ŞI REPREZENTAREA LOR Noţiunea de algoritm Noţiunea de algoritm este foarte veche. Ea a fost introdusă în secolele VIII-IX de către Abu Ja f

ALGORITHMICS

Laborator 1-Teoria probabilitatilor si statistica matematica Sef lucrari dr.mat. Daniel N.Pop Departamentul de calculatoare si inginerie electrica 1 P

Microsoft Word - Cuprins_LP.doc

-

Adresarea memoriei Modurile de adresare constituie un instrument principal pentru reprezentarea în memorie a imaginii datelor, aşa cum este ace

Paradigme de programare

Nr. 932 din Avizat ISJ Vâlcea, Inspector școlar informatică, Ciochină Luisa EXAMEN DE ATESTARE A COMPETENȚELOR PROFESIONALE A ABSOLVENȚILOR

1 Lucrarea nr. 8 - Structuri de date de tip liste sortate O listă sortată reprezintă un aranjament al înregistrărilor din cadrul listei în funcţie de

Propunator: Morar Florin Colegiul National Silvania Zalau Discipina: Informatica Nivel liceal, cls. XI 1.Fişierul text bac.in conţine cel mult 1000 de

MINISTERUL EDUCAŢIEI, CULTURII ŞI CERCETĂRII AL REPUBLICII MOLDOVA UNIVERSITATEA DE STAT ALECU RUSSO DIN BĂLŢI FACULTATEA DE ŞTIINŢE REALE, ECONOMICE

Microsoft Word - Programarea Portului Paralel - IBM-PC. .doc

Furnicuţa şi-a construit un depozit pentru grăunţe

Gestionarea I/E

Slide 1

Logică și structuri discrete Limbaje regulate și automate Marius Minea marius/curs/lsd/ 24 noiembrie 2014

Fişiere 11 ianuarie 2004 Utilizarea şi programarea calculatoarelor. Curs 13 Marius Minea

Capitole Speciale de Informatică Curs 1: Extragerea informaţiilor. Modelul boolean şi modelul boolean extins 27 septembrie 2018 Extragerea informaţiil

Microsoft PowerPoint - Curs_TPI_22_v01.ppt

Lucrarea nr. 4 - Algoritmi de sortare şi ordonare Breviar teoretic Un algoritm de sortare este o metoda prin care se aranjează elementele unui tablou

Probleme proiect TP BITPERM Implementați un algoritm care citește de la intrarea standard două numere naturale și scrie la ieșirea standard da

Slide 1

Microsoft Word - Raspunsul la niste provocari. Partea III..doc

Laborator 9: Fire de execuţie Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 20 noiembrie 2011

Capitole Speciale de Informatică Curs 2: Determinarea vocabularului de termeni şi a listelor de postări 4 octombrie 2018 Reamintim că listele de indec

Lecţia 2 Structura liniară, alternativă şi repetitivă Clasa a V-a Structuri de bază(liniară, alternativă şi repetitivă) Programarea structurată este o

Microsoft Word - Curs1.docx

Poo Laboratoare 1 Contents Laborator7 2 1 Colecţii de obiecte în Java Interfaţa Iterator Interfaţa C

Laborator 7: PROIECTAREA BAZELOR DE DATE SUBPROGRAME in PL/SQL (partea I - proceduri) Un subprogram este un bloc PL/SQL cu nume (spre deosebire de blo

Addendum Syllabus 6 Microsoft Access 2016 REF Syllabus 6.0 Cunoașterea domeniilor în care se utilizează bazele de date Datorită potenţialului ma

Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare

Microsoft Word - CarteC.doc

Laborator 04: Apeluri de funcții

Introducere în limbajul JavaScript

7. Alinierea robustă a densităţilor de puncte 3D Măsurarea distanţei dintre diferite forme geometrice 3D Estimarea rotaţiei şi a translaţiei optime în

Lecții de pregă,re la informa,că Admitere 2019 Tema: Discutarea problemelor date la ul,mele sesiuni de admitere Bogdan Alexe

Metode de programare Proiectarea algoritmilor

Logică și structuri discrete Relații. Funcții parțiale Marius Minea marius/curs/lsd/ 20 octombrie 2014

Transcriere:

LUCRAREA NR. 5 TIPURI DE DATE STRUCTURATE În C există două categorii de tipuri de date structurate: tablourile şi structurile. Un tablou este o colecţie omogenă de valori de acelaşi tip identificate printr-un indice, iar o structură este o colecţie neomogenă de valori identificate prin nume simbolice, denumite selectori. 5.1. Tablouri unidimensionale Un tablou este o colecţie de variabile de acelaşi tip care sunt referite printr-un nume comun. În C, un tablou constă din locaţii de memorie contigue. Adresa cea mai mică corespunde primului element, iar adresa cea mai mare corespunde ultimului element. Un tablou poate avea de la una la mai multe dimensiuni. Accesul la un element specific al tabloului se face utilizând un index. Cel mai utilizat tablou este tabloul de caractere. Şirurile de caractere pot fi definite prin conceptele: vector de caractere şi pointer-caracter. Declararea unui tablou cu o singură dimensiune are următoarea formă generală: tip var_nume[size]; Aici, tip, declară tipul de bază al tabloului. Tipul de bază determină tipul de dată al fiecărui element al tabloului. var_nume este numele tabloului, iar size este numărul elementelor pe care le va conţine tabloul. Exemple: int a[10]; // vectorul a contine 10 intregi float v[3]; // vectorul v contine 3 reali În C toate tablourile folosesc pe zero ca index al primului lor element. Elementele tabloului a[10] sunt a[0],...,a[9]. Iniţializarea vectorilor de caractere Citirea unui şir de la tastatură utilizând funcţiile scanf() şi gets(). o Utilizarea funcţiei scanf(). Exemplu: char nume[21], adresa[41]; printf ("\n Nume: "); scanf ("%s", nume); printf ("\n Adresa: "); scanf ("%s", adresa); printf ("%s\n%s\n", nume, adresa); } S-au definit variabilele nume şi adresa ca tip şir de caractere de maximum 20 şi 40 de caractere. Şirul "%s" care apare în apelul funcţiei scanf() precizează că se vor citi în variabilele nume, respectiv adresa, valori de tip şir de caractere. În printf() descriptorul "%s" are rolul de a preciza cum trebuie convertite valorile datelor de afişat (în cazul de faţă, valorile variabilelor nume şi adresa). Cea mai bună cale de a introduce un şir de la tastatură constă în utilizarea funcţiei gets() din fişierul antet "stdio.h". Forma generală a funcţiei gets() este: gets (nume_vector) 1

Pentru a citi un şir se apelează gets() având ca argument numele vectorului, fără nici un index. Funcţia gets() returnează vectorul ce va păstra şirul de caractere introdus de la tastatură. gets() va continua să citească caractere până la introducerea caracterului CR. Exemplu: Programul următor afişează şirul de caractere introdus de la tastatură. char sir[80]; gets (sir); /* citeste un sir de la tastatura */ printf ("%s", sir); } Iniţializarea vectorilor de caractere utilizând constantele şir Folosind constantele şir, vectorii de caractere se iniţializează sub forma: char nume_vector[size] = "sir_de_caractere" unde size = numărul caracterelor din şir plus 1. Exemplu: char nume[14] = "ENE ALEXANDRU"; char adresa[24] = "Str. A. I. Cuza, nr.13"; puts (nume); puts (adresa); } Vectorul nume va ocupa începând de la adresa nume, 13 + 1 = 14 octeţi, iar cel de-al doilea vector va ocupa începând de la adresa adresa, 23 + 1 = 24 locaţii (bytes). Funcţia puts() scrie pe stdout şirul memorat în vectorul al cărui nume apare ca parametru al funcţiei puts(), precum şi caracterul "\n". Funcţii pentru prelucrarea şirurilor (fişierul antet string.h) Funcţia strcpy() Apelul funcţiei strcpy() are următoarea formă generală: strcpy (nume_sir, constanta_sir); Funcţia strcpy() copiază conţinutul constantei_sir (inclusiv caracterul terminator '\n') în nume_sir. Exemplu: void main(void) { char sir[80]; strcpy (sir, "hello"); printf("%s", sir); } Acest program va copia "hello" în şirul sir. Funcţia strcat() Apelul funcţiei strcat() are forma: strcat (s1, s2); Funcţia strcat() concatenează şirul s2 la sfârşitul şirului s1 şi întoarce şirul s1. irul s2 nu se modifică. Ambele şiruri trebuie să aibă caracterul terminator NULL, iar rezultatul va avea de asemenea caracterul terminator NULL. Exemplu: void main(void) { 2

char first[20], second[10]; strcpy (first, "hello"); strcpy (second, "there"); strcat (first, second); printf ("%s", first); } Acest program va afişa "hellothere" pe ecran. Funcţia strcmp() Se apelează sub forma: strcmp (s1, s2); Această funcţie compară şirurile s1 şi s2 şi returnează valori negative, dacă s1 < s2, 0, dacă s1 = s2 şi un număr pozitiv, dacă s1 > s2. Exemplu: Această funcţie poate fi folosită ca o subrutină de verificare a parolei: char s[80]; printf ("Introduceti parola: "); gets (s); if (strcmp (s, "pasword")) { printf (" Invalid pasword \n "); return 0;} return 1; } Funcţia strlen() Funcţia strlen() se apelează sub forma: strlen (s) unde s este un şir. Funcţia strlen() returnează lungimea şirului s. Exemplu: Programul următor returnează lungimea unui şir introdus de la tastatură. # incude <stdio.h> # incude <string.h> char sir[80]; printf ("Introduceti un sir: "); gets (sir); printf ("Sirul %s contine %d caractere ", sir, strlen(sir)); } Observaţie: Funcţia strlen() nu numără şi caracterul NULL. Exemplu: Programul următor afişează inversul unui şir de caractere introduse de la tastatură. char sir[80]; int i; gets(sir); for(i=strlen(sir)-1;i>=0;i--) printf("%c",sir[i]); } 3

5.2. Tablouri cu două dimensiuni (matrice) Tablourile bidimensionale (matricele) sunt reprezentate ca vectori de vectori. De exemplu, declaraţia: int v[2][5]; declară un vector cu 2 elemente, fiecare element fiind un vector de tip int[5]. Se observă că fiecare dimensiune a tabloului este separată (închisă) între paranteze, iar dimensiunile nu sunt separate prin virgulă. Astfel, declaraţia: int v[2, 5]; conduce la eroare. Iniţializarea matricelor Declaraţia : char v[2][5] = { 'a', 'b', 'c', 'd', 'e', '0', '1', '2', '3', '4' }; conduce la iniţializarea primului vector cu primele 5 litere, iar a celui de-al doilea cu primele 5 cifre. Exemplu: Programul: char v[2][5] = { 'a', 'b', 'c', 'd', 'e', '0', '1', '2', '3', '4' }; int i, j; for (i = 0; i < 2; i++){ for(j = 0; j < 5; j++) printf ("v[%d][%d] = %c", i, j, v[i][j]); printf ("\n"); } } va produce : v[0][0]=a v[0][1]=b v[0][2]=c v[0][3]=d v[0][4]=e v[1][0]=0 v[1][1]=1 v[1][2]=2 v[1][3]=3 v[1][4]=4. Exemplu: Secvenţa de instrucţiuni: int l, c, num[3][4]; for (l = 0; l < 3; ++l) for (c = 0; c < 4; ++c) num[l][c] = (l * 4) + c + 1; } conduce la încărcarea tabloului num[3][4]cu numerele de la 1 la 12. Astfel, num[0][0] = 1,..., num[2][3] = 12. Se observă că limbajul C memoreză tablourile bidimensionale într-o matrice linii-coloane, unde primul indice se referă la linie şi al doilea indice se referă la coloană. Cantitatea de memorie alocată permanent pentru un tablou, exprimată în bytes, este: nr_linii * nr_coloane * sizeof(tipul_datei) 4

Tablouri bidimensionale de şiruri Pentru crearea unui tablou de şiruri se foloseşte un tablou de caractere, bidimensional, în care mărimea indicelui din stânga determină numărul de şiruri, iar indicele din drepta specifică lungimea maximă a fiecărui şir. De exemplu, declaraţia : char sir_tablou[30][80]; defineşte un tablou de 30 de şiruri, fiecare şir având maximum 80 de caractere. Accesul la un singur şir este foarte uşor: se specifică numai primul indice. De exemplu: gets (sir_tablou[2]) întoarce al treilea şir din tabloul sir_tablou. Funcţional, instrucţiunea anterioară este echivalentă cu: gets (&sir_tablou[2][0]); 5.3. Tablouri multidimensionale Forma generală a declaraţiei unui tablou multidimensional este: tip nume[size1][size2]...[sizen]; De exemplu, declaraţia: int trei[4][10][3]; creează un tablou de 4*10*3 întregi. Forma generală de iniţializare a tablourilor este următoarea: specificator_tip nume_tablou[size1][size2]...[sizen]={lista_valori}; unde lista_valori este o listă de constante separate prin virgulă, compatibile cu tipul de bază al tabloului. Observaţie: Limbajul C permite şi iniţializarea tablourilor multidimensionale fără dimensiune. Trebuie menţionat că pentru aceasta este necesară precizarea indicelui celui mai din dreapta. Astfel, declaraţia: int sqrs[5][2] = {1, 1, 2, 4, 3, 9, 4, 16, 5, 25}; este echivalentă cu declaraţia: int sqrs[ ][2] = {1, 1, 2, 4, 3, 9, 4, 16, 5, 25}; 5.4. Structuri O structură este o colecţie de variabile (de tipuri diferite) referite sub un singur nume. Definiţia unei structuri formează un aşa numit şablon (template, tag) ce poate fi folosit la crearea variabilelor tip structură. Variabilele care formează structuri se numesc elementele structurii. Exemplu de program pentru actualizarea unei liste de corespondenţa - maillist Pentru a ilustra modul de utilizare a structurilor şi tablourilor de structuri prezentăm un exemplu de program pentru actualizarea unei liste de corespondenţă. Informaţiile ce vor fi memorate se referă la name, street, city, state, zip. 5

Listingul complet al programului este următorul: # include <ctype.h> # define SIZE 100 struct addr { char name[20]; char street[30]; char city[15]; char state[10]; unsigned int zip; } addr_info[size]; FILE *fp; void init_list(),enter(),save(),load(); void display(); char menu(); void main() { char choice; init_list(); for (;;) { choice = menu(); switch (choice) { case 'e' : enter(); break; case 'd' : display(); break; case 's' : save(); break; case 'l' : load(); break; case 'q' : exit(0); }}} /* Functia init_list() */ void init_list() { register int t; for (t = 0; t < SIZE; t++) *addr_info[t].name = '\0'; } /* Functia menu() */ char menu() { char s[5],ch; do { printf ("(E)nter\n"); printf ("(D)isplay\n"); printf ("(L)oad\n"); printf ("(S)ave\n"); printf ("(Q)uit\n"); printf (" Alegeti optiunea: "); gets(s); ch=s[0]; } while (!strrchr("edlsq",ch)); return tolower(ch); } /* Functia enter() */ void enter() { register int i; for (i=0; i < SIZE; i++) 6

if (!*addr_info[i].name) break; if (i == SIZE) { printf ("addr_info full \n"); /* Lista plina */ return;} printf ("Name: "); gets (addr_info[i].name); printf ("Street: "); gets (addr_info[i].street); printf ("City: "); gets (addr_info[i].city); printf ("State: "); gets (addr_info[i].state); printf ("Zip: "); scanf ("%d",&addr_info[i].zip);} /* Functia save() */ void save() { register int i; if ((fp = fopen("maillist", "wb")) == NULL) { printf (" Cannot open file\n "); return;} for (i = 0; i <= SIZE; i++) if(*addr_info[i].name) if(fwrite(&addr_info[i], sizeof(struct addr), 1,fp)!=1) printf (" File write error \n "); fclose (fp);} /* Functia load() */ void load() { register int i; if ((fp = fopen("maillist","rb")) == NULL) { printf("cannot open file\n "); return;} for (i = 0; i < SIZE; i++) if(fread(&addr_info[i],sizeof(struct addr),1,fp)==1); else if (feof(fp)) { fclose (fp); return;} else printf ("File read error\n"); } /* Functia display() */ void display() { register int t; printf("\n%20s","name"); printf("%30s","street"); printf("%15s","city"); printf("%10s","state"); printf("%5s\n","zip"); for (t=0;t<size;t++) { if (*addr_info[t].name!='\0') { printf("%20s",addr_info[t].name); printf("%30s",addr_info[t].street); printf("%15s",addr_info[t].city); printf("%10s",addr_info[t].state); printf("%5d",addr_info[t].zip); getchar();}}} 7

5.5. Uniuni În C o uniune este o zonă de memorie utilizată de mai multe variabile ce pot fi diferite ca tip. Definitia uniunilor este similară celei a structurilor. Exemplu: union tip_u { int i; char ch;}; O variabilă de acest tip poate fi declarată fie prin plasarea numelui său la sfîrşitul acestei definiţii, fie utilizând o instrucţiune de declarare separată. Când se declară o variabilă union compilatorul C rezervă o zonă de memorie suficient de lungă capabilă să preia variabila cu lungimea cea mai mare. TEME: 1. Să se realizeze un program ce realizează suma şi diferenţa a două matrici oarecare. 2. Să se realizeze un program ce realizează produsul a două matrici. 3. Să se realizeze un program ce ordonează crescător şi descrescător un vector de n numere reale. 4. Să se realizeze un program care determină cel mai mare element şi cel mai mic element dintr-un vector de numere reale precum şi poziţia lor în vector. Dacă există mai multe elemente cu aceeaşi valoare (maximă sau minimă) se afişează toate poziţiile în care acestea apar. 5. Să se realizeze un program ce concatenează două şiruri de caractere şi afişează şirul rezultat reversat (de la coadă la cap). 6. Să se realizeze un program care determină dacă un număr X citit de la tastatură se află într-o matrice cu n linii şi m coloane. În caz afirmativ să se afişeze poziţia în care se află. 7. Să se realizeze un program care determină valoarea unui polinom într-un punct x citit de la tastatură. 8. Să se realizeze un program care calculează c.m.m.d.c a două polinoame. 9. Să se realizeze un program care calculează suma, diferenţa şi produsul a două polinoame. 10. Să se creeze o structură STUDENT cu următoarele câmpuri: nume (de tip şir de caractere), prenume (de tip şir de caractere), adresă (de tip şir de caractere), vârstă (de tip întreg), note (vector de 5 numere reale), medie (de tip real). Să se realizeze un program ce citeşte de la tastatură numele, prenumele, adresa şi cele 5 note pentru 5 studenţi şi afişează cei 5 studenţi în ordine alfabetică şi în ordinea descrescătoare a mediilor. 11. Să se realizeze un program care afişează clasamentul campionatului de fotbal. (Se va folosi o structură ce va conţine numele, nr. de victorii, nr de egaluri, nr. de înfrângeri şi nr. de puncte pentru o echipă. Numărul de puncte se va calcula din celelalte câmpuri.). 8