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

要求用到数据结构中队列和堆栈的知识

//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);
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-03-06
我写的,你看看咋样~~

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");
}
}
}
第2个回答  2008-02-26
VB我就懂 C++恩。。忘记了 ~
Private Sub Command1_Click()
Text3 = Val(Text1.Text) - Val(Text2.Text)
End Sub
+ - * / 改个符号就好~本回答被提问者采纳

用c语言编一个计算器程序,能够实现基本的加减乘除,能够输出运算对象...
include <stdio.h>int main(void){double a, b;int chose;printf("欢迎使用我的计算器\\n");while (1){printf("***\\n");printf("1、两数相加\\n");printf("2、两数相减\\n");printf("3、两数相乘\\n");printf("4、两数相除\\n");printf("5、退出\\n");printf("***\\n");scanf(...

用C语言做一个计算器,能实现加减乘除混合运算
1、打开visual C++ 6.0-文件-新建-文件-C++ Source File;2、输入预处理命令和主函数:include<stdio.h> \/*函数头:输入输出头文件*\/ void main()\/*空类型:主函数*\/ 3、定义变量:int a,b,d; \/*定义变量的数据类型为整型*\/ char c;\/*定义变量的数据类型为字符型*\/ 4、输入四则运算...

java 写的计算器源代码只实现加减乘除四则运算即可
int k4=1;\/\/开关4 str2 同上 int k5=1;\/\/开关5 控制小数点可否被录入 ==1时可以 !=1 输入的小数点被丢掉 JButton jicunqi; \/\/寄存器 记录 是否连续按下符号键 Vector vt=new Vector(20,10);JFrame frame=new JFrame("sunshine---计算器");JTextField jg_TextField=new JTextField(jg,...

用C语言做一个计算器,能实现加减乘除混合运算?
是的,可以使用C语言编写一个计算器程序,能够实现加、减、乘、除等混合运算。下面是一个简单的示例程序:```c include <stdio.h> int main() { char operator;double num1, num2, result;printf("Enter an operator (+, -, *, \/): ");scanf("%c", &operator);printf("Enter two num...

计算器上怎样输入数学表达式?
1.首先先将计算器开机,按一下红框处的on键即可开机。2.按一下红框处的shift键,是为了将计算器上直接按的ln函数(对数函数)反转为以自然常数e为底的指数函数,即exp函数。3.再按一下ln键。此时由于已经按过shift键了,所以现在为exp函数。按了ln键之后,屏幕上会显示一个e。4.输入需要求得的...

如何在计算器上输入数学表达式
1、同时按计算器上的组合键“shift和9”键,进入设置。2、然后选择“3”ALL.,全部清除。3、点击计算器上的“=”,选择YES.进行确定。4、这时候显示complete,点击"AC"键返回到主界面。5、这时候进入正常math模式。

求简单java写计算器代码加减乘除
private char lastOperator; \/\/ 表示上一运算符 private JTextField operation; \/\/ 结果栏 private JButton dot, plus, minus, multi, div, sqrt, equal, changePN, clear; \/\/ 运算符 private JButton[] numbers; \/\/ 数字 \/\/ 构造者 public Calculator(){ setTitle("Calculator");\/\/ 初始化...

求用C语言编写一简单计算器程序,要求:实现简单地加减乘除就行了
fu=='+') return a+b;if(fu=='-') return a-b;if(fu=='*') return a*b;if(fu=='\/') return a\/b;}int fun(char *ss,int n){int i,flag=0;if(n==1) return ss[0]-'0';for(i=0;i<n;i++){if((ss[i]=='+')||(ss[i]=='-'))\/\/扫描加减号{flag = 1;...

怎样用c语言编一个简单的计算器?最简单的
\/\/算术表达式求值 char c,x,theta,prec; \/\/c是每次读取的字符,x是存放脱括号后的多余的括号,theta是运算符,prec是c的前一个字符 float a,b,result;\/\/a、b是每次从运算数栈中取出的要进行运算的数,result存放最终结果 float cc,flag,ii,minus=1; \/\/cc存放由字符串转化而来的浮点数,flag用于标记是否已读...

...要求从键盘上输入两个浮点数,计算它们的加减乘除运算结果
include<stdio.h>void main() { float x,y,z; char c; scanf("%f%c%f",&x,&c,&y); switch ( c ) { case '+': z=x+y; break; case '-': z=x-y; break; case '*': z=x*y; break; case '\/': z=( y==0 )?(0):(x\/y); break; default:...

相似回答