[Pomoć][C] Pointeri

Teme vezane za console/GUI programiranje u C/C++ jeziku
7 post(ov)a • Stranica: 1/1.

[Pomoć][C] Pointeri

PostPostao/la nemesis » 14 tra 2016, 14:11

Pozdrav kolege, opet ja. Stigao sam do pointera i veliku muku mucim sa njima, stvaraju mi ogroman problem te se nadam da ce mi to neko napokon objasniti da vidim kako rade. Naime, trenutno radim zadatak u kom treba pomocu struktura i korisnicki defisanog tipa uz pomoc funkcija da napisem program koji ce raditi zbir n razlomaka. Nazalost zaglavio sam na samom startu, te ako moze neko da mi objasni sledeci kod koji sam iskucao kakvu konkretno gresku vraca i zasto je tako

cpp code
/* Ucitavanje n razlomaka i njihov zbir, 6.9.2011, 3. zadatak */

#include <stdio.h>

typedef struct razlomak
{
int br, im;

}RAZLOMAK;

void citajR(RAZLOMAK *);
void pisiR(RAZLOMAK);

RAZLOMAK zbirR(RAZLOMAK, RAZLOMAK);

void kratiR(RAZLOMAK *);

int main()
{
int n, i, razlomak[10];
//RAZLOMAK razlomak[100];


do
{
printf("Unesi n: ");
scanf("%d", &n);
}while(n < 1);

for(i = 0; i < n; i++)
{
citajR(&i);
//razlomak = citajR(&i);
}

/*for(i = 0; i < n; i++)
printf("%d\n", razlomak[i]);*/

//citajR(&n);

return 0;
}

void citajR(RAZLOMAK *r)
{
int br1, im1;

br1 = r->br;
im1 = r->im;

printf("Unesi brojilac: ");
scanf("%d", &br1);
printf("Unesi imenilac: ");
scanf("%d", &im1);

}


ovo sto je komentarisano zanemarite, treba samo da natjeram program da ucita brojilac i imenilac iz funkcije void citajR(RAZLOMAK *), da pozovem funkciju u main i sacuvam te razlomke u neki staticki niz, u zadatku se trazi dinamicki ali ja zelim sa statickim prvo da radim da vidim kako oni funkcionisu sa pointerima. Prototipovi funkcija moraju ostati takvi kakvi su u kodu. Jel moze neko sada da mi objasni zasto imam konflikte kada poziva funkciju unutar for petlje, sta se zapravo desava, gdje ja to grijesim, pokusavam vec 2 sata i ne razumijem, znam da prosljedjujem int, a tu i nastaje konflikt, kako zapravo funkcionisu pointeri???

Re: [Pomoć][C] Pointeri

PostPostao/la Jasko » 15 tra 2016, 08:52

Prvo da navedem disclaimer: Nisam isprobao kod, tako da nezz 100% jeli moj odgovor OK, ali iz iskustva mogu reci.

Ovako, kao sto kazes problem je prvi sto proslijedjujes adresu koja je rezervisana za int tip varijable, a ocekuje se pointer na structuru RAZLOMAK, za pocetak bi mogao definisat jedan pointer na jedan razlomak, i njega slati n puta kroz for petlju, to nebi syntaxu programa remetilo odnosno nebi dobio tu prvu gresku.

Sto se tice samih pointera, nezz koliko si oko toga citao, ali kod nas se kaze i pokazivac, ako se govori o pointeru, a upravo to i jesu, pokazuju na postojece vrijednosti u memoriji tako sto posjeduju vrijednost adrese gdje je data vrijednost memorisana.

Recimo imas varijablu int a = 10; Dakle varijabla tipa integer po imenu a koja ima vrijednost 10. Recimo da je u memoriji ta varijabla pohranjena na adresi 0x001.
Onda poniter tipa int * p = &a; Je pointer na tip integer koji u sebi nosi vrijednost 0x001, dakle adresu memorije, sa vrijednosti a=10 nema apsolutno nista, cak ga ne interesuje ni da se radi o varijabli a. Iz toga mozemo zakljuciti da mozemo napraviti veliki broj pokazivaca na varijablu a, koji svi imaju vrijednost 0x001.

