亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? calculation.cpp

?? 最優化方法newton法求極值的vc++實現 環境:vs2008
?? CPP
字號:
// Calculation.cpp: implementation of the CCalculation class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Calculation.h"
#include "math.h"
#include "string.h"

//#include <string.h>

using namespace std; 

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#define FUNCNUM 15 //函數個數
#define CONSTNUM 11 //常數個數
#define E 2.7182818284590452353
#define PI 3.1415926535897932384


CCalculation::CCalculation()
{	//初始化函數和常數
	m_bDegree=0;
	m_nOutputFlag=0;
	opt[0]="e^";
	opt[1]="ch";
	opt[2]="sqr";
	opt[3]="sh";
	opt[4]="log";
	opt[5]="cos";
	opt[6]="sin";
	opt[7]="tan";
	opt[8]="ln";
	opt[9]="abs";
	opt[10]="at";
	opt[11]="as";
	opt[12]="ac";
	opt[13]="th";
	opt[14]="exp";
	opt2[0]='^';
	opt2[1]='/';
	opt2[2]='*';
	opt2[3]='%';
	opt2[4]='+';
	opt2[5]='-';
	m_strConValue[0]="3.1415926535897932384";	m_strConName[0]="PI";
	m_strConValue[1]="9.80665";					m_strConName[1]="GG";
	m_strConValue[2]="(8.988*10^9)";			m_strConName[2]="EF";
	m_strConValue[3]="0.02241383";				m_strConName[3]="VM";
	m_strConValue[4]="(1.380662*10^(-23))";		m_strConName[4]="BC";
	m_strConValue[5]="8.3144";					m_strConName[5]="MG";
	m_strConValue[6]="(6.6720*10^(-11))";		m_strConName[6]="GR";
	m_strConValue[7]="(6.022045*10^23)";		m_strConName[7]="NA";
	m_strConValue[8]="(2.99792458*10^8)";		m_strConName[8]="LS";
	m_strConValue[9]="(8.854187818*10^(-12))";	m_strConName[9]="DC";
	m_strConValue[10]="2.7182818284590452353";	m_strConName[10]="E";

}

CCalculation::~CCalculation()
{

}
bool CCalculation::IsDigital(CString str)   	//*判斷表達式中是否有函數或運算符*
{
	int i;
	while(str.GetAt(0)=='-') str.Delete(0);
	for(i=0;i<FUNCNUM;i++) if(str.Find(opt[i])!=-1) return 0;
	for(i=0;i<6;i++) if(str.Find(opt2[i])!=-1) return 0;
	return 1;
}

CString CCalculation::NtoS(double d)		//*數字轉字串*
{
	int  decimal, sign;
	char *buffer;
	CString temp;
	buffer = _ecvt( d, 16, &decimal, &sign );//轉換浮點數據到字符串,正返回sign=0負為1 ,decimal返回小數點在第一個數字的后幾位,第二個參數為返回字符串的位數,不足補0,去符號去小數點
	CString str=(LPCTSTR)buffer;
		temp=".";
	if(decimal>=0 && decimal<=16) str.Insert(decimal,temp);
	else if(decimal>16)
	{
		temp="0";
		for(int i=str.GetLength();i<decimal;i++) str+=temp;
		temp=".0";
		str+=temp;
	}
	else 
	{
		temp="0";
		for(int i=0;i<-decimal;i++)	str.Insert(0,temp);
		temp=".";
		str.Insert(0,temp);
	}
	temp="-";
	if(sign==1) str.Insert(0,temp);
	return str;
}
CString CCalculation::DeleteChar(CString str,int pos,int NUM)//刪除從pos開始的NUM個字符
{
	int len=str.GetLength();
	CString str1;
	str1=="";
	for(int i=0;i<len;i++)
	{
		if((i>=pos)&&(i<NUM)); 
			
		else 	str1=str1+str.GetAt(i);
	}

	return str1;
		

}



double CCalculation::StoN(CString str)		//*字串轉數字*
{
	char   *stopstring;
	double x;
    x = strtod(str.GetBuffer(0), &stopstring );
	m_strTmp=stopstring;
	return x;
}

