資源簡介
基于MFC編寫一個單文檔程序,在客戶區用圖形來展現各種數學函數曲線。
具體要求:
1)可繪制常見的數學函數曲線,如三角函數、指數函數、冪函數等。
2)通過菜單選擇不同的函數曲線類型,可以通過對話框指定該函數的參數,如Xa中的冪a的具體設置,sin(ax+b)中的參數a、b的設置。
3)繪制數學曲線時應包括坐標軸和刻度以及相應的數字(字符),數學函數公式;
4)可以在一個坐標系中繪制多條數學曲線;
5)可以選擇不同顏色來繪制不同的曲線。
6)當鼠標移動到曲線上某點時,可以顯示該點的坐標。
7)可以進行圖形的縮放。
代碼片段和文件信息
#include?“pch.h“
#include?“CalculatorFunc.h“
#define?MAXNUM?30
#define?MAXOPT?30
const?double?pi?=?3.1415926535898;
const?double?e?=?2.718281828459;
bool?IsOpt(char?c)?{
return??c?==?‘+‘?||?c?==?‘-‘?||?c?==?‘*‘?||?c?==?‘/‘?||?c?==?‘^‘;
}
bool?IsNum(char?c)?{
return?c?>=?‘0‘?&&?c?<=?‘9‘?||?c?==?‘e‘??||?c?==?‘p‘;
}
double?GetNum(CString&?Eq?int&?i?char?xKey?double?xVal)
{
int?flag?=?1;
if?(i? flag?=?-1;
i++;
}
if?(i? i++;
return?flag?*?pi;
?}
???
if?(i? i++;
return?flag?*?e;
}
//cout< if?(i? i++;
return?flag?*?xVal;
}
double?x?=?0;
while?(i? {
x?=?x?*?10?+?Eq[i]?-?‘0‘;
i++;
}
double?rad?=?0.1;
if?(i? {
i++;
while?(i? {
x?=?x?+?(Eq[i]?-?‘0‘)?*?rad;
rad?=?rad?*?0.1;
i++;
}
}
return?flag?*?x;
}
double?Get_Equation_Num(CString&?Eq?int&?i?bool&?succ?char?xKey?double?xVal)?{
if?(IsNum(Eq[i])?||?Eq[i]?==?‘-‘?||?Eq[i]?==?xKey)
return?GetNum(Eq?i?xKey?xVal);//如果是數直接讀
CString?single_func;//記錄單目運算符
succ?=?false;
double?tmp_ans?=?0;//記錄子式的值
int?Lcnt?=?0;//判斷括號套括號,如sqrt(1+(1-1))
while?(i? if?(Eq[i]?==?‘(‘)?{//左括號,單目運算符已經記錄完,接下來是子式
i++;
CString?tmpEq;//記錄子式
while?(i? if?(Eq[i]?==?‘(‘)?Lcnt++;
if?(Eq[i]?==?‘)‘)?{
if?(Lcnt)
Lcnt--;
else?{//找到與第一個左括號匹配的右括號了
succ?=?true;//遞歸計算括號內子式的值
tmp_ans?=?CalcEquation(tmpEq?succ?xKey?xVal);
i++;
break;
}
}
tmpEq?+=?Eq[i];
i++;
}
break;
}
single_func?+=?Eq[i];
i++;
}
if?(succ)?{
if?(single_func?==?_T(““))
return?tmp_ans;
if?(single_func?==?_T(“sin“))?
return?sin(tmp_ans);
if?(single_func?==?_T(“cos“))
return?cos(tmp_ans);
if?(single_func?==?_T(“tan“))
return?tan(tmp_ans);
if?(single_func?==?_T(“abs“))
return?abs(tmp_ans);
if?(single_func?==?_T(“floor“))
return?floor(tmp_ans);
if?(single_func?==?_T(“ceil“))
return?ceil(tmp_ans);
if?(single_func?==?_T(“round“))
return?round(tmp_ans);
if?(single_func?==?_T(“sqrt“))
return?sqrt(tmp_ans);
if?(single_func?==?_T(“ln“))
return?log(tmp_ans);
if?(single_func?==?_T(“lg“))
return?log10(tmp_ans);
succ?=?false;
return?0;
}
}
double?Calc(double?num1?char?opt?double?num2)
{
//cout?<“calc?“?< switch?(opt)
{
case?‘+‘:?return?num1?+?num2;
case?‘-‘:?return?num1?-?num2;
case?‘*‘:?return?num1?*?num2;
case?‘/‘:?return?num1?/?num2;
case?‘^‘:?return?pow(num1?num2);
}
}
int?cPriority(char?c)?{
if?(c?==?‘^‘)?return?3;
if?(c?==?‘*‘?||?c?==?‘/‘)?return?2;
return?1;
}
double?CalcEquation(CString?
- 上一篇:北京地鐵最短路徑.rar
- 下一篇:圖片版QT黑白棋
評論
共有 條評論