Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

Pointeri et stringovi
WWW:

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
krilo
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 01. 11. 2016. (14:45:48)
Postovi: (4E)16
Spol: žensko
Sarma = la pohva - posuda
= 5 - 0

PostPostano: 14:52 pon, 24. 4. 2017    Naslov: Pointeri et stringovi Citirajte i odgovorite

Da ne švrljam po topicu o "rekurzijama"...

Malo me zbunjuju funkcije iz [tt]<ctype.h>[/tt] datoteke... Zašto piše u njihovom prototipu da primaju [tt]int[/tt] ako provjeravaju [tt]char[/tt]? (Nije mi baš jasno kako poziv funkcionira u računalu, tj. kako se to unutra interpretira.)

Rješavam zadatak iz kolokvija i imam problem s pointerima:
Napišite program koji učitava broj prodavača n jedne trgovine, a zatim, redom, iznose računa koje je pojedini prodavač naplatio. Iznos je realni broj strogo veći od nula. Između iznosa svaka dva prodavača unosi se 0.

(a) Potrebno je kreirati dinamički alocirano polje prodavaci, u kojem će, u i-tom retku, na prvom mjestu biti oznaka prodavača (na početku je to upravo i), zatim iznosi naplaćenih računa i-tog prodavača, i = 0, . . . , n−1, a posljednji element svakog retka ima vrijednost 0 i označava kraj retka. Pri tom, alocirajte točno onoliko memorije koliko vam je potrebno.

Za to pravim funkciju [tt]al_uc_racune[/tt] koja bi alocirala memoriju za "manje" nizove i postavila njihove prve elemente kao oznake prodavača. (Note: prije poziva dotične funkcije u glavnom programu već imam učitan broj prodavača i alocirano polje [tt]prodavaci[/tt]: [tt]prodavaci=(double**)malloc(sizeof(double)*n);[/tt].)

[code:1]void al_uc_racune(double **prodavaci, int n)
{
int i, j;
for (i=0; i<n; i++)
{
prodavaci[i][0]=i; //prvi u manjem nizu je broj (oznaka) prodavaca
for (j=1; ; j++)
{
prodavaci[i][j]=(double*)malloc(sizeof(double)); (*)
scanf ("%g", prodavaci[i][j]);
if (prodavaci[i][j]==0) break;
}
}
}[/code:1]
1) Nije mi jasno zašto neće compiler alocirati memoriju za svaki pojedini račun (*). Probala sam isto s pointerima, umjesto [tt]prodavaci[i][j][/tt] staviti [tt](*(prodavaci+i)[j])[/tt] ali ni to ne štima, pa je očito da ne kužim pointersku aritmetiku i kretanje po "matrici" pomoću pointera. Koliko postoji ekvivalentrnih zapisa za dvodimenzionalno polje kad zapisujemo pomoću pointera i sa klasičnim zagradama ([][])?

2) Neka je u nekom xy programu inicijaliziran [tt]int *ptr[/tt]. Jasno mi je da (*ptr) označava vrijednost na koju pointer pokazuje, ali koje je značenje (ptr) u toj "sintagmi"? Vječito malloc-om (ptr)-u (a ne (*ptr)-u) pridružujem nešto, a iskreno nemam pojma što (ptr) jest, osim imena samog pointera. Prvo sam mislila da je to neka adresa, ali mi to nema smisla je *ptr baš pointer, a ne varijabla. Može neko objašnjenje?
Da ne švrljam po topicu o "rekurzijama"...

Malo me zbunjuju funkcije iz <ctype.h> datoteke... Zašto piše u njihovom prototipu da primaju int ako provjeravaju char? (Nije mi baš jasno kako poziv funkcionira u računalu, tj. kako se to unutra interpretira.)

Rješavam zadatak iz kolokvija i imam problem s pointerima:
Napišite program koji učitava broj prodavača n jedne trgovine, a zatim, redom, iznose računa koje je pojedini prodavač naplatio. Iznos je realni broj strogo veći od nula. Između iznosa svaka dva prodavača unosi se 0.

