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; } } } |
krilo (napisa): | ||
|
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.) |
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);.)
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 ([][])? |
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? |
Kod: |
ptr = (double*)malloc(n * sizeof(double)); |
Citat: |
Posto ne znamo unaprijed koliko prodavaci[i] ima elemenata, treba koristiti realloc. |
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. |
krilo (napisa): |
I još jedna sitnica, da budem 100% sigurna: Kad inicijaliziram... |
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? |
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. ) |
Kod: |
#include<stdio.h>
int main(void) { double x; scanf("%lf", &x); printf("%s nula\n", (x == 0 ? "Je" : "Nije")); return 0; } |
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). |
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. |
output generated using printer-friendly topic mod. Vremenska zona: GMT + 01:00.