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