實驗四算術表示式求值

2022-12-28 20:24:04 字數 3770 閱讀 7298

源**:

#include<>

#include <>

#include <>

#define plus 0

#define minus 1

#define power 2

#define divide 3

#define leftp 4

#define righp 5

#define startend 6

#define digit 7

#define point 8

#define num 7

#define no 32767

#define stacksize 20

//運算子

char a

//優先關係矩陣,規定:=為 0,>為 1,《為-1,空為 no

int prioritytable[7][7]=,,,

,,,};

int menu(void)

while(num<1 || num>4);

return(num);

}/* 輸入表示式函式 */

void inputexpression(char str)

/* 確定當前字元型別 */

/* 若為運算子,則返回運算子在運算子陣列中的序號 */

/* 若為數字字元,則返回 digit */

/* 若為小數點字元,則返回 point */

/* 否則為非法字元,返回-1 */

int getchartype(char ch)

/* 表示式計算 */

/* 輸入引數:char *str,表示式字串 */

/* 輸出引數:double *result,表示式計算結果 */

/* 函式返回值:1 計算正確 */

/* 0 表示式有錯 */

int excute(char *str,double *result)

{ int pp,toptr,topnd,chartype,optr[stacksize];

double number,temp,opnd[stacksize];

optr[0]=startend;

toptr=1;

topnd=0;

pp=0;

while((str[pp]))

{chartype=getchartype(str[pp]); //確定字元型別

switch(chartype)

{case -1: //不是表示式中的字元,表示式有錯

return(0);

case digit: //數字字元,實數的開始字元

number=0;

while(str[pp]>='0' && str[pp]<='9') //處理實數的整數部分

number=number*10+(str[pp]-48); //48為0的acsll碼

pp++;

if(str[pp遇到小數點

temp=10.0;

pp++;

while(str[pp]>='0' && str[pp]<='9') //處理實數的小數部分

number=number+(str[pp]-48)/temp;

temp=temp*10;

pp++;

opnd[topnd]=number; //運算元進棧

topnd++;

break;

case point: //小數點,以小數點開頭的實數

number=0;

temp=10.0;

pp++;

while(str[pp]>='0' && str[pp]<='9')

number=number+(str[pp]-48)/temp;

temp=temp*10;

pp++;

opnd[topnd]=number;

topnd++;

break;

case plus: //加

case minus: //減

case power: //乘

case divide: //除

int i,j;

i=prioritytable[optr[toptr-1]][chartype];

if(i==-1)//棧頂元素優先順序小,直接輸入

optr[toptr]=chartype;

toptr++;

if(i==1)//棧頂元素優先順序大

while(i==1)

j=optr[toptr-1];//把棧頂運算子賦給j

if(j==0)//加

opnd[topnd-2]=opnd[topnd-2]+opnd[topnd-1];

if(j==1)//減

opnd[topnd-2]=opnd[topnd-2]-opnd[topnd-1];

if(j==2)//乘

opnd[topnd-2]=opnd[topnd-2]*opnd[topnd-1];

if(j==3)//除

opnd[topnd-2]=opnd[topnd-2]/opnd[topnd-1];

topnd--;

toptr--;

i=prioritytable[optr[toptr-1]][chartype];//判斷是否繼續迴圈

optr[toptr]=chartype;

toptr++;

pp++;

break;

case leftp: //左括號直接進棧

optr[toptr]=4;

toptr++;

pp++;

break;

case righp: //右括號

if(optr[toptr-1]==4)//若棧頂是左括號,則左括號出棧,pp 指向下乙個字元

toptr--;

pp++;

break;

else

if(optr[toptr-1]==6)//若棧頂是#(即「6」),則左括號和右括號不配對,結束處理,返回出錯標誌(0)

return(0);

else

棧頂是運算子,則取運算子棧頂運算子和運算元棧頂運算元進行運算,參與運算的運算子和運算元出棧,運算結果進運算元棧重複該操作,直到棧頂出現左括號「(」

int j;

j=optr[toptr-1];

if(j==0)

opnd[topnd-2]=opnd[topnd-2]+opnd[topnd-1];

if(j==1)

opnd[topnd-2]=opnd[topnd-2]-opnd[topnd-1];

if(j==2)

opnd[topnd-2]=opnd[topnd-2]*opnd[topnd-1];

if(j==3)

opnd[topnd-2]=opnd[topnd-2]/opnd[topnd-1];

topnd--;

toptr--;

break;

case startend: // 遇到表示式結束符#

while(optr[toptr-1]!=startend)//若當前字元不為#:依次從運算子棧取出運算子和從運算元棧取出運算元進行計算,

直到運算子棧的棧頂為#為止。

int j;

j=optr[toptr-1];

if(j==0)

opnd[topnd-2]=opnd[topnd-2]+opnd[topnd-1];

if(j==1)

opnd[topnd-2]=opnd[topnd-2]-opnd[topnd-1];

算術表示式求值課設報告

資料結構課程設計 設計說明書 數學與電腦科學學院 2012年 9月 7日 資料結構課程設計評閱書 注 指導教師成績60 答辯成績40 總成績合成後按五級制記入 課程設計任務書 2011 2012學年第2學期 專業學號姓名 課程設計名稱資料結構課程設計 設計題目表示式求值演算法的實現 完成期限 自 2...

表示式求值

課程設計報告 課程名稱資料結構 課題名稱表示式求值 專業電腦科學與技術 班級0901 學號 200903010102 姓名覃宇星 指導教師李珍輝鄧作傑郭芳 2011年7月7日 湖南工程學院 課程設計任務書 課程名稱 c語言程式設計 課題表示式求值 專業班級計算機0901 學生姓名 學號指導老師周鐵山...

資料結構算術表示式求值實驗報告

目錄1 前言 1 2 概要設計 1 2.1 資料結構設計 1 2.2 演算法設計 1 2.3 adt描述 2 2.4 功能模組分析 2 3 詳細設計 3 3.1 資料儲存結構設計 3 3.2主要演算法流程圖 或演算法偽 3 4 軟體測試 6 5 心得體會 8 參考文獻 8 附錄 8 在計算機中,算術...