⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calc.c

📁 PDA程序开发PDA程序开发PDA程序开发PDA程序开发PDA程序开发PDA程序开发PDA程序开发PDA程序开发
💻 C
📖 第 1 页 / 共 2 页
字号:
}

/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□---计算器等号处理---------------------------------------------------□
□                                                                    □
□---2001.3.4---------------------------------------------------------□
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
void CalcEqual(void)
{
	unsigned char i=calc.status;
	if(i>=1&&i<=3)
	{
		if(i==1)StrCopy(calc.OldIn,calc.InOne);
		else StrCopy(calc.OldIn,calc.InTwo);
	}
	switch(calc.Opt)
	{
	case DIV:StrDIV(calc.InOne,calc.InOne,calc.OldIn);break;
	case MUT:StrMUT(calc.InOne,calc.InOne,calc.OldIn);break;
	case SUB:StrSUB(calc.InOne,calc.InOne,calc.OldIn);break;
	case ADD:StrADD(calc.InOne,calc.InOne,calc.OldIn);break;
	case 0:return;
	}
	calc.InTwo[0]='+';
	calc.InTwo[1]=0;
	calc.OldOpt=calc.Opt;
	calc.Opt=0;
	calc.status=5;
}
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□---操作符处理-------------------------------------------------------□
□                                                                    □
□---2001.3.1---------------------------------------------------------□
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
unsigned char * CalcOpp(void)
{
	unsigned char *s;
	if(calc.Opt)
	{
		s=calc.InTwo;
		calc.status=3;
	}
	else
	{
		s=calc.InOne;
		calc.status=4;
	}
	return s;
}
void CalcOperate(unsigned char i)
{
	unsigned char *ss;
	unsigned char *s;
	unsigned char b[3];
	short k;
	if(calc.status==8&&i!=CE&&i!=CC)return;
	switch(i)
	{
	case UNDO:
		if(calc.status==0||calc.status==2)
		{
			s=(calc.Opt)?&calc.InTwo[1]:&calc.InOne[1];
			if(!calc.Opt)calc.status=0;
			if(*s)
			{
				while(*++s);
				*--s=0;
			}
		}
		break;
	case CE:
		*calc.InTwo='+';
		calc.InTwo[1]=0;
		if(calc.status==8||!calc.Opt)InitCalc();
		break;
	case CC:InitCalc();break;

	case MC:
		s=CalcOpp();
		*calc.M='+';
		calc.M[1]=0;
		break;
	case MR:
		if(StrToDouble(calc.M)!=0.0)
		{
			s=CalcOpp();
			StrCopy(s,calc.M);
		}
		break;
	case MS:
		s=CalcOpp();
		StrSUB(calc.M,calc.M,s);
		for(k=0,ss=calc.M;*ss;ss++){
			if(*ss=='.')break;
			k++;
		}
		if((k-1)>MAXNUM){
			StrADD(calc.M,calc.M,s);
			calc.M[12]=0;
			calc.status=8;
		}
		break;
	case MA:
		s=CalcOpp();
		StrADD(calc.M,calc.M,s);
		for(k=0,ss=calc.M;*ss;ss++){
			if(*ss=='.')break;
			k++;
		}
		if((k-1)>MAXNUM){
			StrSUB(calc.M,calc.M,s);
			calc.M[12]=0;
			calc.status=8;
		}
		break;
	case DIV:/*/*/
	case MUT:/***/
	case SUB:/*-*/
	case ADD:/*+*/
		if(calc.Opt&&calc.status!=1)CalcEqual();
		calc.Opt=i;
		calc.status=1;
		break;
	case ROOT:
		calc.OldOpt=0;
		if(calc.status==1)
		{
			StrROOT(calc.InTwo,calc.InOne);
			calc.status=3;
		}
		else
		{
			s=CalcOpp();
			StrROOT(s,s);
		}
		break;
	/*case PERCENT:break;*/
	case RECIPROCAL:/*倒数*/
		calc.OldOpt=0;
		b[0]='+';b[1]='1';b[2]=0;
		if(calc.status==1)
		{
			StrDIV(calc.InTwo,b,calc.InOne);
			calc.status=3;
		}
		else
		{
			s=CalcOpp();
			StrDIV(s,b,s);
		}
		break;
	case P_N:/*+/-*/
		if(calc.Opt)*calc.InTwo=(*calc.InTwo=='-')?'+':'-';
		else *calc.InOne=(*calc.InOne=='-')?'+':'-';
		break;
	case '=':
		if((calc.status==4)&&calc.OldOpt)calc.Opt=calc.OldOpt;
		if(calc.Opt)CalcEqual();
		break;
	}
}
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□---当前操作数插入数字-----------------------------------------------□
□                                                                    □
□---2001.3.1---------------------------------------------------------□
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
void InputAddNum(unsigned char i,unsigned char *s)
{
	unsigned char num;
	if(calc.status==8)return;
	if(calc.status==4){calc.InOne[0]='+';calc.InOne[1]=0;}
	else if(calc.status==3){calc.InTwo[0]='+';calc.InTwo[1]=0;}
	calc.status=(calc.Opt)?2:0;
	if(*s)
	{
		if(*s=='0'&&s[1]==0){*s++=i;*s=0;}
		else
		{
			num=1;
			while(*(++s))
			{
				if(*s!='.')num++;
				if(num>=MAXNUM)return;
			}
			*s++=i;
			*s=0;
		}
	}
	else {*s++=i;*s=0;}
}
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□---当前操作数插入小数点---------------------------------------------□
□                                                                    □
□---2001.3.1---------------------------------------------------------□
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
void InputAddDot(unsigned char *s)
{
	if(calc.status==8)return;
	if(calc.status==4){calc.InOne[0]='+';calc.InOne[1]=0;}
	else if(calc.status==3){calc.InTwo[0]='+';calc.InTwo[1]=0;}
	calc.status=(calc.Opt)?2:0;
	if(*s)
	{
		while(*(++s))if(*s=='.')return;
		*s++='.';
		*s=0;
	}
	else{*s++='0';*s++='.';*s=0;}
}
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□---计算器面板按钮功能处理函数---------------------------------------□
□                                                                    □
□---2001.3.1---------------------------------------------------------□
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
void CalcInput(unsigned char i)
{
	unsigned char *s;
	s=(calc.Opt)?&calc.InTwo[1]:&calc.InOne[1];
	if(i>='0'&&i<='9')InputAddNum(i,s);
	else if(i=='.')InputAddDot(s);
	else CalcOperate(i);
	CalcShow();
}


