[ del-boy @ 14.12.2005. 21:03 ] @
Imam jedan problem, koji ne znam kako da rešim!
Čitao sam po forumu, ali nisam našao odgovor.

Meni u stvari treba način na koji mogu da prepoznam kog tipa je unešena brojevna promenljiva!

Npr: Ako uvedem promenljivu realnog tipa (float ili double) i u nju nešto učitam sa tastature, korisnik može da unese i ceo broj, naravno. E sad, kako ja da ispišem tu promenljivu bez decimala ako je ona tako unešena u originalu? Nadam se da znate na šta mislim.

Ako recimo kornik unese 2.15 da mu program to i napiše na ekranu, znači 2.15, a ako korisnik unese 2 da mu i ispiše 2, a ne 2.00!

PS: pomogla bi mi i neka funkcija iz biblioteka, ali više bi mi pomogao kod koji radi ovo, pošto na faxu nismo radili sve biblioteke ( u stvari radili smo ih baš malo)!
[ Ivand @ 14.12.2005. 22:03 ] @
Mozes pri deljenju sa jedan vidis da li je ostatak veci od nule.
Verovatno postoji i pametniji nacin...
[ BigSmallMan @ 14.12.2005. 22:10 ] @
Probaj nesto ovako:
Code:

#include <stdio.h>

int main(void)
{
    float fff;
    int iii;
    
    scanf(" %f", &fff);
    while(fff)
    {
        iii=(int)fff;
        if(iii==fff)
            printf("%d\n", iii);
        else
            printf("%f\n", fff);
        scanf(" %f", &fff);
    }
    return 0;
}
[ del-boy @ 15.12.2005. 00:01 ] @
Citat:
Ivand: Mozes pri deljenju sa jedan vidis da li je ostatak veci od nule.
Verovatno postoji i pametniji nacin...


Ali kako da dobijem ostatak pri deljenju sa 1 kod realnih tipova? Ako na primer broj 2.15 podelim sa 1 dobuću 2.15 i tu je ostatak nula, znači da ovo ne bi radilo!
Citat:
BigSmallMan: Probaj nesto ovako:
Code:

#include <stdio.h>

int main(void)
{
float fff;
int iii;

scanf(" %f", &fff);
while(fff)
{
iii=(int)fff;
if(iii==fff)
printf("%d\n", iii);
else
printf("%f\n", fff);
scanf(" %f", &fff);
}
return 0;
}


OK, ovo mi se već malo više sviđa! Hvala!

Ako neko zna još neko elegantno rešenje, dobrodošlo je naravno...
[ Ivand @ 15.12.2005. 00:54 ] @
Izvinjavam se moja greska kada sam rekao ostatak deljenja , mislio sam na celobrojno deljenje ( % )

Code:

if((f-(f%1))!=0) // ovo nije ceo broj
else // ovo jeste ceo broj 




[ del-boy @ 15.12.2005. 01:36 ] @
Ni ovo ne razumem! Mislim logiku razimem, ali kompajler ne može ni da prevede kod u kome se nalazi ovako nešto. Ne možeš kod realnog broja tražiti ostaak pri deljenju ovako!

Možda da u ovu promenljivu stavim konvertovan relan broj u ceo pa da gledam tu razliku, to je onda ostatak, ali to je u suštini i BigSmallMan-ovo rešenje, samo malo drukčije zapisano!
[ Goranowsky @ 15.12.2005. 18:33 ] @
Momci, to se radi sa template-om.

http://www.cplusplus.com/doc/tutorial/templates.html
[ NrmMyth @ 15.12.2005. 19:10 ] @
Citat:
Goranowsky: Momci, to se radi sa template-om.

http://www.cplusplus.com/doc/tutorial/templates.html

Nece template pomoci da se razazna tip unosa.

Najprvo sta mi pada na pamet je da uneses kao string i provjeris dali u tom string je sadrzana tocka ( '.' ), ako je spremas u float varijablu, ako nije u int...
[ Goran Arandjelovic @ 15.12.2005. 20:57 ] @
Code:

/* NETESTIRANO */
include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
  double p;
  int r;
  cout << "Unesi vrednost: ";
  cin >> p;
  r = (int)p;
  if(r<p){
    cout << "Ovo nije celobrojna vrednost";
  }
  if(r==p){
    cout << "Ovo je celobrojna vrednost";
  }
}


Nadam se da je jasno...
Pozdrav.
[ idb @ 16.12.2005. 09:11 ] @
Sta ces dobiti ako unese negativne vrednosti: -2.2 ili -3?
Mozda je upotreba funcije modf bolje resenje:
Code:

#include <iostream>
#include <cmath>
using namespace std;

bool is_integer(double num, double i){
    if (modf(num, &i)==0) return true;
    else return false;    
}
int main(int argc, char *argv[]){
    double ceo_deo = 0;
    double num[] = {1.12, 2.0, 32, -1.12, -2, -8};
    for (int i=0; i<6;i++){
        if (is_integer(num[i],ceo_deo)) 
            cout <<"num["<<i<<"] = "<<num[i]<< " je ceo broj\n";
        else 
            cout <<"num["<<i<<"] = "<<num[i]<< " nije ceo broj\n";
    }
    system("PAUSE");
    return 0;
}
[ Buffy @ 16.12.2005. 14:56 ] @
mozda bi, kako je vec neko rekao, bilo dobro da se podaci cuvaju u stringu jer tad mozes na jednostavan nacin da saznas da li je ili nije cjel broj, koliko ima cifri iza tacke itd...
Ali vjerovatno bi se gubilo dosta na brzini programa, a i program trosio bi vise memorije.
Pozdrav!

[Ovu poruku je menjao Buffy dana 16.12.2005. u 15:58 GMT+1]
[ NrmMyth @ 16.12.2005. 19:00 ] @
Stvar sa stringom bi i na informatickim natjecanjima prolazila, zasto onda ne iskoristiti??