#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;
}
|