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

zadatak-pomoć
WWW:
Idite na Prethodno  1, 2
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
vsego
Site Admin
Site Admin


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

PostPostano: 12:39 pon, 29. 3. 2010    Naslov: Citirajte i odgovorite

[tt]k[/tt] i [tt]j[/tt] inicijaliziras na krivom mjestu, a i u drugoj petlji bi bilo bolje da krenes sa [tt]i=k[/tt].

U ispisu ti fali skok u novi red.
k i j inicijaliziras na krivom mjestu, a i u drugoj petlji bi bilo bolje da krenes sa i=k.

U ispisu ti fali skok u novi red.



_________________
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
.anchy.
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 14. 11. 2007. (20:03:46)
Postovi: (1BC)16
Sarma = la pohva - posuda
= 15 - 11
Lokacija: Zgb

PostPostano: 17:43 pon, 29. 3. 2010    Naslov: Citirajte i odgovorite

hvala puno,sada radi! :)
hvala puno,sada radi! Smile


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


Pridružen/a: 14. 11. 2007. (20:03:46)
Postovi: (1BC)16
Sarma = la pohva - posuda
= 15 - 11
Lokacija: Zgb

PostPostano: 12:18 sri, 14. 4. 2010    Naslov: Citirajte i odgovorite

Napisite funkciju koja ce primati barem jedan argument x tipa int. Funkcija treba vratiti broj na koliko razlicitih nacina se broj x moze prikazati kao suma prostih brojeva, neovisno o redoslijedu sumanada. (Dakle, ne razlikujemo rastave 2 + 3 + 5 i 5 + 2 + 3, odnosno, brojimo ih kao jedan.)

ideja mi je da proste brojeve <x spremam u jedan niz,i onda s njima radim rastav x na zbroj:
[code:1]#include <stdio.h>
#include <stdlib.h>

int br=0;

int prosto(int i){
int j;
for(j=2;j<i;j++)
if(i%j==0) return 0;
return 1;
}

int *prosti(int x, int *prost){
int i,n=0;
for(i=2;i<x;i++){
if(prosto(i)){
prost=(int*)realloc(prost,++n*sizeof(int));
prost[br]=i;
br++;
}
}
return prost;
}

int part(int x,int *prost,int zadnji){
int cnt=0,i;
if(x<2) return 0;
if(x=2) return 1;
for(i=0;i<br;i++)
if(zadnji<=prost[i])
cnt+=part(x-prost[i], prost, prost[i]);
return cnt;
}
int main(){
int x, *prost;
scanf("%d",&x);
prosti(x,prost);
printf("%d", part(x,prost,2));
system("pause");
free(prost);
return 0;
}
[/code:1]

za svaki broj mi ispiše da ima samo jedan rastav ako nizu zadam duljinu,bez realloca,što će reći da se s reallocom ruši program,a ne razumijem zašto,pa ako može pomoć oko toga i točnosti zadatka?
Napisite funkciju koja ce primati barem jedan argument x tipa int. Funkcija treba vratiti broj na koliko razlicitih nacina se broj x moze prikazati kao suma prostih brojeva, neovisno o redoslijedu sumanada. (Dakle, ne razlikujemo rastave 2 + 3 + 5 i 5 + 2 + 3, odnosno, brojimo ih kao jedan.)

ideja mi je da proste brojeve <x spremam u jedan niz,i onda s njima radim rastav x na zbroj:
Kod:
#include <stdio.h>
#include <stdlib.h>

int br=0;

int prosto(int i){
    int j;
    for(j=2;j<i;j++)
      if(i%j==0) return 0;
    return 1;
}

int *prosti(int x, int *prost){
    int i,n=0;
    for(i=2;i<x;i++){
                     if(prosto(i)){
                                  prost=(int*)realloc(prost,++n*sizeof(int));
                                  prost[br]=i;
                                  br++;
                                  }
                                  }
    return prost;
}

int part(int x,int *prost,int zadnji){
    int cnt=0,i;
    if(x<2) return 0;
    if(x=2) return 1;
    for(i=0;i<br;i++)
         if(zadnji<=prost[i])
               cnt+=part(x-prost[i], prost, prost[i]);
    return cnt;
}
int main(){
    int x, *prost;
    scanf("%d",&x);
    prosti(x,prost);
    printf("%d", part(x,prost,2));
    system("pause");
    free(prost);
    return 0;
}


za svaki broj mi ispiše da ima samo jedan rastav ako nizu zadam duljinu,bez realloca,što će reći da se s reallocom ruši program,a ne razumijem zašto,pa ako može pomoć oko toga i točnosti zadatka?


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


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

PostPostano: 13:18 sri, 14. 4. 2010    Naslov: Citirajte i odgovorite