(a) Potrebno je kreirati dinamički alocirano polje prodavaci, u kojem će, u i-tom retku, na prvom mjestu biti oznaka prodavača (na početku je to upravo i), zatim iznosi naplaćenih računa i-tog prodavača, i = 0, . . . , n−1, a posljednji element svakog retka ima vrijednost 0 i označava kraj retka. Pri tom, alocirajte točno onoliko memorije koliko vam je potrebno.

Za to pravim funkciju al_uc_racune koja bi alocirala memoriju za "manje" nizove i postavila njihove prve elemente kao oznake prodavača. (Note: prije poziva dotične funkcije u glavnom programu već imam učitan broj prodavača i alocirano polje prodavaci: prodavaci=(double**)malloc(sizeof(double)*n);.)

Kod:
void al_uc_racune(double **prodavaci, int n)
{
    int i, j;
    for (i=0; i<n; i++)
        {
            prodavaci[i][0]=i;        //prvi u manjem nizu je broj (oznaka) prodavaca
            for (j=1; ; j++)
                {
                    prodavaci[i][j]=(double*)malloc(sizeof(double));            (*)
                    scanf ("%g", prodavaci[i][j]);
                    if (prodavaci[i][j]==0) break;
                }
        }
}

1) Nije mi jasno zašto neće compiler alocirati memoriju za svaki pojedini račun (*). Probala sam isto s pointerima, umjesto prodavaci[i][j] staviti (*(prodavaci+i)[j]) ali ni to ne štima, pa je očito da ne kužim pointersku aritmetiku i kretanje po "matrici" pomoću pointera. Koliko postoji ekvivalentrnih zapisa za dvodimenzionalno polje kad zapisujemo pomoću pointera i sa klasičnim zagradama ([][])?

2) Neka je u nekom xy programu inicijaliziran int *ptr. Jasno mi je da (*ptr) označava vrijednost na koju pointer pokazuje, ali koje je značenje (ptr) u toj "sintagmi"? Vječito malloc-om (ptr)-u (a ne (*ptr)-u) pridružujem nešto, a iskreno nemam pojma što (ptr) jest, osim imena samog pointera. Prvo sam mislila da je to neka adresa, ali mi to nema smisla je *ptr baš pointer, a ne varijabla. Može neko objašnjenje?


[Vrh]
Korisnički profil Pošaljite privatnu poruku
mdoko
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12)
Postovi: (71A)16
Spol: muško
Sarma = la pohva - posuda
199 = 237 - 38
Lokacija: Heriot-Watt University, Edinburgh

PostPostano: 21:23 pon, 24. 4. 2017    Naslov: Re: Pointeri et stringovi Citirajte i odgovorite

[quote="krilo"]
[code:1]void al_uc_racune(double **prodavaci, int n)
{
/* ... */
prodavaci[i][j]=(double*)malloc(sizeof(double));
/* ... */
}[/code:1][/quote]

Ako je varijabla prodavaci tipa [tt]double**[/tt], onda je [tt]prodavaci[i][j][/tt] tipa [tt]double[/tt].

S druge strane [tt](double*)malloc(sizeof(double))[/tt] je (očito) tipa [tt]double*[/tt].

Dakle, ti pokušavaš vrijedost tipa [tt]double*[/tt] pridružiti varijabli tipa [tt]double[/tt], što nema nikakvog smisla i normalno je da se kompajler buni.
krilo (napisa):

Kod:
void al_uc_racune(double **prodavaci, int n)
{
    /* ... */
    prodavaci[i][j]=(double*)malloc(sizeof(double));
    /* ... */
}


Ako je varijabla prodavaci tipa double**, onda je prodavaci[i][j] tipa double.

S druge strane (double*)malloc(sizeof(double)) je (očito) tipa double*.

Dakle, ti pokušavaš vrijedost tipa double* pridružiti varijabli tipa double, što nema nikakvog smisla i normalno je da se kompajler buni.



_________________
Extraordinary claims require extraordinary evidence. – Carl Sagan
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (355F)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 21:36 pon, 24. 4. 2017    Naslov: Re: Pointeri et stringovi Citirajte i odgovorite

[quote="krilo"]Malo me zbunjuju funkcije iz [tt]<ctype.h>[/tt] datoteke... Zašto piše u njihovom prototipu da primaju [tt]int[/tt] ako provjeravaju [tt]char[/tt]? (Nije mi baš jasno kako poziv funkcionira u računalu, tj. kako se to unutra interpretira.)[/quote]

