Natrag   Forum.hr > Informatička tehnologija > Za napredne korisnike > Programiranje

Programiranje Za programere i one koji to žele postati ...

Odgovor
 
Tematski alati Opcije prikaza
Old 29.11.2014., 05:31   #1
Question Pronalazak najvećeg i najmanjeg elementa niza korištenjem pokazivačke notacije

Pozdrav!

Imam problem kod pronalaska najmanjeg i najvećeg, na kraju mi ispiše isti minimalni broj koji je jednak maksimalnom iako to nisu.

Kod:
#include <iostream>
#include <stdlib.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], najmanja_vrijednost, najveca_vrijednost;
	int *p = &m, *n = niz, *min = &najmanja_vrijednost, *max = &najveca_vrijednost;

	printf("Unesite koliko brojeva zelite unijeti u niz:\n ");
	while(true){
		scanf("%d", p);
		if(*p < 4 || *p > 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", (n + 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);


	system("pause");

	return 0;
}
Kropotkin is offline  
Odgovori s citatom
Old 29.11.2014., 11:31   #2
Evo ti rješenje, bio je problem u dodjeli vrijednosti min i max pointerima:
Kod:
#include <iostream>
#include <stdlib.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], najmanja_vrijednost, najveca_vrijednost;
	int *p = &m, *n = niz, *min = &najmanja_vrijednost, *max = &najveca_vrijednost;

	printf("Unesite koliko brojeva zelite unijeti u niz:\n ");
	while(true){
		scanf("%d", p);
		if(*p < 4 || *p > 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", (n + i));
	}

	*min = niz[0];
	*max = niz[0];

	for(int i = 0; i < m; i++){
		if(*(niz + i) < *min){
			*min = *(niz + i);}
		else if(*(niz + i) > *max){
			*max = *(niz + i);}
	}

	printf("Najmanji element niza je: %d\n", *min);
	printf("Najveci element niza je: %d\n", *max);


	system("pause");

	return 0;
}
__________________
Ne očajavamo, zato što se ne nadamo nikom. Ničemu dobrom, ničemu lošem tu ne nada se niko.
I sa tom diplomom, i sa šljakom sam se slik’o. Rintao k'o magarac, sve dok nisam rikn'o.
mr-crime is offline  
Odgovori s citatom
Old 29.11.2014., 12:40   #3
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!
__________________
mutim vodu po dogovoru!
stnd is offline  
Odgovori s citatom
Old 30.11.2014., 13:19   #4
Puno hvala!
Kropotkin is offline  
Odgovori s citatom
Odgovor



Kreni na podforum




Sva vremena su GMT +2. Trenutno vrijeme je: 00:35.