急求一个计算器的源程序,要求:完整输入数学表达式(数字加减乘除括号)按=显示结果.JAVA或C++的都可以

要求用到数据结构中队列和堆栈的知识... 要求用到数据结构中队列和堆栈的知识 展开
 我来答
百度网友d059fccfa
2008-02-26 · TA获得超过6584个赞
知道大有可为答主
回答量:1464
采纳率:0%
帮助的人:1857万
展开全部
//c++下的计算器源代码
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <iostream> //输入输出流

#define 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; //扫描标志位

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//类定义
class calculate
{public:
void mov(int sign); //////运算后,或去括号后,表达式左移
void gover( ); //扫描函数扫扫描“()”,如果扫描到“()”就计算其中的值,
//没有扫到就直接进行计算表达式值
void jisuan(int &a,int &b); //主要的计算函数

};//类定义结束
//表达式为:3+(5*4+3-6)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//move 函数
void calculate::mov(int sign)
{
//出现了(1+5)这样的情况,要变成(6)**,注:**是原先)的后继元素
for (int j=0;sign+j<=n-2;j++)
a[sign+j]= a[sign+j+2]; //元素依次前移
n-=2; //表长减2
at-=2; //指向后括的标志随着)前移

}//move结束

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//jisuan函数
void calculate::jisuan(int &at,int &p)
{

for (int i=at;p!=i ;i--) //乘法,除法运算
{
if (a[i]==-15.000000)//出现乘法
{
a[i-1]=a[i-1]*a[i+1];
mov(i);
} //if over
if (a[i]==-16.000000) //出现除法
{a[i-1]=a[i-1]/a[i+1];
mov(i);
}// if over
} //for 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 over
if (a[j]==-14.000000) //出现除法
{
a[j-1]=a[j-1]-a[j+1];
mov(j);
}//if over
}//for over加减运算结束

if (p!=0)
{if (p+2==at) //出现(5)的情况,就去括号
{
a[p]=a[p+1];
for (int j=0;p+j<=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
}//jisuan完

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//扫描函数
void calculate::gover( )
{ //m用来指示下标变化,每次发生移位后,都要把新的n值付给m,即第次//移位后,要从尾开重新扫描
for ( ; m>=0; m-- )
{
if (a[m]==-12.000000 ) //出现“)”
{
at=m; //用at标记住“)”的下标
}
if (a[m]==-11.000000) //出现“(”
{p=m; //用p标记住“(”的下标,连续出现了(),计算()内的表达式值
jisuan(at,p) ;
}//if 完
}//扫描()结束
//如果没有()则直接调用jisuan( )
//把两个指针放回到表达式的首尾,
jisuan(at,p);
}//gover结束

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int main() //主调函数
{calculate example; //创建一个对象
example.gover( ); //对象调用gover

printf("%f",a[0]);//计算完毕,输出结果

return 0;
}

//改进目标:第一,实现用户输入运算表达式
// 第二,实现对表达式的正确性进行扫描
//第三,用Mfc把用户界面设计出来
//

//存在的问题:
//第一,参数传递中有很多不理解的东西
//第二,由于第一个原因p,at迫于无奈做成了全局的变量,因为全局变量过多
//第三,结构化程序不够高,没有把面向对象的思想最大的发挥出来
//针对以上三点,下一步努力改进

======================
还有一个:
# include <windows.h>

long WINAPI CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hinst,HINSTANCE phinst,
PSTR cmdline,int cmdshow)
{
//the application's name
static CHAR Appname[] = TEXT("HexCalc");
//---------------------------------------
HWND hwnd;
MSG msg;
// window class create
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = DLGWINDOWEXTRA;
wndclass.hInstance = hinst;
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = Appname;
//---------------------------------------
//create and show window
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("This program requires Windows NT!"),
Appname,MB_ICONHAND);
return 0;
}
hwnd = CreateDialog(hinst,Appname,0,NULL);
ShowWindow(hwnd,cmdshow);
UpdateWindow(hwnd);
//------------------------------------------------
//send message
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//------------------------------------------------
return msg.wParam;
}

void ShowNumber(HWND hwnd,UINT iNumber)
{
char szBuffer[20];
wsprintf(szBuffer,TEXT("%X"),iNumber);
SetDlgItemText(hwnd,VK_ESCAPE,szBuffer);
}

DWORD Calclt(UINT iFirstNum,int iOperation,UINT iNum)
{
switch(iOperation)
{
case '=':
return iNum;
case '+':
return iFirstNum + iNum;
case '-':
return iFirstNum - iNum;
case '*':
return iFirstNum * iNum;
case '&':
return iFirstNum & iNum;
case '|':
return iFirstNum | iNum;
case '^':
return iFirstNum ^ iNum;
case '<':
return iFirstNum << iNum;
case '>':
return iFirstNum >> iNum;
case '/':
return iNum ? iFirstNum / iNum : MAXDWORD;
case '%':
return iNum ? iFirstNum % iNum : MAXDWORD;
default:
return 0;
}
}

long WINAPI CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static BOOL bNewNumber = TRUE;
static int iOperation = '=';
static UINT iNumber,iFirstNum;
HWND hButton;
//message list or procces
switch(message)
{
case WM_KEYDOWN:
if(wParam != VK_LEFT)
break;
wParam = VK_BACK;
case WM_CHAR:
if((wParam = (WPARAM)CharUpper((char*)wParam)) == VK_RETURN)
wParam = '=';
if(hButton = GetDlgItem(hwnd,wParam))
{
SendMessage(hButton,BM_SETSTATE,1,0);
Sleep(100);
SendMessage(hButton,BM_SETSTATE,0,0);
}
else
{
MessageBeep(0);
break;
}
case WM_COMMAND:
SetFocus(hwnd);
if(LOWORD(wParam) == VK_BACK)
ShowNumber(hwnd,iNumber /= 16);
else if(LOWORD(wParam) == VK_ESCAPE)
ShowNumber(hwnd,iNumber = 0);
else if(isxdigit(LOWORD(wParam)))
{
if(bNewNumber)
{
iFirstNum = iNumber;
iNumber = 0;
}
bNewNumber = FALSE;
if(iNumber <= MAXDWORD >> 4)
ShowNumber(hwnd,iNumber = 16 * iNumber + wParam -
(isdigit(wParam) ? '0' : 'A' - 10));
else
MessageBeep(0);
}
else
{
if(!bNewNumber)
ShowNumber(hwnd,iNumber = Calclt(iFirstNum,iOperation,iNumber));
bNewNumber = TRUE;
iOperation = LOWORD(wParam);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
//-----------------------------------------
return DefWindowProc(hwnd,message,wParam,lParam);
}
百度网友1d6b3eb
2008-03-06 · TA获得超过1064个赞
知道小有建树答主
回答量:1785
采纳率:100%
帮助的人:748万
展开全部
我写的,你看看咋样~~

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
* @author 李政劭
* 一个简单地计算器
*/
public class Caculator extends JPanel{

private static final long serialVersionUID = 1L;
private JButton buttonDvision,buttonPlus,buttonMinus;
private JButton buttonD,buttonEqual,buttonNC,buttonMupl;
private JButton[] buttons = new JButton[10];
private JTextField field;
private String x = "0";
private String y = "0";
private String numbers = "";
private String symbol;
private double answer = 0;
private boolean exist = false;

public static void main(String args[]){

GUI();
}

public static void GUI(){

JFrame frame = new JFrame("caculator");
frame.setContentPane(new Caculator());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);

}

public Caculator(){

JPanel panelLeft = new JPanel();
JPanel panelRight = new JPanel();
JPanel panelUp = new JPanel();

for(int i = 9 ; i >= 0 ; i--){
int j = i;
if(i % 3 == 0 && i >= 3){
j = j - 2;
}
if((i + 2) % 3 == 0 ){
j =j + 2;
}
buttons[i] = new JButton("" + j);
panelLeft.add(buttons[i]);
}

panelLeft.setLayout(new GridLayout(4, 3));
panelRight.setLayout(new GridLayout(4, 1));

buttonD = new JButton(".");
buttonEqual = new JButton("=");
buttonPlus = new JButton("+");
buttonMinus = new JButton("-");
buttonMupl = new JButton("*");
buttonDvision = new JButton("%");
buttonNC = new JButton("NC");
field = new JTextField("0.0",14);
field.setVisible(true);
field.setEditable(false);

for(int i = 0 ; i < 10 ; i++){
buttons[i].addActionListener(new ListenerNumber());
}

buttonD.addActionListener(new ListenerD());
buttonEqual.addActionListener(new ListenerEqual());
buttonPlus.addActionListener(new ListenerSymbol());
buttonMinus.addActionListener(new ListenerSymbol());
buttonMupl.addActionListener(new ListenerSymbol());
buttonDvision.addActionListener(new ListenerSymbol());
buttonNC.addActionListener(new ListenerNC());

panelLeft.add(buttonD);
panelLeft.add(buttonEqual);
panelRight.add(buttonPlus);
panelRight.add(buttonMinus);
panelRight.add(buttonMupl);
panelRight.add(buttonDvision);
panelUp.add(field);
panelUp.add(buttonNC);

setLayout(new BorderLayout());
add(panelLeft,BorderLayout.CENTER);
add(panelRight,BorderLayout.EAST);
add(panelUp,BorderLayout.NORTH);

}

class ListenerNumber implements ActionListener {

public void actionPerformed(ActionEvent event) {

if(event.getSource() instanceof JButton){
JButton actButton = (JButton)(event.getSource());
numbers = numbers + actButton.getText();
field.setText(numbers);
}
}
}

class ListenerD implements ActionListener {

public void actionPerformed(ActionEvent event) {

if(exist == false && numbers != ""){
numbers+=".";
field.setText(numbers);
exist = true;
}
}
}

class ListenerSymbol implements ActionListener {

public void actionPerformed(ActionEvent event) {

if(event.getSource() instanceof JButton){
JButton actButton = (JButton)(event.getSource());
symbol = actButton.getText();
x = field.getText();
field.setText("");
numbers = "";
}
}
}

class ListenerEqual implements ActionListener {

public void actionPerformed(ActionEvent event) {

try{
double a;
double b;
y = field.getText();
a = Double.parseDouble(x);
b = Double.parseDouble(y);
if(symbol == "+"){
answer = a + b;
}else if(symbol == "-"){
answer = a - b;
}else if(symbol == "*"){
answer = a * b;
}else if(symbol == "%"){
answer = a / b;
}else{
answer = b;
}
field.setText("" + answer);
exist = false;
numbers = "";
answer = 0;
symbol = "";
x = "0";
y = "0";
}catch(NumberFormatException e ){
exist = false;
numbers = "";
field.setText("0.0");
answer = 0;
symbol = "";
x = "0";
y = "0";
}
}
}

class ListenerNC implements ActionListener {

public void actionPerformed(ActionEvent event) {

symbol = "";
x = "0";
y = "0";
exist = false;
numbers = "";
field.setText("0.0");
}
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lxkers
2008-02-26 · TA获得超过110个赞
知道小有建树答主
回答量:396
采纳率:50%
帮助的人:267万
展开全部
VB我就懂 C++恩。。忘记了 ~
Private Sub Command1_Click()
Text3 = Val(Text1.Text) - Val(Text2.Text)
End Sub
+ - * / 改个符号就好~
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式