For all intents and purposes, ponasaj se kao da rade s [tt]char[/tt]-ovima. Rijec je o kompatibilnim tipovima, jer se [tt]char[/tt] cuvao kao ASCII vrijednost. Zasto su stavili [tt]int[/tt] je pomalo tehnicka stvar; zagooglaj ako te zanimaju detalji.

[quote="krilo"]Rješavam zadatak iz kolokvija i imam problem s pointerima:
Napišite program koji učitava broj prodavača n jedne trgovine, a zatim, redom, iznose računa koje je pojedini prodavač naplatio. Iznos je realni broj strogo veći od nula. Između iznosa svaka dva prodavača unosi se 0.
(a) Potrebno je kreirati dinamički alocirano polje prodavaci, u kojem će, u i-tom retku, na prvom mjestu biti oznaka prodavača (na početku je to upravo i), zatim iznosi naplaćenih računa i-tog prodavača, i = 0, . . . , n−1, a posljednji element svakog retka ima vrijednost 0 i označava kraj retka. Pri tom, alocirajte točno onoliko memorije koliko vam je potrebno.
Za to pravim funkciju [tt]al_uc_racune[/tt] koja bi alocirala memoriju za "manje" nizove i postavila njihove prve elemente kao oznake prodavača. (Note: prije poziva dotične funkcije u glavnom programu već imam učitan broj prodavača i alocirano polje [tt]prodavaci[/tt]: [tt]prodavaci=(double**)malloc(sizeof(double)*n);[/tt].)
[code:1]void al_uc_racune(double **prodavaci, int n)
{
int i, j;
for (i=0; i<n; i++)
{
prodavaci[i][0]=i; //prvi u manjem nizu je broj (oznaka) prodavaca
for (j=1; ; j++)
{
prodavaci[i][j]=(double*)malloc(sizeof(double)); (*)
scanf ("%g", prodavaci[i][j]);
if (prodavaci[i][j]==0) break;
}
}
}[/code:1]
1) Nije mi jasno zašto neće compiler alocirati memoriju za svaki pojedini račun (*). Probala sam isto s pointerima, umjesto [tt]prodavaci[i][j][/tt] staviti [tt](*(prodavaci+i)[j])[/tt] ali ni to ne štima, pa je očito da ne kužim pointersku aritmetiku i kretanje po "matrici" pomoću pointera. Koliko postoji ekvivalentrnih zapisa za dvodimenzionalno polje kad zapisujemo pomoću pointera i sa klasičnim zagradama ([][])?[/quote]

[tt]prodavaci[/tt] treba biti pointer na niz, a svaki njegov element treba opet biti pointer na niz. Dakle, treba alocirati [tt]prodavaci[/tt] (sto mozda radis izvan funkcije), a zatim i svaki [tt]prodavaci[i][/tt]. Elementi [tt]prodavaci[i][j][/tt] su najobicniji brojevi; njih ne alociramo.

Posto ne znamo unaprijed koliko [tt]prodavaci[i][/tt] ima elemenata, treba koristiti [tt]realloc[/tt].

[quote="krilo"]2) Neka je u nekom xy programu inicijaliziran [tt]int *ptr[/tt]. Jasno mi je da (*ptr) označava vrijednost na koju pointer pokazuje, ali koje je značenje (ptr) u toj "sintagmi"? Vječito malloc-om (ptr)-u (a ne (*ptr)-u) pridružujem nešto, a iskreno nemam pojma što (ptr) jest, osim imena samog pointera. Prvo sam mislila da je to neka adresa, ali mi to nema smisla je *ptr baš pointer, a ne varijabla. Može neko objašnjenje?[/quote]

To je tzv. implicitna deklaracija. Basically, kad deklariras [tt]int *ptr[/tt], kazes "zelim alocirati [tt]*ptr[/tt] koji je tipa [tt]int[/tt]". No, compiler zna da je [tt]*ptr[/tt] "ono na sto [tt]ptr[/tt] pokazuje", pa "pametno" zakljuci da zapravo zelis deklarirati "pointer na [tt]int[/tt] koji ces zvati [tt]ptr[/tt]".

