ماشین حساب به زبان c - زیگورات
سفارش تبلیغ
صبا ویژن

زیگورات

 

فرستاده تو میزان خرد تو را رساند و نامه‏ات رساتر چیزى است که از سوى تو سخن راند . [نهج البلاغه]

 
 

مدیریت| ایمیل من

| خانه

پایین

?زمانی

دوشنبه 87/8/6  ساعت 2:20 عصر

ماشین حساب به زبان c

 

#include <conio.h>
#include <string.h>
#include <mem.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>

#define ENCOK_SAYI (10 + 1)
#define FMT         "%c %11s"

#define ENCOK_HESMAK 13

typedef enum islembit_t { IB_BASLAT, IB_ISLEM, IB_HATA };

islembit_t islembit;
char girilen_sayi[ ENCOK_SAYI ];
char isaret;
double sayi;
char basilan;
int baslangic_x;
int baslangic_y;

char *hesmak_str[ ] = {
"+---------------+",
"|               |",
"|===============|",
"| [7]  [8]  [9] |",
"| [4]  [5]  [6] |",
"| [1]  [2]  [3] |",
"| [0] [   =   ] |",
"| [%] [K] [1/x] |",
"|---------------+",
"| K = Karekok   |",
"| X = 1/x       |",
"| Q = Cikis     |",
"+---------------+"
};


void sondan_sil(char *);
void hata(void);
void dgs_ekran(double);
double ogn_ekran(void);
void baslat(void);
void goruntule(void);
void isaret_ekle(char);
void hesmak_ciz(void);

void makina_islet(char);
void makina_baslat(void);

void main(void) {

   clrscr();

   baslangic_x = 10;
   baslangic_y = 5;

   hesmak_ciz();

   makina_baslat();

   char ch;

   while (1) {

      ch = getch();

      if ((ch >= "a") && (ch <= "z")) ch -= " ";

      if (ch == "Q") break;

      makina_islet(ch);

   }

}

void sondan_sil(char *s) {

   s[ strlen(s) - 1 ] = NULL;

}

void hata(void) {

   islembit = IB_HATA;

   strcpy(girilen_sayi, "HATA");

   isaret = " ";

}

void dgs_ekran(double R) {

   char s[ 80 ] = { 0 };
   int l;

   gcvt(R, ENCOK_SAYI, s);

   if (s[ strlen(s) ] == ".") sondan_sil(s);

   if (s[ 0 ] == "-") {

      l = strlen(s);

      movmem(s + 1, s, l);
      s[ l ] = NULL;

      isaret = "-";

   } else

      isaret = " ";

   if (strlen(s) > 10 + 15 + 1)
      hata();
   else {
      while (s[ strlen(s) ] == "0") sondan_sil(s);

      if (s[ strlen(s) ] == ".") sondan_sil(s);

      l = strlen(s);
      if (l > ENCOK_SAYI) l = ENCOK_SAYI;

      s[ l ] = NULL;

      strcpy(girilen_sayi, s);
   }

}


double ogn_ekran(void) {

   char s[ ENCOK_SAYI ] = { 0, 0 };

   if (isaret == "-") s[ 0 ] = isaret;

   strcpy(&s[ strlen(s) ], girilen_sayi);

   return atof(s);

}

void baslat(void) {

   if (islembit == IB_BASLAT) {

      islembit = IB_ISLEM;

      strcpy(girilen_sayi, "0");

      isaret = " ";

   }

}

void goruntule(void) {

   gotoxy(baslangic_x + 2, baslangic_y + 1);
   printf(FMT, isaret, girilen_sayi);

}

void isaret_ekle(char ch) {
   int l = strlen(girilen_sayi);

   girilen_sayi[ l ] = ch;
   girilen_sayi[ (l + 1) ] = NULL;
}

void hesmak_ciz(void) {

   for (int i = 0; i < ENCOK_HESMAK; i++) {
      gotoxy(baslangic_x, baslangic_y + i);
      printf("%s", hesmak_str[ i ]);
   }

}

void makina_islet(char isr) {

   double R;

   if ((islembit == IB_HATA) && (isr != "C")) isr = 0;

   if ((isr >= "0") && (isr <= "9")) {

      baslat();

      if (strcmp(girilen_sayi, "0") == 0) girilen_sayi[ 0 ] = NULL;

      if (strlen(girilen_sayi) < ENCOK_SAYI) isaret_ekle(isr);

   } else if ((isr == ".") || (isr == ",")) {

      baslat();

      if (strrchr(girilen_sayi, ".") == NULL) isaret_ekle(isr);

   } else if ((isr == 8) || (isr == 27)) {

      baslat();

      if (strlen(girilen_sayi) == 1)
girilen_sayi[ 0 ] = "0";
      else
sondan_sil(girilen_sayi);

   } else if (isr == "_") {

      isaret = (isaret == " ")?("-"):(" ");

   } else if ((isr == "+") || (isr == "-") || (isr == "*") || (isr == "/") || (isr == "=") || (isr == "%") || (isr == 13)) {

      if (islembit == IB_ISLEM) {

islembit = IB_BASLAT;

R = ogn_ekran();

if (isr == "%")
    if ((basilan == "+") || (basilan == "-"))
       R = sayi * R / 100.0;
    else if ((basilan == "*") || (basilan == "/"))
       R = R / 100.0;

if (basilan == "+")
    dgs_ekran(sayi + R);
else if (basilan == "-")
    dgs_ekran(sayi - R);
else if (basilan == "*")
    dgs_ekran(sayi * R);
else if (basilan == "/")
    if (R == 0.0)
       hata( );
    else
       dgs_ekran(sayi / R);

      }

      basilan = isr;

      if (islembit != IB_HATA) sayi = ogn_ekran();

   } else if (isr == "C")

      makina_baslat();

   else if (isr == "K") {

      sayi = ogn_ekran();
      dgs_ekran(sqrt(sayi));

   } else if (isr == "X") {

      sayi = ogn_ekran();
      dgs_ekran(1.0 / sayi);

   }

   goruntule();

}

void makina_baslat(void) {

   strcpy(girilen_sayi, "0");

   goruntule();

   isaret = " ";
   basilan = 0;
   sayi = 0.0;

   islembit = IB_BASLAT;

}


نظر شما( )

لیست کل یادداشت های این وبلاگ

آرگ
نی زن
[عناوین آرشیوشده]

بالا

  [ خانه| مدیریت| ایمیل من| پارسی بلاگ| شناسنامه ]

بازدید

169149

بازدید امروز

550

بازدید دیروز

47


 RSS 


 درباره خودم


 لوگوی وبلاگ

زیگورات

 اوقات شرعی

 فهرست موضوعی یادداشت ها

 آرشیو

مهرماه 87
آبان ماه 87

لوگوی دوستان


اشتراک