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

Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float

[es] :: C/C++ programiranje :: C/C++ za početnike :: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float

Strane: 1 2

[ Pregleda: 7982 | Odgovora: 20 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nikolas_bg
Beograd

Član broj: 156367
Poruke: 45
91.150.113.*



+2 Profil

icon Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float27.11.2007. u 13:28 - pre 200 meseci
Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float ?
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
212.200.234.*

ICQ: 208550327


+14 Profil

icon Re: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float27.11.2007. u 15:35 - pre 200 meseci
Verovatno postoji analogija sa matematikom. Nikada neces traziti ostatak kada radis sa realnim brojevima...

5.2 % 2 ( da li je ovo paran broj posto je deo posle zareza paran.... - nije, jer se parni i neparni brojevi uvek definisu kao celi )..

Isto vazi i za sve ostale 'probe deljivosti'...

Verovatno ti je ovo potrebno za neki slozeniji problem? ( posle svakog 10.tog broja stampati a oni su float.... npr... probaj onda sa cast-ovanjem u int )
EOF
 
Odgovor na temu

Nikolas_bg
Beograd

Član broj: 156367
Poruke: 45
91.150.113.*



+2 Profil

icon Re: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float27.11.2007. u 15:47 - pre 200 meseci
Nije u pitanju neki komplikovan zadatak , samo sam hteo da rastavim neki trocifren broj N na stotine , desetice i jedinice.Kada sam promenljive definisao kao int sve je radilo , ali kao float ne funkcionise , pa me interesuje da li postoji neko resenje , zadatak izgleda ovako...
Code:

#include <stdio.h>
main ()
{
     int n,b1,b2,b3,x;
     printf ("Unesite trocifren broj ");
     scanf ("%d",&n);
     if (n<100 || n>999)
        printf("Nepravilan unos!!!");
     b1=n/100;
     b2=n%100/10;
     b3=n%10;
     printf ("Sabiranjem cifara dobije se broj %d",x=b1+b2+b3);
}
 
Odgovor na temu

Black3maj
Beograd

Član broj: 113924
Poruke: 59
*.adsl.beotel.net.



Profil

icon Re: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float27.11.2007. u 18:51 - pre 200 meseci
Zasto uopste pokusavas da stavis broj kao float?
Int su celi brojevi,a float realni,mozda te to buni sta je sta.
Tvoj problem u principu trazi int broj,ako ti je u tekstu zadatka naglaseno da on bude float,a kaze da se brojevi posle decimalne tacke ignorisu onda mozes da koristis cast operator
za tvoj slucaj
Code:

float a;

int b;

scanf("%f",&a);

b=(int)a; //mozes i da pises b=a;


Pretvaranje realnog broja u celi broj c realizuje kao odsecanje svega posle decimalne tacke tj. broj 12.162 posle konverzije bice 12 i broj 12.9999 ce isto biti 12 odnosno ne zaokrugljuje brojeve.
 
Odgovor na temu

Nikolas_bg
Beograd

Član broj: 156367
Poruke: 45
91.150.113.*



+2 Profil

icon Re: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float27.11.2007. u 20:06 - pre 200 meseci
Citat:
Nikada neces traziti ostatak kada radis sa realnim brojevima

Zasto ne bih ?
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float27.11.2007. u 20:24 - pre 200 meseci
Jednostavno, operator % nije definisan za realne brojeve u C-u. Da koristiš neke druge jezike, mogao bi da ga isprogramiraš i koristiš. U međuvremenu, radi konverziju u int pre traženja ostatka.
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
212.200.234.*

ICQ: 208550327


+14 Profil

icon Re: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float28.11.2007. u 00:08 - pre 200 meseci
Zasto ne bi???

Well, ako se secas matematike u osnovnoj pa i srednjoj skoli, mnoge operacije se rade samo nad skupom celih brojeva... Tako da, razmisljaj o ovome kao o aksiomi... Jednostavno, ima li smisla da realan broj ima ostatak, mozda ima, moze se implementirati, ali to nece resiti tvoj problem, jer, realni brojevi nemaju ostatak, jednostavno se zaokruzuju ako broj cifara posle zareza premasi neku brojku ( 10 / 3 = 3.33333333333333333333333333333333333333334 ).


EOF
 
Odgovor na temu

Nikolas_bg
Beograd

Član broj: 156367
Poruke: 45
91.150.113.*



+2 Profil

icon Re: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float28.11.2007. u 11:55 - pre 200 meseci
Ok,s'vatio sam.
 
Odgovor na temu

Nemanja.Ciric
web dizajner/programer, Niteoweb
Novi Sad/Subotica

Član broj: 163398
Poruke: 63
*.ns.ac.yu.

Jabber: serj.cobain@gmail.com


Profil

icon Re: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float28.11.2007. u 15:51 - pre 200 meseci
Nisi, jer si dobio pogrešno obrazloženje :).

