Korisnički Kontrolni Panel
Pogledajte svoj profil
Pogledajte svoje postove
ČPP
Prijavite se

Matematički forum na kojem možete da diskutujete o raznim matematičkim oblastima, pomognete drugima oko rešavanja zadataka, a i da dobijete pomoć kada vam zatreba


















Index stranica RAZNO ODMORIŠTE

Programiranje

Offtopic teme o svemu i svačemu

Programiranje

Postod Gekko » Utorak, 28. Novembar 2023, 02:10

Pozdrav svima, nije me bilo dugo.
Krenuo sam nesto da se vracam na programiranje i stigoh do teme pokazivaca, pa reku da postavim u ovoj rubrici pitanje, mislim da je najprikladnije tako(znam da je odmoriste, al ne vidoh ni jednu rubriku vezanu za programiranje, a znam da su ljudi objavljivali ranije).
Ovako, zadatak je relativno jednostavan(u pitanju je jezik C, mada to i nije toliko bitno):

Napisati funkciju void uredi(int *pa,int *pb) koja uredjuje svoja dva celobrojna argumenta tako da se u prvom nalazi manja vrednost a u drugom veca. Napisati program koji ucitava dva cela broja i ispisuje uredjene brojeve.

Kod:


#include <stdio.h>
#include <stdlib.h>

/* Argumenti funkcije uredi_pogresno, promenljive a i b,
predstavljaju lokalne promenljive za ovu funkciju i prestaju da
postoje po zavrsetku funkcije. Zbog toga se efekti razmene
vrednosti promenljivih a i b u slucaju da je a>b ne vide u
glavnom programu.
void uredi_pogresno(int a, int b) {
int pom;
if (a > b) {
pom = a;
a = b;
b = pom;
}
} */

/* Argumenti funkcije uredi, promenljive pa i pb, takodje su
lokalne promenljive za ovu funkciju i prestaju da postoje kada
se funkcija zavrsi. Razlika je u tome sto su one adrese
promenljivih a i b koje zelimo da razmenimo u slucaju da je a>b.

Promenljivoj a se pristupa preko pokazivacke promenljive pa sa
*pa i slicno, promenljivoj b sa *pb.

Vrednosti promenljivih *pa i *pb se razmenjuju kao i vrednosti
bilo koje dve celobrojne promenljive. */
void uredi(int *pa, int *pb) {
int pom;
if (*pa > *pb) {
pom = *pa;
*pa = *pb;
*pb = pom;
}
}

int main() {
/* Deklaracija potrebnih promenljivih. */
int a, b;

/* Ucitavanje vrednosti dva cela broja. */
printf("Unesite dva broja:");
scanf("%d%d", &a, &b);

/* Neispravan nacin:
uredi_pogresno(a, b);
printf("Uredjene promenljive: %d, %d\n", a, b); */

/* Funkcija uredi kao argumente prima dve pokazivacke promenljive
(int*,int*). Zbog toga je u pozivu funkcije neophodno
proslediti adrese promenljivih koje zelimo da uredimo rastuce:
&a i &b. */
uredi(&a, &b);
printf("Uredjene promenljive: %d, %d\n", a, b);

exit(EXIT_SUCCESS);
}
Dakle moje pitanje: Meni nije jasno zasto program ne radi u navedenom (komentarisanom slucaju) kada se koriste samo a i b a ne pokazivaci. Jasan je meni koncept lokalne i globalne promenljive(ili mozda ipak nije?) lokalne su lokalne vidi ih samo odredjeni segment koda(npr. funkcije) globalne vaze na nivou celog koda ali opet ja imam kontraprimer gde sam koristio lokalne promenljive za neku funkciju, pozivao tu funkciju iz glavnog programa i sve je bilo vidljivo i program se pokretao normalno. Gde gresim?
P.S. Nadam se da nema neki poseban nacin za kucanje koda kao sto ima za matematiku lateks? Ako ima izvinjavam se promenicu blagovremeno, tj. ako me ne preduhitri Daniel :) .
''Everybody is a genius. But if you judge a fish by its ability to climb a tree, it will live its whole life believing that it is stupid.''
-Albert Einstein
Korisnikov avatar
Gekko  OFFLINE
 
Postovi: 50
Zahvalio se: 30 puta
Pohvaljen: 8 puta

Sharuj ovu temu na:

Share on Facebook Facebook Share on Twitter Twitter Share on MySpace MySpace Share on Google+ Google+

Re: Programiranje

Postod Srdjan01 » Petak, 22. Mart 2024, 16:03

Pozdrav,

Funkcija uredi(int *pa,int *pb): Ova funkcija radi ispravno jer prima adrese promenljivih 'a' i 'b' kao pokazivače. Kada se koriste pokazivači, možemo direktno manipulisati vrijednostima na adresama na koje oni pokazuju. Dakle, iako su promenljive 'pa' i 'pb' lokalne za funkciju 'uredi', one pokazuju na iste memorijske lokacije kao i promenljive 'a' i 'b' iz 'main' funkcije, omogućavajući nam direktno mijenjanje vrijednosti tih promjenljivih.

Funkcija uredi_pogresno(int a, int b): Ova funkcija prima vrijednosti 'a' i 'b' kao argumente, a ne adrese. Kada se vrijednosti 'a' i 'b' prosleđuju funkciji, one se kopiraju u lokalne promjenljive 'a' i 'b' u okviru funkcije 'uredi_pogresno'. Kada se izvrši zamjena u okviru ove funkcije, ona utiče samo na lokalne kopije promenljivih 'a' i 'b', a ne na one u 'main' funkciji. Ove promjenljive nestaju čim se funkcija završi, tako da promjene koje napravimo unutar nje neće imati efekta na originalne promenljive u 'main' funkciji.

Lokalne promjenljive imaju automatski životni vijek, one imaju doseg nivoa bloka, to znači da se njihov životni ciklus završava po završetku bloka u kome su definisane. Sa druge strane, globalne promjenljive imaju doseg na nivou čitavog programa. Globalna promjenljiva je dostupna za upotrebu u cijelom programu nakon njene deklaracije.
Korisnikov avatar
 
Postovi: 92
Zahvalio se: 32 puta
Pohvaljen: 61 puta


Povratak na ODMORIŠTE

Ko je OnLine

Korisnici koji su trenutno na forumu: Nema registrovanih korisnika i 5 gostiju


Index stranicaTimObriši sve kolačiće boarda
Danas je Utorak, 10. Decembar 2024, 18:55 • Sva vremena su u UTC + 1 sat
Pokreće ga phpBB® Forum Software © phpBB Group
Prevod – www.CyberCom.rs