background image

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); 

background image

 

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 <conio.h> 
# include <malloc.h> 
# include <stdlib.h> 
# define PI 3.14; 
 
main () { 
float tab[10]; 
int i; 
for(i=0;i<10;i++) { 
  tab[i]=rand()/PI; 
  printf("Tab[%i]=%f\n",i,tab[i]); 

getch(); 
return(0); 
}

 

# include <stdio.h> 
# include <conio.h> 
# include <malloc.h> 
# include <stdlib.h> 
# define PI 3.14; 
 
main () { 
float *tab; 
int i; 
tab=(float*)calloc(10,sizeof(float)); 
for(i=0;i<10;i++) { 
  *(tab+i)=rand()/PI; 
  printf("Tab[%i]=%f\n",i,*(tab+i)); 

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