Pomoć oko zadatka- ProstiBroj.c

poruka: 18
|
čitano: 5.947
|
moderatori: XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
10 godina
neaktivan
offline
Pomoć oko zadatka- ProstiBroj.c

Molim pomoć oko ovog zadatka.

Kada unesem broj 1 program mi ispiše: Broj 1 JEST prost broj.  

 

Kako rješiti ovaj zadatak a da prilikom unesenog broja 1 program ispiše:  Broj 1 NIJE prost broj.    ?

 

 

 

 

/*
Zadatak: Upitati korisnika pozitivan cijeli broj i ispitati je li on prost
(broj je prost ako je djeljiv samo sa 1 i sa samim sobom;
broj 1 po definiciji nije prost).
*/

#include <stdio.h>

int main(void) {

int i, broj, pola;

/* upitujemo korisnika za unos pozitivnog cijelog broja
* dokle god on to ne ucini */
do {
printf("Unesite pozitivan cijeli broj: ");
scanf("%d", &broj);
} while (broj <= 0);

/* pokusamo podijeliti broj sa svim brojevima od 2 do broj/2
* (dalje od toga nema potrebe racunati) */
pola = broj / 2;
for(i = 2; i <= pola; i = i + 1) {
/* ako je broj djeljiv sa bilo kojim i-em tada nije prost,
te stoga ispisemo tu informaciju i izidjemo iz programa */
if (broj % i == 0) {
printf("Broj %d NIJE prost broj.\n", broj);
return 1;
}
}

/* ako smo zavrsili petlju bez izlaska iz programa,
* znaci da niti jedno djeljenje nije uspjelo i da je
* broj prost broj */
printf("Broj %d JEST prost broj.\n", broj);

return 0;

}

 

 

 

Moj PC  
0 0 hvala 0
10 godina
neaktivan
offline
Re: Pomoć oko zadatka- ProstiBroj.c

Pokušala sam i ovako ali ne funkcionira 

 

if (broj % i == 0 || broj == 1) //u IF petlju sam dodala ili ako je broj jednak 1 ispiši sljedeće
{
printf("Broj %d NIJE prost broj.\n", broj);
return 1;
}    

 

 

A ako u DO petlju dodam ili dok je broj jednak jedan ispisuje unesite cijeli pozitivan broj što mi opet ne koristi jer 1 je cijeli i pozitivan broj

 

do {
printf("Unesite pozitivan cijeli broj: ");
scanf("%d", &broj);
} while (broj <= 0 || broj == 1);

 

Mogu li onda napraviti neku novu petlju koja bi funkcionirala a da za 1 na kraju ispisuje da nije prosti broj??

12 godina
neaktivan
offline
Re: Pomoć oko zadatka- ProstiBroj.c

Par opaski:

 

i) broj 1 nije prost ali nije ni slozen, sto nedostaje tvojoj definiciji. To izmedju ostalog potjece i iz definicije da se prosti brojevi definiraju kao n@N\{1}.

ii) Ne znam zasto posebno kompliciras, kad to mozes rijesiti jednim dodatnim if-om ispod do-while petlje.

if (broj == 1) {
printf("Broj %d NIJE ni prost ni slozeni broj.\n", broj);
return 0; //ili sto vec kanis vratiti
}

iii) dodaj math.h knjiznicu i ustedi na racunu:

pola = ceil(sqrt(broj));

Dovoljno je, za ovakav tip provjere, gledati uvjet djeljivosti do korijena trazenog broja, kod nas specijalno za for petlju, najmanje cijelo.

 

HTH!

http://www.pci-z.com/
10 godina
neaktivan
offline
Re: Pomoć oko zadatka- ProstiBroj.c

#include <stdio.h>
#include <math.h>

int main(void) {

int i, broj, pola;

/* upitujemo korisnika za unos pozitivnog cijelog broja
* dokle god on to ne ucini */
do {
printf("Unesite pozitivan cijeli broj: ");
scanf("%d", &broj);
} while (broj <= 0 );


/* pokusamo podijeliti broj sa svim brojevima od 2 do broj/2
* (dalje od toga nema potrebe racunati) */
pola = ceil(sqrt(broj));
for(i = 2; i <= pola; i = i + 1) {
/* ako je broj djeljiv sa bilo kojim i-em tada nije prost,
te stoga ispisemo tu informaciju i izidjemo iz programa */
if (broj == 1) {                           //dodala sam if petlju ali ne znam gdje ju trebam dodati da to i radi
printf("Broj %d NIJE ni prost ni slozeni broj.\n", broj);
return 0; //ili sto vec kanis vratiti
}

if (broj % i == 0) {
printf("Broj %d NIJE prost broj.\n", broj);
return 1;
}
}

/* ako smo zavrsili petlju bez izlaska iz programa,
* znaci da niti jedno djeljenje nije uspjelo i da je
* broj prost broj */
printf("Broj %d JEST prost broj.\n", broj);

return 0;

}

 

 

 

Sa ovim gornjim kodom je ispis i dalje : Broj 1 JEST prost broj. 

 

Molim te reci mi gdje bi trebala ići ova tvoja if petlja kako bi to radilo i kako bi ispis bio: Broj 1 NIJE ni prost ni slozeni broj.  ? 

 

Što znači HTH? 

Poruka je uređivana zadnji put pon 7.9.2015 16:39 (Evi).
12 godina
neaktivan
offline
Re: Pomoć oko zadatka- ProstiBroj.c
Evi kaže...

Sa ovim gornjim kodom je ispis i dalje : Broj 1 JEST prost broj. 

 

Molim te reci mi gdje bi trebala ići ova tvoja if petlja kako bi to radilo i kako bi ispis bio: Broj 1 NIJE ni prost ni slozeni broj.  ? 

 

Što znači HTH? 

Pa napisao sam ti - odmah ispod do-while dijela. :)

 

http://www.pohrani.com/f/3c/tw/2pQM5q5B/1.png

 

Naravno, mozes dodati else ispod tog if-a pa sloziti neku drugu programsku logiku izlaska iz programa, ali ne znam koliko ti je to bitno.

 

BTW, u toj istoj petlji slobodno napisi "unesite prirodni broj"; u tvom konkretnom slucaju je nebitno za sam zadatak, ali je matematicki ispravno.

 

HTH - hope that helps (nadam se da je pomoglo) ;)

http://www.pci-z.com/
17 godina
offline
Re: Pomoć oko zadatka- ProstiBroj.c
Evi kaže...

#include <stdio.h>
#include <math.h>

int main(void) {

int i, broj, pola;


do {
printf("Unesite pozitivan cijeli broj: ");
scanf("%d", &broj);
} while (broj <= 0 );


pola = ceil(sqrt(broj));
for(i = 2; i <= pola; i = i + 1) {
if (broj == 1) {                         
printf("Broj %d NIJE ni prost ni slozeni broj.\n", broj);
return 0;
}

if (broj % i == 0) {
printf("Broj %d NIJE prost broj.\n", broj);
return 1;
}
}


printf("Broj %d JEST prost broj.\n", broj);

return 0;

}

 

 

 

Sa ovim gornjim kodom je ispis i dalje : Broj 1 JEST prost broj. 

 

Molim te reci mi gdje bi trebala ići ova tvoja if petlja kako bi to radilo i kako bi ispis bio: Broj 1 NIJE ni prost ni slozeni broj.  ? 

 

Što znači HTH? 

 Nije ni čudo da se ovdje ne možeš snaći, toliko si stavila komentara (nepotrebnih) da se od šume ne vidi drvo. Ne trebaš valjda u programu nekog podsjećati definiciju prostog broja. Komentari moraju biti kratki ukoliko ih uopće staviš, a stavljati ih treba isključivo u svrhu pojašnjenja konkretnog koda, a općenito ih treba izbjegavati. Isto tako izbjegavaj i ta objašnjenja kod unosa broja tipa "unesi broj", to u žargonu zovemo kićenje programa. Prijeđi na algoritamski način rada, što u praksi izgleda ovako na primjeru ovog zadatka:

Ovako zadaš zadatak i navedeš primjere inputa i outputa

Unesi cijeli broj x>0 i ispitaj da li je x prim broj

input  output

1          nije prim