Kad kazes
[code:1]ptr = (double*)malloc(n * sizeof(double));[/code:1]
Zapravo kazes:[list=1][*][tt]malloc(n * size(double))[/tt] sto znaci "alociraj [tt]n * size(double)[/tt] byteova memorije", tj. "alociraj onoliko memorije koliko mi treba da pospremim [tt]n[/tt] vrijednosti tipa [tt]double[/tt]".
[*]Posto [tt]malloc(...)[/tt] vraca "pointer na memoriju neodredjenog tipa" (tzv. void-pointer, odnosno [tt]void*[/tt]), a [tt]ptr[/tt] je tipa [tt]double*[/tt], onda zelimo compileru reci da ne pridruzujemo "razlicite" tipove slucajno. Tome sluzi cast operator [tt](double*)[/tt] koji kaze "vrijednost s desne strane tretiraj kao da je tipa [tt]double*[/tt]. Posto su svi pointeri jednake velicine, ti tipovi su kompatibilni, pa nema problema.[/list:o]Dakle, adresa novoalocirane memorije (ilitiga "pointer na tu memoriju") se sprema u varijablu [tt]ptr[/tt].
krilo (napisa):
Malo me zbunjuju funkcije iz <ctype.h> datoteke... Zašto piše u njihovom prototipu da primaju int ako provjeravaju char? (Nije mi baš jasno kako poziv funkcionira u računalu, tj. kako se to unutra interpretira.)


For all intents and purposes, ponasaj se kao da rade s char-ovima. Rijec je o kompatibilnim tipovima, jer se char cuvao kao ASCII vrijednost. Zasto su stavili int je pomalo tehnicka stvar; zagooglaj ako te zanimaju detalji.

krilo (napisa):
Rješavam zadatak iz kolokvija i imam problem s pointerima:
Napišite program koji učitava broj prodavača n jedne trgovine, a zatim, redom, iznose računa koje je pojedini prodavač naplatio. Iznos je realni broj strogo veći od nula. Između iznosa svaka dva prodavača unosi se 0.
(a) Potrebno je kreirati dinamički alocirano polje prodavaci, u kojem će, u i-tom retku, na prvom mjestu biti oznaka prodavača (na početku je to upravo i), zatim iznosi naplaćenih računa i-tog prodavača, i = 0, . . . , n−1, a posljednji element svakog retka ima vrijednost 0 i označava kraj retka. Pri tom, alocirajte točno onoliko memorije koliko vam je potrebno.
Za to pravim funkciju al_uc_racune koja bi alocirala memoriju za "manje" nizove i postavila njihove prve elemente kao oznake prodavača. (Note: prije poziva dotične funkcije u glavnom programu već imam učitan broj prodavača i alocirano polje prodavaci: prodavaci=(double**)malloc(sizeof(double)*n);.)
Kod:
void al_uc_racune(double **prodavaci, int n)
{
    int i, j;
    for (i=0; i<n; i++)
        {
            prodavaci[i][0]=i;        //prvi u manjem nizu je broj (oznaka) prodavaca
            for (j=1; ; j++)
                {
                    prodavaci[i][j]=(double*)malloc(sizeof(double));            (*)
                    scanf ("%g", prodavaci[i][j]);
                    if (prodavaci[i][j]==0) break;
                }
        }
}

1) Nije mi jasno zašto neće compiler alocirati memoriju za svaki pojedini račun (*). Probala sam isto s pointerima, umjesto prodavaci[i][j] staviti (*(prodavaci+i)[j]) ali ni to ne štima, pa je očito da ne kužim pointersku aritmetiku i kretanje po "matrici" pomoću pointera. Koliko postoji ekvivalentrnih zapisa za dvodimenzionalno polje kad zapisujemo pomoću pointera i sa klasičnim zagradama ([][])?


prodavaci treba biti pointer na niz, a svaki njegov element treba opet biti pointer na niz. Dakle, treba alocirati prodavaci (sto mozda radis izvan funkcije), a zatim i svaki prodavaci[i]. Elementi prodavaci[i][j] su najobicniji brojevi; njih ne alociramo.

