搜索
人大经济论坛 附件下载

附件下载

所在主题:
文件名:  ComplexCaculator.rar
资料下载链接地址: https://bbs.pinggu.org/a-1887846.html
附件大小:


用MFC制作了一个复数计算器

CComplex类
  1. //复数的头文件


  2. #ifndef _COMPLEX_H_
  3. #define _COMPLEX_H_


  4. #if _MSC_VER>1000
  5. #pragma once
  6. #endif

  7. //定义一个复数的类
  8. class CComplex
  9. {
  10. protected:

  11. double m_dblX;
  12. double m_dblY;

  13. //公共的接口函数
  14. public:
  15. //无参数构造函数
  16. CComplex();


  17. //两个参数的构造函数
  18. CComplex(double dblX , double dblY);

  19. //复制构造函数
  20. CComplex(const CComplex &other);

  21. //析构函数
  22. virtual ~CComplex(){};

  23. //输入与显示
  24. void SetReal(double dblX);
  25. void SetImag(double dblY);
  26. double GetReal();
  27. double GetImag();

  28. //将字符串转换为复数
  29. CString ToString() const;
  30. void FromString(CString s , const CString& sDelim = _T(" "));

  31. //各类的数学运算
  32. BOOL operator==(const CComplex& cpxX) const;
  33. BOOL operator!=(const CComplex& cpxX) const;
  34. CComplex& operator=(const CComplex& cpxX);
  35. //复数的模
  36. double Abs() const;
  37. CComplex operator+(const CComplex& cpxX) const;
  38. CComplex operator-(const CComplex& cpxX) const;
  39. CComplex operator*(const CComplex& cpxX) const;
  40. CComplex operator/(const CComplex& cpxX) const;

  41. //以下是一些函数的运算
  42. //n可能是CComplex的向量个数
  43. void Root(CComplex cpxR[]) const;
  44. //实幂指数
  45. CComplex Pow(double) const;
  46. //复幂指数
  47. CComplex Pow(CComplex,int) const;
  48. CComplex Log() const;
  49. CComplex Sin() const;
  50. CComplex Cos() const;
  51. CComplex Tan() const;

  52. };

  53. #endif
复制代码

