programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · programiranje 2 - 6 d. vitas...
TRANSCRIPT
1
Programiranje 2 - 6
D. Vitas
Hanojske kule
PRAVILA (elementarne operacije)1. premeštanje diska sa jednog štaoa na drugi 2. nije dozvoljeno postaviti veći disk na manji
CILJPreneti diskove sa štapa a na štap b koristeći pomoćni štap c
Hanojske kulePRIMER (3 diska)
KORACI a-b a-c b-c a-b c-a c-b a-b
2
Hanojske kuleSpecifikacija
Izračunati funkciju H(n, x, y, z) koja opisuje korake u prenosu ndiskova sa x na y koristeći pomoćni štap z (n≥1).
Opis funkcijex-y ako n = 1
H(n, x, y, z) = H(n-1, x, z, y) ; x-y ; H(n-1, z, y, x) si n > 1
Algoritam (n ≥ 1)funkcija H(n, x, y, z) ;početak
ako n = 1 onda ispis(x-y) ;inače { H(n-1, x, z, y); ispis(x-y); H(n-1, z, y, x); }
kraj.
Hanojske kuleIzvršavanje
H (3, a, b, c)
H (2, a, c, b) a - b H (2, c, b, a)
H (1, a, b, c) a - c H (1, b, c, a) H (1, c, a, b) c - b H (1, a, b, c)
a - b b - c c - a a - b
Vreme izvršavanja
T(H, n diskova) = O(2n)H je optimalan (među algoritmima koji poštuju pravila)
Implementacija/* primer47.c - Hanojske kule */#include <stdio.h>void hanoj( int, int, int );main(){
hanoj( 3, 1, 2 ); }void hanoj( int n, int i, int j ) {
printf("n = %d i = %d j = %d :\n ", n, i, j );if( n > 0 ) {
hanoj( n-1, i, 6-(i+j)); // H( n-1, x, z, y )printf("%d --> %d\n", i, j ); // x --> yhanoj( n-1, 6-(i+j), j ); } // H( n-1, z, y, x )
}
3
Izvršavanje
Izvršavanje za n = 3
void hanoj( int n, int i, int j ) {printf("n = %d i = %d j = %d :\n ", n, i, j );
if( n > 0 ) {hanoj( n-1, i, 6-(i+j)); // H( n-1, x, z, y )printf("%d --> %d\n", i, j ); // x --> yhanoj( n-1, 6-(i+j), j ); } // H( n-1, z, y, x )
}
hanoj( 3, 1, 2 )
Igra brojevima
celi > 0Dato: w1, w2, …, wns
Rezultat: podskup I od (1, 2, …, n) takav da ∑ wi = s∅ inače i∈I
Algoritamfunkcija CIFRE (t, i) ;/ * dobija vrednost tacno akko postoji podskup od (i, i+1, ..., n)
takav da je zbir njegovih elemenata t ; ispisuje odgovarajuće brojeve*/
početakako (t = 0 ) tada vrati ( tačno)inače ako ( t < 0 ) ili ( i > n ) tada vrati ( netačno)inače ako CIFRE( t - wi, i+1) tada { ispis(wi ) ; vrati( tačno) ; }inače vrati (CIFRE( t, i+1) ) ;
kraj
Implementacijaint w[] = { 2, 9, 10, 7};int S = 19;int n = 4;main() {
cifre( S, 0 );}int cifre( int t, int i ) {
if( t == 0 ) return 1;else if( ( t < 0 ) || ( i > n ) ) return 0;else if( cifre( t-w[i], i+1 ) )
{ printf("%d ", w[i] ); return 1; }else return cifre( t, i + 1 );
}
4
IzvršavanjeNeka w1 = 2, w2 = 9, w3 = 10, w4 = 7 i s = 19
t i19 1
17 28 3
-2 4 netačno8 4
1 5 netačnonetačno
17 37 4
0 5 tačno--> w4 = 7 tačno
--> w3 = 10 tačnotačno
--> w1 = 2 tačno
int cifre( int t, int i ) {
if( t == 0 ) return 1;else if( ( t < 0 ) || ( i > n ) )
return 0;else if( cifre( t-w[i], i+1 ) )
{ printf("%d ", w[i] ); return 1; }
else return cifre( t, i + 1 );
primer48.c
s = 19 int w[] = { 2, 9, 10, 7};
Složenost
Vremenska složenost = O(2n)
Dokaz: dokazje se da ako je s > ∑ wi
algoritam obiđe sve podskupove skupa
(1, 2, …, n), a njih je 2n.
Zadatak. Sastavi program koji razmenjuje novčanicu od 1000 dinara na sve moguće načine.
5
Analiza vremenaKod rekurzivne funkcije, za vreme se dobija rekurentna
veza iz koje se izračunava vreme izvršavanja. Primer (MNO3 ~ m):
Označimo sa Q telo funkcije m (MNO3). Tada za bilo koji poziv m( u, v, t ) imamo:
Tm(u,v,t) (w) = TQ(w,x,y,r) + Tx,y,r/u,v,t
w - vrednosti programa pre pozova m
vreme izvršavanja tela Q prenos parametara
Primerako je y = 0 --> TQ = T y = 0 + T r = 0
y = 2n, n>= 1 --> TQ = T y = 0 + T par + Tm(2*x, y/2)
y = 2n+1, n> 0 --> TQ = T y = 0 + T par + T r=r+x + Tm(2*x, y/2)
Odavde ⎧ k1, y = 0 TQ (y) = ⎨ TQ(n)+k2, y = 2n parno
⎩ TQ(n)+k3, y = 2n+1
---> TQ (y) ~ log y
Konstrukcija rekurzivnih funkcija
6
PrincipiRešenje problema P se zasniva na
a. direktnom rešenju problema P u nekom posebnom slučaju
b. na izboru dekompozicija problema P na podprobleme iste prirode kaoi P, ali takve da uzastopne dekompozicije vode ka rešenju a.
Struktura
Rekurzivna funkcija mora tada da sadrži:
a. iskaze koji direktno rešavaju poseban slučajb. iskaze koji vrše dekompoziciju na podprobleme
i rešavaju problem u funkciji rešenja podproblema
c. rekurzivne pozive koji rešavaju same podprobleme
PrimeriPrimer 1. Program MNO3 izračunava x*y (a) direktno za y = 0 ili svodi problem na podproblem (b) m( 2*x, y/2 )
Primer 2. Izračunavanje n! ima (a) direktno rešenje za n= 0 ili se svodi na rešenje (b) podproblema izračunavanja (n-1)!
Izračunavanje se završava ako niz dekompozicija konvergira ka rešenju pod (a).
7
Principi dekomponovanjaPostoji više dekompozicija jednog problema.
Dimenzija problema - ne sme zavisiti od dekompozicije
Npr. dužina problema sortiranja niza je izražena brojem elemenata koje treba sortirati
Principi dekomponovanjaNeka je dat problem P dužine n. Možemo birati
između dve dekompozicije: (a) ako je n > 1, rešiti problem dimenzije n-1Primer. n!
T(n) = T(n-1) + f(n), T(1) = k
(b) ako je n > 1, rešiti problem dimenzije n/2 Primer. MNO3
T(n) = T(n/2) + f(n), T(1) = k logaritamska redukcija
Specijalni slučajNeka je dat problem P dužine n. (a) ako je n > 1, rešiti problem dimenzije n-1. Neka je f(n) = n. Tada
T(n) = T(n-1) + n = k+2 + 3 + n ~ n2
(b) ako je n > 1, rešiti dva podproblema dimenzije n/2 i neka je n=2k
Tada: T(n) = 2*T(n/2) + n ---> T(2k) = c*2kT+ k* 2k
---> T(n) ~ n log n
8
Primer 1Zadatak. Crtanje figure. Potrebno je iscrtati mustru
(n = 2):
Uslovi• Crta se na listu proizvoljne dužine i pomoću
olovke koja ima samo dve operacije:– place(x,y) - pozicioniranje pera u tačku sa
koordinatama (x,y)– trace(x,y) - crta duž koja povezuje tekuću
poziciju pera sa tačkom (x,y)• Crtanje mustre je problem Pn (na prethodnom
slajdu: P2)
Uslovi• Za n > 1, crtež se može razložiti na probleme P1 i Pn-1.
Dekompozicija se može izvršiti na više načina, npr. prema tome da li je P1 najveći ili najmanji kvadrat.
• Metoda iscrtavanja: – bez podizanja pera – bez prelaska preko iste linije dva puta.
Odavde: • Pero se vraća u polaznu tačku Pn (n>1)
• Polazna tačka: ista pozicija za svako Pn (inače bi se morala pamtiti pozicija polazne tačke)
• Početna i završna tačka za Pn-1 je tačka na P1. (Neka to bude donji levi ugao)
9
Postupak• Nacrtati deo od P1 koji povezuje polaznu tačku P1 sa
polaznom tačkom na Pn-1.
P1 : dužina strane Ä
• Nacrtati Pn-1.• Dovršiti iscrtavanje P1.
Rešenje... place( x, y ); crtaj(x, y, l, n); ... primer50.c
primer50.exevoid crtaj( int x, int y, int l, int n ) {
if( n > 0 ) {trace(x+l/2, y);trace(x+l/4, y-l/4);crtaj( x+l/4, y-l/4, l/2, n-1 );trace(x, y-l/2);trace(x+l/2, y-l);trace(x+l, y-l/2);trace(x+l/2, y);trace(x+l, y);trace(x+l, y-l);trace(x, y-l);trace(x, y); } }
Složenostn > 0 D(l, n) = 4*l + 2*l*sqrt(2) + D(l/2, n-1 )
n = 0 D(l, 0) = 0
---> D(l, n) = (4*l + 2*l*sqrt(2))*(1 + 1/2 + 1/4 + ...)= 4*l*(2 + sqrt(2)) *(1 - 1/2n)
D(l, n) --> 4*l*(2 + sqrt(2)); n ---> ∞
10
Primer 2Data je figura.
Nacrtati je.
h
d
d
trougao1/* parametre preneti po referenci */void trougao1( float x, float y, float d, float h ) {if( y + d < h ) {
trace( x - d, y + d ); trougao1( x - d, y + d, d, h ); trace( x + d, y + d ); trougao1( x + d, y + d, d, h ); trace( x, y );
} primer51.c primer51.exe
Vreme
T trogao1(y, d, h ) = 3* (2*k-1 - 1 )
eksponencijalno vreme jer se svi trouglovi sa čvorom (x, y + 2*d) crtaju bar dva puta...
Može li bolje?
11
trougao2void strana( float x, float y, float d, float h ) {if( y + d < h ) {
trace( x - d, y + d ); trace( x + d, y + d ); trougao1( x + d, y + d, d, h ); trace( x, y );
}
trougao2void trogao2( float x, float y, float d, float h ) {if( y + d < h ) {
trace( x - d, y + d ); trougao2( x - d, y + d, d, h ); trace( x + d, y + d, d, h ); strana( x + d, y + d, d, h ); trace( x, y );
} T trogao2(y, d, h ) = 3/2*(k+1)*(k+2) primer52.exe
Brzo sortiranje (quicksort)... se duguje C. A. R. Hoare. Ideja je sledeća:
Particija sastožerom = 3 32 4 1 7 2 3 6
32 2 1 7 4 3 6
< 3 ≥ 3
12
quicksortI dalje:
32 2 1 3 4 7 6
< 3 ≥ 3
31 2 2 3 4 6 7
Sort Sort
Rekurzivna definicijaDat je niz A (1 ≤ n ≤ N) celih brojeva koje treba urediti u
rastućem poretku. neka A(i:j) označava podniz takav da 1 ≤ i ≤ j ≤ N. Problem sortiranaj se svodi na problem oblika:
Pinf, sup: Sortiraj A( inf:sup )Dekompozicija je sledeća: P1: ako inf ≥ sup, tada je A( inf:sup ) ili sortiran, ili prazanPinf, sup: ako inf < sup, premeštamo elemente podniza
A(inf:sup) sve dok ne odredimo i: inf ≤ i ≤ sup takvo da A(l) ≤ A(i) za inf ≤ l ≤ i ...(*)A(i) ≤ A(m) za i ≤ m ≤ sup
ParticijaOznačimo sa k vrednost A(i) koje zadovoljava (*).
Tada:
Podela A u odnosu na i naziva se particija niza.Problem Pinf, sup se rastavlja na podprobleme Pinf, i-1 i Pi+1, sup što daje rekurzivnu definiciju...
< k stožer k ≥ k
13
Implementacijaprimer54.c
void quicksort( int inf, int sup ) {if( inf < sup ) {
int i;i = particija( inf, sup);qs( inf, i - 1 );qs( i + 1, sup );}
}
Konstrukcija particijeFunkcija particija se primenjuje na podniz A(inf:sup) uz
uslov da je inf < sup.
Ovaj uslov zadovoljava bilo koja vrednost k koja se javlja u A(inf:sup), pa je možemo proizvoljno izabrati neko k pre nego što počne podela na particije. Vrednost k nazivamo stožer (pivot, centar) particioniranja. Npr. k =A[inf].
< k stožer k ≥ k
particijaInvarijanta petlje u particiji se može prikazati kao
(slično problemu trobojke): < k
stožer k≥ k
l m
14
Implementacijaint particija( int inf, int sup ) {
int l, k, m;l = inf + 1; m = sup; k = A[inf]; //Stozer
while( l <= m) {if( A[l] <= k ) l = l + 1;else { /* A[l] > k */while( A[m] > k ) m = m - 1; /* A[m] <= k */if( l < m ) {
swap( &A[l], &A[m] );m = m - 1; l = l + 1;}
} } primer54.c primer54.exe
VremeT (particija (inf, sup, p)) = Θ (sup - inf + 1) (inf < sup)
ΤMAX(qs (1, n)) = O (n²)
Primer: sortirani niz i izbori stožera p redom 1, 2, …, n - 1
ΤAVG(qs (1, n)) = O (n log n)(t [1], …, t [n] ) = ( 1, 2, …, n )
(sve permutacije od t [1], …, t [n] imaju jednaku verovatnoću)
Implementacijavoid qs( int A[], int inf, int sup ) { // primer56.c
int i, j, tempr;/* Particija */while ( sup > inf ) { i = inf; j = sup; tempr = A[inf];/*** Podeli niz u dva ***/
while ( i < j ) {for ( ; A[j] > tempr; j-- );for ( A[i]=A[j]; i<j && A[i]<=tempr; i++ );A[j] = A[i]; }
A[i] = tempr;/*** Sort rekurzivni, najmanji prvo ***/
if ( i-inf < sup-i ) { qs(A,inf,i-1); inf = i+1; }else { qs(A,i+1,sup); sup = i-1; }
}}
15
Bibliotečki qsort Sortira <num> elemenata dužine <with> bajtova počev od
adrese <base>, a koristeći u poređenju funkciju na koju pokazuje (*compare) (korisnička funkcija).
Prototip:void qsort(
void *base, // ime nizasize_t num, // br. elemenatasize_t width, // br. bajtovaint (*compare) ( // f. poređenja
void *elem1, void *elem2 ) ); primer56.c
Funkcije za poređenjeint icmp(void *p1, void * p2) // poredjenje int u rastucem poretku { return ( ( * (int *) p1) - ( * (int *) p2 ) ); }
int icmpd(void *p1, void * p2) // poredjenje int u opadajucem poretku { return ( ( * (int *) p2) - ( * (int *) p1 ) ); }
int scmp(void *p1, void * p2) /* poredjenje niski */{ return ( strcmp( (char *) p1, (char *) p2 ) ); }
int pscmp(void *p1, void * p2) // poredjenje niski preko pokazivaca /{ return ( strcmp( * (char **) p1, * (char **) p2 ) ); }
Drugi primeri cmpfuns.c
Primeri#include "cmpfuns.h" int a[10]; char sa[3][10]; // niz niskichar *ps[20]; // niz pokazivaca na karaktere......................................qsort( a, 10, sizeof( int ), icmp ); // rastuci poredakqsort( a, 10, sizeof( int ), icmpd ); // opadajuci poredakqsort( sa, 3, sizeof( sa[0] ), scmp ); // poredjenje niskiqsort( ps, 20, sizeof( char * ), pscmp ); // poredjenje niski
16
Anagrami (Bentley)Anagrami = reči koje se sastoje od istih slova
Primer. vatra, vrata, trava,...
Zadatak. Sa standardnog ulaza se učitava tekst. Odrediti sve anagrame u tom tekstu.
PrimerTekst: To je trava a ono nije ni vatra ni vrata ...Vertikalizacija: Parovi: Anagrami: To To, To a, aje ej, je aartv, travatrava aartv, trava aartv, vatraa a, a aartv, vrataono oon, ono eeijn, nijenije eijn, nije ej, jeni in, ni in, nivatra aartv, vatra in, nini in, ni oon, onovrata artv, vrata To, To
sort sort
Rešenjesign - primena qsort-a unutar niske da bi se
dobio kanonski predstavniksort - primena qsort-a na niz kanonskih
predstavnikasquash - grupisanje različitih reči sa istim
kanonskim predstavnikom
sign <text | sort | squash > anagram
anagram1.c, anagram2.c
17
Još jedan primerTekst: To je to a ovo nije ni to ni ovo ...Vertikalizacija: Frekvencije RečnikTo a 1 a 3 toje je 1 je 2 nito ni 2 ni 2 ovo a ni 1 aovo nije 1 nije 1 jenije ovo 2 ovo je nijeni ovoto To 3 toni toovo to
sort count sort
ZadatakPod medijanom niza od N elemenata
podrazumeva se element niza koji je manji od jedne polovine, a veći od druge polovine elemenata niza.
Primer. 16 12 99 95 18 87 10
N = 7 medijana = 18
Rešenja1. (trivijalno) sortirati niz, pa naći srednji element.2. particija 3. uopštenje: pronaći k-ti element po veličini u
nizu (bez sortiranja) - rečšenje FIND (Hoare)
Još jedan zadatak (bez qsort-a): Data su dva niza, F i G, celih brojeva. Pronaći bez
sortiranja najmanje rastojanje elemenata F i G: min( abs(F(i) - G(j)), po i i j
18
Mergesort
Mergesort// MergeSort a table of integer of size count.// Never tested. void MergeSort(int *tab,int count) {
if (count==1) return; MergeSort(tab,count/2);MergeSort(tab+count/2,(count+1)/2); Mix(tab,tab+count/2,count/2,(count+1)/2); }
Mergesort// Mix two sorted tables in one and split the result into these two tables. int *Mix(int *tab1,int *tab2,int count1,int count2) {
int i,i1,i2; i = i1 = i2 = 0; int * temp = (int *)malloc(sizeof(int)*(count1+count2)); while((i1<count1) && (i2<count2)) {
while((i1<count1) && (*(tab1+i1)<=*(tab2+i2))) { *(temp+i++) = *(tab1+i1); i1++; }
if (i1<count1) { while((i2<count2) && (*(tab2+i2)<=*(tab1+i1)))
{ *(temp+i++) = *(tab2+i2); i2++; } }
}
19
Mergesort
http://www.cse.iitk.ac.in/users/dsrkg/cs210/applets/sortingII/mergeSort/mergeSort.html
Binarno pretraživanjeDat je niz T(1:N) celih brojeva uređen u rastućem
poretku i dat je ceo broj k. Utvrditi da li postoji indeks i: 1 <= i <= N takav da
T(i) <= k < T(i+1)
Označimo ovaj problem sa P1,N. Rekurzivna dekompozicija se dobija rešavanjem podproblema Pinf,sup gde
0 ≤ inf - 1 ≤ sup ≤ N
Neka T[0] = - ∞ i T[N+1] = +∞
RešenjeAko inf ≤ sup, neka je l = [(inf+sup)/2]. Tada:
• Ako k < T[l], onda T[inf-1] ≤ k < T[l], pa treba rešiti Pinf,l-1.
• Ako k ≥ T[l], onda T[l] ≤ k < T[sup+1], pa treba rešiti Pl,sup+1.
• Ako inf > sup, tada inf - 1 = sup i rešenje je i = sup = inf - 1
20
Implementacijaint bp( int inf, int sup, int k ){
if( inf > sup ) return sup;else { int l;
l = (inf + sup)/2;if( k < T[l] ) return bp( inf, l-1, k );else return bp( l+1, sup, k );}
} primer53.c
repna rekurzija
Razvoj rekurzivne funkcijeProblem Pn dekomponujemo na P1 i Pn-1
---> Primer. n!
Problem Pn dekomponujemo na P1 i Pn/2
---> Primer. bs
Problem Pn dekomponujemo na P1 i 2*Pn/2
---> Primer. qsort
I da ponovimo:• Rekurzivno izračunavanje se svodi na dekompoziciju u
kojoj bar jedna grana vodi konačnom rešenju (bez rekurzivnog poziva)
• Rekurzivni poziv je u obliku u kome se izračunavanje ponavlja, pa uvek postoji mogućnost da se isto izračunavanje izrazi iterativno
• U C-u je iterativni program treši manje vremena za izvršavanje i memorijskog prostora
• Rekurzivnost omogućava koncizan, precizan i jednostavan zapis kompleksnog problema
• Rekurzivnost je posebno korisna kod rekurzivnih struktura podataka...
21
Dalje, alokacija memorije
zona teksta(tekst programa)
zona podataka(globalne promenljive)
zona steka(privremeni podaci, lokalne promenljive)
zona heap-a(dinamička memorija)
Klase alokacije
Dinamička alokacija... "zahvatanje" potrebnog memorisjkog prostora
sa heap-aNe postoje operatori u C-u, već se alokacija vrši
pozivom određenih funkcija iz biblioteke <stdlib.h>. Princip:
heap
p
• •• •heap
p dodeljeni prostor
22
Funkcije• alokacija: calloc, malloc, realloc• oslobađanje: free
void * calloc( size_t nb, size_t t);
Poziv ove funkcije, ako je uspešan, vraća pokazivač na zonu niza od nb elemenata od kojih je svaki dužine t, a inače NULL (npr. nema prostora na heap-u). Zona je inicijalizovana na 0
Primerfloat *p; .................................../* p pokazuje na niz od 50 elemenata * tipa float */p = (float *) calloc( 50, sizeof( float )); for( i = 0; i < 50; i++ )
p[ i ] = ...
Funkcije(void *) malloc( size_t n )
... vraća pokazivač na zonu od n bajtova, a u slučaju neuspeha, NULL. Nema inicijalizacije.
(void *) realloc( void *p, size_t n ) ... modifikuje obim objekta na koji pokazuje pokazivač p
(kome je prostor dodeljen funkcijama malloc ili calloc) i vraća pokazivač na zonu od n elemenata, a u slučaju neuspeha, NULL.
Ako je za p bilo rezervisano t bajtova, realloc kopira inf(t,n) prvih bajtova iz p (sadržaj ostaje nepromenja). Novi prostor je neinicijalizovan.
23
Funkcijevoid free( void *p)
... oslobađa memorijski prostor koji je zauzimao pokazivačp (kome je prostor dodeljen sa malloc ili calloc). Funkcija nema dejstvo ako je p = NULL.
Koristan makro:
#define zauzmi(nb, tip) (tip *) calloc( nb, sizeof( tip ) )
Primermain(){ char *niska= "Dobar dan"; // niska od 10 karaktera
char *pok; // pokazivac na lokaciju tipa char
/* Kopiranje preko pokazivaca mora da rezervise memorijsku * zonu od 10 karaketra za kopiranje */
pok = (char *) malloc( (strlen(niska) + 1 ));copy( pok, niska );printf("%s\n", pok );
}void copy( char *s, char *t ) { while( *s++ = *t++); }
primer23.c
Primer#include <stdio.h> <malloc.h> <stdlib.h> realloc.cint main() {
int *bufint; // Zona za cele brojevechar *bufchar; // Zona za karaktere printf( "Alociraj dva bafera od 512 objekata\n" );if( (bufint = (int *) calloc( 512, sizeof( int ) )) == NULL ) exit( 1 );printf( "Alocirano %d bajtova na %Fp\n", _msize( bufint ), bufint );
if( (bufchar = (char *) calloc( 512, sizeof( char ) )) == NULL ) exit( 1 );printf( "Alocirano %d bajtova na %Fp\n",
_msize( bufchar ), bufchar );
24
Primer (nastavak) /* Prosirimo 2. bafer. Pokusaj da prvo realociramo prvi bafer nije
moguc jer je realokacija drugog bafera u toku. */if( (bufchar = (char *) _expand( bufchar, 1024 )) == NULL )
printf( "Nema ekspanzije" );else printf( "Prosiren 2. blok na %d bajtova na %Fp\n",
_msize( bufchar ), bufchar );/* Realociramo prvi bafer na 1024 objekta tipa int */ if( (bufint = (int *) realloc( bufint, 1024 * sizeof( int ) )) == NULL )
printf( "Nemoguca realokacija" );else printf( "1. blok realociran na %d bajtova %Fp\n",
_msize( bufint ), bufint );/* Oslobadjanje memorije */free( bufint ); free( bufchar );exit( 0 ); }
RezultatAlociraj dva bafera od 512 objekataAlocirano 2048 bajtova na 003D4818 // intAlocirano 512 bajtova na 003D2430 // char Prosiren 2. blok na 1024 bajtova na 3D50A0 // char1. blok realociran na 4096 bajtova 003D4818 // int