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

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

//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+(54+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]==-15000000)//出现乘法

{

a[i-1]=a[i-1]a[i+1];

mov(i);

} //if over

if (a[i]==-16000000) //出现除法

{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]==-13000000) //出现加法

{

a[j-1]=a[j-1]+a[j+1];

mov(j);

}// if over

if (a[j]==-14000000) //出现除法

{

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]==-12000000 ) //出现“)”

{

at=m; //用at标记住“)”的下标

}

if (a[m]==-11000000) //出现“(”

{p=m; //用p标记住“(”的下标,连续出现了(),计算()内的表达式值

jisuan(at,p) ;

}//if 完

}//扫描()结束

//如果没有()则直接调用jisuan( )

//把两个指针放回到表达式的首尾,

jisuan(at,p);

}//gover结束

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

int main() //主调函数

{calculate example; //创建一个对象

examplegover( ); //对象调用gover

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

return 0;

}

//改进目标:第一,实现用户输入运算表达式

// 第二,实现对表达式的正确性进行扫描

//第三,用Mfc把用户界面设计出来

//

//存在的问题:

//第一,参数传递中有很多不理解的东西

//第二,由于第一个原因p,at迫于无奈做成了全局的变量,因为全局变量过多

//第三,结构化程序不够高,没有把面向对象的思想最大的发挥出来

//针对以上三点,下一步努力改进

======================

还有一个:

# include <windowsh>

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;

wndclassstyle = CS_HREDRAW | CS_VREDRAW;

wndclasslpfnWndProc = WndProc;

wndclasscbClsExtra = 0;

wndclasscbWndExtra = DLGWINDOWEXTRA;

wndclasshInstance = hinst;

wndclasshIcon = LoadIcon(NULL,IDI_APPLICATION);

wndclasshCursor = LoadCursor(NULL,IDC_ARROW);

wndclasshbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);

wndclasslpszMenuName = NULL;

wndclasslpszClassName = 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 msgwParam;

}

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);

}

这个你参考一下。

import javaxswing;

//import javaxswingevent;

import javaawt;

import javaawtevent;

//计算器显示结果的窗体

class Result extends JPanel

{

JTextField text = new JTextField("0"); //text先是输入和结果

Result()

{

textsetHorizontalAlignment(SwingConstantsRIGHT); //讲输入的数字或得到的结果在text的右边显示

textsetEnabled(false); //文本框不能编辑

setLayout(new BorderLayout()); //设定布局管理器边框布局

add(text, BorderLayoutCENTER); //text放置在窗体的中间

}

}

//计算器数字按钮定义面板

class Number_Key extends JPanel

{

JButton zero = new JButton("0");//数字键0

JButton one = new JButton("1");//数字键1

JButton two = new JButton("2");//数字键2

JButton three = new JButton("3");//数字键3

JButton four = new JButton("4");//数字键4

JButton five = new JButton("5");//数字键5

JButton six = new JButton("6");//数字键6

JButton seven = new JButton("7");//数字键7

JButton eight = new JButton("8");//数字键8

JButton nine = new JButton("9");//数字键9

JButton plus = new JButton("+");

JButton sub = new JButton("-");

JButton mul = new JButton("");

JButton div = new JButton("/");

JButton equal = new JButton("=");

JButton ce = new JButton("ce");//置零键

JButton point = new JButton("");

JButton tzero = new JButton("00");

Number_Key()

{

setLayout(new GridLayout(6, 3, 10, 10));//定义布局管理器为网格布局

//添加各个按钮键

add(seven);

add(eight);

add(nine);

add(four);

add(five);

add(six);

add(one);

add(two);

add(three);

add(zero);

add(tzero);

add(plus);

add(sub);

add(mul);

add(div);

add(point);

add(equal);

add(ce);

}

}

//计算器主类

class sakura extends JFrame implements ActionListener

{

Result result = new Result();//定义text的面板

Number_Key number_key = new Number_Key();//定义按钮面板

//当点击按钮+、-、、/时,com = true

boolean com = false;

//当i=0时说明是我们第一次输入,字符串sum不会累加

int i = 0;

//存放text的内容

String sum = "";

//存放点击按钮+、-、、/之前的数值

double total = 0;

//+、-、、/的代号分别为1,2,3,4

int symbol = 0;

sakura()

{

super("Calculator");//设定标题

setDefaultCloseOperation(JFrameEXIT_ON_CLOSE);//设定关闭窗体时退出程序

JPanel pane = new JPanel();//定义主面板

panesetLayout(new BorderLayout());

paneadd(result, BorderLayoutNORTH);

paneadd(number_key, BorderLayoutSOUTH);

number_keyoneaddActionListener(this);//对1按钮添加监听事件

number_keytwoaddActionListener(this);//对2按钮添加监听事件

number_keythreeaddActionListener(this);//对3按钮添加监听事件

number_keyfouraddActionListener(this);//对4按钮添加监听事件

number_keyfiveaddActionListener(this);//对5按钮添加监听事件

number_keysixaddActionListener(this);//对6按钮添加监听事件

number_keysevenaddActionListener(this);//对7按钮添加监听事件

number_keyeightaddActionListener(this);//对8按钮添加监听事件

number_keynineaddActionListener(this);//对9按钮添加监听事件

number_keyzeroaddActionListener(this);//对0按钮添加监听事件

number_keyceaddActionListener(this);//对置零按钮添加监听事件

number_keyplusaddActionListener(this);//对+按钮添加监听事件

number_keyequaladdActionListener(this);//对=按钮添加监听事件

number_keysubaddActionListener(this);//对-按钮添加监听事件

number_keymuladdActionListener(this);//对按钮添加监听事件

number_keydivaddActionListener(this);//对/按钮添加监听事件

number_keytzeroaddActionListener(this);//对00按钮添加监听事件

number_keypointaddActionListener(this);//对按钮添加监听事件

setContentPane(pane);

pack();//初始化窗体大小为正好盛放所有按钮

}

//各个按钮触发的事件

public void actionPerformed(ActionEvent e) {

/如果是点击数字按钮那么先要判断是否在此之前点击了+、-、、/、=,如果是那么com=true

如果没有com= false;或者是否点击数字键,如果是i = 1,如果没有 i = 0;

/

if (egetSource() == number_keyone)

{

if (com || i == 0)

{

resulttextsetText("1");

com = false;

i = 1;

}

else

{

sum = resulttextgetText();

resulttextsetText(sum + "1");

}

}

else if (egetSource() == number_keytwo)

{

if (com || i == 0)

{

resulttextsetText("2");

com = false;

i = 1;

}

else

{

sum = resulttextgetText();

resulttextsetText(sum + "2");

}

}

else if (egetSource() == number_keythree)

{

if (com || i == 0)

{

resulttextsetText("3");

com = false;

i = 1;

}

else

{

sum = resulttextgetText();

resulttextsetText(sum + "3");

}

}

else if (egetSource() == number_keyfour)

{

if (com || i == 0)

{

resulttextsetText("4");

com = false;

i = 1;

}

else

{

sum = resulttextgetText();

resulttextsetText(sum + "4");

}

}

else if (egetSource() == number_keyfive)

{

if (com || i == 0)

{

resulttextsetText("5");

com = false;

i = 1;

}

else

{

sum = resulttextgetText();

resulttextsetText(sum + "5");

}

}

else if (egetSource() == number_keysix)

{

if (com || i == 0)

{

resulttextsetText("6");

com = false;

i = 1;

}

else

{

sum = resulttextgetText();

resulttextsetText(sum + "6");

}

}

else if (egetSource() == number_keyseven)

{

if (com || i == 0)

{

resulttextsetText("7");

com = false;

i = 1;

}

else

{

sum = resulttextgetText();

resulttextsetText(sum + "7");

}

}

else if (egetSource() == number_keyeight)

{

if (com || i == 0)

{

resulttextsetText("8");

com = false;

i = 1;

}

else

{

sum = resulttextgetText();

resulttextsetText(sum + "8");

}

}

else if (egetSource() == number_keynine)

{

if (com || i == 0)

{

resulttextsetText("9");

com = false;

i = 1;

}

else

{

sum = resulttextgetText();

resulttextsetText(sum + "9");

}

}

/对于0这个按钮有一定的说法,在我的程序里不会出现如00000这样的情况,我加了判断条件就是

如果text中的数值=0就要判断在这个数值中是否有存在如果有那么就在原来数值基础之上添

加0;否则保持原来的数值不变

/

else if (egetSource() == number_keyzero)

{

if (com || i == 0)

{

resulttextsetText("0");

com = false;

i = 1;

}

else

{

sum = resulttextgetText();

if (FloatparseFloat(sum) > 0 || FloatparseFloat(sum) < 0)

{

resulttextsetText(sum + "0");

}

else

{

if (sumtrim()indexOf("") == -1)

{

resulttextsetText(sum);

}

else

{

resulttextsetText(sum + "0");

}

}

}

}

else if (egetSource() == number_keyce)

{

resulttextsetText("0");

i = 0;

com = true;

}

else if (egetSource() == number_keytzero)

{

if (com || i == 0)

{

resulttextsetText("0");

com = false;

i = 1;

}

else

{

sum = resulttextgetText();

if (FloatparseFloat(sum) > 0 || FloatparseFloat(sum) < 0)

{

resulttextsetText(sum + "00");

}

else

{

if (sumtrim()indexOf("") == -1)

{

resulttextsetText(sum);

}

else

{

resulttextsetText(sum + "00");

}

}

}

}

/本程序不会让一个数值中出现2个以上的小数点具体做法是:判断是否已经存在存在就不添加,

不存在就添加

/

else if (egetSource() == number_keypoint)

{

if (com || i == 0)

{

resulttextsetText("0");

com = false;

i = 1;

}

else

{

sum = resulttextgetText();

if (sumtrim()indexOf("") == -1)

{

resulttextsetText(sum + "");

}

else

{

resulttextsetText(sum);

}

}

}

//获得点击+之前的数值

else if (egetSource() == number_keyplus)

{

com = true;

i = 0;

total = DoubleparseDouble(resulttextgetText());

symbol = 1;

}//获得点击-之前的数值

else if (egetSource() == number_keysub)

{

com = true;

i = 0;

total = DoubleparseDouble(resulttextgetText());

symbol = 2;

}//获得点击之前的数值

else if (egetSource() == number_keymul)

{

com = true;

i = 0;

total = DoubleparseDouble(resulttextgetText());

Systemoutprintln(total);

symbol = 3;

}//获得点击/之前的数值

else if (egetSource() == number_keydiv)

{

com = true;

i = 0;

total = DoubleparseDouble(resulttextgetText());

symbol = 4;

}

else if (egetSource() == number_keyequal)

{

switch (symbol)

{

case 1 ://计算加法

{

double ad =

total + DoubleparseDouble(resulttextgetText());

resulttextsetText(ad + "");

i = 0;

sum = "";

break;

}

case 2 ://计算减法

{

double ad =

total - DoubleparseDouble(resulttextgetText());

resulttextsetText(StringvalueOf(ad));

i = 0;

sum = "";

break;

}

case 3 ://计算乘法

{

double ad =

total DoubleparseDouble(resulttextgetText());

resulttextsetText(ad + "");

i = 0;

sum = "";

break;

}

case 4 ://计算除法

{

double ad =

total / DoubleparseDouble(resulttextgetText());

resulttextsetText(ad + "");

i = 0;

sum = "";

break;

}

}

Systemoutprintln(com);

}

}

public static void main(String[] args)

{

sakura ww = new sakura();

wwsetVisible(true) ;

}

}

import javaawt;

import javaawteventActionEvent;

import javaawteventActionListener;

import javaxswing;public class CaculatorA {

private JFrame jf;

private JButton[] jbs;

private JTextField jtf;

private JButton clear;

private double num1,num2,jieguo;

private char c;

/

构造方法实例化属性

/

public CaculatorA(){

jf=new JFrame("我的计算器v10");

jtf=new JTextField(20);

clear=new JButton("clear");

jbs=new JButton[16];

String str="123+456-7890/=";

for(int i=0; i<strlength(); i++){

jbs[i]=new JButton(strcharAt(i)+"");

}

init();

addEventHandler();

// setFont();

// setColor();

showMe();

}

/

以上就是关于急求一个计算器的源程序,要求:完整输入数学表达式(数字加减乘除括号)按=显示结果.JAVA或C++的都可以全部的内容,包括:急求一个计算器的源程序,要求:完整输入数学表达式(数字加减乘除括号)按=显示结果.JAVA或C++的都可以、用JAVA编写的科学计算器源代码、Java计算器源代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9968920.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存