[ ena_m @ 25.11.2009. 20:46 ] @
problem je sljedeci: ako imam decimalan broj 1,23456789 i hocu da ga pretvorim u razlomak, ali da prije toga "odsjecem" cifre iza seste cifre iza decimalnog zareza(znaci dobijem decimalni broj1,234567) tj. trebam dobiti ovo: 1234567/1000000. moze li mi iko pomoci?
[ Goran Arandjelovic @ 26.11.2009. 02:54 ] @
A gde tačno imaš problem?
[ Mihajlo Cvetanović @ 26.11.2009. 07:18 ] @
floor(x * 1E6 + 0.5) / 1E6

Ovo +0.5 služi da bi se zokruživalo na bližu celu vrednost, a bez njega bi se zaokruživalo na manju. Ovo rešenje važi za pozitivne brojeve.
[ ena_m @ 26.11.2009. 18:31 ] @
pa ne funkcionise mi bas ovo: floor(x * 1E6 + 0.5) / 1E6; problem tacno imam u funkciji doubleUrazlomak koja treba da uzme decimalni broj pretvori ga u razlomak i vrati rjesenje, a ne znam kako to da postignem
[ Goran Arandjelovic @ 26.11.2009. 19:13 ] @
Citat:
ena_m: pa ne funkcionise mi bas ovo: floor(x * 1E6 + 0.5) / 1E6; problem tacno imam u funkciji doubleUrazlomak koja treba da uzme decimalni broj pretvori ga u razlomak i vrati rjesenje, a ne znam kako to da postignem


(int)floor(x * 1E6 + 0.5) je brojilac, a 1E6 imenilac.
[ Mihajlo Cvetanović @ 26.11.2009. 21:32 ] @
Nema dovoljno informacija da bismo mogli da ti pomognemo. Da ne bi nagađali šta i kako može da ne valja bolje je da ti ovde staviš spornu funkciju, ili sporni deo koda, kao i ulazne podatke, očekivane izlazne podatke, i izlazne podatke koje zapravo dobiješ.
[ ena_m @ 27.11.2009. 12:30 ] @
Code:

double mojRazlomak :: doubleUrazlomak(double dec)
         {

               int i,b;
               int n=10;
               int a[10];
               int decimals=0;
               double dec = 4.64789;
               int x=int (dec);
               a[1]=x;
               cout <<"a[1]="<< x <<endl<<endl;
               cout << dec<<endl<<endl;
               double ostatak = dec - int(dec);
               double temp=ostatak;
               do
               {                  
                      for(i=2; i<n; i++)
                      {
                               temp = temp-int(temp);
                               temp=temp*10;
                               decimals++;
                               cout<<temp<<"\n";
                               int x=int(temp);
                              
                               a[i]=x;
                               cout<<"a["<<i<<"] = "<<a[i]<<endl<<endl; 

                      }

               }
               while(temp>1);
               
               for(i=1; i<n; i++)
                        
                        cout<<a[i];
    
               b=a[i]/1000000;
               return b;                            
    
         }

evo taj dio koda, ja sam to pokusala uraditi ovako, i dobila sam taj trazeni decimalni broj bez decimala kao niza a[ i ], sada je samo problem sastavit taj niz a[ i ] da pretstavlja jedan broj i da ga prikazem kao razlomak tj da mi ispise 464789/1000000. mislim da problem predstavljaju zadnje dvije linije koda jer mi ispisuje razlomak 0/1, a moguce je i da nisam dobro uradila poziv fje u main programu jer me zbunjuju pozivi fja koje su u izvedenim klasama.evo kako sam pozvala tu fju:

Code:

    mojRazlomak razlomak;             //mojRazlomak mi je izvedena klasa, a Razlomak je osnovna klasa (problem nije u fji ispis, jer savrseno radi u ostalim fjama)
    Razlomak raz12;
    raz12=razlomak.mojRazlomak::doubleUrazlomak(4.64789)/1000000;
    raz12.ispis();



EDIT X Files :: Sanjam noću CODE tagove.




[Ovu poruku je menjao X Files dana 27.11.2009. u 13:42 GMT+1]
[ Nedeljko @ 27.11.2009. 12:39 ] @
int brojilac = round(dec*1e6);
int imenilac = 1e6;
[ Mihajlo Cvetanović @ 27.11.2009. 13:26 ] @
Ti želiš da imaš funkciju koja ima double kao ulaz a Razlomak kao izlaz. I da se od ulaznog broja uzimaju samo cifre do šeste decimale.

Ako je to tačno onda:
1. Funkcija mora da vraća Razlomak, a ne double
2. Promenljiva b (koja je povratna vrednost funkcije) mora da bude Razlomak, a ne int
3. Ta promenljiva b (koja je Razlomak) valjda ima dve članice, brojnik i nazivnik. brojnik treba da dobije vrednost floor(dec*1000000), a nazivnik treba da dobije vrednost 1000000.

I to je to, nema neke velike mudrosti. Funkcija mora da bude statička, i poziva se sa raz12=mojRazlomak::doubleUrazlomak(4.64789). Evo rešenja:

Code:
class mojRazlomak : public Razlomak
{
public:
  static Razlomak doubleUrazlomak(double dec);
  ...
};

Razlomak mojRazlomak::doubleUrazlomak(double dec)
{
  Razlomak b(floor(dec*1000000), 1000000); // pretpostavljam da postoji ovakav konstruktor

  // ako ne postoji kostruktor kao gore onda treba nekako ovako
  b.brojnik = floor(dec*1000000);
  b.nazivnik = 1000000;

  return b;
}
[ ena_m @ 28.11.2009. 19:44 ] @
uradila sam tako ali mi sada javlja gresku da mi konvertuje double u int (sto meni u biti i treba).evo taj dio sto sam ubacila


Razlomak b(floor(dec*1000000), 1000000); // ako stavim konstruktor kaze mi ovako: In static member function `static Razlomak mojRazlomak::doubleUrazlomak(double)': [Warning] passing `double' for converting 1 of `Razlomak::Razlomak(int, int)'

Razlomak b;
int br, naz;
br = floor(dec*1000000); //a ako stavim bez konstruktora kaze mi ovo: [Warning] converting to `int' from `double' i ja vlja mi gresku u ovoj liniji
naz = 1000000;

return b;
[ Mihajlo Cvetanović @ 29.11.2009. 00:56 ] @
Promaklo mi je da su imenilac i sadržalac celi brojevi. Pa dobro, dodaj (int) pre floor(dec*1000000), tako da bude (int)floor(dec*1000000). Time ćeš ućutkati kompajler.

Primećujem da ne razumeš neke stvari. U drugom delu koda (koji je višak, al nema veze) imamo promenljivu b koja je tipa Razlomak, a onda nešto petljaš sa dve promenljive tipa int koje se zovu br i naz, a onda pozivaš return b. Koja je svrha tog return b, kad se nigde nije postavio na neku vrednost? Male su vajde od toga što ćeš dobiti od nas rešenje, ako se ne udubiš malo u celo to programiranje.