/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□  图象数据数组 generated by 《PdaTools-BmpToGray.exe》
□  图象数据头部(有)长度为6字节的DATAHEAD结构。
□  扫描模式:0(0:水平 1:垂直 2:字节垂直,数据水平 3:字节水平,数据垂直 4:Nucleus)
□  灰度:    4(1:单色 2:四灰 4:十六灰 8:256色)
□  宽度:    16
□  高度:    11
□---2001.10.9--15:28----------------------------------------------------
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
const unsigned char Image_Root[94]={0,4,16,0,11,0,
34,34,34,42,170,170,170,170,34,34,34,42,34,34,34,34,34,34,34,162,
34,34,34,34,34,34,34,162,34,34,34,34,34,34,34,162,34,34,34,34,34,
34,42,34,34,34,34,34,34,34,42,34,34,34,34,34,42,34,42,34,34,34,34,
34,162,162,162,34,34,34,34,34,162,42,162,34,34,34,34,34,34,34,162,
34,34,34,34,34,};
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□  图象数据数组 generated by 《PdaTools-BmpToGray.exe》
□  图象数据头部(有)长度为6字节的DATAHEAD结构。
□  扫描模式:0(0:水平 1:垂直 2:字节垂直,数据水平 3:字节水平,数据垂直 4:Nucleus)
□  灰度:    4(1:单色 2:四灰 4:十六灰 8:256色)
□  宽度:    14
□  高度:    11
□---2001.10.9--15:29----------------------------------------------------
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
const unsigned char Image_Reciprocal[83]={0,4,14,0,11,0,
34,34,34,42,34,34,34,42,34,34,42,34,34,34,170,34,34,162,42,162,170,
42,34,34,162,34,162,162,42,34,34,162,34,162,162,42,34,42,34,34,42,
34,42,34,42,34,34,42,34,42,34,42,34,34,162,162,42,34,162,34,34,162,
162,170,162,162,34,42,162,170,34,34,162,34,34,34,34,};
const unsigned char CalcButtonID[]={
MA,/*M+*/'7',/*7*/'8',/*8*/'9',/*9*/DIV,/*/*/ROOT,/*√ˉ*/CC,/*C*/
MS,/*M-*/'4',/*4*/'5',/*5*/'6',/*6*/MUT,/***/RECIPROCAL,/*1/x*/CE,/*CE*/
MR,/*MR*/'1',/*1*/'2',/*2*/'3',/*3*/SUB,/*-*/'=',/*=*/UNDO,/*退格*/
MC,/*MC*/'0',/*0*/P_N,/*+/-*/'.',/*.*/ADD,/*+*/
};
const unsigned char CalcButtonStr[][6]={
"M+","7","8","9","÷","√ˉ","C",
"M-","4","5","6","×","1/x","CE",
"MR","1","2","3","-","=","退格",
"MC","0","±",".","+",
};
const PDARECT CalcButtonRc[26]={
{7,133,29,153,},/*M+*/
{35,61,56,81,},/*7*/
{59,61,80,81,},/*8*/
{83,61,104,81,},/*9*/
{107,61,129,81,},/*/*/
{132,61,154,81,},/*√ˉ*/
{132,36,153,56,},/*C*/
{7,109,29,129,},/*M-*/
{35,85,56,105,},/*4*/
{59,85,80,105,},/*5*/
{83,85,104,105,},/*6*/
{107,85,129,105,},/***/
{132,85,154,105,},/*1/x*/
{107,36,129,56,},/*CE*/
{7,85,29,105,},/*MR*/
{35,109,56,129,},/*1*/
{59,109,80,129,},/*2*/
{83,109,104,129,},/*3*/
{107,109,129,129,},/*-*/
{132,109,154,153,},/*=*/
{59,36,104,56,},/*退格*/
{7,61,29,81,},/*MC*/
{35,133,56,153,},/*0*/
{59,133,80,153,},/*+/-*/
{83,133,104,153,},/*.*/
{107,133,129,153,},/*+*/
};
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□---计算器面板按钮获取函数-------------------------------------------□
□                                                                    □
□---2001.10.9---------------------------------------------------------□
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
short GetCalcButton(PDAMSG *pMsg)
{
	BUTTON b;
	short i,x,y;
	x=pMsg->x;
	y=pMsg->y;
	for(i=0;i<26;i++)if(CheckPointInRect(x,y,(PDARECT *)&CalcButtonRc[i]))
	{
		InitButton(&b,(PDARECT *)&CalcButtonRc[i],0);
		if(i!=5&&i!=12)SetButtonStr(&b,(unsigned char *)CalcButtonStr[i],COLOR_HIGHGRAY);
		else
		{
			SetButtonBmp(&b,(unsigned char *)(i==5?Image_Root:Image_Reciprocal),NULL);
		}
		if(GetButton(&b,pMsg))return i+100;
	}
	return MSG_NULL;
} 
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□---计算器入口函数---------------------------------------------------□
□                                                                    □
□---2001.10.9---------------------------------------------------------□
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
short Calc(void)
{
	void DrawButtonFrame(BUTTON *b,short f);
	short i;
	BUTTON b;
	PDAMSG msg;
	//计算器数据初始化。
	InitCalc();
	//清屏。
	DispBar(0,0,160,160,COLOR_BACK);
	//画外围框架。
	InitRect(0,0,159,159,&b.Rect);
	DrawButtonFrame(&b,0);
	//画计算器显示屏。
	InitRect(7,8,153,30,&b.Rect);
	DrawButtonFrame(&b,1);
	DispBar(9,10,143,19,COLOR_WHITE);
	//画一个填充空白区域的凹型框架。
	InitRect(7,36,56,56,&b.Rect);
	DrawButtonFrame(&b,1);
	//画计算器输入按钮。
	for(i=0;i<26;i++)
	{
		InitButton(&b,(PDARECT *)&CalcButtonRc[i],0);
		if(i!=5&&i!=12)SetButtonStr(&b,(unsigned char *)CalcButtonStr[i],COLOR_HIGHGRAY);
		else
		{
			SetButtonBmp(&b,(unsigned char *)(i==5?Image_Root:Image_Reciprocal),NULL);
		}
		DrawButton(&b,0);
	}
	//发送MSG_PAINT消息。
	msg.type=MSG_PAINT;
	SendMsg(&msg);
	while(1)
	{
		GetMsg(&msg);
		TranslateMsg(&msg);
		/*热键ICON退出*/
		if(msg.type>=80&&msg.type<90)return msg.type;
		switch(msg.type)
		{
		case MSG_EXIT:return MSG_EXIT;/*退出消息*/
		case MSG_LCD:/*位置消息*/
			i=GetCalcButton(&msg);
			if(i>=100)CalcInput(CalcButtonID[i-100]);
			break;
		case MSG_PAINT:/*绘制计算器显示屏图象*/
			CalcShow();
			break;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -