You are on page 1of 17

Pokazivacke promenljive

-Pokazivacka promenljiva je promenljiva koja “pokazuje” na drugu promenljivu,


odnosno sadrzi adresu memorijske lokacije u kojoj se cuva ta promenljiva.

-Pokazivacke promenljive se deklarisu na sledeci nacin: tip *p1,*p2,…,*pn;

-Specifikacija tipa zadaje tip promenljivih na koje pokazuju pokazivacke promenljive:


p1,p2,..,pn. Simbol: * ispred imena promenljive ukazuje da je ona pokazivacka
promenljiva. Na primer, pokazivacke promenljive se mogu deklarisati na sledeci
nacin:

int *pi; /*pokazivac na celobrojnu promenljivu*/


char *pc; /*pokazivac na znakovnu promenljivu*/
float *pf1,pf2; /*pokazivac na float promenljive*/
-Ako je data deklaracija:

int i,j,*pi;

njom su i,j deklarisane kao celobrojne promenljive, a pi kao pokazivacka


promenljiva koja pokazuje na celobrojnu promenljivu.

-Operatorima dodeljivanja:

i=5;
pi=&i;

promenljivoj i se dodeljuje vrednost 5, a pokazivackoj promenljivoj pi adresa od i


(tako da pokazuje na promenljivu i).

-Ako treba da pristupimo vrednosti promenljive na koju pokazuje pokazivacka


promenljiva tada ispred imena pokazivacke promenljive stavljamo znak: *. Na taj
nacin vrednost na koju pokazuje pi dobijamo sa: *pi. Na primer operator:

j=*pi;
dodeljuje promenljivoj j celobrojnu vrednost koja se nalazi na adresi sadrzanoj u
promenljivoj pi. Operatori dodeljivanja:

pi=&i;
j=*pi;

imaju isti efekat kao

j=i

Vrednost promenljive i mozemo promeniti dodelom

*pi=77;

jer je u pi adresa promenljive i.


Zadatak 1. Sastaviti program na jeziku C za nalazenje vrednosti najmanjeg elementa u
nizu celih brojeva. Za pristup elementima niza koristiti pokazivace. Program treba
da cita i obradjuje nizove sve dok za duzinu niza ne procita nedozvoljenu vrednost.

#include<stdio.h>
#define NMAX 100
main() {
int a[NMAX],n,min,*p;
while(1) {
printf(“n?”); scanf(“%d”,&n);
if(n<=0 || n>NMAX) break;
printf(“A? ”);
for(p=a; p<a+n; p++) if(*p<min) min=*p;
printf(“min=%d\n\n”,min);
}
}
-program ispisuje:

% min3
n? 5
A? 6,3,9,2,4
min= 2

n? -1
Zadatak 2. Sastaviti program na jeziku C za obrtanje redosleda elemenata (prvi sa
poslednjim, drugi sa predposlednjim,…) zadatog niza celih brojeva. Za pristup
elementima niza koristiti pokazivace. Program treba da cita i obradjuje nizove sve
dok za duzinu niza ne procita nedozvoljenu vrednost.

#include<stdio.h>
#define NMAX 100
main() {
int a[NMAX],*p,*q,n;
while(1) {
printf(“n?”); scanf(“%d”,&n);
if(n<=0 || n>NMAX) break;
printf(“A? ”); for(p=a; p<=a+n; scanf(“%d”,p++));
for(p=a, q=a+n-1; p<q; p++, q--) {
int b=*p; *p=*q; *q=b;
}
printf(“A=”); for(p=a; p<a+n; printf(“%d”,*p++)); printf(“\n\n”);
}
}
-program ispisuje:

% obrni2
n? 5
A? 1 2 3 4 5
A=5 4 3 2 1

n? 6
A? 1 2 3 4 5 6
A= 6 5 4 3 2 1

n? -1
Zadatak 3. Sastaviti na jeziku C program za uredjivanje niza brojeva po neopadajucem redosledu metodom
umetanja. Program treba da procita duzinu niza, popuni niz slucajnim jednocifrenim brojevima, ispise
dobijeni niz, ispise dobijeni rezultat i ponavlja predhodne korake sve dok za duzinu niza ne procita
nedozvoljenu vrednost. Niz smestiti u dinamicku zonu memorije.

