Kod:
#include <stdio.h>
/*. Omoguciti korisniku unos 4 ´ < m < 21 elemenata u polje cijelih brojeva. Odrediti i
na ekran ispisati element s najvecom i element s najmanjom vrijednosti. Koristiti ´
pokazivacku notaciju za pristup elementima polja*/
int main(){
int m, niz[20];
int *min, *max;
printf("Unesite koliko brojeva zelite unijeti u niz:\n ");
while(1){
scanf("%d", &m);
if(m < 4 || m > 21)
printf("Broj se treba nalaziti u intervalu <4,21>!\n");
else
break;
}
printf("\nUnosenje elemenata niza...\n");
for(int i = 0; i < m; i++){
printf("Unesite %d. element niza: \n", i + 1);
scanf("%d", (niz + i));
}
min = niz;
max = niz;
for(int i = 0; i < m; i++){
if(*(niz + i) < *min)
min = niz + i;
if(*(niz + i) > *max)
max = niz + i;
}
printf("Najmanji element niza je: %d\n", *min);
printf("Najveci element niza je: %d\n", *max);
return 0;
}
Iz tvojeg programa izbačene su nepotrebne varijable: n, p, najmanja_vrijednost i najveca_vrijednost te je preveden iz nekog hibrida ("C/C++"
) u C.
Pokazivač
p koji koristiš za učitavanje
m je višak!
Funkcija scanf() očekuje pokazivač na mjesto u memoriji (adresu memorijske lokacije) gdje želiš pohraniti učitanu vrijednost. Jednostavno joj proslijedi adresu varijable
m koristeći unarni operator & koji vraća referencu na svoj operand, odn. adresu u memoriji gdje se taj operand nalazi, odn. pokazivač.
Zašto tvoj program ne radi?
Naime,
min i
max su pokazivačke varijable, u njih se spremaju adrese:
Kod:
min = niz;
max = niz;
dodjeljuje tim varijablama adresu prvog elementa
niza, isto kao da pišeš:
Kod:
min = &niz;
max = &niz;
što bi mogao pročitati: "dohvati adresu prvog elementa niza i dodjeli ju varijabli min/max". Kad pišeš
niz, zapravo misliš na adresu prvog elementa niza a ne na kompletan niz kao u nekim drugim jezicima.
Nakon gornjih dodjela,
min i
max oba pokazuju na prvi element niza.
Program ulazi u petlju i mora provjeriti da li je
vrijednost trenutnog elementa niza veća ili manja od
vrijednosti u
nizu na koju pokazuju varijable
min i
max.
Tu dolazimo do operatora *, on vraća vrijednost koja je spremljena na memorijskoj lokaciji na koju pokazuje njegov operand. Tako da npr.
*niz vraća vrijednost prvog elementa niza.
*(niz + i) vraća vrijednost i-tog elementa niza i može se reći da je taj izraz ekvivalentan izrazu
niz[i] kojeg si ranije susretao.
Napokon dolazimo do konkretnog problema u tvojem programu!
Sjeti se da varijable min i max pokazuju na prvi element niza, one su pokazivači. Kad pišeš:
Kod:
*min = *(niz + i)
ili
*max = *(niz + i);
ti zapravo mijenjaš vrijednost prvog elementa niza, čitaj te redove: "dohvati vrijednost na i-tom mjestu u nizu
*(niz + i) i dodjeli tu vrijednost mjestu
na koje pokazuje varijabla min/max", što će uvijek biti prvi element niza jer se sami pokazivači
min i
max u tvom programu ne mijenjaju, mijenja se samo sadržaj na koji one pokazuju odn. prvi element niza.
Zamjeni gornje linije s:
Kod:
min = (niz + i)
i
max = (niz + i);
i program će raditi. Zašto? Sad kada program naleti na broj koji je manji/veći od zapamćenih brojeva on će promijeniti same pokazivače tako da pokazuju na trenutno najmanji/najveći element u nizu.
Nema na čemu!