уторак, 09. јун 2015.

Kako da isprogramirate jednostavan kalkulator u C programskom jeziku?

Pre nego što počnete da programirate kalkulator, neophodno je da se bar delimično upoznate sa tipovima podataka u programskom jeziku C. Tipovi u programskom jeziku C se dele na osnovne i složene. Često složene nazivaju i strukturirane. Osnovni tipovi podataka su celobrojni (int), realni ili sa pokretnim zarezom (float, double), znakovni (char), nabrojivi (enumiration) i prazan tip (void) koji ne sadržava nikakvu vrednost. Razlog zašto ne koristite samo jedan tip podataka je pre svega razlika između njih u broju bit-ova koje zauzimaju prilikom zapisa u memoriju. Iz matematike ste verovatno učili da su brojevi beskonačni, međutim u informatici brojevi su itekako ograničeni pre svega vašim procesorom u računaru a zatim i kad je C programski jezik u pitanju i kompajlerom. Možete imati odličan računar ali ako vam je kompajler zastareo teško da će te moći uneti broj tipa double, broj dvostruke preciznosti; npr. veličine 1.7 * 10^308. Zato samo predpostavljam da će te sa ovim programom jednostavnog kalkulatora moći da izračunavate izuzetno velike brojeve, isto kao što program radi kod mene na 64bit-nom procesoru.

( C – programski jezik )

Druga bitna stvar pored tipova podataka u C programskom jeziku jeste što morate znati i formate za ispis različiti tipova. Npr. u programskom jeziku C# o takvim stvarima i ne razmišljate. Zato ako želite prikazati celi broj na ekranu koristiće te %d za ispis celog broja ili %f za ispis realnog broja. Početnike uglavnom zbunjuje ispis celog broja jer misle da se %d koristi za double tip podataka, dok u stvari %f se koristi i za float i za double tip podataka jer obadvoje spadaju u realan tip podataka.


Naš jednostavan kalkulator će izračunavati samo 4 osnovna aritmetička operatora, +,-,* i / dok se nećemo baviti sa modulo operatorom. S obzirom da kalkulator izračunava brojeve sa pokretnim zarezom, tipom float, smatram da za jednostavnost i za početnike u programskom jeziku C ne treba odmah da komplikujem sa konvertovanjem promenjivih. Oni koji nisu početnici lako mogu dograditi ovaj mali jednostavni program i sa mnogobrojnim matematičkim funkcijama, kako god žele.


( Prikaz jednostavnog programa Simple Calculator u Terminal-u, Ubuntu )

U uvodu u programskom jeziku C, pogledajte ovde; kao što ste videli, komentari se pišu između simbola /* i */ . Ovakav način komentiranja je uobičajan kada hoćete da pišete komentare u više redova. Međutim komentari se mogu pisati i sa simbolima // koji tumače celi red kao komentar. S obzirom da se C programski jezik uglavnom koristi za konzolne aplikacije, praksa je da program započnete komentarima; nazivom programa i vašim imenom.

Uglavnom to izgleda ovako ili slično, pre se navodio i datum kad je kod pisan.

// Simple Calculator example using C code

// from Manuel Radovanovic

// www.manuelradovanovic.com


Posle uvodnih komentara u naš program uvozimo biblioteke, koje nazivamo i datoteke zaglavlja. U datotekama zaglavlja se nalaze određene funkcije koje nam omogućavaju da neke funkcije ne moramo da programiramo već kad nam trebaju mi ih uvezemo. Skoro uvek će te koristiti osnovnu datoteku zaglavlja stdio.h koja vam omogućava pre svega I/O ulaz i izlaz podataka. Ono što treba da znate da su funkcije iz uvezenih datoteka deklarisane i da vi nemate potrebu da ih deklarišete u svom programu, kao što će te raditi kada pravite svoje funkcije, već samo uvozite datoteke u vaš program koje vam trebaju. Za naš kalkulator mi ćemo uvesti 3 datoteke zaglavlja. Tačno je da je dovoljno da uvezemo samo stdio.h i naš kalkulator će raditi, ali ja sam namerno radi vas dodao još dve datoteke zaglavlja, ukoliko budete nameravali da proširujete ovaj kalkulator. Datoteka zaglavlja stdlib.h koja se inače često koristi će vam omogućiti konverziju, pretraživanje, čak i sortiranje podataka dok math.h kao što se može i pretpostaviti ima veliki broj već gotovih matematičkih funkcija.

To u programu izgleda ovako:

#include<stdio.h>

#include<stdlib.h>

#include<math.h>


Zatim dolazi glavna funkcija main() od koje program i počinje da se izvršava. Mi ćemo sav kod za kalkulator kucati u funkciji main(). Svaki C program mora imati funkciju main() i ukoliko pokušate da je obrišete ili preimenujete dobiće te grešku tokom kompajliranja. Ovu funkciju uvek smatrajte obaveznom. Predznak int, ili tačnije deklaracija integer označava da funkcija ima povratnu vrednost tipa integer. U našem programu povratna vrednost je nula. Kad funkcija main vrati 0, program se završava. Obratite pažnju na ovaj deo koda:

int main()

{

         return 0;

}


Počećemo sa deklaracijom promenjivih koje su nam potrebne u programu.

int main()

