Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (355F)16
Spol:
Lokacija: /sbin/init
|
Postano: 20:52 sri, 2. 1. 2013 Naslov: |
|
|
@Redeemer: Baci oko na skriptu za vjezbe, poglavlje 4.3. Ako razumijes sto se dogadja u memoriji (a tamo je objasnjeno i nacrtano), trebalo bi ti biti kad takva zamjena radi, a kad ne (i zasto).
@Redeemer: Baci oko na skriptu za vjezbe, poglavlje 4.3. Ako razumijes sto se dogadja u memoriji (a tamo je objasnjeno i nacrtano), trebalo bi ti biti kad takva zamjena radi, a kad ne (i zasto).
_________________ 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.
|
|
[Vrh] |
|
la mer Forumaš(ica)
Pridružen/a: 19. 09. 2012. (17:39:46) Postovi: (F)16
|
|
[Vrh] |
|
celeste Forumaš(ica)
Pridružen/a: 31. 10. 2009. (11:56:09) Postovi: (23)16
|
Postano: 15:04 čet, 17. 1. 2013 Naslov: |
|
|
Zadatak uchitava broj i niz brojeva i sortira ih po sumi znamenaka. Zanima me znachi li ovo da sam koristila pomochni niz obzirom da sam sumu znamenaka spremila u prvotni niz i onda ga sortirala?
[code:1]#include <stdio.h>
#include <stdlib.h>
int main(){
int n,a[200],i,s=0,t,d,m,j;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);}
for(i=0;i<n;i++){
t=a[i];
if(t<0) t=-t;
s=0;
while(t>0){
d=t%10;
s=s+d;
t=t/10;}
a[i]=s;}
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
if(a[i]>a[j]){
m=a[i];
a[i]=a[j];
a[j]=m;}}}
for(i=0;i<n;i++){
printf("%d\n",a[i]);}
return 0;
}
[/code:1]
Zadatak uchitava broj i niz brojeva i sortira ih po sumi znamenaka. Zanima me znachi li ovo da sam koristila pomochni niz obzirom da sam sumu znamenaka spremila u prvotni niz i onda ga sortirala?
Kod: | #include <stdio.h>
#include <stdlib.h>
int main(){
int n,a[200],i,s=0,t,d,m,j;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);}
for(i=0;i<n;i++){
t=a[i];
if(t<0) t=-t;
s=0;
while(t>0){
d=t%10;
s=s+d;
t=t/10;}
a[i]=s;}
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
if(a[i]>a[j]){
m=a[i];
a[i]=a[j];
a[j]=m;}}}
for(i=0;i<n;i++){
printf("%d\n",a[i]);}
return 0;
}
|
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (355F)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
JustLovely Forumaš(ica)
Pridružen/a: 07. 09. 2011. (09:16:02) Postovi: (E)16
Spol:
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (355F)16
Spol:
Lokacija: /sbin/init
|
Postano: 1:04 pet, 18. 1. 2013 Naslov: |
|
|
Probas, pa saznas. 8)
Zadatak 11.6.15. brise samo jedan element. Bolja referenca je zadatak 11.6.10.
Pristup koji ti pokusavas dobiti ima kvadratnu slozenost (ovaj u 11.6.10. ima linearnu), no ako bas zelis tako, onda bi to ovako trebalo ici:
[code:1]for (i = 0; i < *n; ) {
if (x[i] == min) {
for (j = i + 1; j < *n; j++)
x[j - 1] = x[j];
(*n)--;
} else
i++[/code:1]
Poanta: ako obrisemo element, onda on dolazi na mjesto [tt]i[/tt] i tek ga treba provjeriti, sto znaci da [tt]i[/tt] u tom slucaju ne povecavamo. Umjesto da ga smanjimo i povecamo, bolje je inkrement prebaciti iz [tt]for()[/tt] u [tt]else[/tt].
Probas, pa saznas.
Zadatak 11.6.15. brise samo jedan element. Bolja referenca je zadatak 11.6.10.
Pristup koji ti pokusavas dobiti ima kvadratnu slozenost (ovaj u 11.6.10. ima linearnu), no ako bas zelis tako, onda bi to ovako trebalo ici:
Kod: | for (i = 0; i < *n; ) {
if (x[i] == min) {
for (j = i + 1; j < *n; j++)
x[j - 1] = x[j];
(*n)--;
} else
i++ |
Poanta: ako obrisemo element, onda on dolazi na mjesto i i tek ga treba provjeriti, sto znaci da i u tom slucaju ne povecavamo. Umjesto da ga smanjimo i povecamo, bolje je inkrement prebaciti iz for() u else.
_________________ 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.
|
|
[Vrh] |
|
JustLovely Forumaš(ica)
Pridružen/a: 07. 09. 2011. (09:16:02) Postovi: (E)16
Spol:
|
|
[Vrh] |
|
patakenjac Forumaš(ica)
Pridružen/a: 23. 10. 2011. (17:34:05) Postovi: (2F)16
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (355F)16
Spol:
Lokacija: /sbin/init
|
Postano: 13:13 sri, 30. 1. 2013 Naslov: |
|
|
[quote="patakenjac"]I može li hint za 2. zadatak[/quote]
Tupi kut ima negativni kosinus. To znaci da treba provjeriti je li
[tex]a^2 > b^2 + c^2 \quad \text{ili} \quad b^2 > a^2 + c^2 \quad \text{ili} \quad c^2 > a^2 + b^2[/tex].
Naravno, da bi nesto bilo tupokutni trokut, treba prvo provjeriti je li uopce trokut, sto znaci da treba provjeriti da je [tex]a,b,c > 0[/tex] i nejednakost trokuta:
[tex]a < b + c \quad \text{i} \quad b < a + c \quad \text{i} \quad c < a + b[/tex].
Po meni, najbolje je napisati funkciju koja vraca 1 ako su uvjeti zadovoljeni, a nulu inace i onda tu funkciju zavrtis u tri petlje; prva, recimo po [tt]i[/tt], ide od 1 do [tt]n[/tt], druga, po [tt]j[/tt], ide od [tt]i[/tt]+1 do [tt]n[/tt], a treca ide [tt]j[/tt]+1 do [tt]n[/tt] (time sprijecis ponavljanja).
[quote="patakenjac"]i rješenje 3. http://degiorgi.math.hr/prog1/kolokviji/p1-kolokvij-1213-2.pdf[/quote]
Rutinski sort i trazenje. Ne pise mi se cijelo rjesenje, sorry.
patakenjac (napisa): | I može li hint za 2. zadatak |
Tupi kut ima negativni kosinus. To znaci da treba provjeriti je li
[tex]a^2 > b^2 + c^2 \quad \text{ili} \quad b^2 > a^2 + c^2 \quad \text{ili} \quad c^2 > a^2 + b^2[/tex].
Naravno, da bi nesto bilo tupokutni trokut, treba prvo provjeriti je li uopce trokut, sto znaci da treba provjeriti da je [tex]a,b,c > 0[/tex] i nejednakost trokuta:
[tex]a < b + c \quad \text{i} \quad b < a + c \quad \text{i} \quad c < a + b[/tex].
Po meni, najbolje je napisati funkciju koja vraca 1 ako su uvjeti zadovoljeni, a nulu inace i onda tu funkciju zavrtis u tri petlje; prva, recimo po i, ide od 1 do n, druga, po j, ide od i+1 do n, a treca ide j+1 do n (time sprijecis ponavljanja).
Rutinski sort i trazenje. Ne pise mi se cijelo rjesenje, sorry.
_________________ 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.
|
|
[Vrh] |
|
hendrix Forumaš(ica)
Pridružen/a: 03. 09. 2012. (15:59:06) Postovi: (92)16
|
Postano: 20:33 sri, 30. 1. 2013 Naslov: |
|
|
[quote="vsego"]Po meni, najbolje je napisati funkciju koja vraca 1 ako su uvjeti zadovoljeni, a nulu inace i onda tu funkciju zavrtis u tri petlje; prva, recimo po [tt]i[/tt], ide od 1 do [tt]n[/tt], druga, po [tt]j[/tt], ide od [tt]i[/tt]+1 do [tt]n[/tt], a treca ide [tt]j[/tt]+1 do [tt]n[/tt] (time sprijecis ponavljanja).[/quote]
Ako se ide metodom izbjegavanja ponavljanja (ako je to potrebno - ja sam to napravio na kolokviju pa se kasnije pitao je li bilo potrebno), ne bi li onda prva petlja trebala ići do [tt]n-2[/tt], druga do [tt]n-1[/tt], a samo treća do [tt]n[/tt]? Jer inače se ponovi ovo "s kraja" petlji. (Ili sam nešto propustio.)
vsego (napisa): | Po meni, najbolje je napisati funkciju koja vraca 1 ako su uvjeti zadovoljeni, a nulu inace i onda tu funkciju zavrtis u tri petlje; prva, recimo po i, ide od 1 do n, druga, po j, ide od i+1 do n, a treca ide j+1 do n (time sprijecis ponavljanja). |
Ako se ide metodom izbjegavanja ponavljanja (ako je to potrebno - ja sam to napravio na kolokviju pa se kasnije pitao je li bilo potrebno), ne bi li onda prva petlja trebala ići do n-2, druga do n-1, a samo treća do n? Jer inače se ponovi ovo "s kraja" petlji. (Ili sam nešto propustio.)
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (355F)16
Spol:
Lokacija: /sbin/init
|
Postano: 20:48 sri, 30. 1. 2013 Naslov: |
|
|
[quote="hendrix"][quote="vsego"]Po meni, najbolje je napisati funkciju koja vraca 1 ako su uvjeti zadovoljeni, a nulu inace i onda tu funkciju zavrtis u tri petlje; prva, recimo po [tt]i[/tt], ide od 1 do [tt]n[/tt], druga, po [tt]j[/tt], ide od [tt]i[/tt]+1 do [tt]n[/tt], a treca ide [tt]j[/tt]+1 do [tt]n[/tt] (time sprijecis ponavljanja).[/quote]
Ako se ide metodom izbjegavanja ponavljanja (ako je to potrebno - ja sam to napravio na kolokviju pa se kasnije pitao je li bilo potrebno), ne bi li onda prva petlja trebala ići do [tt]n-2[/tt], druga do [tt]n-1[/tt], a samo treća do [tt]n[/tt]? Jer inače se ponovi ovo "s kraja" petlji. (Ili sam nešto propustio.)[/quote]
Traze se troclani skupovi, a student matematike vjerojatno zna da su skupovi [tex]\{i,j,k\}[/tex] i [tex]\{j,i,k\}[/tex] jednaki te da nisu troclani ako su neki od tih indeksa jednaki.
Sto se petlje tice, recimo da je [tt]i = n-1[/tt]. Tada u prvom koraku unutrasnje (tj. srednje) petlje imamo [tt]j = i+1 = n[/tt]. Posto je uvjet petlje [tt]j < n[/tt], ta se nece niti jednom izvrtiti. Bilo bi preglednije kako si napisao, ali radi i ovako, a nisam htio zapiliti s detaljima. Ipak je to samo skica.
hendrix (napisa): | vsego (napisa): | Po meni, najbolje je napisati funkciju koja vraca 1 ako su uvjeti zadovoljeni, a nulu inace i onda tu funkciju zavrtis u tri petlje; prva, recimo po i, ide od 1 do n, druga, po j, ide od i+1 do n, a treca ide j+1 do n (time sprijecis ponavljanja). |
Ako se ide metodom izbjegavanja ponavljanja (ako je to potrebno - ja sam to napravio na kolokviju pa se kasnije pitao je li bilo potrebno), ne bi li onda prva petlja trebala ići do n-2, druga do n-1, a samo treća do n? Jer inače se ponovi ovo "s kraja" petlji. (Ili sam nešto propustio.) |
Traze se troclani skupovi, a student matematike vjerojatno zna da su skupovi [tex]\{i,j,k\}[/tex] i [tex]\{j,i,k\}[/tex] jednaki te da nisu troclani ako su neki od tih indeksa jednaki.
Sto se petlje tice, recimo da je i = n-1. Tada u prvom koraku unutrasnje (tj. srednje) petlje imamo j = i+1 = n. Posto je uvjet petlje j < n, ta se nece niti jednom izvrtiti. Bilo bi preglednije kako si napisao, ali radi i ovako, a nisam htio zapiliti s detaljima. Ipak je to samo skica.
_________________ 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.
|
|
[Vrh] |
|
hendrix Forumaš(ica)
Pridružen/a: 03. 09. 2012. (15:59:06) Postovi: (92)16
|
Postano: 21:00 sri, 30. 1. 2013 Naslov: |
|
|
Istina, kao i mnogo puta dosad, propustio sam očitije/jednostavnije rješenje. :D
Glede prvog dijela, ja sam na kolokviju imao grupu s uređenim trojkama pa otud i "razilaženje" u postovima iznad (zato sam se i zbunio poslije kolokvija jer nisam znao što mi je na kraju pisalo), pretpostavio sam da je u svim grupama bilo isto, sad vidim da ipak nije.
Istina, kao i mnogo puta dosad, propustio sam očitije/jednostavnije rješenje.
Glede prvog dijela, ja sam na kolokviju imao grupu s uređenim trojkama pa otud i "razilaženje" u postovima iznad (zato sam se i zbunio poslije kolokvija jer nisam znao što mi je na kraju pisalo), pretpostavio sam da je u svim grupama bilo isto, sad vidim da ipak nije.
|
|
[Vrh] |
|
vitezzzzz Forumaš(ica)
Pridružen/a: 08. 04. 2013. (10:17:56) Postovi: (1)16
|
Postano: 16:59 sub, 18. 5. 2013 Naslov: |
|
|
Ako može mala pomoć oko zadatka iz predprošlog kolokvija 3.zadatak:
Elementi vezane liste trebaju sadrzavati po jedan string ime s najvise 10 znakova i dva cijela broja start i end.
Napisite funkciju osam(element *first, element second), gdje je first pokazivac na prvi element liste, koja ubacuje element second u listu first i to prije osmog elementa liste. Ako lista ima manje od osam elementa, funkcija ne radi nista.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _element {
char ime[11];
int start, end;
struct _element *next;
} element;
element *osam(element *first, element second)
{
element *t, *osam, *n=(element*)malloc(sizoef(element));
int i=0, n=0;
strcpy(n->ime,second.ime)
n->start=second.start;
n->end=second.end;
for(t=first;t;t=t->next) n++;
if (n<8) return first;
for(t=first;t;t=t->next)
{
i++;
if(i==7)
{
osam= t->next;
t->next=second;
second->next=osam;
}
}
return first;
}
Moje pitanje je može li se ta funkcija napisati na ovaj način, tj. jeli ovo ispravno???
Hvala
Ako može mala pomoć oko zadatka iz predprošlog kolokvija 3.zadatak:
Elementi vezane liste trebaju sadrzavati po jedan string ime s najvise 10 znakova i dva cijela broja start i end.
Napisite funkciju osam(element *first, element second), gdje je first pokazivac na prvi element liste, koja ubacuje element second u listu first i to prije osmog elementa liste. Ako lista ima manje od osam elementa, funkcija ne radi nista.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _element {
char ime[11];
int start, end;
struct _element *next;
} element;
element *osam(element *first, element second)
{
element *t, *osam, *n=(element*)malloc(sizoef(element));
int i=0, n=0;
strcpy(n→ime,second.ime)
n→start=second.start;
n→end=second.end;
for(t=first;t;t=t→next) n++;
if (n< return first;
for(t=first;t;t=t→next)
{
i++;
if(i==7)
{
osam= t→next;
t→next=second;
second→next=osam;
}
}
return first;
}
Moje pitanje je može li se ta funkcija napisati na ovaj način, tj. jeli ovo ispravno???
Hvala
|
|
[Vrh] |
|
frutabella Forumaš(ica)
Pridružen/a: 09. 10. 2010. (16:35:36) Postovi: (24E)16
|
Postano: 16:40 sri, 22. 5. 2013 Naslov: |
|
|
Pomoc u vezi prvog zadatka s proslogodinjeg kolokvija:
http://degiorgi.math.hr/prog2/kolokviji/p2-kolokvij-1112-2.pdf
Moj kod za upis i ispis: (bez predzadnjeg i zadnjeg dijela zadatka)
[code:1]
typedef struct _drzava{
char naziv[21];
unsigned populacija;
double povrsina;
} drzava;
struct _drzava*ucitaj(unsigned *n){
struct _drzava*niz=NULL;
char ime[21];
int i;
for(i=1; i<*n; ++i){
printf("Upisi %d. drzavu: \n", i);
scanf(" %[^\n]", ime);
niz=(drzava*)realloc(niz,i*sizeof(drzava));
strcpy(niz[i].naziv, ime);
/*ovdje u rjesenju pise strcpy(niz[*n].naziv, ime), ne znam zasto /*
printf("Upisi populaciju i povrsinu: \n");
scanf("%u\n %lf",&niz[i].populacija,&niz[i].povrsina);
}
return niz;
}
int main (void){
unsigned n;
drzava *a=ucitaj(&n);
ispisi(a,n);
return 0;
}
[/code:1]
Rjesenje s neta kad isprobam ne radi. :cry:
Ako ne rijesim zadnji dio prvog zadatka, onda ucitavanje nema ogranicenja?
Mozda razmisljam pogresno, ali gdje se onda ucitava taj n pa da program zna kad zavrsiti s ucitavanjem?
Pomoc u vezi prvog zadatka s proslogodinjeg kolokvija:
http://degiorgi.math.hr/prog2/kolokviji/p2-kolokvij-1112-2.pdf
Moj kod za upis i ispis: (bez predzadnjeg i zadnjeg dijela zadatka)
Kod: |
typedef struct _drzava{
char naziv[21];
unsigned populacija;
double povrsina;
} drzava;
struct _drzava*ucitaj(unsigned *n){
struct _drzava*niz=NULL;
char ime[21];
int i;
for(i=1; i<*n; ++i){
printf("Upisi %d. drzavu: \n", i);
scanf(" %[^\n]", ime);
niz=(drzava*)realloc(niz,i*sizeof(drzava));
strcpy(niz[i].naziv, ime);
/*ovdje u rjesenju pise strcpy(niz[*n].naziv, ime), ne znam zasto /*
printf("Upisi populaciju i povrsinu: \n");
scanf("%u\n %lf",&niz[i].populacija,&niz[i].povrsina);
}
return niz;
}
int main (void){
unsigned n;
drzava *a=ucitaj(&n);
ispisi(a,n);
return 0;
}
|
Rjesenje s neta kad isprobam ne radi.
Ako ne rijesim zadnji dio prvog zadatka, onda ucitavanje nema ogranicenja?
Mozda razmisljam pogresno, ali gdje se onda ucitava taj n pa da program zna kad zavrsiti s ucitavanjem?
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (355F)16
Spol:
Lokacija: /sbin/init
|
Postano: 19:04 sri, 22. 5. 2013 Naslov: |
|
|
Ti u funkciju posaljes adresu cijelog broja [tt]n[/tt] i tamo onda to koristis... a gdje mu zadajes vrijednost? Ili, ako hoces drugacije: koliko puta ce se tvoja [tt]for[/tt]-petlja u funkciji [tt]ucitaj()[/tt] izvrsiti?
Hint: u funkciji fali [tt]scanf("%d", n);[/tt] (da, [b]bez[/b] [tt]&[/tt]!).
P.S. Kad vec imas [tt]typedef[/tt], ne treba ti [tt]struct _drzava[/tt] u svakoj deklaraciji; stavi ekvivalentnu deklaraciju [tt]drzava[/tt], da ustedis na pisanju (na kolokviju nema copy/paste-a).
Ti u funkciju posaljes adresu cijelog broja n i tamo onda to koristis... a gdje mu zadajes vrijednost? Ili, ako hoces drugacije: koliko puta ce se tvoja for-petlja u funkciji ucitaj() izvrsiti?
Hint: u funkciji fali scanf("%d", n); (da, bez &!).
P.S. Kad vec imas typedef, ne treba ti struct _drzava u svakoj deklaraciji; stavi ekvivalentnu deklaraciju drzava, da ustedis na pisanju (na kolokviju nema copy/paste-a).
_________________ 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.
|
|
[Vrh] |
|
frutabella Forumaš(ica)
Pridružen/a: 09. 10. 2010. (16:35:36) Postovi: (24E)16
|
Postano: 17:53 čet, 23. 5. 2013 Naslov: |
|
|
[code:1]
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct _drzava{
char naziv[21];
unsigned populacija;
double povrsina;
} drzava;
drzava*ucitaj(unsigned *n){
drzava*niz=NULL;
char ime[21];
int i;
printf("Upisi broj drzava: \n");
scanf("%d", n);
for(i=1; i<=*n; ++i){
printf("Upisi %d. drzavu: \n", i);
scanf(" %[^\n]", ime);
niz=(drzava*)realloc(niz,i*sizeof(drzava));
if(!strcmp(ime, "kraj")) return niz;
strcpy(niz[*n].naziv, ime);
printf("Upisi populaciju i povrsinu: \n");
scanf("%u\n %lf",&niz[i].populacija,&niz[i].povrsina);
}
return niz;
}
void ispisi(drzava *niz, unsigned n){
unsigned i;
printf("%-20s %10s %10s\n","Ime","Stanovnika","Povrsina");
for(i=1;i<=n;++i)
printf(" %-20s %10u %10f\n",niz[i].naziv,niz[i].populacija,niz[i].povrsina);
}
int main (void){
unsigned n;
drzava *a=ucitaj(&n);
ispisi(a,n);
free (a);
return 0;
}
[/code:1]
1. Ne ispisuje mi dobro imena drzava, zadnu upisanu drzavu dobro ispise, a prethodne ne.
2. zasto u funkciji ucitaj radimo
[code:1] strcpy(niz[*n].naziv, ime)[/code:1]
a ne
[code:1]strcpy(niz[i].naziv, ime)[/code:1]
3. Zasto moramo inicijalizirati ----> drzava*niz=NULL?
Da ne koristimo realloc, onda ne bi trebali?
Kod: |
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct _drzava{
char naziv[21];
unsigned populacija;
double povrsina;
} drzava;
drzava*ucitaj(unsigned *n){
drzava*niz=NULL;
char ime[21];
int i;
printf("Upisi broj drzava: \n");
scanf("%d", n);
for(i=1; i<=*n; ++i){
printf("Upisi %d. drzavu: \n", i);
scanf(" %[^\n]", ime);
niz=(drzava*)realloc(niz,i*sizeof(drzava));
if(!strcmp(ime, "kraj")) return niz;
strcpy(niz[*n].naziv, ime);
printf("Upisi populaciju i povrsinu: \n");
scanf("%u\n %lf",&niz[i].populacija,&niz[i].povrsina);
}
return niz;
}
void ispisi(drzava *niz, unsigned n){
unsigned i;
printf("%-20s %10s %10s\n","Ime","Stanovnika","Povrsina");
for(i=1;i<=n;++i)
printf(" %-20s %10u %10f\n",niz[i].naziv,niz[i].populacija,niz[i].povrsina);
}
int main (void){
unsigned n;
drzava *a=ucitaj(&n);
ispisi(a,n);
free (a);
return 0;
}
|
1. Ne ispisuje mi dobro imena drzava, zadnu upisanu drzavu dobro ispise, a prethodne ne.
2. zasto u funkciji ucitaj radimo
Kod: | strcpy(niz[*n].naziv, ime) |
a ne
Kod: | strcpy(niz[i].naziv, ime) |
3. Zasto moramo inicijalizirati ----> drzava*niz=NULL?
Da ne koristimo realloc, onda ne bi trebali?
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (355F)16
Spol:
Lokacija: /sbin/init
|
Postano: 18:00 čet, 23. 5. 2013 Naslov: |
|
|
Ovako nabrzinu, cini mi se da si u pravu i da treba ici [tt]i[/tt]. Ovaj [tt]*n[/tt] je vjerojatno ostatak od copy/paste-a iz verzije u kojoj se [tt]n[/tt] ne ucitava.
Takodjer, petlje bi trebale ici od 0 do [tt]<n[/tt]. Isprobaj, pa javi je l' ok. :)
Inace, ovdje ne treba [tt]realloc()[/tt], ako se oslanjamo na to da je [tt]n[/tt] ucitan. Dosta je nakon [tt]scanf("%d", n);[/tt] staviti [tt]malloc()[/tt].
Ref. 3. da, zbog [tt]realloc()[/tt].
Ovako nabrzinu, cini mi se da si u pravu i da treba ici i. Ovaj *n je vjerojatno ostatak od copy/paste-a iz verzije u kojoj se n ne ucitava.
Takodjer, petlje bi trebale ici od 0 do <n. Isprobaj, pa javi je l' ok.
Inace, ovdje ne treba realloc(), ako se oslanjamo na to da je n ucitan. Dosta je nakon scanf("%d", n); staviti malloc().
Ref. 3. da, zbog realloc().
_________________ 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.
|
|
[Vrh] |
|
frutabella Forumaš(ica)
Pridružen/a: 09. 10. 2010. (16:35:36) Postovi: (24E)16
|
Postano: 18:34 čet, 23. 5. 2013 Naslov: |
|
|
[quote="vsego"]Ovako nabrzinu, cini mi se da si u pravu i da treba ici [tt]i[/tt]. Ovaj [tt]*n[/tt] je vjerojatno ostatak od copy/paste-a iz verzije u kojoj se [tt]n[/tt] ne ucitava.
Takodjer, petlje bi trebale ici od 0 do [tt]<n[/tt]. Isprobaj, pa javi je l' ok. :)
Inace, ovdje ne treba [tt]realloc()[/tt], ako se oslanjamo na to da je [tt]n[/tt] ucitan. Dosta je nakon [tt]scanf("%d", n);[/tt] staviti [tt]malloc()[/tt].
Ref. 3. da, zbog [tt]realloc()[/tt].[/quote]
E, radi sad, super. Hvala.
vsego (napisa): | Ovako nabrzinu, cini mi se da si u pravu i da treba ici i. Ovaj *n je vjerojatno ostatak od copy/paste-a iz verzije u kojoj se n ne ucitava.
Takodjer, petlje bi trebale ici od 0 do <n. Isprobaj, pa javi je l' ok.
Inace, ovdje ne treba realloc(), ako se oslanjamo na to da je n ucitan. Dosta je nakon scanf("%d", n); staviti malloc().
Ref. 3. da, zbog realloc(). |
E, radi sad, super. Hvala.
|
|
[Vrh] |
|
frutabella Forumaš(ica)
Pridružen/a: 09. 10. 2010. (16:35:36) Postovi: (24E)16
|
Postano: 21:27 čet, 23. 5. 2013 Naslov: |
|
|
Definirajte tip podatka "razlomak" za pohranu jednog razlomka u listu (tako da bude moguce deklarirati varijablu razlomak r;) te napisite funkciju koja dodaje jedan razlomak (određen parametrima x, y ---->ja sam ih nazvala brojnik, nazivnik) na pocetak razlomka. Napisite i kako se funkcija poziva.
Da li je ovo rjesenje dobro?
[code:1]#include<stdio.h>
typedef struct _razlomak* lista;
typedef struct _razlomak{
int brojnik;
int nazivnik;
lista next;
}razlomak;
lista ubaci_razlomak_na_pocetak(lista prvi, lista novi)
{
novi->next=prvi;
prvi=novi;
return prvi;
}
int main (void)
{
lista prvi=NULL;
lista novi, temp, pom, pom2;
while(1){
novi=(lista)malloc(sizeof(razlomak));
printf("Brojnik: ");
scanf("%d", &novi->brojnik);
printf("Nazivnik: \n");
scanf("%d", &novi->nazivnik);
if(novi->nazivnik==0) break;
temp=ubaci_razlomak_na_pocetak(prvi, novi);
printf("Brojnik/Nazivnik: %d/%d\n", temp->brojnik, temp->nazivnik);
}
for(pom=prvi; pom!=NULL; pom=pom2){
pom2=pom->next;
free(pom);
}
return 0;
}
[/code:1]
Imam rjesenje od prosle godine od jednog asistenta:
[code:1]
#include <stdio.h>
#include <stdlib.h>
typedef struct __cvor
{
int br, naz;
struct __cvor *next;
} cvor;
typedef cvor razlomak;
cvor *dodaj( cvor *L, int x, int y )
{
cvor *novi;
novi = (cvor *) malloc( sizeof( cvor ) );
novi->br = x;
novi->naz = y;
novi->next = L;
L = novi;
return L;
}
int main( void )
{
cvor *L = NULL, *tren;
while( 1 )
{
int x, y;
scanf( "%d %d", &x, &y );
if( y == 0 )
break;
L = dodaj( L, x, y );
}
for( tren = L; tren != NULL; tren = tren->next )
printf( "%d/%d ", tren->br, tren->naz );
while( L != NULL )
{
cvor *temp = L;
L = L->next;
free( temp );
}
return 0;
}
[/code:1]
Da li programi rade isto?
Definirajte tip podatka "razlomak" za pohranu jednog razlomka u listu (tako da bude moguce deklarirati varijablu razlomak r te napisite funkciju koja dodaje jedan razlomak (određen parametrima x, y ---->ja sam ih nazvala brojnik, nazivnik) na pocetak razlomka. Napisite i kako se funkcija poziva.
Da li je ovo rjesenje dobro?
Kod: | #include<stdio.h>
typedef struct _razlomak* lista;
typedef struct _razlomak{
int brojnik;
int nazivnik;
lista next;
}razlomak;
lista ubaci_razlomak_na_pocetak(lista prvi, lista novi)
{
novi->next=prvi;
prvi=novi;
return prvi;
}
int main (void)
{
lista prvi=NULL;
lista novi, temp, pom, pom2;
while(1){
novi=(lista)malloc(sizeof(razlomak));
printf("Brojnik: ");
scanf("%d", &novi->brojnik);
printf("Nazivnik: \n");
scanf("%d", &novi->nazivnik);
if(novi->nazivnik==0) break;
temp=ubaci_razlomak_na_pocetak(prvi, novi);
printf("Brojnik/Nazivnik: %d/%d\n", temp->brojnik, temp->nazivnik);
}
for(pom=prvi; pom!=NULL; pom=pom2){
pom2=pom->next;
free(pom);
}
return 0;
}
|
Imam rjesenje od prosle godine od jednog asistenta:
Kod: |
#include <stdio.h>
#include <stdlib.h>
typedef struct __cvor
{
int br, naz;
struct __cvor *next;
} cvor;
typedef cvor razlomak;
cvor *dodaj( cvor *L, int x, int y )
{
cvor *novi;
novi = (cvor *) malloc( sizeof( cvor ) );
novi->br = x;
novi->naz = y;
novi->next = L;
L = novi;
return L;
}
int main( void )
{
cvor *L = NULL, *tren;
while( 1 )
{
int x, y;
scanf( "%d %d", &x, &y );
if( y == 0 )
break;
L = dodaj( L, x, y );
}
for( tren = L; tren != NULL; tren = tren->next )
printf( "%d/%d ", tren->br, tren->naz );
while( L != NULL )
{
cvor *temp = L;
L = L->next;
free( temp );
}
return 0;
}
|
Da li programi rade isto?
|
|
[Vrh] |
|
|