Laboratorium nr 9

Temat: Alokacja tablic. Program z poprzedniego wiczenia zmodyfikowa tak, aby okre lał liczb

danych, alokował tablic , pobierał dane i na zako czenie zwalniał pami .

1) Alokacja tablicy, pobranie danych oraz wy wietlenie rekordu.

# include <stdio.h>

# include <conio.h>

# include <malloc.h>

struct baza {

char imie[56];

char nazwisko[56];

char telefon[56];

};

int utworz_dane(struct baza *dane, int *ilosc){

FILE *wsk_pliku;

char znak;

if((wsk_pliku=fopen("baza.txt","r"))!=NULL) {

do {

znak=fgetc(wsk_pliku);

if (znak=='\n') *ilosc+=1;

} while (fscanf(wsk_pliku,&znak)!=EOF);

if ((dane=(struct baza*) malloc(*ilosc*sizeof(struct baza)))==NULL) printf("\nNie zarezerwowano pamieci !\n"); fclose(wsk_pliku);

}

else printf("\nNie mozna otworzyc pliku !\n"); return(0);

}

int pobierz_dane(struct baza *wsk){

FILE *wsk_pliku;

char znak,bufor[256];

if((wsk_pliku=fopen("baza.txt","r"))!=NULL) {

while ((fgets(bufor,256,wsk_pliku)!=NULL)) {

sscanf(bufor,"%s%s%s",&wsk->imie,&wsk->nazwisko,&wsk->telefon); wsk++;

}

fclose(wsk_pliku);

}

return(0);

}

int wyswietl_rekord(struct baza *wsk){

int rekord;

printf("Podaj numer rekordu = "); scanf("%d",&rekord); printf("\nDane osoby[%i]\n",rekord);

printf("Imie: %s\t Nazwisko: %s\t Telefon: %s\n",wsk[rekord].imie, wsk[rekord].nazwisko, wsk[rekord].telefon);

return(0);

}

int zwolnij_dane(struct baza *wsk){

free(wsk);

return(0);

}

main() {

struct baza *wsk_bazy;

int ilosc_danych=0;

utworz_dane(wsk_bazy, &ilosc_danych);

pobierz_dane(wsk_bazy);

wyswietl_rekord(wsk_bazy);

zwolnij_dane(wsk_bazy);

getch();

return(0);

}

Uwaga:

a. Przed uruchomieniem programu utwórz plik "baza.txt" oraz wpisz, np. 4 rekordy, wg. schematu: imie00 nazwisko00 telefon00

imie01 nazwisko01 telefon01

imie02 nazwisko02 telefon02

b. Funkcje alokowania pami ci

Funkcja

Działanie

malloc()

Alokacja pami ci

calloc()

Alokacja pami ci z wyzerowaniem obszaru

free()

Zwalnianie przydzielonej pami ci

realloc()

Zmiana wielko ci alokowanej tablicy

c. Przykład zastosowania funkcji alokowania tablicy jedno-wymiarowej

# include <stdio.h>

# include <stdio.h>

# include <conio.h>

# include <conio.h>

# include <malloc.h>

# include <malloc.h>

# include <stdlib.h>

# include <stdlib.h>

# define PI 3.14;

# define PI 3.14;

main () {

main () {

float tab[10];

float *tab;

int i;

int i;

for(i=0;i<10;i++) {

tab=(float*)calloc(10,sizeof(float));

tab[i]=rand()/PI;

for(i=0;i<10;i++) {

printf("Tab[%i]=%f\n",i,tab[i]);

*(tab+i)=rand()/PI;

}

printf("Tab[%i]=%f\n",i,*(tab+i));

getch();

}

return(0);

getch();

}

free(tab);

return(0);

}

gdzie:

• tablica[i] jest tłumaczone przez kompilator jako:

*(&tablica[0]+i*sizeof(typ_danych)) lub *(tablica+i*sizeof(typ_danych))

• wyra enie tablica[i] jest równowa ne wyra eniu *(tablica+i).

• wyra enia tablica++ odnosi si do arytmetyki wska ników i oznacza dost p do nast pnego elementu w tablicy, tzn. tablica[i+1].

2) Zadanie: Zmodyfikuj program bazy danych z poprzedniego wiczenia tak, aby: pozwalał na wprowadzanie danych ze spacja, okre lał liczb danych, alokował tablic o wymaganej wielko ci a na zako czeniu zwalniał pami .

Uwaga: Przykładowe menu programu:

1. Wprowad rekord

2. Zapisz dane na dysk

3. Pobierz dane z dysku

4. Wy wietl dane

5. Wy wietl rekord

6. Wy wietl pole

7. Koniec

Przykładowy plik danych:

Imie 00 nazwisko 00 telefon 00

Imie 01 nazwisko 01 telefon 01

Imie 02 nazwisko 02 telefon 02