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ć