3          prim

10        nije prim

 

A sad kad je program očišćen od nepotrebnih stvari i imamo preglednost, vidljivo je i zašto ne radi kako si zamislila. Provjeru za broj 1 si stavila u petlju koja se pokreće tek kad je broj 4 i veći, pošto brojač petlje i kreće od 2 a zaustavlja se na kvadratnom korijenu broja kojeg uneseš. Dakle, poslušaj kolegu koji ti je preporučio neke knjige koliko sam vidio, da bi petlju primjenila moraš znati kako petlja radi, odnosno teoriju, a tako i za sve druge stvari.

 

Već sam ti rekao da se okaneš nasilnog prekidanja programa prije njegovog kraja i primjeniš logiku if else if grananja. Ako na početku usvojiš krivi koncept, teško ćeš ga se kasnije riješiti. To što radiš je špageti kod, već odavno napušten i zamjenjen if else if grananjem (ajde, umjesto goto naredbe ti si "uspješno" primjenila return da bi skakala preko linija koda i dobila špageti kod).

 

Ovako razmišljaj kod ovog programa:

1. provjeru za sve brojeve veće od 3 vršiš u petlji odmah nakon unosa broja

2. nakon provjere u petlji izvrši ispis, a ne vršiš ispis u petlji

3. u tom ispisu moraš pokriti i brojeve 1, 2, 3 koje petlja ne provjerava.

4. da bi izvršila ispis na kraju programa moraš uvesti jednu int varijablu koja će pratiti provjeru broja u petlji i na osnovu čije vrijednosti vršimo ispis

 

// int jeliPrim = 1 (polaziš od pretpostavke da je broj prim)

// unos

// petlja (ako nije prim u petlji varijabla jeliPrim = 0)

// ispis (ako je jeliPrim = 0 ILI broj = 1 ispišeš nije prim else prim)

 

Kao što vidiš, ono što si napisala if(broj%i || broj == 1) nije bilo za baciti, što je pohvalno (da ne ispadne da samo kritiziram)

 

Inače na forumu ima poseban thread za jezik C, pa ubuduće piši ovdje

http://www.bug.hr/forum/topic/programiranje/programiranje-c-svega-pomalo/60641.aspx

 

 

Poruka je uređivana zadnji put uto 8.9.2015 12:36 (Floki).
10 godina
neaktivan
offline
Re: Pomoć oko zadatka- ProstiBroj.c

Odlično Bruno! Nisam vidjela vjerojatno da ide ispod do while, pardon.
E pa to je to, sad radi, pomoglo je. 

10 godina
neaktivan
offline
Re: Pomoć oko zadatka- ProstiBroj.c

Hvala Floki na trudu, ali iskreno puno mi je lakše kad mi netko kaže rješenje i objasni nego kad mi da samo objašnjenje bez rješenja i kad moram kemijati da dođem do rješenja jer ionako je ovo preteško za mene i osjećam se baš mutavo pored vas ovdje koji se kužite u to ali mi je to zadnji ispit i moram ga položiti. 

Ok, makar mi se ovdje više sviđa, pokušat ću pisati pod programiranje-c-svega-po-malo iako mi je smiješan taj naziv-svega po malo, bojim valjda se da ne naiđem na svega po malo. :) hehehe šala mala. 

12 godina
neaktivan
offline
Re: Pomoć oko zadatka- ProstiBroj.c
Evi kaže...

Odlično Bruno! Nisam vidjela vjerojatno da ide ispod do while, pardon.
E pa to je to, sad radi, pomoglo je. 

Bitno da je pomoglo. ;)

 

Iako, uz odredjene ograde, kao sto ti je receno, pokusaj shvatiti sto tvoj kod predstavlja i kako se ponasa. Ovo su zaista trivijalni zadatci i nekakva osnovna "logika" visih programskih jezika se mora shvatiti.

 

Nema nista intrinsicno lose u "goto spageti kodu", kako je nazvan. Na kraju krajeva, deplasirano ga je usporedjivati s if/else/do/while kombinacijama kada ce ionako svaki kompajler tvoju do-while petlju prevesti u nesto tipa:

 

MOV rax, $broj