Ako definišemo celobrojno deljenje kao deljenje čiji rezultat mora biti ceo broj, i dopustimo da (samim tim što smo fiksirali samo tip rezultata) operacija ne bude zatvorena, takva operacija bi imala domen jednak celom polju Kompleksnih brojeva! (i šire, ali zadržimo se na jednostavnijem primeru :)). Dakle, koliko je 5+2i / 2? Odgovor je 2+i. Koliki je ostatak? Odgovor: 1. Celobrojno deljenje kao takvo može da se vrši i nad dva realna broja. 6.25/2.5 je 2, pri čemu je ostatak 6.25-(2.5*2)=1.25. To što se u osnovnoj (pa i u srednjoj) školi učilo je restrikcija funkcije celobrojnog deljenja na skup celih brojeva.

Odgovor na tvoje pitanje je da je upravo ta restrikcija operacije celobrojnog deljenja definisana operatorom % u C i C++ dakle operacija % je operacija koja deli dva cela broja i vraća ostatak pri deljenju, i nije definisana za realne brojeve. Ako baš hoćeš da koristiš tu operaciju, možeš da preklopiš taj operator za realne brojeve, što ti toplo preporučujem kao dobru vežbu
NĆirić
 
Odgovor na temu

Nikolas_bg
Beograd

Član broj: 156367
Poruke: 45
91.150.113.*



+2 Profil

icon Re: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float28.11.2007. u 16:34 - pre 200 meseci
Citat:
Nisi, jer si dobio pogrešno obrazloženje :).

Poenta prethodnog post-a je da ukaze da sam shvatio :) ,ali u svakom slucaju ,hvala na trudu !
 
Odgovor na temu

bandigarf
student
Novi Sad

Član broj: 164436
Poruke: 2
*.adsl.beotel.net.



Profil

icon Re: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float28.11.2007. u 17:24 - pre 200 meseci
Nemanja, vidi se da si učio matematiku na tehničkom fakultetu, objašnjenje ti je sasvim na mestu, ali preklapanje operatora nije rešenje jer se očigledno radi o C programu gde tako nešto ne postoji. Evo jedna funkcija koja to radi (sa negativnim brojevima najverovatnije neće dati tačne rezultate):

Code:

float mod(float a, float b) {
    return (a - b * ((int) (a/b)));
}


Moglo bi i nekom for ili while petljom unutar koje se od a oduzima b i čim takvo novo a postane manje od b, to je onda ostatak pri deljenju.

Nikolas, ako umesto a%b varijanti u svoj primer ubaciš mod(a,b) možeš dobiti veoma zanimljive rezultate. Npr. zbir cifara broja 123 je 6,53 pošto broj sadrži 1,23 stotina, 2,3 desetice i 3 jedinice.

Kao što su neki već rekli, za ovakav zadatak nema potrebe da proglašavaš promenljive kao float. Ili postoji neki razlog koji nam nisi rekao zašto ti baš trebaju brojevi u pokretnom zarezu? Možda imaš neki prikladniji primer?
 
Odgovor na temu

Nemanja.Ciric
web dizajner/programer, Niteoweb
Novi Sad/Subotica

Član broj: 163398
Poruke: 63
*.ns.ac.yu.

Jabber: serj.cobain@gmail.com


Profil

icon Re: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float28.11.2007. u 18:14 - pre 200 meseci
Citat:
preklapanje operatora nije rešenje jer se očigledno radi o C programu gde tako nešto ne postoji.

očigledno :) moja greška.

Možda bi želeo da objasniš i osatlima po čemu se vidi da sam matematiku učio na teh. faksu, čisto da se neko ne uvredi :)
NĆirić
 
Odgovor na temu

icobh
Igor Pejašinović
Network Admin
Navigo SC d.o.o.
Banja Luka

Član broj: 18738
Poruke: 1319
*.inecco.net.

Sajt: www.nsc.ba


+4 Profil

icon Re: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float28.11.2007. u 18:21 - pre 200 meseci
Evo, ja se bavim programiranjem tih školskih primjera, uvijek nešto i nekome treba, kao i meni, pa eto...

Ja ne mogu da razumijem šta neko može očekivati nešto kao ostatak dijeljenja 3.4 sa 2!? Koliko ja znam, to je 1.7! Nikad, i ponavljam, nikad mi nije postavljen problem sa ovakvim nečim... Stvarno nema smisla...

