www.pudn.com > 1.rar > Mathstr.cpp


/////////////////////////////////////////////////////////////////////////////// 
//                                                                           // 
// Dateiname: MATHSTR.CPP                                                    // 
//                                                                           // 
// Autor:     Andreas Jäger, Friedrich-Schiller-Universität Jena             // 
//                                                                           // 
// System:    WIN_RWPM.EXE und WINLRWPM.EXE                                  // 
//                                                                           // 
// Beschreibung: String-Klasse, die komfortabel mit Zahlen, Vektoren und     // 
//            Matrizen umgehen kann                                          // 
//                                                                           // 
// Hinweise:                                                                 // 
//                                                                           // 
/////////////////////////////////////////////////////////////////////////////// 
#include "stdafx.h" 
#include  
#include  
#include  
 
#include "mathutil.h" 
//#include "Vektor.h" 
#include "MathStr.h" 
#include "FktParser.h" 
 
// Konstruktor, der aus einer long double-Zahl einen String macht 
// Funktioniert zur Zeit nur für den double-Wertebereich. 
CMathString::CMathString(long double t, int ndig, bool /*scientific*/, int /*acceptpotenz*/) : CString() 
{ 
	char buffer[40]; 
	sprintf(buffer, _T("%.*lG"), ndig, t); 
	// Kommas in Punkte verwandeln (sollte eleganter gehen) 
	for (unsigned int i=0; i* fkt = CFunction::Parse(*this); 
	if (fkt) 
	{ 
		long double y = fkt->Execute(0.0); 
		delete fkt; 
		return y; 
	} 
	else 
		return 0.0; 
} 
 
/* 
long double CMathString::Value() 
{ 
	long double x1 = 0.0L; 
	long double x2 = 1.0L; 
 
	// Suche Minus 
	int op = Find(_T("-")); 
	if (op != -1 && op > 0 && toupper(GetAt(op-1)) != 'E') 
	{ 
		CMathString s1 = Left(op); 
		CMathString s2 = Mid(op + 1); 
		x1 = s1.Value(); 
		x2 = s2.Value(); 
		return x1 - x2; 
	} 
 
	// Suche Plus 
	op = Find(_T("+")); 
	if (op != -1 && op > 0 && toupper(GetAt(op-1)) != 'E') 
	{ 
		CMathString s1 = Left(op); 
		CMathString s2 = Mid(op + 1); 
		x1 = s1.Value(); 
		x2 = s2.Value(); 
		return x1 + x2; 
	} 
 
	// Suche Bruchstrich 
	op = Find(_T("/")); 
	if (op != -1) 
	{ 
		CMathString s1 = Left(op); 
		CMathString s2 = Mid(op + 1); 
		x1 = s1.Value(); 
		x2 = s2.Value(); 
		if (fabsl(x2) > 1E-18L) 
		{ 
			return x1 / x2; 
		} 
		else return x1; 
	} 
 
	// Suche Mal 
	op = Find(_T("*")); 
	if (op != -1) 
	{ 
		CMathString s1 = Left(op); 
		CMathString s2 = Mid(op + 1); 
		x1 = s1.Value(); 
		x2 = s2.Value(); 
		return x1 * x2; 
	} 
 
	// Suche Potenz 
	op = Find(_T("^")); 
	if (op != -1) 
	{ 
		CMathString s1 = Left(op); 
		CMathString s2 = Mid(op + 1); 
		x1 = s1.Value(); 
		x2 = s2.Value(); 
		return powl(x1,x2); 
	} 
 
	struct lconv* lc = localeconv(); 
	//AfxMessageBox(lc->decimal_point); 
 
	Replace_All(_T("M_E"),        _T("2.71828182845904523536")); 
	Replace_All(_T("M_LOG2E"),    _T("1.44269504088896340736")); 
	Replace_All(_T("M_LOG10E"),   _T("0.434294481903251827651")); 
	Replace_All(_T("M_LN2"),      _T("0.693147180559945309417")); 
	Replace_All(_T("M_LN10"),     _T("2.30258509299404568402")); 
	Replace_All(_T("M_PI_2"),     _T("1.57079632679489661923")); 
	Replace_All(_T("M_PI_4"),     _T("0.785398163397448309616")); 
	Replace_All(_T("M_PI"),       _T("3.14159265358979323846")); 
	Replace_All(_T("M_1_PI"),     _T("0.318309886183790671538")); 
	Replace_All(_T("M_2_PI"),     _T("0.636619772367581343076")); 
	Replace_All(_T("M_1_SQRTPI"), _T("0.564189583547756286948")); 
	Replace_All(_T("M_2_SQRTPI"), _T("1.12837916709551257390")); 
	Replace_All(_T("M_SQRT2"),    _T("1.41421356237309504880")); 
	Replace_All(_T("M_SQRT_2"),   _T("0.707106781186547524401")); 
	Replace_All(_T("PI"),         _T("3.14159265358979323846")); 
	Replace_All(_T("pi"),         _T("3.14159265358979323846")); 
	Replace_All(_T("Pi"),         _T("3.14159265358979323846")); 
	Replace_All(_T("."), lc->decimal_point); 
 
	return strtod(*this, 0); 
} 
*/ 
 
long double CMathString::Value(const char* str) 
{ 
	CMathString mstr(str); 
	return mstr.Value(); 
} 
 
CString CMathString::rational(long double x, long maxtest, long double TOL) 
{ 
	char a[35]; 
#pragma warning ( disable : 4244 ) 
	long y = x; 
#pragma warning ( default : 4244 ) 
	CString str; 
	if (fabsl(y - x) < TOL) 
	{ 
		str = CString(ltoa(y, a, 10)); 
		return str; 
	} 
	for (long p=2; p<=maxtest; p++) 
	{ 
#pragma warning ( disable : 4244 ) 
		y = x*p; 
#pragma warning ( default : 4244 ) 
		if (fabsl(y - p*x) < TOL) 
		{ 
			str = CString(ltoa(y, a, 10)); 
			str += _T("/"); 
			str += CString(ltoa(p, a, 10)); 
			return str; 
		} 
	} 
	return CMathString(x, 20); 
} 
 
CString CMathString::rationalTeX(long double x, long maxtest, long double TOL) 
{ 
	char a[35]; 
#pragma warning ( disable : 4244 ) 
	long y = x; 
#pragma warning ( default : 4244 ) 
	CString str; 
	if (fabsl(y - x) < TOL) 
	{ 
		str = CString(ltoa(y, a, 10)); 
		return str; 
	} 
	for (long p=2; p<=maxtest; p++) 
	{ 
#pragma warning ( disable : 4244 ) 
		y = x*p; 
#pragma warning ( default : 4244 ) 
		if (fabsl(y - p*x) < TOL) 
		{ 
			str = _T("\\frac{"); 
			str += CString(ltoa(y, a, 10)); 
			str += _T("}{"); 
			str += CString(ltoa(p, a, 10)); 
			str += _T("}"); 
			return str; 
		} 
	} 
	return CMathString(x, 20); 
} 
 
/* 
int CMathString::Replace_All(CString& str, const char* findstring, const char* replacestring, int _tf) 
{ 
	return CMathString::Replace_All(str, CString(findstring), CString(replacestring), _tf); 
} 
*/ 
 
int  CMathString::Replace_All(CString& str, /*CString&*/const char* findstring, /*CString&*/const char* replacestring, int /*_tf*/) 
{ 
	int anz = 0; 
	//int tf = get_case_sensitive_flag(); 
	//set_case_sensitive(_tf); 
	int op1 = str.Find(findstring); 
	int op = op1; 
	while (op1 != -1) 
	{ 
		Replace(str, op, strlen(findstring), replacestring); 
		anz++; 
		op += strlen(replacestring); 
		CString rest = str.Mid(op); 
		if (rest.IsEmpty() || anz==10) return anz; 
		op1 = rest.Find(findstring); 
		op += op1; 
	} 
	//set_case_sensitive(tf); 
	return anz; 
} 
 
bool CMathString::Replace(CString& str, int pos, int len, /*CString&*/const char* replstr) 
{ 
	str = str.Left(pos) + replstr + str.Mid(pos + len); 
	return true; 
} 
 
/* 
bool CMathString::Replace(CString& str, int pos, int len, const char* replstr) 
{ 
	return Replace(str, pos, len, CString(replstr)); 
} 
*/ 
 
void CMathString::MakeUpper1() 
{ 
	MakeUpper1(*this); 
} 
 
void CMathString::MakeLower1() 
{ 
	MakeLower1(*this); 
} 
 
void CMathString::MakeUpper1(CString& str) 
{ 
	str.MakeUpper(); 
//	Replace_All(str, _T("ä"), _T("Ä")); 
//	Replace_All(str, _T("ö"), _T("Ö")); 
//	Replace_All(str, _T("ü"), _T("Ü")); 
//	Replace_All(str, _T("ß"), _T("SS")); 
} 
 
void CMathString::MakeLower1(CString& str) 
{ 
	str.MakeUpper(); 
//	Replace_All(str, _T("Ä"), _T("ä")); 
//	Replace_All(str, _T("Ö"), _T("ö")); 
//	Replace_All(str, _T("Ü"), _T("ü")); 
} 
 
/*CString CVektor::AsString() 
{ 
	return CMathString(*this, 10, true); 
} 
 
CString CLinePoint::AsString() 
{ 
	return CMathString(CVektor(*this), 10, true); 
} 
 
CString CMatrix::AsString() 
{ 
	return CMathString(*this, 10, true); 
} 
*/