CATEGORII DOCUMENTE |
Tablouri de structuri
Cel mai uzual mod de folosire a structurilor este in tablouri de structuri. Pentru declararea unui tablou de structuri, mai intai se defineste o structura si apoi se declara un tablou de variabile de acel tip. De exemplu, pentru declararea unui tablou cu 100 de structuri addr definite anterior, se va scrie:
struct addr addr_info[100];
Pentru a avea acces la o structura oarecare din cele 100 se va indexa numele structurii (in cazul acesta addr_info).
De exemplu:
printf ('%d', addr_info[2].zip);
are ca efect afisarea codului zip din a treia structura.
Se observa ca, la fel orice variabila tablou, tablourile de structuri incep cu indexul 0.
Exemplu de program pentru actualizarea unei liste de corespondenta - maillist
Pentru a ilustra modul de utilizare a structurilor si tablourilor de structuri prezentam un exemplu de program pentru actualizarea unei liste de corespondenta.
Informatiile ce vor fi memorate se refera la name, street, city, state, zip. Pentru definirea structurii de baza addr care va contine aceste informatii vom scrie:
struct addr addr_info[SIZE];
Tabloul addr_info contine SIZE structuri de tip addr, unde SIZE se defineste dupa necesitati.
Prima functie necesara in program este main(), a carei structura este urmatoarea:
void main() }}
Functia init_list() pregateste tabloul structura pentru utilizare prin punerea unui caracter null in primul byte al campului 'nume'. Programul impune ca o variabila structura sa nu fie utilizata daca campul nume este vid. Aceasta initializare are loc in memoria interna a calculatorului (nu in fisierul maillist de pe disc).
Structura functiei de initializare init_list() ar putea fi urmatoarea:
/* Functia init_list() */
void init_list()
Functia de selectare a meniului menu() va afisa mesajele optiunilor si va returna varianta aleasa. Prin tastarea literei din paranteze, se va lansa in executie o anumita procedura.
/* Functia menu() */
char menu() while (!strrchr('edlsq',ch));
return tolower(ch); }
Observatie: Functia strrchr(cs,c) din <string.h> intoarce un pointer la ultima aparitie a lui c in cs sau NULL daca nu apare.
Functia enter() are ca efect introducerea unor noi informatii in urmatoarea structura libera a listei addr_info[SIZE]. Aceasta introducere se efectueaza prin determinarea primei structuri libere din memorie (cu addr_info.name setata la 0) si prin completarea sa cu informatii culese de la tastatura.
/* Functia enter() */
void enter()
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);}
Rutinele save() si load() se utilizeaza pentru actualizarea bazei de date. Aceste rutine lucreaza cu fisierul disc maillist. Cand se apeleaza load(), atunci se copiaza in tabloul structura din memorie datele stocate in fisierul maillist. Functia load() realizeaza operatiunea inversa, de suprainscriere a fisierului disc cu datele din memorie. Spre exemplu, daca dorim sa adaugam date la fisierul maillist care contine deja date introduse anterior, ordinea de lansare a comenzilor va fi: init_list(), load(), enter(), save(), exit(). Structura acestor rutine este urmatoarea:
/* Functia save() */
void save()
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()
for (i = 0; i < SIZE; i++)
if(fread(&addr_info[i],sizeof(struct addr), 1, fp) == 1);
else if (feof(fp))
else printf ('File read errorn'); }
Atat save() cat si load() confirma un succes a unei operatii cu fisiere prin verificarea valorilor intoarse de functiile fread() sau fwrite(). In plus, load() trebuie sa caute si indicatorul de sfarsit de fisier utilizand functia feof() deoarece fread() intoarce aceeasi valoare daca se intalneste indicatorul de sfarsit de fisier sau daca apare o eroare.
Functia display() afiseaza pe ecran intregul tablou structura din memorie care contine date valide:
/* Functia display() */
void display() }}
Listingul complet al programului va fi:
# include <stdio.h>
# include <ctype.h>
# include <string.h>
# define SIZE 100
struct addr addr_info[SIZE];
FILE *fp;
void init_list(),enter(),save(),load();
void display(),exit();
char menu();
void main() }}
/* Functia init_list() */
void init_list()
/* Functia menu() */
char menu() while (!strrchr('edlsq',ch));
return tolower(ch); }
/* Functia enter() */
void enter()
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()
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()
for (i = 0; i < SIZE; i++)
if(fread(&addr_info[i],sizeof(struct ddr),1,fp)==1);
else if (feof(fp))
else printf ('File read errorn'); }
/* Functia display() */
void display() }}
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1655
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved