Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

if propusta nedozvoljene vrednosti

[es] :: C/C++ programiranje :: C/C++ za početnike :: if propusta nedozvoljene vrednosti

[ Pregleda: 4138 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

VirtualPoP
VirtualPoP

Član broj: 87655
Poruke: 123
194.106.187.*



+24 Profil

icon if propusta nedozvoljene vrednosti02.05.2008. u 22:13 - pre 193 meseci
Pravim program za proracun izvodljivosti grupe zupcanika. Cilj je da ukoliko proracun pokaze da je greska manja od 10 podaci sa tekucim vrednostima upisuju se u fajl. Problem je u tome sto mi uslov
Code:
if(greska<10) 

propusta i vrednosti gde je greska=10. Probao sam da castujem gresku u int pa i da eksplicitno postavim preduslov
Code:
if(greska!=10)
(nema smisla al' sam probao) ali nista ne pomaze.
Code:

#include<stdio.h>
//#include<math.h>
#define pi 3.14159265
#define min 14
#define max 30
#define nUlaz 1400
int main()
{
   register int za1,za2,zg1,zg2;
   int nIzlaz=0,linija,nNovi=1;
   double wu,wi,ir,ip,greska;
   FILE *tekstFajl;
   tekstFajl=fopen("zupcanik.rtf","w");
   if(!tekstFajl)
   {
      printf("Greska! Nemoguce je kreirati izlazni fajl.");
      printf("\nPritisni ENTER za izlaz iz programa.");
      getchar();
      return 0;
   }
   wu=float(pi*nUlaz/30);
   printf("Proracun u toku (Moze da potraje minut i duze) ...");
   while(++nIzlaz<=1000)
   {
      if(nNovi)
      {
         fprintf(tekstFajl,"\n\n|  za1 |  za2  |  zg1  |  zg2  |    ip    |    ir    |    Wizl  |greska (%%)| Nizlazno|\n");
         for(linija=0;linija<43;linija++)
            fprintf(tekstFajl,"--");
         fprintf(tekstFajl,"\n");
         nNovi=0;
      }
      wi=(float)(pi*nIzlaz/30);
      ip=wu/wi;
      for(za1=min;za1<=max;za1++)
         for(za2=min;za2<=max;za2++)
            for(zg1=min;zg1<=max;zg1++)
               for(zg2=min;zg2<=max;zg2++)
                  {                     
                  ir=(float)(4*(za1+zg1)*(zg2+za2))/(float)(za1*za2);
                  greska=(ir/ip-1)*100;
                  greska=(greska<0)?-greska:greska;
                     if(greska<10)
                  //if(fabs((ir/ip-1)*100)<10)
                     {
                        nNovi++;
                        fprintf(tekstFajl,"|  %d  |  %d  |  %d   |   %d   |%8.2f  |%8.2f  |%7.2f   |%7.2f   |    %d    |\n",za1,za2,zg1,zg2,ip,ir,wi,greska,nIzlaz);
                     }
                  }
   }
   fclose(tekstFajl);
   return 0;
 
Odgovor na temu

StefanJer91
Stefan Jeremic
Beograd

Član broj: 121923
Poruke: 160
*.static.ikomline.net.



Profil

icon Re: if propusta nedozvoljene vrednosti02.05.2008. u 22:50 - pre 193 meseci
Citat:

propusta i vrednosti gde je greska=10. Probao sam da castujem gresku u int pa i da eksplicitno postavim preduslov


Nisam citao ceo kod, ali ako sam te dobro razumeo tebi trebaju vrednosti manje od 10 ukljucujuci i 10. Ako je tako onda umesto '<' koristi '<='.
The earth teaches us more about ourselves than all the books. Because it resists us. Man discovers himself when he measures himself against the obstacle.
 
Odgovor na temu

_Mrgud_
Uros Todorovic
Novi Beograd

Član broj: 129681
Poruke: 21
*.vektor.net.



Profil

icon Re: if propusta nedozvoljene vrednosti02.05.2008. u 23:22 - pre 193 meseci
A da umesto kastovanja pokusas sa

Code:
if(greska < 10.0)
 
Odgovor na temu

VirtualPoP
VirtualPoP

Član broj: 87655
Poruke: 123
194.106.187.*



+24 Profil

icon Re: if propusta nedozvoljene vrednosti03.05.2008. u 13:51 - pre 193 meseci
@stefan Ne. Meni trebaju vrednosti manje od 10, znaci greska<10.
@mrgud probao sam i to, neces mi verovati sta sam sve probao(vec nekoliko dana se zezam sa ovim)... Mada je cast i g<10.0 bio potez iz ocaja jer koliko znam double ima visi prioritet od int(mada je 10 literal nisam siguran kako se literal tretira?) pa bi 10 trebalo pri poredjenju da bude konvertovano u 10.0000000000...
 
Odgovor na temu

StefanJer91
Stefan Jeremic
Beograd

Član broj: 121923
Poruke: 160
*.static.ikomline.net.



Profil

icon Re: if propusta nedozvoljene vrednosti03.05.2008. u 15:05 - pre 193 meseci
Cek, ako si rekao da propusta vrednosti koje su 10 onda znaci da ti treba i 10 :) Ne razumem bas u cemu je problem. Btw, zasto ne stavis da ti ispise gresku u konzoli pre nego sto je zapise u fajl kako bi mogao lakse da vidis sta se desava?
The earth teaches us more about ourselves than all the books. Because it resists us. Man discovers himself when he measures himself against the obstacle.
 
Odgovor na temu

VirtualPoP
VirtualPoP

Član broj: 87655
Poruke: 123
194.106.187.*



+24 Profil

icon Re: if propusta nedozvoljene vrednosti07.05.2008. u 12:49 - pre 193 meseci
Pa u tome i jeste problem sto propusta vrednost 10 a uslov je greska<10 .....
Nemoguce da niko nije imao slican problem?
 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: if propusta nedozvoljene vrednosti07.05.2008. u 16:11 - pre 193 meseci
Pokušaj if (ceil(greska) < 10.00)...
 
Odgovor na temu

VirtualPoP
VirtualPoP

Član broj: 87655
Poruke: 123
194.106.187.*



+24 Profil

icon Re: if propusta nedozvoljene vrednosti08.05.2008. u 23:25 - pre 193 meseci
Ovo resava problem ali samo prividno. Prakticno kao da sam postavio uslov greska<=9
Moguce da veliki broj castova pravi problem... progacu sve vrednosti koje ucestvuju da deklarisem kao double, zamenim for sa while pa ce valjda da radi kako Bog miluje :/
Tek sad vidim koliko sam los kod napisao, ocajan je...
 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: if propusta nedozvoljene vrednosti09.05.2008. u 09:41 - pre 193 meseci
> Ovo resava problem ali samo prividno. Prakticno kao da sam postavio uslov greska<=9

Da tebi treba, if (ceil(greska) <= 10.00)...

Kod tebe je verovatno problem što je greska 9,9999999999... što bude manje od 10, ali kada se prikaže bude 10.
Sa ceil možeš rešiti, naime ceil(9.993) je 10, a ceil(10.0001) je 11 tako da će sve ono manje od 10 dati 10 ili manje od 10 i taj uslov možeš tražiti.
 
Odgovor na temu

mulaz
Ljubljana

Član broj: 47602
Poruke: 2239
*.dial-up.dsl.siol.net.

Jabber: mulaz@elitesecurity.org
Sajt: www.mulaz.org


+184 Profil

icon Re: if propusta nedozvoljene vrednosti09.05.2008. u 10:49 - pre 193 meseci
ili da umesto ceil() upotrebis floor() pa onda mozes da gledas dali je manje od 10
Bolje ispasti glup nego iz aviona
http://www.mulaz.org/
 
Odgovor na temu

VirtualPoP
VirtualPoP

Član broj: 87655
Poruke: 123
194.106.187.*



+24 Profil

icon Re: if propusta nedozvoljene vrednosti12.05.2008. u 20:46 - pre 193 meseci
malo sam pogledao ceil()&floor() a i probao oni ne resavaju problem jer ceil(9.01) zaokruzi na 10... Svejedno hvala svima na pomoci. Uradicu program od nule (kad se nakanim(vec sam ga prodao(neki traljavi diplomski(prosao je i sa greskom :)))) pa cu ga okaciti ako nekom zatreba.... Sad shvacam zasto gurui govore tako ostro protiv casta, siguran sam da je to problem.
 
Odgovor na temu

VirtualPoP
VirtualPoP

Član broj: 87655
Poruke: 123
194.106.187.*



+24 Profil

icon Re: if propusta nedozvoljene vrednosti12.05.2008. u 21:50 - pre 193 meseci
@savkic e covece sad tek kapiram skroz si u pravu... kad postavim konverziju %f7.2 broj se zaokruzuje na 2 decimale pa je 9.9999999999 ispisano kao 10.00.... znaci kad je argument %.16f sve je ok. Super si hvala.
Malo je samo ruzno kad mi ispise broj od 17 cifara.
Ako neko zna koja funkcija krati (ne zaokruzuje) broj na zeljeni broj decimala?
 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: if propusta nedozvoljene vrednosti13.05.2008. u 10:57 - pre 193 meseci
> Malo je samo ruzno kad mi ispise broj od 17 cifara.
> Ako neko zna koja funkcija krati (ne zaokruzuje) broj na zeljeni broj decimala?

Ne znam da li postoji takva gotova funkcija, možeš sledeće (pretpostavka je da se žele samo dva decimalna mesta):

1) Napraviš posebnu funkciju za konverziju broja u text, prvo se koristi sprintf sa %.16f i onda od rezultata prvo nađeš gde je decimalni separator potom, odbrojiš željeni broj decimala u desno i tu presečeš i takav string vratiš.

2) Ako se traže dve decimale, pomnožiš broj sa 100, uradiš floor i podeliš sa 100. Npr. 9,99999999999999 * 100; floor(999,9999999999999); 999 / 100 = 9,99
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: if propusta nedozvoljene vrednosti

[ Pregleda: 4138 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.