l1:

//mađija

CMP rax, 0x00

JLE l1

//nastavak programa

 

Ono sto je bitno jest da postujes neka "pravila struke", jer ces neiskustvom pridonjeti jako losem, necitljivom i na kraju, vrlo vjerojatno nefunkcionalnom ili totalno neispravnom kodu. Zato je bitno da pazis kako ces izvesti grananje i uvjetovanje, kako bi dobro uhvatila koncept baratanja osnovnom programskom logikom. Ovakvi zadatci su, kao sto mozes vidjeti, dusu dali za takvo sto.

Pokusaj sama napraviti varijaciju na nacin da upisujes broj dok god je prirodan, i definiras ova tri kriterija (jedinica, prost ili slozen).

http://www.pci-z.com/
10 godina
neaktivan
offline
Re: Pomoć oko zadatka- ProstiBroj.c

Može, e sad da su barem komentari tu da ja to skužim. Ima li toga u knjigama? Što znači MOV, $broj? Kaj je mađija i zašto je u komentaru? l1:?  CMP?  0x00 - ovo je neki heksadecimalni zapis broja 64? Što je JLE? 
Probati ću sutra rješiti tu varijaciju i posudit knjigu C++ za apsolutne početnike pa možda budem bolja. Rado bih sad rješila, hehe ali po jutru se dan pozna. :) LN.

12 godina
neaktivan
offline
Re: Pomoć oko zadatka- ProstiBroj.c
Evi kaže...

Može, e sad da su barem komentari tu da ja to skužim. Ima li toga u knjigama? Što znači MOV, $broj? Kaj je mađija i zašto je u komentaru? l1:?  CMP?  0x00 - ovo je neki heksadecimalni zapis broja 64? Što je JLE? 
Probati ću sutra rješiti tu varijaciju i posudit knjigu C++ za apsolutne početnike pa možda budem bolja. Rado bih sad rješila, hehe ali po jutru se dan pozna. :) LN.

Ono je bio moj generalni komentar na Flokijevu opasku, nemoj to previse uzimati k srcu. :D

 

Kakav te sad C++ spopao? :) Ono sto tebi treba je da shvatis kako ces napraviti pseudokod, i kada to napravis kvalitetno i logicki, onda je tako svejedno u kojem programskom jeziku ces ga nakucati...

http://www.pci-z.com/
17 godina
offline
Pomoć oko zadatka- ProstiBroj.c

Ma da, najprije ona dođe sa dva prekida koda (i to oba u petlji) za dva rješenja i onda valjda ti se učinilo premalo, pa joj ti savjetovao još jedan prekid za treće rješenje, kojeg ona nije stavila na pravo mjesto, da bi se onda razmrsilo da može i drukčije. I onda kao nije špageta.

 

Rekao sam joj što sam imao, ispis izvršiti na kraju i to izvan petlje, uz uvođenje zasebne kontrolne varijable, a ako joj se ne da "kemijati" kako kaže, e pa, njen problem a ne moj. Baš zato sam i išao sa zasebnom kontrolnom varijablom jer je lako za napraviti i shvatiti logiku programa. Inače, ne treba ni zasebna kontrolna varijabla, jer imamo brojač petlje.

 

Treću granu if else if da pokrije 1 kao poseban slučaj nije teško staviti kod ispisa, dvojim da treba, zadatak jasno kaže, test na prim, jest ili nije.

 

#include<stdio.h>


int main()
{
   int broj, i;
   scanf_s("%d", &broj);
   for (i = 2; i * i <= broj && broj%i; i++);
   if (i * i > broj && broj != 1)
      printf("Prim!\n");
   else
      printf("Nije prim!\n");
   return 0;
}

Poruka je uređivana zadnji put sri 9.9.2015 15:29 (Floki).
 
0 0 hvala 0
10 godina
neaktivan
offline
Re: Pomoć oko zadatka- ProstiBroj.c