{

         int operation;

         float number1, number2, result;


Promenjivu celobrojnog tipa intiger, u našem kalkulatoru operation koristimo da korisnik može odabrati koju aritmetičku operaciju želi da uradi ili samo da izađe iz programa. Promenjive tipa float koristimo za izračunavanje i rezultat.

Prvu stvar koju će naš kalkulator da radi je da očisti ekran.

system("clear");

Ova komanda će da radi ako koristite Linux operativni sistem, međutim za korisnike Windows-a,

"clear" zamenite sa "clr".

Posle brisanja ekrana, postavimo jednu labelu, da komandom goto vraćamo izvršavanje programa sve dok korisnik ne odabere neku od ponuđenih opcija. Jednostavno definišemo u našem programu labelu gde želimo da skočimo i nazovemo je kako god hoćemo, npr. jump. Ukoliko stavimo labelu pre brisanja ekrana, nećemo moći videti ispisan rezultat, jer bi tako uvek bio obrisan.

jump:

I naravno posle labele ispisujemo celi menu-i na ekranu kako bi korisnik znao kako da koristi kalkulator.

printf("\n\t--------------- Simple Calculator ---------------\n\n");


printf("\t\t1. Addition\n");

printf("\t\t2. Subtraction\n");

printf("\t\t3. Multiplication\n");

printf("\t\t4. Division\n");

printf("\t\t5. Quit\n\n");


printf("Enter the number you want to do: ");

scanf("%d", &operation);


Kao što vidite u kodu, ispis se vrši komandom printif dok se čitanje ulaza od korisnika koristi komanda scanf. Preciznije obadve komande su funkcije koje se nalaze u našoj stdio.h datoteci zaglavlja, tako ove komande preciznije nazivaju izlazna i ulazna funkcija. Ovde komanda scanf takođe od korisika očekuje da unese celi broj. To je navedeno formatom %d. Simbol & ispred operation je operacija adresiranja. Ona nam daje adresu promenjive koju smo rezervisali u RAM memoriji deklarisanjem promenjive na početku programa.

Da bi smo reagovali na unos korisnika potrebno je da programsku logiku razgranamo kodom. Grananja ili uslovljavanja u programu obavljamo uslovnim operatorom if koja se koristi za izražavanje odluka..

if (operation > 0 && operation < 5)

{

       printf("Enter first number: ");

       scanf("%f", &number1);

       printf("Enter second number: ");

       scanf("%f", &number2);

}

else if (operation == 5)

{

        return 0;

}

else

{

        goto jump;

}


Naredbom if mi uslovljavamo korisnikov unos. Ukoliko korisnik unese ceo broj od 1 do 4, tačnije izabere jednu od 4 aritmetičke operacije, mi ćemo tražiti od korisnika da unese prvi i drugi broj takođe. Imajte u vidu da ovde ne ispitujemo nikakav unos podataka od korisnika, što znači ukoliko korisnik otkuca slovo umesto broja, doći će do greške i program će se srušiti. Takođe ukoliko pokušate da u kalkulatoru delite neki broj sa 0, tada će vam program umesto nekog rezultata i broja ispisati inf, ali se program neće srušiti. Validacija i ispravljanje grešaka u programskom jeziku C je posebna i opširna tema i nije uključena u ovaj jednostavni kalkulator. Ukoliko korisnik otkuca broj 5 izaći će iz našeg programa, dok ukoliko otkuca šta bilo drugo, program će skočiti na labelu jump i ponuditi ponovo korisniku meni i izbor da nastavi sa računanjem ili da izađe iz programa. Da bi to sve funkcionisalo dodaćemo još jednu naredbu, switch.

switch (operation)

{

         case 1: result = number1 + number2;

         break;

         case 2: result = number1 - number2;

         break;

         case 3: result = number1 * number2;

         break;

         case 4: result = number1 / number2;

         break;

         default:

         break;

}


Naredba switch omogućava da odjednom proverite kome neki uslov odgovara. Koristi se uglavnom da zameni situacije u kojima bi ste koristili mnogo if naredbi. Navedena switch naredba prepoznaje uslov koji je korisnik uneo i tada izvršava izabranu aritmetičku operaciju i rezultat dodeljuje promenjivoj result. Ukoliko korisnik nije uneo broj od 1 do 4 program neće ni doći do naredbe switch jer se uslovi if naredbi pre izvršavaju. I na kraju, prikazujemo rezultat i vraćamo se na menu-i skokom na label-u jump.

printf("\n\nResult is: %f \n", result);

goto jump;


Celi kod kalkulatora izgleda ovako.

// Simple Calculator example using C code
// from Manuel Radovanovic
// www.manuelradovanovic.com


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

int main()
{
        int operation;
        float number1, number2, result;
        
         system("clear");

jump:

        printf("\n\t--------------- Simple Calculator ---------------\n\n");

        printf("\t\t1. Addition\n");
        printf("\t\t2. Subtraction\n");
        printf("\t\t3. Multiplication\n");
        printf("\t\t4. Division\n");
        printf("\t\t5. Quit\n\n");

        printf("Enter the number you want to do: ");
        scanf("%d", &operation);

        if (operation > 0 && operation < 5)
        {
                   printf("Enter first number: ");
                   scanf("%f", &number1);
 
                   printf("Enter second number: ");
                   scanf("%f", &number2);
         }
         else if (operation == 5)
         {
                   return 0;
          }
          else
         {
                    goto jump;
         }
         switch (operation)
        {
                  case 1: result = number1 + number2;
                              break;
                  case 2: result = number1 - number2;
                              break;
                  case 3: result = number1 * number2;
                              break;
                  case 4: result = number1 / number2;
                              break;
                  default:
                              break;
           }
            printf("\n\nResult is: %f \n", result);
            goto jump;
}

Kako to sve izgleda možete pogledati i na video-u.




( C - Tutorial - 2. Calculator )