#include<stdio.h>
#include<stdlib.h>
main() {
int n,*a,b,i,j;
while(1) { /*citanje duzine niza*/
printf(“\n Duzina niza? ”); scanf(“%d”, &n);
if(n<=0) break; /*stvaranje i ispisivanje niza*/
a=malloc(n*sizeof(int)); printf(“\n Pocetni niz:\n\n”);
for(i=0; i<n; i++) {
printf(“%d”, a[i]=rand() / (RAND_MAX + 1.)*10);
if(i%30==29 || i==n-1) printf(“\n”);
} /*uredjivanje niza*/
for(i=1;i<n;i++) {
b=a[i];
for(j=i-1; j>=0 && a[j]>b; j--) a[j+1]=a[j];a[j+1]=b;
} /*ispisivanje uredjenog niza*/
printf(“\n Uredjeni niz: \n\n”);
for(i=0;i<n;i++) {
printf(“%d”,a[i]); if(i%30==29 || i==n-1) printf(“\n”);
} /*unistavanje niza*/
free (a);
}
}
-program ispisuje:

% uredi3
Duzina niza? 25
Pocetni niz:
0518543887187530031194100
Uredjeni niz:
0000011111333445557788889
Duzina niza? -1
Zadatak 4. Sastaviti na jeziku C program za nalazenje unije, preseka i razlike dva skupa realnih brojeva.
Skupove smestiti u dinamicku zonu memorije. Program treba da obradjuje proizvoljan broj parova
skupova.

#include<stdio.h>
#include<stdlib.h>
main() {
float *s1,*s2,*s3; int n1,n2,n3,i,j;
while(1) { /*citanje podataka*/
printf(“\nn1? ”); scanf(“%d”,&n1);
if(n1<0) break;
s1=malloc(n1*sizeof(float));
printf(“s1? ”); for(i=0;i<n1;scanf(“%f”,&s1[i++]));
if(n1==0) printf(“\n”);
printf(“n2? ”); scanf(“%d”,&n2);
if(n2<0) break;
s2=malloc(n2*sizeof(float));
printf(“s2? ”); for(i=0;i<n2;scanf(“%f”,&s2[i++]));
if(n2==0) printf(“\n”); /*unija dva skupa*/
s3=malloc((n1+n2)*sizeof(float));
for(n3=0;n3<n1;n3++) s3[n3]=s1[n3];
for(j=0;j<n2;j++) {
for(i=0;i<n1 && s1[i] != s2[j];i++);
if(i==n1) s3[n3++]=s2[j];
}
s3=realloc(s3, n3*sizeof(float));
printf(“s1+s2=”); for(i=0; i<n3; printf(“%.2f”,s3[i++])); printf(“\n”); free (s3);
/*presek dva skupa*/
s3=malloc((n1<n2?n1:n2)*sizeof(float));
for(n3=i=0;i<n1;i++) {
for(j=0;j<n2 && s1[i] != s2[j]; j++);
if(j<n2) s3[n3++]=s1[i];
}
s3=realloc(s3,n3*sizeof(float));
printf(“s1*s2=”); for(i=0;i<n3,printf(“%.2f”,s3[i++]));
printf(“\n”);
free (s3);
/*razlika dva skupa*/
s3=malloc(n1*sizeof(float));
for(n3=i=0;i<n1;i++) {
for(j=0;j<n2 && s1[i] != s2[j]; j++);
if(j==n2) s3[n3++]=s1[i];
}
s3=realloc(s3,n3*sizeof(float));
printf(“s1-s2=”); for(i=0;i<n3;printf(“%.2f”,s3[i++]));
printf(“\n”);
free (s3);
free (s1); free (s2);
}
}
-program ispisuje:

% skup1