CString CCalculation::TwoE(CString strExp)		//*二元運算*
{
	double x2,y,x1=StoN(strExp);
	strExp=m_strTmp;
	char op=strExp.GetAt(0);
	strExp.Delete(0);
	x2=StoN(strExp);
	if(m_strTmp!="") return "ERROR_"+m_strTmp+"未知符號_";
	if(op=='+') {y=x1+x2;}
	else if(op=='*') {y=x1*x2;}
	else if(op=='-') {y=x1-x2;}
	else if(op=='^') {y=pow(x1,x2);}
	else if(op=='/') {y=x1/x2;}
	else if(op=='%') {y=fmod(x1,x2);}
	else return "ERROR_"+m_strTmp+"未知運算符_";
	return NtoS(y);
}

CString CCalculation::SingleE(CString op,double dx)		//*一元運算*
{
	if(op=="ln") 
	{
		return NtoS(log(dx));
	}
	else if(op=="log") 
	{
		return NtoS(log10(dx));
	}
	else if(op=="sqr") 
	{
		return NtoS(sqrt(dx));
	}
	else if(op=="e^") 
	{
		return NtoS(exp(dx));
	}
	else if(op=="abs") 
	{
		return NtoS(fabs(dx));
	}
	else if(op=="ac") 
	{
		return NtoS(acos(dx));
	}
	else if(op=="as") 
	{
		return NtoS(asin(dx));
	}
	else if(op=="at") 
	{
		return NtoS(atan(dx));
	}

	if(m_bDegree) dx=dx*PI/180;
	if(op=="tan") 
	{
		return NtoS(tan(dx));
	}
	else if(op=="sin") 
	{	
		return NtoS(sin(dx));			
	}
	else if(op=="cos") 
	{
		return NtoS(cos(dx));		
	}
	else if(op=="cot") 
	{
		return NtoS(1/tan(dx));		
	}
	else if(op=="sh") 
	{
		return NtoS(sinh(dx));				
	}	
	else if(op=="ch") 
	{
		return NtoS(cosh(dx));
	}
	else if(op=="th") 
	{
		return NtoS(sinh(dx)/cosh(dx));
	}
	else if(op=="exp") 
	{
		return NtoS(pow(10,dx));
	}
	return "ERROR"+op+"_未知函數_";
}

int CCalculation::LocateLBra(CString strExp)			//*定位最后一個左括號*
{
	int len=strExp.GetLength();
	int pos=-1;
	for(int i=0;i<len;i++)
	{
		if(pos>=0 && strExp.GetAt(i)==')') break;
		if(strExp.GetAt(i)=='(')
		{
			pos=i;
		}
	}
	return pos;
}

void CCalculation::DelBracket(CString *strExp)		//*用計算結果替換表達式*
{
	int pos=LocateLBra(*strExp);
	int i,len=strExp->GetLength();
	CString temp;
	temp="ERROR_無效表達式_";
	if(pos==-1) {*strExp=temp;return;}
	for(i=pos;i<len;i++) if(strExp->GetAt(i)==')') break;
	CString str;
	str=strExp->Mid(pos+1,i-pos-1);
	MultiE(&str);
	strExp->Delete(pos,i-pos+1);
	strExp->Insert(pos,str);
}