[code:1]... f(..., tip varijabla,...) {
...
varijabla = ...
...
}[/code:1]

Ovaj kod ne mijenja vrijednost varijable s kojom je stvar pozvana, neovisno o tome je l' tip neki "obicni" (npr. [tt]int[/tt]) ili pointerski (npr. [tt]int *[/tt]). Zato i tvoj [tt]realloc()[/tt] alocira memoriju, ali ne preusmjeri pointer [tt]prost[/tt] iz [tt]main()[/tt]-a na tu novu memoriju.

Nije li lakse u rekurziji staviti [tt]static[/tt] varijable (niz prostih brojeva i njegova duljina) koje ce, po potrebi, produljivati niz i dodavati proste u njega?

Ako to ne znas, onda
[code:1] for(i=0;i<br;i++)
if(zadnji<=prost[i])
cnt+=part(x-prost[i], prost, prost[i]);[/code:1]
zamijeni s
[code:1] for(p = 2; p <= zadnji; ++p)
if (prost(p))
cnt += part(x - p, p);[/code:1]
pri cemu je [tt]prost()[/tt] funkcija koja provjerava je li argument prost broj, a [tt]part()[/tt] prima dva argumenta kao i u vjezbama.

Ovo rjesenje je solidno sporije od onoga sa [tt]static[/tt] nizom, ali je i dalje ispravno.

Usput:
[tt]if(x[bg=red][color=white]=[/color][/bg]2) return 1;[/tt]
:ccc:
Kod:
... f(..., tip varijabla,...) {
  ...
  varijabla = ...
  ...
}


Ovaj kod ne mijenja vrijednost varijable s kojom je stvar pozvana, neovisno o tome je l' tip neki "obicni" (npr. int) ili pointerski (npr. int *). Zato i tvoj realloc() alocira memoriju, ali ne preusmjeri pointer prost iz main()-a na tu novu memoriju.

Nije li lakse u rekurziji staviti static varijable (niz prostih brojeva i njegova duljina) koje ce, po potrebi, produljivati niz i dodavati proste u njega?

Ako to ne znas, onda
Kod:
    for(i=0;i<br;i++)
         if(zadnji<=prost[i])
               cnt+=part(x-prost[i], prost, prost[i]);

zamijeni s
Kod:
    for(p = 2; p <= zadnji; ++p)
         if (prost(p))
               cnt += part(x - p, p);

pri cemu je prost() funkcija koja provjerava je li argument prost broj, a part() prima dva argumenta kao i u vjezbama.

Ovo rjesenje je solidno sporije od onoga sa static nizom, ali je i dalje ispravno.

Usput:
if(x=2) return 1;
Ccc.... Sram te bilo...



_________________
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
pbakic
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 05. 10. 2009. (17:48:30)
Postovi: (143)16
Spol: muško
Sarma = la pohva - posuda
83 = 86 - 3

PostPostano: 13:27 sri, 14. 4. 2010    Naslov: Citirajte i odgovorite

Ah, tak mi i treba kad sporo pisem :D sry na extra postu...


A ima par sitnih gresaka al kad se to sredi onda radi:

1) u funkciji prosto treba stavit dodatni uvjet na pocetku if(i==2) return 1;
jer je 2 prost broj (a u petlji bi bio djeljiv s 2 pa bi ispalo da nije)

2) u funkciju "prosti" unosis niz "prost" i zelis ga vratit promijenjenog (jer koristis realloc => dakle trebalo bi unijeti pokazivac na taj niz:
int *prosti(int x, int **prost)

(onda recimo u toj funkciji odma deklarirat neki pomocni niz tipa
int* pom=*prost; pa dalje baratat s njim)

zato i kad se funkcija "prosti" poziva treba unositi &prost umjesto samo prost

isto za funkciju "prosti", trebalo bi u onoj for petlji ic do x ukljuceno (jer sta ako je x prost? (ovisno dal zelis brojat 7=7 kao prikaz pomocu prostih brojeva))

3) u funkciji part pocetne uvjete treba promijeniti (al ne samo = u == kod x=2), npr za svaki prost broj nece brojat njega samog, itd... zato recimo

if(x==0) return 1;
if(x<zadnji) return 0;

radi dobro
Ah, tak mi i treba kad sporo pisem Very Happy sry na extra postu...


A ima par sitnih gresaka al kad se to sredi onda radi:

1) u funkciji prosto treba stavit dodatni uvjet na pocetku if(i==2) return 1;
jer je 2 prost broj (a u petlji bi bio djeljiv s 2 pa bi ispalo da nije)

2) u funkciju "prosti" unosis niz "prost" i zelis ga vratit promijenjenog (jer koristis realloc => dakle trebalo bi unijeti pokazivac na taj niz:
int *prosti(int x, int **prost)

(onda recimo u toj funkciji odma deklarirat neki pomocni niz tipa
int* pom=*prost; pa dalje baratat s njim)

zato i kad se funkcija "prosti" poziva treba unositi &prost umjesto samo prost

isto za funkciju "prosti", trebalo bi u onoj for petlji ic do x ukljuceno (jer sta ako je x prost? (ovisno dal zelis brojat 7=7 kao prikaz pomocu prostih brojeva))

3) u funkciji part pocetne uvjete treba promijeniti (al ne samo = u == kod x=2), npr za svaki prost broj nece brojat njega samog, itd... zato recimo

if(x==0) return 1;
if(x<zadnji) return 0;

radi dobro


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


Pridružen/a: 11. 09. 2008. (10:54:06)
Postovi: (370)16
Sarma = la pohva - posuda
-29 = 108 - 137
Lokacija: Pula

PostPostano: 13:52 sri, 14. 4. 2010    Naslov: Citirajte i odgovorite

[quote=".anchy."]za svaki broj mi ispiše da ima samo jedan rastav ako nizu zadam duljinu,bez realloca,što će reći da se s reallocom ruši program,a ne razumijem zašto,pa ako može pomoć oko toga i točnosti zadatka?[/quote]
ja neznam cemu ti tako sve to kompliciras, i neda mi se gledat kod(i tako je sego to napravio :) )... al ajmo ovako, zapravo treba samo generalizirat [tt]Zadatak 2.5[/tt] iz skripte

krenimo ovako, napisimo prvo rekurziju koja vraca broj nacina na koji mozemo prirodan broj [tt]n[/tt] zapisat kao sumu prirodnih brojeva, ali [tt]1+2[/tt] tretiramo istim zapisom kao [tt]2+1[/tt]...
odmah sam stavio da se ispisuju svi nacini, ako bas hoces, mozes polje alocirat u mainu...

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

int f(int polje[], int n, int broj, int koji){
int i,cnt=0;
if(broj==0){
for(i=0;i<n;i++)
printf("%d ",polje[i]);
printf("\n");
return 1;
}
for(i=koji;i<=broj;i++){
polje[n]=i;
cnt+=f(polje,n+1,broj-i,i);
}
return cnt;
}

int main(){
int polje[20]={0};
int n=10;
printf("%d\n",f(polje,0,n,1));
system("pause");
return 0;
}[/code:1]

sad moras samo malo nesto promijenit, napisat funkciju koja provjerava jel broj prost, i liniju koda [tt]for(i=koji;i<=broj;i++){[/tt] zamjenit sa
[tt]for(i=koji;i<=broj;i++)[bg=blue][color=white]if(prost(i))[/color][/bg]{[/tt] i time ne da si rjesila zadatak, nego i jos vise :D

[quote="pbakic"]Ah, tak mi i treba kad sporo pisem[/quote]

ja sam ocito jos sporiji
.anchy. (napisa):
za svaki broj mi ispiše da ima samo jedan rastav ako nizu zadam duljinu,bez realloca,što će reći da se s reallocom ruši program,a ne razumijem zašto,pa ako može pomoć oko toga i točnosti zadatka?

ja neznam cemu ti tako sve to kompliciras, i neda mi se gledat kod(i tako je sego to napravio Smile )... al ajmo ovako, zapravo treba samo generalizirat Zadatak 2.5 iz skripte

krenimo ovako, napisimo prvo rekurziju koja vraca broj nacina na koji mozemo prirodan broj n zapisat kao sumu prirodnih brojeva, ali 1+2 tretiramo istim zapisom kao 2+1...
odmah sam stavio da se ispisuju svi nacini, ako bas hoces, mozes polje alocirat u mainu...

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

int f(int polje[], int n, int broj, int koji){
   int i,cnt=0;
   if(broj==0){
      for(i=0;i<n;i++)
         printf("%d ",polje[i]);
      printf("\n");
      return 1;
   }
   for(i=koji;i<=broj;i++){
         polje[n]=i;
         cnt+=f(polje,n+1,broj-i,i);
         }
   return cnt;
}

int main(){
   int polje[20]={0};
   int n=10;
   printf("%d\n",f(polje,0,n,1));
   system("pause");
   return 0;
}


sad moras samo malo nesto promijenit, napisat funkciju koja provjerava jel broj prost, i liniju koda for(i=koji;i⇐broj;i++){ zamjenit sa
for(i=koji;i⇐broj;i++)if(prost(i)){ i time ne da si rjesila zadatak, nego i jos vise Very Happy

pbakic (napisa):
Ah, tak mi i treba kad sporo pisem


ja sam ocito jos sporiji



_________________
Mario Berljafa
[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.
Idite na Prethodno  1, 2
Stranica 2 / 2.

 
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