Čuj ostatak pri dijeljenju 2 realna broja...
I ♥ ♀

Ovaj post je zlata vrijedan!
 
Odgovor na temu

Nikolas_bg
Beograd

Član broj: 156367
Poruke: 45
91.150.113.*



+2 Profil

icon Re: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float28.11.2007. u 18:50 - pre 200 meseci
Evo sta sam ja hteo da uradim...

Kada promenljive deklarisem kao integer ,onda deljenjem 5 sa 2 dobijem ostatak 1 ,a da bi koristio broj koji nije ceo (neki realan broj) npr.5.4 ,deklarisao sam ga kao float ,medjutim zaboravio sam da cu onda dobiti resenje bez ostatka 2.7 .
Ono sto mene zanima je kako da pri deljenju 5.4 sa 2 dobijem ostatak 1.4.Ako je ovo uopste moguce.
 
Odgovor na temu

Black3maj
Beograd

Član broj: 113924
Poruke: 59
*.adsl.beotel.net.



Profil

icon Re: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float28.11.2007. u 20:10 - pre 200 meseci
sam operator za tako nesto u c-u ne postoji naravno ti mozes da napravis f-ju koja radi to
npr u ovom programu ucitas float pa int i on odradi ono sto ti trazis
Code:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a;
    float b,c;
    scanf("%f",&b);
    scanf("%d",&a);   
    c=b;
    if(a>0)
    {
        while(1)
        {
           if((c-a)>=0)
              c=c-a;
           else
              break;       
        }
        printf("%f\n",c);
    }
    system("PAUSE");
    return 0;
}
}


 
Odgovor na temu

McKracken
Vladimir Jovanovic
HuxleyDev

Član broj: 465
Poruke: 2941
79.101.134.*

ICQ: 203079925


+7 Profil

icon Re: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float28.11.2007. u 20:35 - pre 200 meseci
Citat:
Ono sto mene zanima je kako da pri deljenju 5.4 sa 2 dobijem ostatak 1.4.Ako je ovo uopste moguce.


@nikolas:

Ti ocigledno ne trazis deljenje :)

Bolje pogledaj floor() i ceil() funkcije.
 
Odgovor na temu

icobh
Igor Pejašinović
Network Admin
Navigo SC d.o.o.
Banja Luka

Član broj: 18738
Poruke: 1319
*.inecco.net.

Sajt: www.nsc.ba


+4 Profil

icon Re: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float28.11.2007. u 21:58 - pre 200 meseci
Znači podijeliš 2 broja. Kastuješ dobijeni rezultat u int. Pomnožiš sa brojem kojim si dijelio onaj prvi*, i onda onaj prvi broj koji si dijelio umanjiš za ovaj *proizvod.

Znači:
5.4 / 2 = 2.7;
(int) 2.7 = 2;
2 * 2 = 4;
5.4 - 4 = 1.4;

Naravno, može korištenjem nekih f-ja ali efekat je isti...
I ♥ ♀

Ovaj post je zlata vrijedan!
 
Odgovor na temu

Nikolas_bg
Beograd

Član broj: 156367
Poruke: 45
91.150.113.*



+2 Profil

icon Re: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float28.11.2007. u 22:25 - pre 200 meseci
Evo ,odradio sam ovako...
Code:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int c;
    float a,b,o;
    printf("Unesite prvi broj:");
    scanf("%f",&a);
    printf("Unesite drugi broj:");
    scanf("%f",&b);
    c=a/b;
    o=a-(c*b);
    printf("Ostatak je %.2f\n",o);
    system("PAUSE");
    return 0;
}

 
Odgovor na temu

Nemanja.Ciric
web dizajner/programer, Niteoweb
Novi Sad/Subotica

Član broj: 163398
Poruke: 63
*.dynamic.sbb.co.yu.

Jabber: serj.cobain@gmail.com


Profil

icon Re: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float29.11.2007. u 00:43 - pre 200 meseci
U stratu se izvinjavam na dugom odgovoru, ali poenta cele stvari je da ljudi ponesu neko znanje iz nje. Odgovoram dvojici i u tom cilju ću krajnje detaljno da objasnim šta mi je na umu, jer nisam siguran u njihovo znanje (matematike i programiranja). Ne zamerite, imam najbolje namere :).



Nikolas, dobro si odradio, ali evo ti malog saveta. Modularnost je jedna filozofija programiranja koja ide u paru sa Reusability (izvinjavam se, ne znam dobar prevod na srpski, ako neko zna bio bih zahvalan jer tu i tamo koristim tu reč, voleo bih da znam srpsku varijantu). Ideja Reusability-ja je da kada jednom napišeš neku funkciju ili deo koda, nikada više ne moraš ponovo da ga pišeš, već samo ponovo iskoristiš. To se postiže modularnošću (koja je pored toga potrebna da bi greške bile izolovane, i da bi lakše mogao da rešiš problem - tako što ćeš ga razbiti na sitne delove koje ćeš jedan po jedan rešavati u zasebnim delovima programa, koji se zovu moduli). Ono što ja tebi predlažem je da napraviš jedan takav modul, funkciju koja vraća ostatak pri celobrojnom deljenju koji neće biti program za sebe, već modul koji možeš da koristiš kasnije u raznim podprogramima. U tvojoj realizaciji ti ne možeš da taj kod kao takav iskoristiš u početnom problemu (nalaženju stotina, desetica i jedinica u trocifrenom broju) - morao bi da uradiš copy/paste postojećeg programa u program koji radi sa trocifrenim brojevima i da ga tamo menjaš i tako svaki put kada ti potreba ova operacija.

Kako se postiže modularnost? Evo ovako: napišeš ovaj program kao jednu funkciju, sa ulaznim i izlaznim parametrima odgovarajućih tipova i sačuvaš to u jednom fajlu koji može ma kako da se zove, ali je konvencija da ima .h ekstenziju. To bi izgledalo ovako (kopirao sam tvoj kod, to jest deo njega, samo sam ga prilagodio tome da bude funkcija):

Code:

#include <stdio.h>
#include <stdlib.h>

float ostatak(float a, float b){
  int c;
  float o;

  c=a/b;
  o=a-(c*b);
  return o;
}

int intOstatak (float a, float b){
  return (int) ostatak(a,b);
}



Operaciju intOstatak sam dodao na kraju čisto da bih imao i operaciju ostatak čiji je rezultat ceo broj (dakle celobrojni ostatak je u istom odnosu sa ostatkom, kao celobrojno deljenje sa deljenjem) koja ti treba u tvom zadatku. Jedini mali problemčić sa tvojim rešenjem (koje si pisao kao ceo program sa main() ) je što kao rezultat daje realan broj, a tebi treba ceo (jer (redovan) ostatak pri celobrojnom deljenju brojeva je realan broj i onda 123%10 bude 3). Tvoj zadatak bi sada rešio ovako:

Code:

#include <ostatak.h> // tako bi nazvao prethodni fajl

void main(){
     int n,b1,b2,b3,x;
     printf ("Unesite trocifren broj ");
     scanf ("%d",&n);
     if (n<100 || n>999){
         printf("Nepravilan unos!!!");
     } else { // ubacio sam else jer bi u suprotnom
         b1=n/100;
         b2=intOstatak(n,100)/10;
         b3=intOstatak(n,10);
         printf ("Sabiranjem cifara dobije se broj %d",x=b1+b2+b3);
     };
}



Citat:
icobh: Evo, ja se bavim programiranjem tih školskih primjera, uvijek nešto i nekome treba, kao i meni, pa eto...

Ja ne mogu da razumijem šta neko može očekivati nešto kao ostatak dijeljenja 3.4 sa 2!? Koliko ja znam, to je 1.7! Nikad, i ponavljam, nikad mi nije postavljen problem sa ovakvim nečim... Stvarno nema smisla...

Čuj ostatak pri dijeljenju 2 realna broja...


Koliki je ostatak pri deljenju 5 sa 2? Jedan, jel tako? [sarkazam]Otkud to? ČUJ, OSTATAK PRI DELJENJU 2 CELA BROJA? GDE TO IMA? Kakav crni ostatak, kada je 5 podeljeno sa 2 jedanko 2.5???[/sarkazam]

Sledi poduže matematičko (valjda korektno, trudio sam se) objašnjenje zašto ostatak i te kako postoji pri deljenju dva realna broja. Ima siže na samom kraju (zadnji pasus) koga mrzi da čita.

Nije reč o deljenju već o CELOBROJNOM DELJENJU! Deljenju, čiji je rezultat ceo broj. Koristi se pri rešavanju raznih (najčešće kompjuterskih, ali ima ga recimo i u deljenju polinoma) zadataka od osnovne škole pa na svim nivoima. I zašto je onda tebi tako teško da zamisliš celobrojno deljenje dva realna broja? Zato što ne vidiš čemu to služi? Zato što te tome nisu učili u školi?

Ajd da pokušam malo drugačije. Deljenje samo po sebi nije zatvorena operacija. Operacija je zatvorena kada je rezultat iz istog skupa kao operandi. Ako posmatraš restrikciju deljenja na skup celih brojeva (restrikcija operacije je kada domen smanjiš - deljenje je definisano i za skup kompleksnih brojeva, čiji je podskup skup realnih brojeva, čiji je podskup skup racionalnih brojeva, čiji je podskup skup celih brojeva, dakle ako posmatraš deljenje samo celih brojeva, u pitanju je restrikcija opšte operacije deljenja na skup celih brojeva). Deljenje celih brojeva nije zatvorana operacija jer možeš da dobiješ rezultat koji nije ceo broj, dakle rezultat koji izlazi iz okvira skupa nad kojim je operacija (to jest restrikcija operacije) definisana.

Zašto postoji celobrojno deljenje? Zato što je to zatvorena operacija (definisano je kao deljenje čiji je rezultat ceo broj, i ako posmatraš deljenje ograničeno na skup celih brojeva dobijaš zatvorenu operaciju). Zašto bismo hteli zatvorenu operaciju? Iz više razloga koji se svi svode na to da nam jednostavno ponekad treba rezultat koji je istog tipa kao operandi: zato što deca u nižim razredima ne znaju realne brojeve; zato što je programski jezik koji koristimo ograničen; zato što rezultat želimo da koristimo kao ceo broj u daljem rešavanju problema (kao u ovom slučaju).

U tom svetlu, uvodi se pojam OSTATKA pri CELOBROJNOM deljenju. Ostatak pri deljenju ne postoji, isto kao što ni ostatak pri deljenju celih brojeva ne postoji, jer je kodomen (skup svih mogućih rezultata operacije) deljenja ceo skup kompleksnih brojeva (ako govorimo o Kompleksnom prostoru ili bilo kom njegovom pod-prostoru), što znači da je rezultat jednoznačno definisan i da nema potrebe za ostatkom. Pet podeljeno sa dva je 2,5. NEMA OSTATKA.

Dakle ostatak postoji SAMO pri CELOBROJNOM DELJENJU - deljenju čiji je rezultat ceo broj. Kod operacije celobrojnog deljenja domen (skup svih mogućih operanada) je isti kao kod deljenja (najopštijeg klasičnog) ceo skup kompleksnih brojeva. Parnjak operaciji celobrojnog deljenja je opercija ostatak pri celobrojnom deljenju, koji omogućava kombinovanje tako da se dobije bijektivna funkcija (bijektivna je svaka funkcija čija se ni jedna dva elementa domena ne preslikavaju u isti kodomen - kada celobrojno podeliš 5 sa 2 i 4 sa 2 dobiješ isti rezultat - 2, treba ti ostatak jer se onda par 5 i 2 operacijom celobrojnog deljenja preslikava u broj 2, sa ostatkom 1 a par 4 i 2 preslikava isto na 2, ali sa ostatkom nula). Bijektivnost je veoma važna osobina funkcija, omogućava "rekonstrukciju" operanada na osnovu rezultata - definisanje inverzne funkcije.

Citat:
Suma sumarum, ostatak pri deljenju ne postoji, jer rezultat najopštije operacije deljenja (definisane nad skupom brojeva) može biti realan broj, te je bilo koji ceo broj podeljen drugim celim brojem u suštini realan broj i tu nema govora o ostatku. Kod operacije CELOBROJNOG DELJENJA - deljenja čiji se rezultat zaokružuje na dole, na ceo broj, ostatak je definisan. No, kod celobrojnog deljenja domen može da bude širi od skupa celih brojeva, npr skup realnih ili kompleksnih brojeva.


[Ovu poruku je menjao Nemanja.Ciric dana 29.11.2007. u 02:46 GMT+1]



ceil() i floor() su zaokruživanje realnih brojeva na gore i na dole na cele, nemaju veze sa onim što čovek traži :)

[Ovu poruku je menjao Nemanja.Ciric dana 29.11.2007. u 03:14 GMT+1]
NĆirić
 
Odgovor na temu

McKracken
Vladimir Jovanovic
HuxleyDev

Član broj: 465
Poruke: 2941
212.200.201.*

ICQ: 203079925


+7 Profil

icon Re: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float30.11.2007. u 00:34 - pre 200 meseci
Procitaj jos jednom neku od definicija celobrojnog deljenja realnih brojeva. Mislim da ces biti sokiran da primetis da se celobrojno deljenje definise kao floor((a/b)); kad su a i b realni brojevi.

[Ovu poruku je menjao McKracken dana 30.11.2007. u 01:50 GMT+1]
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Zasto ne mogu da koristim operaciju % kada promenljive deklarisem kao float

Strane: 1 2

[ Pregleda: 7982 | Odgovora: 20 ] > FB > Twit

Postavi temu Odgovori

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