Posto ne znamo unaprijed koliko prodavaci[i] ima elemenata, treba koristiti realloc.

krilo (napisa):
2) Neka je u nekom xy programu inicijaliziran int *ptr. Jasno mi je da (*ptr) označava vrijednost na koju pointer pokazuje, ali koje je značenje (ptr) u toj "sintagmi"? Vječito malloc-om (ptr)-u (a ne (*ptr)-u) pridružujem nešto, a iskreno nemam pojma što (ptr) jest, osim imena samog pointera. Prvo sam mislila da je to neka adresa, ali mi to nema smisla je *ptr baš pointer, a ne varijabla. Može neko objašnjenje?


To je tzv. implicitna deklaracija. Basically, kad deklariras int *ptr, kazes "zelim alocirati *ptr koji je tipa int". No, compiler zna da je *ptr "ono na sto ptr pokazuje", pa "pametno" zakljuci da zapravo zelis deklarirati "pointer na int koji ces zvati ptr".

Kad kazes
Kod:
ptr = (double*)malloc(n * sizeof(double));

Zapravo kazes:
  1. malloc(n * size(double)) sto znaci "alociraj n * size(double) byteova memorije", tj. "alociraj onoliko memorije koliko mi treba da pospremim n vrijednosti tipa double".
  2. Posto malloc(...) vraca "pointer na memoriju neodredjenog tipa" (tzv. void-pointer, odnosno void*), a ptr je tipa double*, onda zelimo compileru reci da ne pridruzujemo "razlicite" tipove slucajno. Tome sluzi cast operator (double*) koji kaze "vrijednost s desne strane tretiraj kao da je tipa double*. Posto su svi pointeri jednake velicine, ti tipovi su kompatibilni, pa nema problema.
Dakle, adresa novoalocirane memorije (ilitiga "pointer na tu memoriju") se sprema u varijablu ptr.



_________________
U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
krilo
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 01. 11. 2016. (14:45:48)
Postovi: (4E)16
Spol: žensko
Sarma = la pohva - posuda
= 5 - 0

PostPostano: 6:43 uto, 25. 4. 2017    Naslov: Citirajte i odgovorite

:thankyou: Hvala lijepo na objašnjenju! :thankyou:

[quote]Posto ne znamo unaprijed koliko prodavaci[i] ima elemenata, treba koristiti realloc.[/quote]

Ma bi ja to koristila, ali sam u skripti pročitala da je realloc spor, pa sam ga odlučila ne upotrijebiti unless absolutely neccessary. Nadalje budem.

I još jedna sitnica, da budem 100% sigurna: Kad inicijaliziram i alociram [tt]int **niz[/tt], onda je u zapisu jednog elementa "većeg" niza [tt]niz[i]==**(niz+i)[/tt] ili [tt]niz[i]==*(*niz+i)[/tt] ili pak [tt]niz[i]==(**niz)+i[/tt]? Ovo potonje mislim da nije, ali u globalu mi nije jasno kako da se properly krećem po "matrici" pomoću pointerske aritmetike. (I kako tek onda moram pisati za [tt]niz[i][j][/tt]?)

(I koja je fora s unosom nule između računa dva prodavača? Cijelo vrijeme unosim doubleove, ali ne mogu prekinuti petlju unosa jer ne znam kako da unesem [tt]int 0[/tt] u double niz a da program ne pošandrca. Znam da ne mogu konvertirati [tt](double) prodavaci[i][j][/tt] u int pa to usporediti jer postoje mogućnosti računa poput 0.00005; probala sam usporediti u [tt]if[/tt]-u double i float, ali malo radi pa malo ne radi. :tso: )
Thank you Hvala lijepo na objašnjenju! Thank you

Citat:
Posto ne znamo unaprijed koliko prodavaci[i] ima elemenata, treba koristiti realloc.


Ma bi ja to koristila, ali sam u skripti pročitala da je realloc spor, pa sam ga odlučila ne upotrijebiti unless absolutely neccessary. Nadalje budem.

I još jedna sitnica, da budem 100% sigurna: Kad inicijaliziram i alociram int **niz, onda je u zapisu jednog elementa "većeg" niza niz[i]==**(niz+i) ili niz[i]==*(*niz+i) ili pak niz[i]==(**niz)+i? Ovo potonje mislim da nije, ali u globalu mi nije jasno kako da se properly krećem po "matrici" pomoću pointerske aritmetike. (I kako tek onda moram pisati za niz[i][j]?)

