//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
# include & ltiostream & gt//iostream
#定義N 11 //表達式長度,用字符數組實現,19位有效數字。
//因為數字和運算符不會同時存儲在壹個數組中,所以定義如下:
// -11代表(
// -12)
// -13代表+
// -14代表-
// -15代表*
// -16代表/
float a[N]={3,-13,-11,5,-15,4,-13,3,-14,6,-12 };//表達式
int n = 10;//全局變量形式的表達式的實際長度。
int p = 0;//指向前括號或表達式的頭。
int at = 10;//指向後括號或表達式的結尾。
int m = 10;//掃描標誌位
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//類定義
類別計算
{公共:
void mov(int sign);/////運算後,或刪除括號後,表達式向左移動。
void govern();//掃描函數掃描“()”,如果掃描“()”,則計算值。
//直接計算表達式值,不需要掃描。
void Ji suan(int & amp;壹、int & ampb);//主計算函數
};//類定義結束
//表達式為:3+(5*4+3-6)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//移動功能
void calculate::mov(int符號)
{
//有(1+5)這種情況,會成為(6)**的後繼元素。
for(int j = 0;sign+j & lt;= n-2;j++)
a[sign+j]= a[sign+j+2];//元素依次向前移動
n-= 2;//表長度減2
at-= 2;//指向後括號的符號向前移動)
}//移動結束
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Ji suman函數
void calculate::Ji suan(int & amp;at,int & ampp)
{
for(int I = at;p!= I;I-)//乘法、除法運算
{
if(a[I]=-15.000000)//發生乘法。
{
a[I-1]= a[I-1]* a[I+1];
mov(壹);
}//如果結束
if(a[I]=-16.000000)//出現除法。
{ a[I-1]= a[I-1]/a[I+1];
mov(壹);
}//如果結束
}//對於over //乘法,除法運算結束。
for(int j = at;p!= j;j-)//加減運算
{
if(a[j]=-13.000000)//加法發生。
{
a[j-1]= a[j-1]+a[j+1];
mov(j);
}//如果結束
if(a[j]=-14.000000)//出現除法。
{
a[j-1]= a[j-1]-a[j+1];
mov(j);
}//如果結束
}//for加減運算結束。
如果(p!=0)
{if (p+2==at) //如果(5)出現,去掉括號。
{
a[p]= a[p+1];
for(int j = 0;p+j & lt;= n-3;J++) //向前移動兩個單位
a[p+j+1]= a[p+j+3];//支付遠期價值
n-= 2;//表長度減2
p = 0;//去掉括號,表示針回到頭尾。
at = n;//去掉括號後,尾指
} // if (p+2==at)結束。
} //if (p!=0)結束
m = n+1;//給M 1
}//計算完畢
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//掃描功能
void calculate::gover()
{//m用來表示下標的變化。每移位壹次,都要給m付壹個新的N值,也就是第壹次//移位後,要從尾部再掃描壹次。
for(;m & gt=0;m -)
{
”)出現在if (a [m] =-12.000000)//中。
{
at = m;//用at標記“)”的下標。
}
如果(a [m] =-11.000000)//"(出現。
{ p = m;//用p標記“(”的下標,()連續出現。計算()中的表達式值。
吉蘇安(at,p);
}//如果完成
}//掃描結束()
//如果沒有(),直接調用jisuan()。
//將兩個指針放回表達式的開頭和結尾,
吉蘇安(at,p);
}//管理端
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Int main() //主音函數
{計算示例;//創建壹個對象
example . gover();//對象調用管理
printf("%f ",a[0]);//計算後,輸出結果。
返回0;
}
//改進目標:首先,實現用戶輸入操作表達式。
//第二,掃描表達式的正確性。
//第三,用Mfc設計用戶界面。
//
//存在的問題:
//第壹,參數傳遞有很多不理解的地方。
//第二,因為第壹個原因p,at沒辦法,只能做全局變量,因為全局變量太多了。
//第三,結構化程序不夠高,不能充分發揮面向對象的思想。
//鑒於以上三點,接下來就是改進了。
======================
還有壹個:
# include & ltwindows.h & gt
long WINAPI回調WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(h instance hinst,HINSTANCE phinst,
PSTR指令行,國際指令顯示)
{
//應用程序的名稱
靜態CHAR Appname[]= TEXT(" hex calc ");
// -
HWND hwnd
味精味精;
//窗口類創建
WNDCLASS wndclass
wnd class . style = CS _ HREDRAW | CS _ VREDRAW;
wndclass.lpfnWndProc = WndProc
wnd class . cbclsextra = 0;
wnd class . cbwndextra = DLGWINDOWEXTRA;
wnd class . h instance = hinst;
wndclass.hIcon = LoadIcon(NULL,IDI _應用);
wnd class . hcursor = load cursor(NULL,IDC _ ARROW);
wnd class . HBR background =(HBRUSH)(COLOR _ BTN face+1);
wndclass.lpszMenuName = NULL
wnd class . lpsz class name = Appname;
// -
//創建並顯示窗口
如果(!register class(& amp;wndclass))
{
MessageBox(NULL,TEXT("該程序需要Windows NT!"),
Appname,MB _ icon hand);
返回0;
}
hwnd = CreateDialog(hinst,Appname,0,NULL);
ShowWindow(hwnd,cmdshow);
更新窗口(hwnd);
// -
//發送消息
while(GetMessage(& amp;msg,NULL,0,0))
{
翻譯消息(& amp味精);
dispatch message(amp;味精);
}
// -
返回msg.wParam
}
void ShowNumber(HWND hwnd,UINT iNumber)
{
char SZ buffer[20];
wsprintf(szBuffer,TEXT("%X ",iNumber);
SetDlgItemText(hwnd,VK_ESCAPE,SZ buffer);
}
DWORD Calclt(UINT iFirstNum,int iOperation,UINT iNum)
{
開關(操作)
{
大小寫“=”:
返回iNum
大小寫“+”:
返回iFirstNum+iNum;
大小寫'-':
返回iFirstNum-iNum;
大小寫' * ':
返回iFirstNum * iNum
格' & amp':
返回iFirstNum & ampiNum
案例“|”:
返回iFirstNum | iNum
凱斯·'^':
返回ifirstnum ^ inum;
大小寫' & lt':
返回iFirstNum & lt& ltiNum
大小寫“>”:
返回iFirstNum & gt& gtiNum
案例“/”:
返回iNum?iFirstNum/iNum:MAXDWORD;
案例“%”:
返回iNum?iFirstNum % iNum:MAXDWORD;
默認值:
返回0;
}
}
長WINAPI回調WndProc(HWND hwnd,UINT消息,WPARAM wParam,LPARAM lParam)
{
static BOOL bNewNumber = TRUE
靜態互操作= ' = ';
靜態UINT iNumber,iFirstNum
HWND hButton
//消息列表或進程
開關(消息)
{
案例WM_KEYDOWN:
如果(wParam!= VK _左)
打破;
wParam = VK _ BACK;
案例WM_CHAR:
if((wParam =(wParam)char upper((char *)wParam))= = VK _ RETURN)
wParam = ' =
if(hButton = GetDlgItem(hwnd,wParam))
{
SendMessage(hButton,BM_SETSTATE,1,0);
睡眠(100);
SendMessage(hButton,BM_SETSTATE,0,0);
}
其他
{
message beep(0);
打破;
}
案例WM_COMMAND:
SetFocus(hwnd);
if(LOWORD(wParam) == VK_BACK)
ShowNumber(hwnd,iNumber/= 16);
else if(LOWORD(wParam)= = VK _轉義)
ShowNumber(hwnd,iNumber = 0);
else if(isxdigit(LOWORD(wParam)))
{
if(b新聞編號)
{
iFirstNum = iNumber
iNumber = 0;
}
bNewNumber = FALSE
if(iNumber & lt;= MAXDWORD & gt& gt4)
ShowNumber(hwnd,iNumber = 16 * iNumber+wParam-
(isdigit(wParam)?0 ':' A '-10));
其他
message beep(0);
}
其他
{
如果(!bNewNumber)
ShowNumber(hwnd,iNumber = Calclt(iFirstNum,iOperation,iNumber));
bNewNumber = TRUE
io operation = LOWORD(wParam);
}
返回0;
案例WM_DESTROY:
PostQuitMessage(0);
返回0;
}
// -
返回DefWindowProc(hwnd,message,wParam,lParam);
}