Cursul02.pdf

  • Uploaded by: Andrei Pricopi
  • 0
  • 0
  • October 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Cursul02.pdf as PDF for free.

More details

  • Words: 1,799
  • Pages: 49
+

Algoritmi și tehnici de programare Cursul 2

+ Cuprins 

Tipul Struct.



Organizarea externă a datelor în fișiere.



Fişiere text şi binare.

+

Tipul Struct

 Articolul:  





Structură statică Structură compusă, ierarhică  Membri = câmpuri  Nume și tip Structură neomogenă  Câmpurile/membrii de tipuri diferite de date Access direct la membri

+

Tipul Struct

struct StructureName { dataType field1; dataType field2; . . . dataType fieldn; };

+

Tipul Struct struct Student { int id;

char nume[20]; char prenume[20]; int grupa; int note[10];

};

+

Tipul Struct

id

bytes

nume

4

20

prenume grupa

20

4

nota

4*10

+

Tipul Struct

Există două posibilități de declarare a variabilelor care alcătuiesc structura: 1) Declarând variabilele de tipul definit: struct Student { int id; char nume[20]; char prenume[20]; int grupa; int note[10]; }; 

struct Student s;



s este o variabila de tipul Student care are 5 membrii.

+

Tipul Struct 2) Scriind la sfârșit numele variabilelor: typedef struct Student { int id; char nume[20]; char prenume[20]; int grupa; int note[10];

} s1,s2;

+ Tipul Struct

Pentru accesul la câmpurile unei variabile de tip struct se foloseşte operatorul de selecţie directă, notat cu ‘.’, operator cu prioritate maximă.

+ Tipul Struct  Dacă

s este o variabilă de tipul Student.

 Atunci:  s.nume

– reprezintă şirul nume al variabilei s;  s.nume[0] - reprezintă primul caracter al şirului nume;  s.nota[0] – reprezintă prima nota a variabilei s.

+ Tipul Struct 

Definirea variabilelor  Student s1, *ps1, studenti[20];



Inițializare  La definire  Student s2 = {2120, "Ionut", "Popa", 1043, {10, 8, 9}};  Alocare memoriei  ps1 = (Student *)malloc(sizeof(Student));



Referirea cîmpurilor  Variabile simple  strcpy(s1.nume, “Ionut");  s1.id = 2121;  studenti[0].nota[2] = 10;  Variabile pointer  strcpy(ps1->nume, “Ionut");  ps1->id = 2121;  ps1->note[2] = 10;

+ Tipul Struct 

Între două variabile de acelaşi tip struct se poate folosi atribuirea.



Dacă s1, s2 sunt două variabile de tip Student, prin atribuirea s1=s2, variabila s1 ia aceeaşi valoare ca variabila s2.

+ Tipul Struct Putem avea un tip structurat ce conține în interiorul său un alt tip structurat. struct data { int an, luna, zi;

} typedef struct persoana { char nume[20]; char adresa[30]; data datan; int cod; } pers;



pers.datan.an=2019

+ Tipul Struct typedef struct persoana { char nume[20]; char adresa[30];

typedef struct { int an, luna, zi;

} datan; int cod;

} pers;



pers.datan.an=2019

+

Tipuri de fişiere în C/C++

 Fișiere

utilizator

 Text  Binare  Fișiere

standard

 stdout  stdin  stderr

 stdprn  stdaux

+

Fişiere text şi binare

 Există

două tipuri de fişiere cu care se poate opera într-un program:

 Fişierele 

stochează datele ca o secvenţă de caractere alfanumerice şi conţinutul acestor fişiere poate fi vizualizat şi poate fi editat direct cu ajutorul unui editor de texte.

 Fişierele 

text:

binare:

stochează informația fără prelucrări exact așa cum apare ea în memorie

+

Moduri de deschidere a fişierelor

Mod

Scop

a

• • • •

Deschide un fişier existent pentru adăugare la sfârşit (extindere) sau Îl creează dacă nu există. Este permisă numai scrierea. Numai pentru fişiere text.

r



Deschide un fişier existent numai pentru citire

w

• •

Suprascrie un fişier existent sau creează unul nou, Permite numai operaţia de scriere

• a+

• •

Deschide un fişier existent pentru adăugare la sfârşit (extindere) sau îl creează dacă nu există. Sunt permise citiri şi scrieri. Numai pentru fişiere text.

r+



Deschide un fişier existent pentru citire şi scriere

w+

• •

Suprascrie un fişier existent sau creează unul nou. Permite atât citiri cât şi scrieri.

Se poate adăuga: b – fişiere binare sau t – fişiere text

+

Moduri uzuale de deschidere a fişierelor Operaţia de gestiune

Fişiere text

Fişiere binare

Creare

w

wb

Consultare

r

rb

Actualizare Creare şi actualizare Extindere

r+b w+ a

rwb, w+b

+

Organizarea externă a datelor în fișiere



Structură de date externe



Colecție omogenă din punct de vedere al:  



Caracteristici:  



Conținutului: articole/înregistrări Prelucrărilor

Externe: nume, extensie, atribute Interne

Abordare:  

Nivel logic Nivel fizic

+

Organizarea externă a datelor în fișiere A1

A2

început de fişier



Ak



separatori de articole

An

eof marcator sfârşit de fişier

Separatorii şi marcatorul sfârşit de fişier pot fi fizici sau logici.

+

Fisiere: Abordare la nivel logic Înregistrare logică

C1 Ak

C2

...

separatori de câmpuri

• Articole cu lungime: • fixă • variabilă

Lk

Ak

Cm

+ Fişiere: Abordare la nivel fizic Zona tampon (buffer) • Blocul (înregistrare fizică) Ai+1 Ai+2

...

Ai+k

I/

/O

Ai+j

MP

Zona articol

+

Moduri de acces la articole

Acces  determinarea adresei Adresă articol = Adresă fişier + Deplasare A1

A2



Ak-1

Ak



An

D(Ak) Pointer (poziția curentă în fișier)

eof

+

Moduri de acces la articole

 Acces

secvențial

 Acces

direct

 Acces

dinamic

+

Moduri de acces la articole

 Acces secvenţial A1



A2

Ak-1

Ak



An

D(Ak)

• Pentru articole cu lungime fixă: D(A1) = 0 D(Ak) = D(Ak-1) + Lart; k=2,3,…,n

eof

+

Moduri de acces la articole

 Acces secvenţial (cont.) • Pentru articole cu lungime variabilă:

D(A1) = 0 D(Ak) = f(D(Ak-1)) = D(Ak-1) + Lartk-1; k=2,3,…,n

+

Moduri de acces la articole  Acces direct după numărul relativ 0

1



k-1



n-1

( 1

2



k



n

A1

A2



Ak



An

)

eof

P(Ak)

Numărul relativ: P(Ak) = k-1 sau P*(Ak) = k Deplasamentul:

D(Ak) = P(Ak) x Lart sau D(Ak) = P*(Ak) x Lart

+

Moduri de acces la articole

 Acces direct după cheie C1

C2

Ck

Cn eof

A1

A2



Deplasamentul:

Ak



An

D(Ak) = f(cheiek)

 cheie primară



Cheia cu valori unice



Cheia cu valori duplicate  cheie secundară

+

Metode de organizare a fişierelor

 Principiile

și regulile după care se memorează articolele unui fișier pe suportul de memorie extern  se asigură protecția și regăsirea acestora

+

Metode de organizare a fişierelor

 Organizare

Secvenţială

 Organizare

Relativă

 Organizare

Indexată

+

Operaţii de intrare/ieşire la nivel de fişier

 Procesarea







conținutului unui fișier presupune:

Deschiderea fișierului  fişier nou  fişier existent Prelucrarea conținutului acestuia (citiri, scrieri) Închiderea fișierului

+

Nivelul superior de prelucrare a fişierelor



Fişierul se descrie ca pointer către predefinită (FIB - File Information Block) 

FILE* fis;



FILE * un tip structură definită în stdio.h

o

structură

+

Operaţii la nivel de fişier



Deschiderea fişierelor





FILE* fopen(const char* nume_extern, const char* mod);

Asignarea fişierelor



FILE *fis = fopen(nume_extern, mod);

exemplu: 1. FILE* f; f= fopen(“lista.txt”,"r"); 2.

FILE* f; fopen_s(&f, nume,"r");

+



Operaţii la nivel de fişier

Închiderea fişierelor



int fclose(FILE* f);

+ Exemplu char *numeFisier = "test.dat";

char *numeFisier = "test.dat";

FILE *fis = fopen(numeFisier, “rb");

FILE *fis;

if (fis != NULL)

if (fopen(numeFisier, “rb") != NULL)

{

{ //… fclose(fis);

//… fclose(fis); }

}

+



Operaţii la nivel de fişier Redenumirea (mutarea) unui fişier





int rename(const char* nume_vechi, const char* nume_nou);

Ştergerea unui fişier 

int remove(const char* cale);

+

Operaţii la nivel de fişier



Revenirea la începutul fişierului  void rewind(FILE *f);



Testarea sfârşitului de fişier  int feof(FILE* f);



Golirea zonei tampon  int fflush(FILE* f);

+

Operaţii de intrare/ieşire la nivel de articol  Scriere  Citire

 Poziţionare  Rescriere  Ştergere

+

Operaţii de citire/scriere cu conversie 

Scrierea pe bază de format 



Citirea pe bază de format 



char * fgets(char *sir, int nrMax, FILE *fis)  nrMax – 1 sau EOL

Scrierea unui caracter 



int fputs(const char *sir, FILE *fis)

Citirea unui șir de caractere 



int fscanf(FILE *fis, const char *spec, …)

Scrierea unui șir de caractere 



int fprintf(FILE *fis, const char *spec, …)

int fputc(int car, FILE *fis)

Citirea unui caracter 

int fgetc(FILE *fis)

+

Operaţii de citire/scriere cu conversie 

stdin și stdout sînt fișiere text



Citirea de la tastatură





citirea din fișiere text (stdin)



fscanf( stdin, "%d", &x );



sau scanf( "%d", &x );

Scrierea pe ecran 

Scrierea în fișiere text (stdout)



fprintf( stdout, "%d", x);



sau printf("%d", x);

+



Operaţii de citire/scriere fără conversie Citirea dintr-un fişier binar





size_t fread(void* ptr, size_t dim, size_t n, FILE* f);

Scrierea într-un fişier binar



size_t fwrite(const void* ptr, size_t dim, size_t n, FILE* f);

+ Exemplu 

Citirea unei înregistrări dintr-un fișier:  fread(&inreg,



sizeof(tipInreg), 1, fis);

Citirea a zece (10) înregistrări dintr-un fișier:  fread(vectInreg,



Scrierea unei înregistrări intr-un fișier:  fwrite(&inreg,



sizeof(tipInreg), 10, fis);

sizeof(tipInreg), 1, fis);

Scrierea a zece (10) înregistrări intr-un fișier:  fwrite(vectInreg,

sizeof(tipInreg), 10, fis);

+ 



Operaţii de poziţionare în fisier Determinarea poziţiei curente 

int fgetpos(FILE* f, fpos_t* poziţie);



long ftell(FILE* f);

Poziţionarea în fişier 

int fsetpos(FILE* f, const fpos_t poziţie);



int fseek(FILE* f, long deplasare, int origine);



Originea poate fi: 

SEEK_SET (0)



SEEK_CUR (1)



SEEK_END (2)

+ Exemplu 

Determinarea poziției curente in fișier





long pozCrt = ftell(fis);

Poziționare la sfîrșitul fișierului



fseek(fis, 0, SEEK_END);

+

Fișiere text ca surse de date

 Fișierele  

text sunt utilizate în aplicații ca:

Sursă de date inițiale Raport final

+

Fișiere text ca surse de date

float a[10]; int i, l = 0; preluare_vector_1("test.txt", a, &l); Vectorul preluat are 6 elemente: 1.11 2.22 3.33 4.44 5.55 23.12 if(!l) printf("\n\nNu s-a putut deschide fisierul sau nu sint elemente"); else { printf("\n\nVectorul preluat are %d elemente: \n",l); for(i=0;i
+

Fișiere text ca surse de date

void preluare_vector_1(char * nume, float v[], int* n) { float x; FILE *f ; f= fopen(nume,"r"); *n=0; if(f) { while(fscanf(f, "%f", &x) > 0) { v[(*n)++]=x; } } }

fclose(f);

+

Fișiere text ca surse de date

void preluare_vector_2(char * nume, float v[], int* n) { float x; FILE* f; fopen_s(&f, nume,"r"); *n=0; if(f) { fscanf_s(f, "%f", &x); while(!feof(f)) { v[*n]=x;(*n)++; fscanf_s(f, "%f", &x); } fclose(f); } }

+ Bibliografie  C.

Uscatu, C. Cocianu, M. Mircea, L. Pocatilu, Algoritmi si tehnici de programare. Aplicații, Editura ASE București 2015 Uscatu, M. Popa, L. Bătăgan, C. Silvestru, Programarea Calculatoarelor. Aplicații, Ed. ASE, 2012

 C.

Gh. Roşca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, M. Mircea, Programarea calculatoarelor. Algoritmi în programare, Ed. ASE Bucureşti, 2007

 I.

Gh. Roşca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, Programarea calculatoarelor. Ştiinţa învăţării unui limbaj de programare, Teorie şi aplicaţii, Ed. ASE, 2003

 I.

More Documents from "Andrei Pricopi"

Excel Bce
August 2019 29
Cv
August 2019 42
Scrisoare De Intentie
August 2019 23
Cv_andreip.pdf
August 2019 24
August 2019 21
Cursul02.pdf
October 2019 16