(I koja je fora s unosom nule između računa dva prodavača? Cijelo vrijeme unosim doubleove, ali ne mogu prekinuti petlju unosa jer ne znam kako da unesem int 0 u double niz a da program ne pošandrca. Znam da ne mogu konvertirati (double) prodavaci[i][j] u int pa to usporediti jer postoje mogućnosti računa poput 0.00005; probala sam usporediti u if-u double i float, ali malo radi pa malo ne radi. Trudim Se Objasniti... )


[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (355F)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 16:49 uto, 25. 4. 2017    Naslov: Citirajte i odgovorite

[quote="krilo"]Ma bi ja to koristila, ali sam u skripti pročitala da je realloc spor, pa sam ga odlučila ne upotrijebiti unless absolutely neccessary. Nadalje budem.[/quote]

Nema spasa ako duljina niza nije poznata unaprijed. Postoje nacini da se ubrza, ali nemojmo komplicirati. ;) Poanta te opaske je da ne alocirate element po element ako duljinu znate unaprijed, te da ste svjesni da postoji performance problem.

[quote="krilo"]I još jedna sitnica, da budem 100% sigurna: Kad inicijaliziram...[/quote]

Imam dojam da brkas "deklarirati" (najaviti compileru da ces koristiti adresu nekog tipa i s nekim imenom) i "inicijalizirati" (zadati varijabli pocetnu vrijednost).

[quote="krilo"]...i alociram [tt]int **niz[/tt], onda je u zapisu jednog elementa "većeg" niza [tt]niz[i]==**(niz+i)[/tt] ili [tt]niz[i]==*(*niz+i)[/tt] ili pak [tt]niz[i]==(**niz)+i[/tt]?[/quote]

Ni jedno. Ako je [tt]niz[/tt] tipa "pointer na pointer na nesto", onda je [tt]**niz[/tt] tipa "nesto" dok je [tt]niz[i][/tt] tipa "pointer na nesto".

Ima negdje u skripti to raspisano (Napomene 4.2.2. i 4.2.3.), ali za element slobodno pisi [tt]niz[i][j][/tt], osim ako se bas explicitno trazi pointerski (sumnam da bude).

[quote="krilo"](I koja je fora s unosom nule između računa dva prodavača? Cijelo vrijeme unosim doubleove, ali ne mogu prekinuti petlju unosa jer ne znam kako da unesem [tt]int 0[/tt] u double niz a da program ne pošandrca. Znam da ne mogu konvertirati [tt](double) prodavaci[i][j][/tt] u int pa to usporediti jer postoje mogućnosti računa poput 0.00005; probala sam usporediti u [tt]if[/tt]-u double i float, ali malo radi pa malo ne radi. :tso: )[/quote]

Nula je nula. Probaj na jednostavnom primjeru:

[code:1]#include<stdio.h>

int main(void) {
double x;
scanf("%lf", &x);
printf("%s nula\n", (x == 0 ? "Je" : "Nije"));
return 0;
}[/code:1]

Dakle, ucitas [tt]double x[/tt]. Ako je [tt]x == 0[/tt] prekines ucitavanje tok prodavaca; ako nije, doalociras niz i pridruziz vrijednost varijable [tt]x[/tt] novom elementu.
krilo (napisa):
Ma bi ja to koristila, ali sam u skripti pročitala da je realloc spor, pa sam ga odlučila ne upotrijebiti unless absolutely neccessary. Nadalje budem.


Nema spasa ako duljina niza nije poznata unaprijed. Postoje nacini da se ubrza, ali nemojmo komplicirati. Wink Poanta te opaske je da ne alocirate element po element ako duljinu znate unaprijed, te da ste svjesni da postoji performance problem.

krilo (napisa):
I još jedna sitnica, da budem 100% sigurna: Kad inicijaliziram...


Imam dojam da brkas "deklarirati" (najaviti compileru da ces koristiti adresu nekog tipa i s nekim imenom) i "inicijalizirati" (zadati varijabli pocetnu vrijednost).