构造、析构、算法等函数:
  1. #include "stdafx.h"
  2. //所有的文件都需要在"Complex.h"之前
  3. #include "Complex.h"
  4. #include <cmath>

  5. //为了在debug中检查内存是否泄露
  6. #ifdef _DEBUG
  7. #undef THIS_FILE
  8. static char THIS_FILE[]=__FILE__;
  9. #define new DEBUG_NEW
  10. #endif

  11. #define PI 3.141592653

  12. //下面定义相应的函数
  13. CComplex::CComplex()
  14. {
  15. m_dblX = 0.0;
  16. m_dblY = 0.0;
  17. }

  18. CComplex::CComplex(double dblX , double dblY)
  19. {
  20. m_dblX = dblX;
  21. m_dblY = dblY;
  22. }

  23. //拷贝构造函数
  24. CComplex::CComplex(const CComplex& other)
  25. {
  26. m_dblX = other.m_dblX;
  27. m_dblY = other.m_dblY;
  28. }

  29. //输入和显示
  30. void CComplex::SetReal(double a)
  31. {
  32. m_dblX = a;
  33. }

  34. void CComplex::SetImag(double b)
  35. {
  36. m_dblY = b;
  37. }

  38. double CComplex::GetReal()
  39. {
  40. return m_dblX;
  41. }

  42. double CComplex::GetImag()
  43. {
  44. return m_dblY;
  45. }

  46. //字符串的转换函数
  47. CString CComplex::ToString() const
  48. {
  49. CString s;

  50. if(fabs(m_dblX)>1e-10)
  51. {
  52. if(m_dblY>0.0)
  53. {
  54. s.Format(_T("%.3f + %.3fj"),m_dblX,m_dblY);
  55. } else if (m_dblY<0.0)
  56. {
  57. s.Format(_T("%.3f - %.3fj"),m_dblX,fabs(m_dblY));
  58. } else
  59. {
  60. s.Format(_T("%.3f"),m_dblX);
  61. }
  62. } else
  63. //判断小于0的情况
  64. {
  65. if(m_dblY>0.0)
  66. {
  67. s.Format(_T("%.3fj"),m_dblY);
  68. } else if (m_dblY<0.0)
  69. {
  70. s.Format(_T("-%.3f"),fabs(m_dblY));
  71. } else
  72. {
  73. s.Format(_T("%.3fj"),m_dblX);
  74. }
  75. }

  76. return s;
  77. }

  78. void CComplex::FromString(CString s , const CString& sDelim)
  79. {
  80. int nPos = s.Find(sDelim);

  81. if (nPos == -1)
  82. {
  83. s.TrimLeft();
  84. s.TrimRight();
  85. m_dblX = _wtof(s);
  86. m_dblY = 0;
  87. } else
  88. {
  89. int len = s.GetLength();
  90. CString sLeft = s.Left(len);
  91. CString sRight = s.Right(nPos - len - 1);

  92. sLeft.TrimLeft();
  93. sRight.TrimRight();

  94. m_dblX = _wtof(sLeft);
  95. m_dblY = _wtof(sRight);
  96. }

  97. }

  98. //相应的重载运算符
  99. BOOL CComplex::operator==(const CComplex& cpxX) const
  100. {
  101. return(m_dblX == cpxX.m_dblX && m_dblY == cpxX.m_dblY);
  102. }

  103. BOOL CComplex::operator!=(const CComplex& cpxX) const
  104. {
  105. return(m_dblX != cpxX.m_dblX || m_dblY != cpxX.m_dblY);
  106. }

  107. CComplex& CComplex::operator=(const CComplex& cpxX)
  108. {
  109. m_dblX = cpxX.m_dblX;
  110. m_dblY = cpxX.m_dblY;
  111. return *this;
  112. }

  113. CComplex CComplex::operator+(const CComplex& cpxX) const
  114. {
  115. double x = m_dblX + cpxX.m_dblX;
  116. double y = m_dblY + cpxX.m_dblY;

  117. return CComplex(x,y);
  118. }

  119. CComplex CComplex::operator-(const CComplex& cpxX) const
  120. {
  121. double x = m_dblX - cpxX.m_dblX;
  122. double y = m_dblY - cpxX.m_dblY;

  123. return CComplex(x,y);
  124. }

  125. //乘法
  126. CComplex CComplex::operator*(const CComplex& cpxX) const
  127. {
  128. double a = m_dblX;
  129. double b = m_dblY;
  130. double c = cpxX.m_dblX;
  131. double d = cpxX.m_dblY;

  132. return(CComplex(a*c - b*d,a*d+b*c));
  133. }

  134. //除法
  135. CComplex CComplex::operator/(const CComplex& cpxX) const
  136. {
  137. double a = m_dblX;
  138. double b = m_dblY;
  139. double c = cpxX.m_dblX;
  140. double d = cpxX.m_dblY;

  141. double x,y;
  142. x = (a*c + b*d)/(pow(c,2)+pow(d,2));
  143. y = (b*c - a*d)/(pow(c,2)+pow(d,2));

  144. return CComplex(x,y);

  145. }

  146. //复数的模
  147. double CComplex::Abs() const
  148. {
  149. double a,b,c;
  150. a = pow(m_dblX,2);
  151. b = pow(m_dblY,2);
  152. c = sqrt(a+b);

  153. return c;
  154. }

  155. //复数的根
  156. void CComplex::Root(CComplex cpxR[]) const
  157. {

  158. double q = atan2(m_dblX , m_dblY);
  159. double r = sqrt(pow(m_dblX,2) + pow(m_dblY,2));

  160. r = pow(r,0.5);
  161. double t = 0.0;

  162. for(int k = 0;k<2;k++)
  163. {
  164. t = (2.0*k*PI + q)/2;
  165. cpxR[k].m_dblX = r*cos(t);
  166. cpxR[k].m_dblY = r*sin(t);
  167. }

  168. }

  169. //实幂指数
  170. CComplex CComplex::Pow(double dblW) const
  171. {
  172. // 局部变量
  173. double r, t;

  174. // 特殊值处理
  175. if ((m_dblX == 0) && (m_dblY == 0))
  176. return CComplex(0, 0);

  177. // 幂运算公式中的三角函数运算
  178. if (m_dblX == 0)
  179. {
  180. if (m_dblY > 0)
  181. t = 1.5707963268;
  182. else
  183. t = -1.5707963268;
  184. }
  185. else
  186. {
  187. if (m_dblX > 0)
  188. t = atan2(m_dblY, m_dblX);
  189. else
  190. {
  191. if (m_dblY >= 0)
  192. t = atan2(m_dblY, m_dblX) + PI;
  193. else
  194. t = atan2(m_dblY, m_dblX) - PI;
  195. }
  196. }

  197. // 模的幂
  198. r = exp(dblW * log(sqrt(m_dblX * m_dblX + m_dblY * m_dblY)));

  199. // 复数的实幂指数
  200. return CComplex(r * cos(dblW * t), r * sin(dblW * t));
  201. }

  202. //复幂指数
  203. CComplex CComplex::Pow(CComplex cpxW,int n = 0) const
  204. {
  205. // 局部变量
  206. double r, s, u, v;

  207. // 特殊值处理
  208. if (m_dblX == 0)
  209. {
  210. if (m_dblY == 0)
  211. return CComplex(0, 0);

  212. s = 1.5707963268 * (fabs(m_dblY) / m_dblY + 4 * n);
  213. }
  214. else
  215. {
  216. s = 2 * PI * n + atan2(m_dblY, m_dblX);

  217. if (m_dblX < 0)
  218. {
  219. if (m_dblY > 0)
  220. s = s + PI;
  221. else
  222. s = s - PI;
  223. }
  224. }

  225. // 求幂运算公式
  226. r = 0.5 * log(m_dblX * m_dblX + m_dblY * m_dblY);
  227. v = cpxW.m_dblX * r + cpxW.m_dblY * s;
  228. u = exp(cpxW.m_dblX * r - cpxW.m_dblY * s);

  229. return CComplex(u * cos(v), u * sin(v));
  230. }

  231. //求对数
  232. CComplex CComplex::Log() const
  233. {
  234. double p = log(sqrt(pow(m_dblX,2.0) +pow(m_dblY,2.0)));
  235. return CComplex(p,atan2(m_dblY,m_dblX));
  236. }

  237. //求解正弦
  238. CComplex CComplex::Sin() const
  239. {
  240. int i;
  241. double x, y, y1, br, b1, b2, c[6];

  242. // 切比雪夫公式的常数系数
  243. c[0] = 1.13031820798497;
  244. c[1] = 0.04433684984866;
  245. c[2] = 0.00054292631191;
  246. c[3] = 0.00000319843646;
  247. c[4] = 0.00000001103607;
  248. c[5] = 0.00000000002498;

  249. y1 = exp(m_dblY);
  250. x = 0.5 * (y1 + 1 / y1);
  251. if (fabs(m_dblY) >= 1)
  252. y = 0.5 * (y1 - 1 / y1);
  253. else
  254. {
  255. b1 = 0;
  256. b2 = 0;
  257. y1 = 2 * (2 * m_dblY * m_dblY - 1);
  258. for (i = 5; i >=0; --i)
  259. {
  260. br = y1 * b1 - b2 - c[i];
  261. if (i != 0)
  262. {
  263. b2 = b1;
  264. b1 = br;
  265. }
  266. }

  267. y = m_dblY * (br - b1);
  268. }

  269. // 组合计算结果
  270. x = x * sin(m_dblX);
  271. y = y * cos(m_dblX);

  272. return CComplex(x, y);
  273. }

  274. //计算余弦
  275. CComplex CComplex::Cos() const
  276. {
  277. int i;
  278. double x, y, y1, br, b1, b2, c[6];

  279. // 切比雪夫公式的常数系数
  280. c[0] = 1.13031820798497;
  281. c[1] = 0.04433684984866;
  282. c[2] = 0.00054292631191;
  283. c[3] = 0.00000319843646;
  284. c[4] = 0.00000001103607;
  285. c[5] = 0.00000000002498;

  286. y1 = exp(m_dblY);
  287. x = 0.5 * (y1 + 1 / y1);
  288. if (fabs(m_dblY) >= 1)
  289. y = 0.5 * (y1 - 1 / y1);
  290. else
  291. {
  292. b1 = 0;
  293. b2 = 0;
  294. y1 = 2 * (2 * m_dblY * m_dblY - 1);
  295. for (i=5 ; i>=0; --i)
  296. {
  297. br = y1 * b1 - b2 - c[i];
  298. if (i != 0)
  299. {
  300. b2 = b1;
  301. b1 = br;
  302. }
  303. }

  304. y = m_dblY * (br - b1);
  305. }

  306. // 组合计算结果
  307. x = x * cos(m_dblX);
  308. y = -y * sin(m_dblX);

  309. return CComplex(x, y);
  310. }

  311. //计算正切算法
  312. CComplex CComplex::Tan() const
  313. {
  314. //类内调用
  315. return Sin()/Cos();
  316. }
复制代码

如图:






所有源码:


[hide][/hide]





    熟悉论坛请点击新手指南
下载说明
1、论坛支持迅雷和网际快车等p2p多线程软件下载,请在上面选择下载通道单击右健下载即可。
2、论坛会定期自动批量更新下载地址,所以请不要浪费时间盗链论坛资源,盗链地址会很快失效。
3、本站为非盈利性质的学术交流网站,鼓励和保护原创作品,拒绝未经版权人许可的上传行为。本站如接到版权人发出的合格侵权通知,将积极的采取必要措施;同时,本站也将在技术手段和能力范围内,履行版权保护的注意义务。
(如有侵权,欢迎举报)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

GMT+8, 2025-12-26 09:30