#include /* Funktioiden atoi ja atof määrittelyt löytyvät kirjastotiedostosta stdlib.h. */ #include /* Funktio round_n pyöristää luvun n ylöspäin lähimpään luvun k monikertaan, * ja antaa palautusarvonaan tämän pyöristetyn luvun. */ int round_int(int n,int k); /* Funktio round_double pyöristää luvun x pyöristyssääntöjen mukaan (0.5 pyöristetään * ylöspäin) lähimpään y:n monikertaan. */ double round_double(double x,double y); /* Oletetaan, että ensimmäinen argumentti on kokonaisluku * ja toinen argumentti double-tyyppinen. */ int main(int argc, char *argv[]) { int n; double x; /* Funktio atoi ("alphabet to integer") muuttaa merkkijonon kokonaisluvuksi. * Huom. Merkkijonon täytyy siis koostua pelkistä luvuista (ja loppumerkistä), * esim. char luku[3]={'1','2','\0'}; */ n = atoi(argv[1]); /* Funktio atof ("alphabet to float") muuttaa merkkijonon reaaliluvuksi. */ x = atof(argv[2]); printf("The arguments are %i and %g.\n",n,x); /* Pyöristetään. */ n = round_int(n,20); x = round_double(x,0.01); printf("Rounded: %i and %g.\n",n,x); } /* On olemassa myös funktiot, jotka muuttavat luvun merkkijonoksi: * itoa ja ftoa. */ int round_int(int n, int k) { /* Käydään läpi lukuja n,n+1,... kunnes tulee vastaan ensimmäinen * 20:llä jaollinen. */ int i; for(i=n; i%20!=0; i++) ; /* Toistettavat lauseet (ei siis tehdä mitään). */ /* Nyt i on jaollinen 20:llä. */ return i; } double round_double(double x, double y) { /* Osamäärän x/y kokonaisosa kertoo, kuinka monta kokonaista kertaa luku y * sisältyy lukuun x. Huom. Tyyppimuunnos siis vain pudottaa desimaaliosan * pois, eli käytännössä pyöristää alaspäin. */ int q = (int)(x/y); double z; /* Pyöristyskandidaatit ovat siis q*y ja (q+1)*y. Lasketaan, kumpi * näistä on lähempänä lukua x, ja palautetaan se (jos ne ovat yhtä lähellä, * pyöristetään ylöspäin, eli palautetaan (q+1)*y). */ if(x-q*y < (q+1)*y-x) { z = q*y; } else { z = (q+1)*y; } return z; }