krilo (napisa):
...i alociram int **niz, onda je u zapisu jednog elementa "većeg" niza niz[i]==**(niz+i) ili niz[i]==*(*niz+i) ili pak niz[i]==(**niz)+i?


Ni jedno. Ako je niz tipa "pointer na pointer na nesto", onda je **niz tipa "nesto" dok je niz[i] tipa "pointer na nesto".

Ima negdje u skripti to raspisano (Napomene 4.2.2. i 4.2.3.), ali za element slobodno pisi niz[i][j], osim ako se bas explicitno trazi pointerski (sumnam da bude).

krilo (napisa):
(I koja je fora s unosom nule između računa dva prodavača? Cijelo vrijeme unosim doubleove, ali ne mogu prekinuti petlju unosa jer ne znam kako da unesem int 0 u double niz a da program ne pošandrca. Znam da ne mogu konvertirati (double) prodavaci[i][j] u int pa to usporediti jer postoje mogućnosti računa poput 0.00005; probala sam usporediti u if-u double i float, ali malo radi pa malo ne radi. Trudim Se Objasniti... )


Nula je nula. Probaj na jednostavnom primjeru:

Kod:
#include<stdio.h>

int main(void) {
    double x;
    scanf("%lf", &x);
    printf("%s nula\n", (x == 0 ? "Je" : "Nije"));
    return 0;
}


Dakle, ucitas double x. Ako je x == 0 prekines ucitavanje tok prodavaca; ako nije, doalociras niz i pridruziz vrijednost varijable x novom elementu.



_________________
U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Drzim prodike


Zadnja promjena: vsego; 23:14 uto, 25. 4. 2017; ukupno mijenjano 1 put.
[Vrh]
Korisnički profil Pošaljite privatnu poruku
krilo
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 01. 11. 2016. (14:45:48)
Postovi: (4E)16
Spol: žensko
Sarma = la pohva - posuda
= 5 - 0

PostPostano: 19:30 uto, 25. 4. 2017    Naslov: Citirajte i odgovorite

[quote="vsego"]Imam dojam da brkas "deklarirati" (najaviti compileru da ces koristiti adresu nekog tipa i s nekim imenom) i "inicijalizirati" (zadati varijabli pocetnu vrijednost).[/quote]

Imaš dobar dojam. :facepalm:

Ne znam kako sam previdjela spomenute napomene, hvala na uputi.

[quote="vsego"]Dakle, ucitas [tt]double x[/tt]. Ako je [tt]x == 0[/tt] prekines ucitavanje tok prodavaca; ako nije, doalociras niz i pridruziz vrijednost varijable [tt]x[/tt] novom elementu.[/quote]

Upravo sam i to radila 'till it hit me da je problem u [tt]scanf[/tt]-u, tj. slovima [tt]%g[/tt], [tt]%f[/tt] i [tt]%lf[/tt]... Stajao mi je tamo [tt]%g[/tt] koji očito ne valja.
Što dalje idem, to više kužim da ne kužim elementarno. :nuts2:
:thankyou:
vsego (napisa):
Imam dojam da brkas "deklarirati" (najaviti compileru da ces koristiti adresu nekog tipa i s nekim imenom) i "inicijalizirati" (zadati varijabli pocetnu vrijednost).


Imaš dobar dojam. O, kuku meni...

Ne znam kako sam previdjela spomenute napomene, hvala na uputi.

vsego (napisa):
Dakle, ucitas double x. Ako je x == 0 prekines ucitavanje tok prodavaca; ako nije, doalociras niz i pridruziz vrijednost varijable x novom elementu.


Upravo sam i to radila 'till it hit me da je problem u scanf-u, tj. slovima %g, %f i %lf... Stajao mi je tamo %g koji očito ne valja.
Što dalje idem, to više kužim da ne kužim elementarno. Nuts
Thank you


[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (355F)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 23:15 uto, 25. 4. 2017    Naslov: Citirajte i odgovorite

[tt]double[/tt] = [tt]long float[/tt], pa je format [tt]%lf[/tt]. ;)
double = long float, pa je format %lf. Wink



_________________
U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2 Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Ne možete otvarati nove teme.
Ne možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan