//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);
}
温馨提示:内容为网友见解,仅供参考
用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...
求一个用C++编过计算器的,就是那种加减乘除三角函数可以写一排算的
}\/\/将中缀表达式转换为后缀表达式(逆波兰式)void trans( char a[], char b[] ){ char stock[128]={0}; int top=0; int len=0; int i=0; int j=0; top = -1; j = -1; len = strlen(a); for ( i=0; i<len; i++ ) { switch( a[...
计算器上怎样输入数学表达式?
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用于标记是否已读...