當前位置:編程學習大全網 - 編程語言 - 如何用C語言制作壹個簡單的計算器?

如何用C語言制作壹個簡單的計算器?

//簡單的計算器,包括加減乘除。

#包括

#包括

#include // malloc()等。

#include // INT_MAX等

# include//eof (= z或F6),NULL。

#include // atoi()

#include // eof()

#包括//地板()、天花板()、abs()

#包含//退出()

#包括//CIN cout

//函數結果狀態代碼

#定義真1

#定義假0

#定義OK 1

#定義錯誤0

#定義不可行-1

// #define OVERFLOW -2因為OVERFLOW的值在math.h中已經定義為3,所以刪除了這壹行。

typedef int狀態;// Status是函數的類型,其值是函數的結果狀態碼,如OK等。

typedef int Boolean// Boolean是值為TRUE或FALSE的布爾類型。

#定義STACK_INIT_SIZE 100

#定義堆棧增量10

//***************************************************************************

//堆棧的存儲結構

typedef結構{

//運算符堆棧

char * base

char * top

int stacksize

} sqstack 1;

typedef結構{

//操作數堆棧

float * base

浮動*頂部;

int stacksize

} SqStack2

//***************************************************************************

//下面是操作符棧的基本操作函數

狀態init stack(sqstack 1 & amp;S){

//初始化堆棧

s . base =(char *)malloc(STACK _ INIT _ SIZE * sizeof(char));

如果(!S.base)退出(溢出);

s . top = s . base;

S.stacksize = STACK _ INIT _ SIZE

退貨OK;

}//初始化堆棧

狀態destroy stack(sqstack 1 & amp;S){

//銷毀堆棧s

免費(s . top);

免費(s . base);

退貨OK;

}//DestroyStack

char GetTop(SqStack1 S){

//如果堆棧不為空,返回S的頂部元素,返回OK;否則返回錯誤。

if(S.top==S.base)返回錯誤;

return *(s . top-1);

}//Gettop

狀態推送(sqstack 1 & amp;s,char e){

//插入元素E作為堆棧的新頂部元素。

if(s . top-s . base & gt;=S.stacksize){

//堆棧已滿,額外的存儲空間

S.base=(char *)realloc(S.base,(s . stack size+stack increment)* sizeof(char));

如果(!S.base)退出(溢出);

s . top = s . base+s . stack size;

s . stack size+= stack increment;

}

* s . top++ = e;

退貨OK;

}//推送

狀態彈出(sqstack 1 & amp;s,char & ampe){

//如果堆棧不為空,刪除S的頂部元素,用E返回其值;並返回ok;否則返回錯誤。

if(S.top==S.base)返回錯誤;

e = *(-s . top);

退貨OK;

}//彈出

//***************************************************************************

//下面是操作數堆棧的基本操作函數

狀態初始化堆棧(SqStack2 & ampS){

//初始化堆棧

s . base =(float *)malloc(STACK _ INIT _ SIZE * sizeof(float));

如果(!S.base)退出(溢出);

s . top = s . base;

S.stacksize = STACK _ INIT _ SIZE

退貨OK;

}//初始化堆棧

狀態銷毀堆棧(SqStack2 & ampS){

//銷毀堆棧s

免費(s . top);

免費(s . base);

退貨OK;

}//DestroyStack

float GetTop(SqStack2 S){

//如果堆棧不為空,返回S的頂部元素,返回OK;否則返回錯誤。

if(S.top==S.base)返回錯誤;

return *(s . top-1);

}//Gettop

狀態推送(SqStack2 & amps,float e){

//插入元素E作為堆棧的新頂部元素。

if(s . top-s . base & gt;=S.stacksize){

//堆棧已滿,額外的存儲空間

S.base=(float *)realloc(S.base,(s . stack size+stack increment)* sizeof(float));

如果(!S.base)退出(溢出);

s . top = s . base+s . stack size;

s . stack size+= stack increment;

}

* s . top++ = e;

退貨OK;

}//推送

狀態彈出(SqStack2 & amp標準普爾,浮動& ampe){

//如果堆棧不為空,刪除S的頂部元素,用E返回其值;並返回ok;否則返回錯誤。

if(S.top==S.base)返回錯誤;

e = *(-s . top);

退貨OK;

}//彈出

//***************************************************************************

//以下是相關的運算符判斷函數。

char precend(char A,char B){

//比較運算符A和B的優先關系,以及A和B的範圍僅限於“+”、“-”、“*”、“/”、“(“,”)”、“=”

//返回' >',' & lt','='

開關(A){

案例'+':開關(B){

大小寫“+”:返回“>;”;

大小寫'-':返回' >;';

大小寫' * ':返回' & lt';

案例'/':返回' & lt';

凱斯'^':return ' & lt;';

case“(”:返回“& lt”;

case ')':返回' >;';

case '= ':返回' >;';

默認值:printf("表達式錯誤!\ n ");退出(0);

}

情況'-':開關(B){

大小寫“+”:返回“>;”;

大小寫'-':返回' >;';

大小寫' * ':返回' & lt';

案例'/':返回' & lt';

凱斯'^':return ' & lt;';

case“(”:返回“& lt”;

case ')':返回' >;';

case '= ':返回' >;';

默認值:printf("表達式錯誤!\ n ");退出(0);

}

案例' * ':開關(B){

大小寫“+”:返回“>;”;

大小寫'-':返回' >;';

事例“*”:返回“>”;

案例“/”:返回“>;”;

凱斯'^':return ' & lt;';

case“(”:返回“& lt”;

case ')':返回' >;';

case '= ':返回' >;';

默認值:printf("表達式錯誤!\ n ");退出(0);

}

案例'/':開關(B){

大小寫“+”:返回“>;”;

大小寫'-':返回' >;';

事例“*”:返回“>”;

案例“/”:返回“>;”;

凱斯'^':return ' & lt;';

case“(”:返回“& lt”;

case ')':返回' >;';

case '= ':返回' >;';

默認值:printf("表達式錯誤!\ n ");退出(0);

}

凱斯·'^':switch(b){

大小寫“+”:返回“>;”;

大小寫'-':返回' >;';

事例“*”:返回“>”;

案例“/”:返回“>;”;

案例'^':return“>”;

case“(”:返回“& lt”;

case ')':返回' >;';

case '= ':返回' >;';

默認值:printf("表達式錯誤!\ n ");退出(0);

}

案例'(':開關(B){

大小寫“+”:返回“& lt”;

大小寫'-':返回' & lt';

大小寫' * ':返回' & lt';

案例'/':返回' & lt';

凱斯'^':return ' & lt;';

case“(”:返回“& lt”;

case“)”:返回“=”;

Case '=':printf("表達式錯誤!\ n ");退出(0);

默認值:printf("表達式錯誤!\ n ");退出(0);

}

案例')':開關(B){

大小寫“+”:返回“>;”;

大小寫'-':返回' >;';

事例“*”:返回“>”;

案例“/”:返回“>;”;

案例'^':return“>”;

Case '(':printf("表達式錯誤!\ n ");退出(0);

case ')':返回' >;';

case '= ':返回' >;';

默認值:printf("表達式錯誤!\ n ");退出(0);

}

case '= ':開關(B){

大小寫“+”:返回“& lt”;

大小寫'-':返回' & lt';

大小寫' * ':返回' & lt';

案例'/':返回' & lt';

凱斯'^':return ' & lt;';

case“(”:返回“& lt”;

Case ')':printf("表達式錯誤!\ n ");退出(0);

大小寫“=”:返回“=”;

默認值:printf("表達式錯誤!\ n ");退出(0);

}

默認值:printf("表達式錯誤!\ n ");退出(0);

}

}//前置

狀態不工作(字符c){

//判斷C是否是運算符,如果是則返回TRUE,否則返回FALSE。

開關(c){

大小寫“+”:返回TRUE

大小寫'-':返回TRUE

case“*”:返回TRUE

案例“/”:返回TRUE

案例'^':return真實;

case“(”:返回TRUE

case“)”:返回TRUE

case“=”:返回TRUE

默認值:返回FALSE

}

}//不工作

//***************************************************************************

浮動操作(浮動a,char theta,浮動b){

開關(θ){

case '+':返回a+b;

格'-':返回a-b;

case '* ':返回a * b;

案例“/”:

if(b==0){

Printf("分母不能為0!\ n ");

退出(0);

}

否則返回a/b;

凱斯·'^':

if(a = = 0 & amp;& ampb & lt=0){

printf("0的指數必須大於0!\ n ");

退出(0);

}

否則返回(浮點)pow(a,b);

默認值:printf("表達式錯誤!\ n ");退出(0);

}

}//操作

狀態EvaluateExpression(){

//算術表達式求值

char c,x,theta,prec

//c是每次要讀取的字符,x是括號後多余的括號,theta是運算符,prec是c的前壹個字符。

浮點a,b,結果;//a和B是每次從操作數堆棧中取出要運算的數,結果存儲最終結果。

float cc,flag,ii,MINUS = 1;

//cc存儲字符串轉換成的浮點數,flag用來標記小數點是否已經讀入。

//ii存儲需要減的小數部分的倍數,用減號記錄這個數之前是否有負號。

sqstack 1 OPTR;

SqStack2 OPND

init stack(OPTR);init stack(OPND);

Push(OPTR,' = ');

prec = ' =scanf("%c ",& ampc);

而(c!='='||GetTop(OPTR)!='='){

cc = 0;flag = 0;ii = 10;

if(c = = '-' & amp;& amp(prec = = ' = ' | | prec = = '('){ MINUS =-1;prec = c;scanf("%c ",& ampc);}

//如果壹個“-”前面有“=”(第壹個符號是“-”)或“(”),則是減號,不是負號。

else if(!不工作(c)){

而(!不工作(c)){

if(c & gt;= 48 & amp& ampc & lt=57){

if(flag = = 0)cc = cc * 10+c-48;//小數點前

else if(flag = = 1){ cc = cc+(c-48)/ii;ii * = 10;}//小數點後

Else {printf("小數點錯誤!\ n ");退出(0);}//小數點不對

}

else if(c== ' . ')flag++;//讀取到小數點

Else {printf("表達式錯誤!\ n ");退出(0);}

prec = c;scanf("%c ",& ampc);

}

cc * = minus減= 1;

推送(OPND,cc);

}//如果不是運算符,則進入OPND棧。

其他

switch(precend(GetTop(OPTR),c)){

大小寫' & lt':Push(OPTR,c);prec = c;scanf("%c ",& ampc);打破;//棧頂元素優先級低。

case '=':Pop(OPTR,x);prec = c;scanf("%c ",& ampc);打破;//去掉括號,接收下壹個字符

大小寫“>”://堆棧,將運算結果進行堆棧。

Pop(OPTR,theta);

Pop(OPND,b);Pop(OPND,a);

Push(OPND,Operate(a,theta,b));

打破;

}

}

result = GetTop(OPND);

printf("%f\n ",結果);

//destroy stack(OPTR);

//destroy stack(OPND);

退貨OK;

}//評估表達式

void main(){

printf(" * * * * * * * * * * * * * * * * * * * \ n ");

Printf(" *歡迎使用計算器!* \ n ");

printf(" * * * * * * * * * * * * * * * * * * * \ n ");

Printf("請輸入以" = ":\n)結尾的表達式);

Printf("(支持實數間的加法(+)、減法(-)、乘法(*)、除法(/)、乘方()和單目減法(-))\ n ");

evaluate expression();

退出(0);

}

  • 上一篇:夜班工資怎麽算
  • 下一篇:亳州工業學校和亳州中藥科技學校哪個好
  • copyright 2024編程學習大全網