void CCalculation::MultiE(CString *strExp)			//*多元運算*
{
	int i;
	CString temp,temp1;
	temp="ERROR_函數表達式為空_";
	if(strExp->IsEmpty()) *strExp=temp;
	if(IsDigital(*strExp)) {return;}
	while(1)/*處理所有的一元運算*/
	{
		for( i=0;i<FUNCNUM;i++)
		{
			int pos=strExp->Find(opt[i]);
			if(pos!=-1)
			{
				CString str=strExp->Right(strExp->GetLength()-pos-opt[i].GetLength());
				double dx=StoN(str);
				temp="ERROR";
				temp1="_無法識別的函數_";
				if(m_strTmp==str) {*strExp=temp+str+temp;return;}
				strExp->Delete(pos,strExp->GetLength()-pos);
				*strExp+=SingleE(opt[i],dx)+m_strTmp;
				MinusMinus(strExp);
				if(pos>=1)
				{
					char ch=strExp->GetAt(pos-1);
					if(ch>=48 && ch<=57)
						temp="ERROR_缺少二元運算符_";
					{*strExp=temp;return;}
				}
				break;
			}
		}
		if(i==FUNCNUM) break;
	}
	//按運算符優先級處理二元運算
	int pos=-1;
	while(1)
	{
		pos=strExp->Find('^');
		if(pos==-1) break;
		else Calcu(strExp,pos);
	}
	while(1)
	{
		pos=strExp->Find('/');
		if(pos==-1) break;
		else Calcu(strExp,pos);
	}
	while(1)
	{
		pos=strExp->Find('*');
		if(pos==-1) break;
		else Calcu(strExp,pos);
	}
	while(1)
	{
		pos=strExp->Find('%');
		if(pos==-1) break;
		else Calcu(strExp,pos);
	}
	pos=0;
	if(strExp->GetAt(0)=='-' ||strExp->GetAt(0)=='+') strExp->Insert(0,"0");
	while(1)
	{
		int tmpos=strExp->Right(strExp->GetLength()-pos).Find('-');
		if(tmpos==-1) break;
		else pos+=tmpos;
		if(pos==0 && strExp->GetAt(pos+1)=='-' || pos>0)
		{
			if(strExp->GetAt(pos+1)=='+')
			{
				strExp->Delete(pos+1);
				pos=0;
				continue;
			}
			/*********處理連減(如:----1)的情況***********/
			int nCount=0;
			while(1)
			{
				if(++pos>0)
				{
					if(strExp->GetAt(pos)!='-') break;
					else nCount++;
				}
				else break;
			}
			if(nCount>0) 
			{
				strExp->Delete(pos-nCount-1,nCount+1);
				if(nCount%2==0) strExp->Insert(pos-nCount-1,"-");
				else if(pos-nCount-1>0) strExp->Insert(pos-nCount-1,"+");
				pos=0;
				continue;
			}
			else pos--;
			/***********************************************/
			if(pos>0 && strExp->GetAt(pos-1)=='+') 
			{
				pos++;
				continue;
			}
			Calcu(strExp,pos);
		}
		else pos++;
	}
	pos=0;
	while(1)
	{
		pos=strExp->Find('+');
//		int tmpos=strExp->Right(strExp->GetLength()-pos).Find('+');
		if(pos==-1) break;
//		else pos+=tmpos;
		if(pos==0 && strExp->GetAt(pos+1)=='+' || pos>0)
		{
			/*********處理連加(如:++++1)的情況***********/
			int nCount=0;
			while(1)
			{
				if(++pos>0)
				{
					if(strExp->GetAt(pos)!='+') break;
					else nCount++;
				}
				else break;
			}
			if(nCount>0) 
			{
				strExp->Delete(pos-nCount-1,nCount+1);
				strExp->Insert(pos-nCount-1,"+");
				pos=0;
				continue;
			}
			else pos--;
			/***********************************************/
			Calcu(strExp,pos);
		}
		else pos++;
	}
}

void CCalculation::Calcu(CString *strExp,int pos)		//*二元運算的預處理函數*
{
	char ch;
	int j,k;
	CString temp;
	temp="ERROR_缺少參數_";
	for(j=pos-1;j>=0;j--)
	{
		ch=strExp->GetAt(j);
		if(ch=='+' ||ch=='-' ||ch=='*'||ch=='/' ||ch=='%' ||ch=='^' )
		{
			if(j==0 && ch!='-') {*strExp=temp;return;}
			if(j==0 && ch=='-') j=-1;//防止把負號誤判為減號
			else if(j>0 && ch=='-' && !IsDigital(strExp->Mid(j-1,1))) j--;
			break;
		}
	}
	for( k=pos+1;k<strExp->GetLength();k++)
	{
		ch=strExp->GetAt(k);
		if(ch=='+' ||ch=='-' ||ch=='*'||ch=='/' ||ch=='%' ||ch=='^' )
		{
			if(ch=='-' && k>pos+1) break;
			if(ch=='-' && k>0 &&  IsDigital(strExp->Mid(k+1,1)) ) k++;
			else break;
		}
	}
	CString strExp2=strExp->Mid(j+1,k-j-1);
	*strExp=strExp->Left(j+1)+TwoE(strExp2)+strExp->Right(strExp->GetLength()-k);
	if(strExp->Find("#IN")!=-1) {*strExp="ERROR_結果有溢出或值域越界_";return;}
	if(!SynRes(strExp)) {*strExp="ERROR_缺少運算符_";return;}
	MinusMinus(strExp);
}