n1? 4
s1? 2431
n2? 5
s2? 75634
s1+s2= 2.00 4.00 3.00 1.00 7.00 5.00 6.00
s1*s2= 4.00 3.00
s1-s2= 2.00 1.00
Zadatak 5. Sastaviti na jeziku C program za transponovanje pravougaone matrice celih brojeva. Matricu
smestiti u dinamicku zonu memorije. Program treba da odredjuje proizvoljan broj pocetnih matrica.

#include<stdio.h>
#include<stdlib.h>
main() {
while(1) {
int **a,**b,m,n,i,j;
/*citanje duzine matrice:*/
printf(“\n Broj vrsta i kolona?”); scanf(“%d%d”,&m,&n);
if(m<=0 || n<=0) break;
/*citanje elemenata matrice*/
a=malloc(m*sizeof(int*));
for(i=0;i<m;i++) {
a[i]=malloc(n*sizeof(int));
printf(“%2d. vrsta?”,i+1);
for(j=0;j<n;scanf(“%d”,&a[i][j++]));
}
/*obrazovanje transponovane matrice*/
b=malloc(n*sizeof(int*));
for(i=0;i<n;i++) {
b[i]=malloc(m*sizeof(int));
for(j=0;j<m;j++) b[i][j]=a[j][i];
}
/*zamena stare matrice novom matricom:*/
for(i=0;i<m;free(a[i++])); free(a);
a=b; i=m; m=n; n=i;
/*ispisivanje rezultata:*/
printf(“\n Transponovana matrica:\n”);
for(i=0;i<m;i++) {
for(j=0;j<n;printf(“%5d”,a[i][j++])); printf(“\n”);
}

/*unistavanje matrice*/
for(i=0;j<m;free(a[i++]));
free (a);
}
}

-program ipisuje:

% transp2 Transponovana matrica:


Broj vrsta i kolona? 3 5 1 6 11
1. vrsta? 1 2 3 4 5 2 7 12
2. vrsta? 6 7 8 9 10 3 8 13
3. vrsta? 11 12 13 14 15 4 9 14
5 10 15
Broj vrsta i kolona? -1 -1
Zadatak 6. Sastaviti na jeziku C program za resavanje sistema linearnih jednacina
Gausovom metodom eliminacije. Matricu i nizove smestiti u dinamicku zonu
memorije. Podaci se citaju skretanjem glavnog ulaza na neku datoteku. Program
treba da obradjuje proizvoljna broj sistema jednacina.

#include<stdio.h>
#include<stdlib.h>
main() {
while(1) {
float **a,**b,*x,c; int n,i,j,k;
/*citanje reda sistema jednacina:*/
scanf(“%d”,&n); if(n<=0) break;
/*citanje koeficijenata sistema*/
printf(“Sistem linearnih jednacina:\n\n\”);
a=malloc(n*sizeof(float*)); b=malloc(n*sizeof(float)); x=malloc(n*sizeof(float));
for(i=0;i<n;i++) {
a[i]=malloc(n*sizeof(float));
for(j=0;j<n;j++) {
scanf(“%f”,&a[i][j]); printf(“7.3f”,a[i][j]);
}
scanf(“%f”,&b[i]); printf(“ | %7.3f\n”,b[i]);
}
/*eliminacija unapred*/
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++) {
c=a[j][i] / a[i][i];
for(k=i;k<n;k++) a[j][k]-=a[i][k]*c;
b[j]-=b[i]*c;
}
/*zamenjivanje unazad:*/
for(j=n-1;j>=0;j--) {
c=b[j]
for(k=j+1;k<n;k++) c-=a[i][k]*x[k];
x[j]c/a[j][j];
}
/*ispisivanje rezultata:*/
printf(“\n Resenje sistema:\n\n”);
for(i=0;i<n;printf(“%7.3f”,x[i++]));
putchar(‘\n’);
/*oslobadanje dinamicki dodeljene memorije:*/
for(i=0;i<n;free(a[i++]));
free(a); free(b); free(x);
}
}
% gaus <gaus.pod
Sistem linearnih jednacina:
1.000 3.000 -4.000 | 8.000
1.000 1.000 -2.000 | 2.000
-1.000 -2.000 5.000 | -1.000

Resenje sistema:

1.000 5.000 2.000

You might also like