日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算器软件设计和计算机软件设计区别,求一个模拟计算器程序

發布時間:2023/12/1 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算器软件设计和计算机软件设计区别,求一个模拟计算器程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

# include

# include

# include

# include

# define MAX_OPERATOR_NUM 100//運算符棧數組長度

# define MAX_DATA_NUM 100//運算數棧數組長度

typedef struct OPStack//定義運算符棧

{

char opStack[MAX_OPERATOR_NUM];

int top;

}OPStack, *pOPStack;

typedef struct DATAStack//定義操作數棧

{

double stack[MAX_DATA_NUM];

int top;

}DATAStack, *pDATAStack;

void InitpOPStack(pOPStack &pOStack)//初始化運算符棧

{

if( !(pOStack = (pOPStack)malloc(sizeof(OPStack))))//為運算符棧分配空間

{

printf("分配內存空間失敗!\n");

exit(-1);

}

pOStack->top = -1;

}

void InitpDATAStack(pDATAStack &pDStack)//初始化運算數棧

{

if( !(pDStack = (pDATAStack)malloc(sizeof(DATAStack))))//為運算數棧分配空間

{

printf("分配內存空間失敗!\n");

exit(-1);

}

pDStack->top = -1;

}

void PushOPStack(pOPStack &pOStack, char ch)//運算符進棧

{

pOStack->opStack[++(pOStack->top)] = ch;

}

void PopOPStack(pOPStack &pOStack, char &ch)//運算符出棧

{

ch = pOStack->opStack[pOStack->top];

pOStack->top--;

}

void PushDATAStack(pDATAStack &pDStack, double d)//運算數進棧

{

++(pDStack->top);

pDStack->stack[pDStack->top] = d;

}

void PopDATAStack(pDATAStack &pDStack, double &d)//運算數出棧

{

d = pDStack->stack[pDStack->top];

pDStack->top--;

}

void ClearpOPStack(pOPStack &pOStack)//清空運算符棧

{

pOStack->top = -1;

}

void ClearpDATAStack(pDATAStack &pDStack)//清空運算數棧

{

pDStack->top = -1;

}

char GetToppOPStack(pOPStack &pOStack)//獲取運算符棧頂元素

{

return pOStack->opStack[pOStack->top];

}

double GetToppDATAStack(pDATAStack &pDStack)//獲取運算數棧頂元素

{

return pDStack->stack[pDStack->top];

}

bool IsOP(char &ch)//區分 運算符 和 運算數 的函數,是運算符時返回true,否則返回false

{//判斷是否為符號

if ( (ch == '+') || (ch == '-') || (ch == '*') || (ch == '/') || (ch == '=') || (ch == 'A') || (ch == 'S') || (ch == 'a') || (ch == 's') || (ch == '(') || (ch == ')') )

return true;

else

return false;

}

char Precede(char op1, char op2) //參考《數據結構》(C語言版)第53頁 3。

2。5表達式求值 表 3。1

{

char tab[9][10];//定義字符串的二維數組來存放運算符優先級的關系

strcpy( tab[0], ">>" );

strcpy( tab[1], ">>" );

strcpy( tab[2], ">>>><>" );

strcpy( tab[3], ">>>><>" );

strcpy( tab[4], ">>>E>>>>" );

strcpy( tab[6], ">>>><>>>>" );

strcpy( tab[7], ">>>><>>>>" );

strcpy( tab[8], "= 0)//判斷被開方數是否為0,若為0,退出程序

{

s = sqrt(b);//調用SQRT()函數

break;

}

else

{

printf("\n#### 求負數的平方根是非法運算。

程序終止! ####\n");

exit_E();//打印結束菜單

exit(-1);

}

}

return s;

}

char ChangeChar(char &c)//通過ChangeChar函數來把a、s的小寫字母改為大寫的

{

if( c == 'a' )

c = 'A';

else if( c == 's' )

c = 'S';

return c;

}

//參考《數據結構》(C語言版)第53頁 3。

2。5表達式求值 算法3。4EvaluateExpression()函數

void EvaluateExpression()//計算函數:讀入表達式,并計算結果

{

pOPStack pOStack;//聲明運算符棧

pDATAStack pDStack;//聲明運算數棧

double result;//存運算的結果

char x, theta, c;//c存放讀取的字符,x、theta存放運算符棧的棧頂元素

int flag, data;//標識符,用來讀入連續的數字

double s;

double getd;//存放GetTop***的結果

double a, b, cc;//a,b存放數據棧出棧的棧頂元素, c存放運算結果

flag = 0;//初始化標識符,用來判斷字符串中的連續數字

data = 0;//

InitpOPStack(pOStack);//初始化運算符棧

InitpDATAStack(pDStack);//初始化運算數棧

PushOPStack(pOStack, '=');//在運算符棧底放入'='

printf("&請輸入表達式以'='結束:");

c = getchar();//讀入字符

ChangeChar(c);//通過調用函數來實現把小寫的a、s改為大寫的A、S

while( c != '=' || GetToppOPStack(pOStack) != '=')

{

if( !IsOP(c) )//不是運算符進棧

{

s = c - '0';//把字符轉化為數字

if ( flag == 1 )

{

PopDATAStack(pDStack, getd);

s = getd*10 + s;

}

PushDATAStack(pDStack, s);

flag = 1;

c = getchar();

ChangeChar(c);

}

else

{

flag = 0;

switch( Precede(GetToppOPStack(pOStack), c) )//輸入元素和運算符棧頂元素比較

{

case ''://退棧并將運算結果進棧

PopOPStack(pOStack, theta);

PopDATAStack(pDStack, b);

PopDATAStack(pDStack, a);

cc = Operate(a, theta, b);

PushDATAStack(pDStack, cc);

break;

}//switch

}//else

}//while

result = GetToppDATAStack(pDStack);//運算結束時,運算數棧的棧底元素就是計算結果

ClearpOPStack(pOStack);//清空運算符棧

ClearpDATAStack(pDStack);//清空運算數棧

printf("->計算結果為:%。

2f\n\n", result);//輸出運算結果

return ;

}

void print_user()//歡迎界面

{

printf("\n歡迎使用C語言版模擬計算器\n\n");

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

printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");

printf("|模擬計算器使用說明|\n\n");

printf("| 作者:謝先斌|\n\n");

printf("|本程序包括對'+'、'-'、'*'、'/'、'()'的運算|\n");

printf("|本程序中ABS()算用A()替代、SQRT()運算用S()代替|\n");

printf("|本程序中的一切字母均不區分大小寫|\n");

printf("正確的表達式如:1+A(7-8)+S(9*8)=\n");

printf("|輸入'='表示表達式輸入結束!!|\n\n");

printf("| 歡迎使用!!!-->--> |\n");

printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");

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

}

int main()//主函數

{

char in;

bool b;//標識符,用來標識是否結束程序

b = true;//初始化,不結束

print_user();//打印歡迎界面

printf("*請確認使用計算器Y/N:");

while(1)

{

scanf("%c", &in);//確認是否繼續操作

getchar();//吃掉會車,避免干擾

switch(in)

{

case 'Y':

case 'y':

{

EvaluateExpression();//進入計算函數:讀入表達式,并計算結果

break;

}

case 'N':

case 'n':

{

exit_E();

b = false;

break;

}

//default:

//printf("**輸入錯誤,請重新輸入Y/N:");

//break;

}

if(b==false)//如果 b==false ,退出整個程序

break;

printf("*您確定要繼續使用計算機Y/N:");

getchar();//用getchar吃掉回車,避免對后續輸入中in的干擾

}

return 0;

}

全部

總結

以上是生活随笔為你收集整理的计算器软件设计和计算机软件设计区别,求一个模拟计算器程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。