CString CCalculation::MainPro(CString strExp,double x)		//*主處理函數*
{
	if(strExp.IsEmpty()) return "表達式不能為空";
	Macro(&strExp);
	strExp.MakeLower(); //表達式全部小寫
	//string &erase(int pos = 0, int n = npos);//刪除pos開始的n個字符,返回修改后的字符串 
	//	strExp=strExp.&erase(0,2);//
	//strExp=DeleteChar(strExp,0,2);
	/**********給表達式加上保護括號************/
	CString str1=NtoS(x);
	strExp.Replace("x",str1);
	strExp.Insert(0,"(");
	strExp+=")";
	/******************************************/
	int pos=strExp.Find(" ");
	int n=BraCheck(strExp);     //*計算左右括號的差值*
	CString str;
	str.Format("%d",abs(n));
	if(n==1) strExp+=")";
	else if(n==-1) strExp.Insert(0,"(");
	else if(n>0) return "缺少"+str+"個右括號";
	else if(n<0) return "缺少"+str+"個左括號";
	while(pos!=-1) //去掉表達式中的空格符
	{
		strExp.Delete(pos);
		pos=strExp.Find(" ");
	}

	while(!IsDigital(strExp))//*判斷表達式中是否有函數或運算符*
	{
		DelBracket(&strExp);//*用計算結果替換表達式*
		if(!SynRes(&strExp)) return strExp;//*判斷表達式是否合法*
	}
	if(!SynRes(&strExp)) return strExp;	//*判斷表達式是否合法*
	else return ModiResult(strExp);//*在格式上處理最后的計算結果*

}

void CCalculation::Macro(CString *strExp)			//*常數宏代換*
{
	int pos;
	for(int i=0;i<CONSTNUM;i++)
	{
		pos=strExp->Find(m_strConName[i]);
		while(pos!=-1)
		{
			strExp->Delete(pos,m_strConName[i].GetLength());
			strExp->Insert(pos,m_strConValue[i]);
			if(pos>=1)
			{
				char ch=strExp->GetAt(pos-1);
				if(ch>=48 && ch<=57 || ch==41)
				{*strExp="缺少二元運算符";return;}
			}
			pos=strExp->Find(m_strConName[i]);
		}
	}
}

CString CCalculation::ModiResult(CString strRes)    	//*在格式上處理最后的計算結果*
{
	int i;
	if(strRes.Find("#IN")!=-1) return "結果有溢出或值域越界";
	/*****************去掉保護括號**********************/
	if(strRes.GetAt(0)=='(') strRes.Delete(0);
	if(strRes.GetAt(strRes.GetLength()-1)==')') strRes.Delete(strRes.GetLength()-1);
	/***************************************************/
	int pos=strRes.Find(".");CString str;
	str=="";
	if(pos!=-1)
	{
		if(pos==0) strRes="0"+strRes;
		else if(strRes.GetAt(0)=='-' && strRes.GetAt(1)=='.') strRes.Insert(1,"0");
	}
	if(pos>16)
	{
		strRes.Delete(pos);
		strRes.Insert(1,".");
		str.Format("%d",pos-1);
		str=" E"+str;
	}
	pos=strRes.Find(".");
	if(pos==0 || pos==1 && strRes.GetAt(0)=='0')
	{
		for(i=pos+1;i<strRes.GetLength();i++)
		{
			if(strRes.GetAt(i)!='0') break;
		}
		if(i>4)
		{
			str.Format(" E-%d",i-2);
			strRes.Delete(pos,i-1);
			strRes.Insert(1,".");
		}
	}
	strRes=strRes.Left(pos+16)+str;//截取小數點后16位
	return strRes;
}

bool CCalculation::SynRes(CString *strExp)			//*判斷表達式是否合法*
{
	int pos=strExp->Find("ERROR");
	if(pos!=-1)
	{
		pos=strExp->ReverseFind('_');
		strExp->Delete(pos,strExp->GetLength()-pos);
		pos=strExp->ReverseFind('_');
		strExp->Delete(0,pos+1);
		return 0;
	}
	return 1;
}

void CCalculation::MinusMinus(CString *strExp)		//*處理負負得正*
{
	int pos=strExp->Find("--");
	if(pos!=-1)
	{
		strExp->Delete(pos,2);
		strExp->Insert(pos,"+");
		if(strExp->GetAt(0)=='+') strExp->Delete(0);
	}
}

int CCalculation::BraCheck(CString str)				//*計算左右括號的差值*
{
	int lb=0,rb=0,len=str.GetLength();
	for(int i=0;i<len;i++)
	{
		if(str.GetAt(i)=='(') lb++;
		else if(str.GetAt(i)==')') rb++;
	}
	return lb-rb;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成+人+亚洲+综合天堂| 日韩亚洲电影在线| 日韩欧美一级在线播放| 国产精品国产三级国产有无不卡| 五月激情综合色| 波多野结衣亚洲| 精品三级av在线| 亚洲高清免费一级二级三级| 国产不卡视频一区| 91精品国产综合久久久久久| 中文字幕日韩av资源站| 国内精品在线播放| 91麻豆精品久久久久蜜臀| 亚洲男同性恋视频| 成人免费av网站| 久久久久国产精品人| 日韩精品亚洲专区| 欧美综合一区二区| 亚洲欧美日韩中文字幕一区二区三区| 国内精品视频666| 日韩欧美国产一二三区| 亚洲午夜免费视频| 色先锋aa成人| 亚洲欧美激情小说另类| 9l国产精品久久久久麻豆| 久久精品在这里| 韩国女主播一区二区三区| 日韩精品中文字幕一区二区三区| 亚洲国产日韩av| 91豆麻精品91久久久久久| 自拍偷拍亚洲激情| 色婷婷综合中文久久一本| 亚洲人被黑人高潮完整版| av中文字幕不卡| 亚洲啪啪综合av一区二区三区| 成人福利视频在线看| 国产精品久久久久桃色tv| av一区二区三区| 亚洲免费av在线| 欧美视频一区二区三区四区| 亚洲一区二区在线播放相泽| 精品视频全国免费看| 天堂成人免费av电影一区| 制服丝袜日韩国产| 久久er99热精品一区二区| 久久―日本道色综合久久| 成人免费看视频| 亚洲精品ww久久久久久p站| 欧美综合视频在线观看| 蜜臀久久久久久久| 久久精品亚洲国产奇米99| 丁香六月久久综合狠狠色| 亚洲日本韩国一区| 欧美久久久一区| 韩国视频一区二区| 亚洲图片激情小说| 欧美日韩不卡在线| 韩国av一区二区三区在线观看| 中文字幕欧美日韩一区| 91女神在线视频| 奇米影视7777精品一区二区| 久久综合九色综合97婷婷女人 | 久久久久国产一区二区三区四区| 国产91在线观看丝袜| 亚洲影视在线观看| 欧美mv和日韩mv的网站| 9l国产精品久久久久麻豆| 午夜精品福利在线| 久久久久久久久久看片| 色婷婷综合久久久久中文一区二区 | 欧美精品三级在线观看| 黑人巨大精品欧美一区| 亚洲综合色视频| 久久综合九色综合97_久久久| 91网站在线观看视频| 美女在线一区二区| 亚洲欧洲日产国码二区| 欧美一级淫片007| 91亚洲精品久久久蜜桃网站| 日韩在线一区二区三区| 亚洲国产精品成人综合色在线婷婷| 欧美曰成人黄网| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 91丨porny丨在线| 精品夜夜嗨av一区二区三区| 玉米视频成人免费看| 国产人成一区二区三区影院| 欧美午夜不卡视频| 91女神在线视频| 国产激情91久久精品导航 | 666欧美在线视频| 91原创在线视频| 国产乱国产乱300精品| 日韩精品一卡二卡三卡四卡无卡| 亚洲日本成人在线观看| 国产午夜亚洲精品羞羞网站| 日韩免费视频一区| 在线播放亚洲一区| 在线精品视频小说1| av爱爱亚洲一区| 成人免费观看视频| 国产成人av在线影院| 久久精品国产第一区二区三区| 亚洲二区在线视频| 一区二区三区在线观看国产| 亚洲欧美在线另类| 国产欧美一区二区在线| 久久久午夜精品| 337p粉嫩大胆噜噜噜噜噜91av| 91麻豆精品国产91久久久使用方法| 91久久精品一区二区三区| 成人av影视在线观看| 懂色av一区二区三区免费观看| 国产又黄又大久久| 国内成人精品2018免费看| 美国三级日本三级久久99| 麻豆久久久久久| 精品午夜一区二区三区在线观看| 日本欧美大码aⅴ在线播放| 日韩va亚洲va欧美va久久| 日日夜夜免费精品| 免费观看久久久4p| 精品无人码麻豆乱码1区2区| 国产一区二区主播在线| 国产精品69毛片高清亚洲| 国产mv日韩mv欧美| 99精品桃花视频在线观看| 在线中文字幕一区| 在线播放中文字幕一区| 精品黑人一区二区三区久久| 久久久综合精品| 国产精品久久久久久久久免费桃花| 国产精品美女久久久久久| 亚洲同性gay激情无套| 亚洲线精品一区二区三区| 日av在线不卡| 国产不卡一区视频| 91久久精品国产91性色tv| 欧美美女激情18p| 久久综合视频网| 综合精品久久久| 奇米色一区二区| 风间由美一区二区三区在线观看 | 欧美一激情一区二区三区| 日韩精品一区二区三区四区视频| 精品国产3级a| 亚洲美女精品一区| 青青草原综合久久大伊人精品优势 | 2020国产精品| 伊人开心综合网| 美女一区二区久久| av资源网一区| 日韩三级高清在线| 中文字幕中文乱码欧美一区二区| 亚洲影院久久精品| 国产精品99久久久久久久vr | 亚洲乱码国产乱码精品精的特点 | 亚洲乱码中文字幕| 理论片日本一区| 91日韩一区二区三区| 日韩欧美的一区二区| 亚洲乱码中文字幕综合| 国产综合久久久久影院| 欧美中文字幕一二三区视频| 久久久久久久久99精品| 亚洲国产人成综合网站| 波多野结衣在线一区| 日韩欧美亚洲国产另类| 一区二区三区在线免费播放| 国内精品视频一区二区三区八戒| 欧美撒尿777hd撒尿| 欧美国产精品专区| 美日韩黄色大片| 欧美日本国产一区| 亚洲精品精品亚洲| 国产1区2区3区精品美女| 日韩三级视频中文字幕| 亚洲国产一区二区三区青草影视| 成人免费精品视频| 久久网这里都是精品| 日韩电影免费一区| 欧美性色aⅴ视频一区日韩精品| 亚洲国产成人在线| 国产一区二区三区av电影| 欧美一级二级三级乱码| 午夜精品在线视频一区| 在线观看亚洲一区| 一区二区三区免费看视频| 成人sese在线| 国产精品久久影院| 高清成人免费视频| 国产欧美精品一区| 国产精品1区二区.| 久久久国产精华| 国内精品国产成人国产三级粉色| 日韩一级精品视频在线观看| 日韩国产精品久久久| 欧美一级理论片| 美腿丝袜亚洲三区| 精品美女一区二区|