OK, to je za predznanje. Sad naravno mozes vrsit odgovarajuce operacije nad vrijednostima kao sto je za svaku varijablu moguce, ali ako mjenjas vrijednost varijable p onda mjenjas ustvari adresu, npr. povecas vrijednost za jedan pa ce bit 0x002. Ako to poredimo sa brojem kuca u nekoj ulici, prvo si pokazivao na kucu sa brojem 1, a nakon povecanja vrijednosti u adresi polazujes na kucu sa brojem 2. Dakle na potpuno drugu vrijednost, sta god ona bila.

Sa druge strane, posto znamo da zadana vrijednos je ustvari adresa, mozemo reci, na adresi *p promjeni vrijednost na 12. Te ce od vrijednosti 10 od jednom postat vrijednost 12. Kao sto bi rekli U ulici X, na kuci sa adresom 1, promjeni broj prozora sa 10 na 12. Dakle promjena ce se zaista desiti na toj kuci a ne na nekoj drugoj, kao sto se desilo da su ljudi u americi previse vjerovali navigaciji pa srusili kucu u pogresnoj ulici.

Nadam se da razumijes malo iz ovog sta je pointer na neki tip, a sta varijabla sama, odnosno koje operacije mozes vrsit sa pointerima i nad pointerima, jer to su dvije stvari.

Pozz
Postoji 10 vrsta ljudi na zemlji. Oni koji razumiju binarni sistem i oni koji ga ne razumiju!
Posjetite moj YouTube kanal za gledanje za programiranje i druge teme oko računara.

Re: [Pomoć][C] Pointeri

PostPostao/la nemesis » 18 tra 2016, 17:34

izvini, par dana nisam bio tu, morao raditi na selu. Znam sta su pokazivaci i kako funkcionisu, ali me remete kada su strukture u pitanju, medjutim ocigledno nisam obratio paznju na tip koji saljem, a u tome i jeste problem definitivno, neiskustvo ocigledno, znam kako cu rijesiti sada problem, postavicu rjesenje kasnije.

Re: [Pomoć][C] Pointeri

PostPostao/la nemesis » 19 tra 2016, 12:33

ok, rijesio sam na sledeci nacin

cpp code
int main()
{
int n, i;
RAZLOMAK *razlomak[100];


do
{
printf("Unesi n: ");
scanf("%d", &n);
}while(n < 1);

for(i = 0; i < n; i++)
citajR(&razlomak[i] + i);

for(i = 0; i < n*2; i++)
printf("%d\n", razlomak[i]);



return 0;
}

void citajR(RAZLOMAK *r)
{
printf("Unesi brojilac: ");
scanf("%d", &r->br);
printf("Unesi imenilac: ");
scanf("%d", &r->im);
}


zadnja for petlja sluzi samo za mene da vidim ispis da li je dobar odnosno da li funkcija dobro upisuje elemente u staticki niz

Re: [Pomoć][C] Pointeri

PostPostao/la gagiD » 19 tra 2016, 16:24

c code
RAZLOMAK *razlomak[100];

Niz pointera na nesto je korisno struktura, ali se onda clanovi niza dinamicki alociraju. Ako to ne mislis uraditi onda koristi "normalan" niz.

Kad unosis n moras uvijek projeriti je li uneseni veci od velicine niza.

c code
citajR(&razlomak[i] + i);

Zasto + i? Npr. ovo je za i = 0 ok, za i = 1 poslat ce se akresa treceg elementa niza(index 2), za i = 2 poslat ce se adresa petog elementa(index 4) itd.
Ovo ce gotovo sigurno "izletiti" iz niza.

c code
for(i = 0; i < n*2; i++)

I ovo isto, nemas ti 2n elemenata nego n.

Re: [Pomoć][C] Pointeri

PostPostao/la nemesis » 19 tra 2016, 16:36

gagiD je napisao/la:c code
RAZLOMAK *razlomak[100];

Niz pointera na nesto je korisno struktura, ali se onda clanovi niza dinamicki alociraju. Ako to ne mislis uraditi onda koristi "normalan" niz.

Kad unosis n moras uvijek projeriti je li uneseni veci od velicine niza.

c code
citajR(&razlomak[i] + i);

Zasto + i? Npr. ovo je za i = 0 ok, za i = 1 poslat ce se akresa treceg elementa niza(index 2), za i = 2 poslat ce se adresa petog elementa(index 4) itd.
Ovo ce gotovo sigurno "izletiti" iz niza.

c code
for(i = 0; i < n*2; i++)

I ovo isto, nemas ti 2n elemenata nego n.



super, ovako, da objasnim, u prvom postu pogledaj kako izgledaju prototipovi funkcije, kao sto sam vec naveo, zadatak se radi pomocu dinamickih nizova, a ja sam licno htio preko statickih da vidim da li se uopste moze i kako oni funkcionisu sa ovakvim tipom zadataka, do dinamickih jos nisam dosao. Zato od vas svih na forumu trazim da mi neko objasni kako pokazivaci rade sa strukturama i tipovima, jer mi stvarno zadaju muku.

sto se tice ove linije koda

cpp code
citajR(&razlomak[i] + i);


"+ i" sam stavio zbog funkcije citajR

cpp code
void citajR(RAZLOMAK *r)
{
printf("Unesi brojilac: ");
scanf("%d", &r->br);
printf("Unesi imenilac: ");
scanf("%d", &r->im);
}


ako izostavim "+ i", onda ce mi u niz upisati samo prvi scanf iz funkcije, ja jednostavno ne znam na koji drugi nacin bi ovo rijesio, nadam se da imas neko bolje rjesenje, a sto se tice zadnje petlje gdje ide od 0 do n*2, to je samo za mene petlja za ispis, cisto da vidim kad ispisuje upravo zbog ovog "+i", jer petlja ide do n, i prolazi kroz funkciju citajR i upisuje elemente, kad hocu da ispisem elemente, ako bih isao do n koje je recimo 3, onda bi ispisao samo prva 3 elementa, umjesto 6 elemenata, u svakom slucaju tu sam petlju obrisao, trebala mi je samo da vidim ispis, da li dobro ucitava elemente i to je to

Re: [Pomoć][C] Pointeri

PostPostao/la nemesis » 20 tra 2016, 15:13

uspio sam rijesiti zadatak, izmorilo me poprilicno mada mi je dosta jasnije sada, hvala kolegama na pomoci, evo rjesenje zadatka

cpp code
/* Ucitavanje n razlomaka i njihov zbir, 6.9.2011, 3. zadatak */

#include <stdio.h>

typedef struct razlomak
{
int br, im;

}RAZLOMAK;

void citajR(RAZLOMAK *);
void pisiR(RAZLOMAK);

RAZLOMAK zbirR(RAZLOMAK, RAZLOMAK);

void kratiR(RAZLOMAK *);

int main()
{
int n, i;
RAZLOMAK razlomak[100];
RAZLOMAK *raz;
RAZLOMAK zbir;

zbir.br = 0;
zbir.im = 1;

do
{
printf("Unesi n: ");
scanf("%d", &n);

}while(n < 1);

for(i = 0; i < n; i++)
citajR(&razlomak[i] + i);


for(i = 0; i < n; i++)
{
raz = &razlomak[i] + i;
zbir = zbirR(zbir, *raz);
}

kratiR(&zbir);
pisiR(zbir);


return 0;
}

void citajR(RAZLOMAK *r)
{
printf("Unesi brojilac: ");
scanf("%d", &r->br);
printf("Unesi imenilac: ");
scanf("%d", &r->im);
}

RAZLOMAK zbirR(RAZLOMAK prvi, RAZLOMAK drugi)
{
RAZLOMAK suma;

suma.im = prvi.im * drugi.im;
suma.br = ((suma.im / prvi.im) * prvi.br) + ((suma.im / drugi.im) * drugi.br);

return suma;
}

void pisiR(RAZLOMAK raz)
{
printf("%d / %d\n", raz.br, raz.im);
}

void kratiR(RAZLOMAK *broj)
{
int suma;

suma = (broj->br > broj->im) ? broj->br : broj->im;

for( ; suma > 0; suma--)
{
if((broj->br % suma == 0) && (broj->im % suma == 0))
{
broj->br /= suma;
broj->im /= suma;
break;
}
}

}


7 post(ov)a • Stranica: 1/1.

Na mreži

Trenutno korisnika/ca: / i 1 gost.