[ Humanoid @ 26.11.2005. 19:52 ] @
Kolega me zamolio da mu pomognem neke zadatke,ja sam to učinio,a kolega je nakon uploada koda programa na fakultetski server dobio samo 116/300 bodova. Zanimaju me koje su moje najveće greške prilikom pisanja sljedećih programčića:

Zadatak 1.

Napisati program koji će učitati broj članova reda n, a zatim provjeriti je
li n prirodan broj
iz intervala [1, 400]. Ukoliko nije, ispisati poruku "n nije valjan" i
završiti program, a
ukoliko je n valjan, izračunati "pi" pomoću sljedećeg reda:

(PI*PI)/8=1/(1*1)+1/(3*3)+1/(5*5)+...+1/(2*i+1)(2*i+1)+...

Program mora ispisati izračunati broj "pi" zaokružen na 12 decimala.

Code:

 #include<stdio.h>
 #include<math.h>
 int main()
 {
 int n, i;
 float pi, r;
 r=0;
 printf("Upisite broj članova reda:\n");
 scanf("%d",&n);
  if((n<1)||(n>400))
   printf("n nije valjan\n");
  else{
      for(i=0;i<=n;i++){
      r=r+(1.f/((2*i+1)*(2*i+1)));}
      pi=sqrt(8*r);
      printf("pi iznosi %.12f",pi);}
 return 0;
 }

Zadatak 2.

Napisati program koji će učitavati cijele brojeve sve dok se ne unese broj
manji ili jednak 2.
Program treba ispisati najveći prosti broj među učitanim brojevima. Ukoliko
nije učitan niti
jedan prosti broj veći od 2, potrebno je ispisati 0.*/

Code:

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

void main(){
int broj,najveci=0,prost,i;

printf("Upisuj brojeve!\n");
    do
    {
    scanf("%d",&broj);
      if (broj>2){
      prost=1;          
         for (i=2;i<=(int)(ceil(sqrt(broj)));i++){
            if (broj%i==0) {prost=0;break;} 
         } 
        if ((prost) && (broj>najveci)) najveci=broj;          
      }    
      }
    while (broj>2);

printf("Najveći prosti broj je %d\n.\n",najveci);
}


[Ovu poruku je menjao Humanoid dana 27.11.2005. u 18:52 GMT+1]
[ McKracken @ 26.11.2005. 21:58 ] @
Za pocetak je kod potpuno necitljiv. Nazubi ga :)
[ MrLimeni @ 26.11.2005. 23:07 ] @
oces reci
da stavi
[ code ]
[ /code ] tagove
[ Humanoid @ 27.11.2005. 19:34 ] @
Stavljeno.Pretpostavljao sam da svaki programer ima doma barem jedan normalni editor
[ noviKorisnik @ 27.11.2005. 20:28 ] @
Hajde detalj do dva o ovom drugom zadatku...
Code:

    najveci = 2;
    do
    {
    scanf("%d",&broj);
      if (broj > najveci){
      prost=1;          
         for (i=2;i<=(int)(ceil(sqrt(broj)));i++){
            if (broj%i==0) {prost=0;break;} 
         } 
        if (prost) najveci=broj;          
      }    
      }
    while (broj>2);

if (najveci == 2) najveci = 0;

printf("Najveći prosti broj je %d\n.\n",najveci);
[ _owl_ @ 27.11.2005. 23:57 ] @
Sta se desava ako se unesu dva prosta broja od koji je drugi uneti manji od prvog??
Mogao si da napravis funkciju koja proverava da li je broj prost ili ne, koja racuna aproksimaciju za pi (lepo je kada je program dobro struktuiran), i recimo onu koja pamti najveci uneti prost broj.

[ BraMom @ 28.11.2005. 13:23 ] @
Naleteo sam na seriju clanaka koja nasiroko opisuje slican problem, cak su i zadaci slicni (Eratostenovo sito), meni je bilo bas interesantno da citam...

Prvi clanak, tj. najstariji, je poslednji na strani "Opening Disaster", obavezno procitaj bar njega i "Crash Diet".

http://www.sdmagazine.com/columnists/martin/

[Ovu poruku je menjao BraMom dana 28.11.2005. u 14:24 GMT+1]
[ Branimir Maksimovic @ 06.01.2006. 10:48 ] @
"int n, i;
......
scanf("%d",&n); "

scanf ne garantuje da ce varijabla biti inicijalizovana. Vraca broj inicijalizovanih
parametara ili EOF te tako u slucaju pogresnog inputa tvoj program
ima undefined behavior. Koliko vidim to vazi i za drugi primer.

Pozdrav!

RETURN VALUE

Upon successful completion, these functions return the number of successfully matched and assigned input items; this number can be 0 in the event of an early matching failure. If the input ends before the first matching failure or conversion, EOF is returned. If a read error occurs the error indicator for the stream is set, EOF is returned, and errno is set to indicate the error.
[ kime1 @ 07.01.2006. 01:41 ] @
U prvom primeru ne proveravaš da li je n ceo broj,samo da li je u rasponu 0-400,(trebalo bi da ga učitaš kao float pa if (n%1==0) then ok).
[ Branimir Maksimovic @ 08.01.2006. 12:24 ] @
Citat:
kime1: U prvom primeru ne proveravaš da li je n ceo broj,samo da li je u rasponu 0-400,(trebalo bi da ga učitaš kao float pa if (n%1==0) then ok).


Ne moze tako zato sto je % integer operacija, a takodje floating point
se ne mogu porediti na jednakost sa nulom ili bilo cime drugim.
U stvari trebalo bi ovako:

float n;
do
{
fflush(stdin);
printf("unesite broj:\n");
fflush(stdout);
}while(scanf("%f",&n)!=1);
if(fabs(fmod(n,1))<FLT_EPSILON)puts("int");
else puts("float");

napomena : scanf("%d" .... iz originalnog programa ne radi zato sto se recimo 2.4 truncatuje na 2, a za bilo kakav input sto nije broj scanf vraca 0 ili EOF ostavljajuci
n neinicijalizovan.

Pozdrav!
[ kime1 @ 11.01.2006. 23:16 ] @
da,onda bi moglo ((int)n==n) ili nešto slično,sigurno ima već neki šablon...