算數表示式求值--c語言課程設計
算數表示式求值
1.可多位的整數運算
2.進行加減乘除四則運算
3.可進行多次計算
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <windows.h>
#define Stack_Size 100
#define maxn 110
int color(int num){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),num);
return 0;
}
char priority[7][7]={
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','0'}, // 此行"("=")"表示左右括號相遇,括號內運算已完成
{'>','>','>','>','0','>','>'},
{'<','<','<','<','<','0','='} // "=" 表示整個表示式求值完畢
}; // "0"表示不可能出現這種情況 ( 語法錯誤 )
struct OPTR{
char elem[Stack_Size];//用來存放運算子
int top;//棧頂
};
struct OPND{
int elem[Stack_Size];//用來存放運算元
int top;//棧頂
};
void InitStack1(struct OPTR *S)//構造運算子棧(空棧)
{
S->top=-1;
}
void InitStack2(struct OPND *S)//構造運算元棧(空棧)
{
S->top=-1;
}
void Push1(struct OPTR *S,char ch)// 運算子棧插入ch為新的棧頂元素
{
if(S->top==Stack_Size-1){
printf("棧已滿,入棧失敗!");
return;
}
S->top++;
S->elem[S->top]=ch;
return;
}
void Push2(struct OPND *S,int ch)// 運算元棧插入ch為新的棧頂元素
{
if(S->top==Stack_Size-1){
printf("棧已滿,入棧失敗!");
return;
}
S->top++;
S->elem[S->top]=ch;
return;
}
void Pop1(struct OPTR *S)//刪除運算子棧S的棧頂元素 ,用p返回其值
{
if(S->top==-1){
printf("棧空,出棧失敗!");
return;
}
// *p=S->elem[S->top];//棧頂元素賦給p
S->top--;//修改棧頂指標
return;
}
void Pop2(struct OPND *S)//刪除運算元棧S的棧頂元素 ,用p返回其值
{
if(S->top==-1){
printf("棧空,出棧失敗!");
return;
}
// *p=S->elem[S->top];//棧頂元素賦給p
S->top--;//修改棧頂指標
return;
}
char GetTop1(struct OPTR *S)//用p返回運算子棧S的棧頂元素
{
if(S->top==-1){
printf("棧空,取值失敗!");
return -1;
}
char p=S->elem[S->top];//棧頂元素賦值給p
return p;
}
int GetTop2(struct OPND *S)//用p返回運算元棧S的棧頂元素
{
if(S->top==-1){
printf("棧空,取值失敗!");
return -1;
}
int p=S->elem[S->top];//棧頂元素賦值給p
return p;
}
int In(char ch)//判斷ch是否為運算子
{
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#'||ch=='='){
return 0;
}
return -1;
}
char Precede(char t1,char t2)//判斷運算子t1和t2的優先順序
{
int i,j;
switch(t1){
case'+':i=0;break;
case'-':i=1;break;
case'*':i=2;break;
case'/':i=3;break;
case'(':i=4;break;
case')':i=5;break;
case'#':i=6;break; // #是表示式的結束符
}
switch(t2){
case'+':j=0;break;
case'-':j=1;break;
case'*':j=2;break;
case'/':j=3;break;
case'(':j=4;break;
case')':j=5;break;
case'#':j=6;break;
}
return priority[i][j];
}
int Operate(int a,char theta,int b)//對a和b進行二元運算theta
{
if(theta=='+') return a+b;
if(theta=='-') return b-a;
if(theta=='*') return a*b;
if(theta=='/') return b/a;
}
int main(){
system("mode 100,30");
int flag;
do{
struct OPTR *S1;
S1=(struct OPTR *)malloc(sizeof(struct OPTR));
InitStack1(S1);
struct OPND *S2;
S2=(struct OPND *)malloc(sizeof(struct OPND));
InitStack2(S2);
Push1(S1,'#');
char s[maxn];
color(11);
printf("請輸入算數表示式(正整數),並以=結束\n");
scanf("%s",&s);
char c=s[0];
int k=1;
while(c!='='||GetTop1(S1)!='#'){//表示式未讀完或者運算子未完
int y=0;
if(c>='0'&&c<='9'){
while(c>='0'&&c<='9'){//讀入連續的數字
y=y*10+(c-'0');
c=s[k++];
}
Push2(S2,y);
}
else{
if(In(c)==-1){
printf("運算子或表示式不合法!計算失敗!");
return 0;
}
char x;
int m,n;
switch(Precede(GetTop1(S1),c)){//不是運算元則說明是運算子 ,和運算子棧的頂元素進行優先順序比較
case'<'://棧頂元素優先順序低
Push1(S1,c);
c=s[k++];
break;
case'=':
Pop1(S1);//脫括號
c=s[k++];//讀取下一個字元
break;
case'>':
x=GetTop1(S1);Pop1(S1);
m=GetTop2(S2);Pop2(S2);
n=GetTop2(S2);Pop2(S2);
Push2(S2,Operate(m,x,n));
break;
default:
printf("語法錯誤"); break;
}
}
}
int result=GetTop2(S2);
printf("%d",result);
color(3);
printf("\n是否繼續計算1/0:");
scanf("%d",&flag);
if(flag==0){
printf("☆☆感謝您的使用 ☆☆");
}
}while(flag!=0);
return 0;
}
相關文章
- 課程-計算機語言學計算機
- 函數語言程式設計:Lambda 表示式函數程式設計
- 浙大翁愷《C語言程式設計》課程筆記C語言程式設計筆記
- C語言程式設計入門之--第五章C語言基本運算和表示式-part2C語言程式設計
- Python函數語言程式設計系列007:惰性求值Python函數程式設計
- Java 函數語言程式設計(二)Lambda表示式Java函數程式設計
- C語言:迴文數計算C語言
- python函數語言程式設計之yield表示式形式Python函數程式設計
- 使用棧實現表示式求值,運用棧計算
- C語言程式設計-長整數加法運算C語言程式設計
- 《Python語言程式設計》課程筆記Python程式設計筆記
- C語言課程設計與學習指導 張冬梅pdfC語言
- Java中的函數語言程式設計(三)lambda表示式Java函數程式設計
- Lambda表示式入門--函數語言程式設計與函式式介面函數程式設計函式
- 3.2.5 表示式求值
- 資料結構 課程設計 員工管理系統(C語言)資料結構C語言
- 鏈式棧介面設計(C語言)C語言
- C程式設計語言讀書筆記:型別運算子與表示式C程式程式設計筆記型別
- C語言:計算輸入字元的個數C語言字元
- C語言計算輸入字元的個數C語言字元
- Java表示式求值引擎 - AviatorJava
- 鵬哥C語言初識課程總結C語言
- 偽隨機數C語言程式設計隨機C語言程式設計
- C++的函數語言程式設計C++函數程式設計
- R語言課程設計之-深圳房價預測模型R語言模型
- 函數語言程式設計-鏈式程式設計RAC函數程式設計
- C語言課程訓練系統題-字串cquptC語言字串
- x86彙編反編譯到c語言之——(1)表示式求值及賦值語句編譯C語言賦值
- JSP 表示式語言概述JS
- 將算數表示式轉換成字尾表示式並計算結果
- C語言:使用函式計算兩點間的距離C語言函式
- 一個數學表示式的計算
- c語言程式設計題C語言程式設計
- 計算機課程程式設計經驗分享計算機程式設計
- 中綴表示式轉化為字尾表示式並求值
- 高階語言程式設計課程第9次個人作業程式設計
- 高階語言程式設計課程第十次作業程式設計
- 高階語言程式設計課程第7次個人作業程式設計