Joj dragi Floki u životu postoje puno veći problemi od ovih rješenja, npr. zdravlje , npr. financije i slično i zato nećemo raditi od muhe slona.
Da mi se kemijati ali baš i nisam sposobna za to kemijanje jer ne kužim to i zato mi dobro dođe kad mi netko otkrije rješenje, a ne kad mi otežava.  Da, priznajem ne znam i ne kužim logiku programa , možda nikad neću ni skužiti i možda nisam za to ali se barem trudim. Zato mi je jasnije kad mi netko olakša i otkrije rješenje. 
scanf_s nije u C99 i ja koristim zasad samo scanf(). 

 

Nije dobro puno toga pisati ukoliko publika to ne shvaća. Pametnije je napisati malo ali jasno. 

17 godina
offline
Re: Pomoć oko zadatka- ProstiBroj.c
Evi kaže...

Joj dragi Floki u životu postoje puno veći problemi od ovih rješenja, npr. zdravlje , npr. financije i slično i zato nećemo raditi od muhe slona.
Da mi se kemijati ali baš i nisam sposobna za to kemijanje jer ne kužim to i zato mi dobro dođe kad mi netko otkrije rješenje, a ne kad mi otežava.  Da, priznajem ne znam i ne kužim logiku programa , možda nikad neću ni skužiti i možda nisam za to ali se barem trudim. Zato mi je jasnije kad mi netko olakša i otkrije rješenje. 
scanf_s nije u C99 i ja koristim zasad samo scanf(). 

 

Nije dobro puno toga pisati ukoliko publika to ne shvaća. Pametnije je napisati malo ali jasno. 

 Takva su ti pravila foruma, gotova rješenja se ne daju, nego upute, iznimka se može napraviti, i napravi se ali ne baš često, ali iznimka ne postaje pravilo.

10 godina
neaktivan
offline
Re: Pomoć oko zadatka- ProstiBroj.c

Bruno nešto sam pokušala ali mi nije točno, joj    kad ću ja to skužit...

/*
Zadatak: neka korisnik unosi neke brojeve sve dok ne unese 0
Program treba ispisati za svaki broj da li je složen , jedinica ili prost (broj je prost ako je djeljiv samo sa 1 i sa samim sobom;
broj 1 po definiciji nije prost).
*/

#include<stdio.h>
#include<math.h>
int main(void) {

int broj;


printf("Unesite proizvoljan niz brojeva (Enter poslije svakog broja,a za kraj unesite 0):\n");

do {

scanf(" %d", &broj);

if (broj > 1 && broj !=1 ) {
printf("Broj je slozen\n");}
else if (broj % broj == 0 && broj % 1 == 0 && broj !=1){
printf("Broj je prost\n");}
else if (broj == 1){
printf("Broj je jedinica\n");}
}
while (broj != 0);


}

 

 

 

10 godina
neaktivan
offline
Re: Pomoć oko zadatka- ProstiBroj.c

    

10 godina
neaktivan
offline
Re: Pomoć oko zadatka- ProstiBroj.c

PA JA SAM ZBUNJOLA, HEHE OVO JE U BITI VRLO JEDNOSTAVNO. KUŽIM. 

 

/*Zadatak: neka korisnik unosi neke brojeve sve dok ne unese 0. Program treba ispisati za svaki broj da li je složen - prost ili jedinica (broj je prost ako je djeljiv samo sa 1 i sa samim sobom;
broj 1 po definiciji nije prost).
*/

#include<stdio.h>
#include<math.h>
int main(void) {

int broj;


printf("Unesite proizvoljan niz brojeva (Enter poslije svakog broja,a za kraj unesite 0):\n");

do {

scanf(" %d", &broj);

if (broj > 1 && broj !=1 && broj % broj == 0 && broj % 1 == 0 && broj !=1 ) {
printf("Broj je slozen\nBroj je prost\n");}
else if (broj == 1){
printf("Broj je jedinica\n");}
}
while (broj != 0);


}

 

12 godina
neaktivan
offline
Re: Pomoć oko zadatka- ProstiBroj.c
Evi kaže...

PA JA SAM ZBUNJOLA, HEHE OVO JE U BITI VRLO JEDNOSTAVNO. KUŽIM. 

Ovo i bez kompajliranja vidis da ne radi kako bi trebalo, ali nije tesko za ispraviti, na dobrom si putu. :)

http://www.pci-z.com/
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice