📄 numerical_analysisdlg.cpp
字号:
cur_lviterm.iItem = result.iter_cote - 1;
line_infor.Format(TEXT("%d次迭代"), result.iter_cote);
m_result.InsertItem(result.iter_cote - 1, line_infor);
line_infor.Format(TEXT("%.4g"), result.t_precision[result.iter_cote - 1]);
cur_lviterm.iSubItem = TRAPEZOIDAL_PRECI;
cur_lviterm.pszText = line_infor.GetBuffer();
m_result.SetItem(&cur_lviterm);
line_infor.Format(TEXT("%.4g"), result.sim_precision[result.iter_cote - 1]);
cur_lviterm.iSubItem = SIMPSON_PRECI;
cur_lviterm.pszText = line_infor.GetBuffer();
m_result.SetItem(&cur_lviterm);
line_infor.Format(TEXT("%.4g"), result.cote_precision[result.iter_cote - 1]);
cur_lviterm.iSubItem = COTES_PRECI;
cur_lviterm.pszText = line_infor.GetBuffer();
m_result.SetItem(&cur_lviterm);
}
if (result.iter_sim > 0)
{
cur_lviterm.iItem = result.iter_sim - 1;
line_infor.Format(TEXT("%d次迭代"), result.iter_sim);
m_result.InsertItem(result.iter_sim - 1, line_infor);
line_infor.Format(TEXT("%.4g"), result.t_precision[result.iter_sim - 1]);
cur_lviterm.iSubItem = TRAPEZOIDAL_PRECI;
cur_lviterm.pszText = line_infor.GetBuffer();
m_result.SetItem(&cur_lviterm);
line_infor.Format(TEXT("%.4g"), result.sim_precision[result.iter_sim - 1]);
cur_lviterm.iSubItem = SIMPSON_PRECI;
cur_lviterm.pszText = line_infor.GetBuffer();
m_result.SetItem(&cur_lviterm);
}
if (result.iter_t > 0)
{
cur_lviterm.iItem = result.iter_t - 1;
line_infor.Format(TEXT("%d次迭代"), result.iter_t);
m_result.InsertItem(result.iter_t - 1, line_infor);
line_infor.Format(TEXT("%.4g"), result.t_precision[result.iter_t - 1]);
cur_lviterm.iSubItem = TRAPEZOIDAL_PRECI;
cur_lviterm.pszText = line_infor.GetBuffer();
m_result.SetItem(&cur_lviterm);
}
}
}
void Cnumerical_analysisDlg::OnBnClickedRadioOutValue()
{
//TODO: 在此添加控件通知处理程序代码
mb_out_value = true;
mb_out_preci = false;
set_user_result_data(num_inte_result);
}
void Cnumerical_analysisDlg::OnBnClickedRadioOutPreci()
{
// TODO: 在此添加控件通知处理程序代码
mb_out_preci = true;
mb_out_value = false;
set_user_result_data(num_inte_result);
}
void Cnumerical_analysisDlg::OnBnClickedButtonOutputFileSelect()
{
// TODO: 在此添加控件通知处理程序代码
char szFilters[]=
"Source Files (*.*)|*.*|(*.dat)|*.dat|*.txt|*.csv|All Files (*.*)|*.*||";
// Create an Open dialog; the default file name extension is ".my".
CFileDialog tCOpenfile(TRUE, "data", "",
NULL, szFilters, this);
if (tCOpenfile.DoModal()==IDOK){
m_output_filename = tCOpenfile.GetPathName();
UpdateData(false);
}
}
void Cnumerical_analysisDlg::free_var_name_list(Var_name_list *name_list)
{
if (name_list == NULL)
{
return;
}
if (name_list->next != NULL)
{
free_var_name_list(name_list->next);
}
if (name_list->var_name != NULL)
{
free(name_list->var_name);
}
free(name_list);
}
int Cnumerical_analysisDlg::analysis_variable()
{
UpdateData(true);
Token_head head;
Token_type *token;
int var_num = 0;
memset(&head, 0, sizeof(Token_head));
if (initi_fun(m_expression.GetBuffer(), &name_list, &head) != OK)
{
MessageBox("表达式错误!");
exit(-1);
}
token = head.token;
while (token != NULL)
{
if (token->class_value == TOKEN_VARIABLE)
{
if (var_num == 0)
{
var_num++;
if (strcmp(name_list.var_name, token->Token.c_token) != 0)
{
//MessageBox("更改变量名为当前的变量", "提示:", MB_ICONWARNING);
m_var_name.SetString(token->Token.c_token);
name_list.var_name = m_var_name.GetBuffer();
}
}
else
{
if (strcmp(name_list.var_name, token->Token.c_token) != 0)
{
var_num++;
MessageBox("太多的变量,请设置其中的一些变量为常量!");
break;
}
}
}
token = token->next;
}
UpdateData(false);
free_token_head(&head);
if (var_num == 1)
{
return 0;
}
else if (var_num == 0)
{
return 0;
}
else
{
return 1;
}
}
void Cnumerical_analysisDlg::OnBnClickedButtonOutput()
{
// TODO: 在此添加控件通知处理程序代码
if (num_inte_result.iter_t == 0)
{
MessageBox("还没有计算!");
return;
}
if (m_output_filename.GetLength() == 0)
{
MessageBox("请先选择文件!");
return;
}
FILE *fp;
unsigned long int i;
fp = fopen(m_output_filename.GetBuffer(), "w");
if (fp == NULL)
{
MessageBox("不能打开文件!");
return;
}
fprintf(fp, "所有迭代数据由此开始!\n");
fprintf(fp, "\n\n-------------------------------------------------------------------------------------------\n\n");
fprintf(fp, "\n函数积分表达式:%s", m_expression.GetBuffer());
fprintf(fp, "\n积分区间:[%.4f, %.4f]", m_integration_start, m_integration_end);
fprintf(fp, "\n积分终止精度:%.4f", m_precision);
fprintf(fp, "\n最大迭代次数:%d", m_iter_max_num);
switch (m_method_list.GetCurSel())
{
case METHOD_TRAPEZOIDAL :
fprintf(fp, "\n积分终止精度判断方法:梯度精度终止迭代");
break;
case METHOD_SIMPSON_VALUE :
fprintf(fp, "\n积分终止精度判断方法:simpson精度终止迭代");
break;
case METHOD_COTES_VALUE :
fprintf(fp, "\n积分终止精度判断方法:cotes精度终止迭代");
break;
case METHOD_ROMBERG_VALUE :
fprintf(fp, "\n积分终止精度判断方法:romberg精度终止迭代");
break;
default :
break;
}
fprintf(fp, "\n输出文件路径:%s", m_output_filename.GetBuffer());
fprintf(fp, "\n\n-------------------------------------------------------------------------------------------\n\n");
fprintf(fp, "\n\n以下为每次的迭代值:\n");
fprintf(fp, "%-15s%-20s%-20s%-20s%-20s", "迭代次数", "梯度迭代值", "simpson迭代值", "cotes迭代值", "romberg迭代值");
for (i = 0; i<num_inte_result.iter_rom; i++)
{
fprintf(fp, "\n%d次迭代 ", i+1);
fprintf(fp, "%-20.4g", num_inte_result.t_value[i]);
fprintf(fp, "%-20.4g", num_inte_result.sim_value[i]);
fprintf(fp, "%-20.4g", num_inte_result.cote_value[i]);
fprintf(fp, "%-20.4g", num_inte_result.rom_value[i]);
}
if (num_inte_result.iter_cote > 0)
{
fprintf(fp, "\n%d次迭代 ", num_inte_result.iter_cote - 1);
fprintf(fp, "%-20.4g", num_inte_result.t_value[num_inte_result.iter_cote - 1]);
fprintf(fp, "%-20.4g", num_inte_result.sim_value[num_inte_result.iter_cote - 1]);
fprintf(fp, "%-20.4g", num_inte_result.cote_value[num_inte_result.iter_cote - 1]);
}
if (num_inte_result.iter_sim > 0)
{
fprintf(fp, "\n%d次迭代 ", num_inte_result.iter_sim - 1);
fprintf(fp, "%-20.4g", num_inte_result.t_value[num_inte_result.iter_sim - 1]);
fprintf(fp, "%-20.4g", num_inte_result.sim_value[num_inte_result.iter_sim - 1]);
}
if (num_inte_result.iter_t > 0)
{
fprintf(fp, "\n%d次迭代 ", num_inte_result.iter_t - 1);
fprintf(fp, "%-20.4g", num_inte_result.t_value[num_inte_result.iter_t - 1]);
}
fprintf(fp, "\n\n-------------------------------------------------------------------------------------------\n\n");
fprintf(fp, "\n\n以下为每次的迭代精度:\n");
fprintf(fp, "%-15s%-20s%-20s%-20s%-20s", "迭代次数", "梯度迭代精度", "simpson迭代精度", "cotes迭代精度", "romberg迭代精度");
for (i = 0; i<num_inte_result.iter_rom; i++)
{
fprintf(fp, "\n%d次迭代 ", i+1);
fprintf(fp, "%-20.4g", num_inte_result.t_precision[i]);
fprintf(fp, "%-20.4g", num_inte_result.sim_precision[i]);
fprintf(fp, "%-20.4g", num_inte_result.cote_precision[i]);
fprintf(fp, "%-20.4g", num_inte_result.rom_precision[i]);
}
if (num_inte_result.iter_cote > 0)
{
fprintf(fp, "\n%d次迭代 ", num_inte_result.iter_cote - 1);
fprintf(fp, "%-20.4g", num_inte_result.t_precision[num_inte_result.iter_cote - 1]);
fprintf(fp, "%-20.4g", num_inte_result.sim_precision[num_inte_result.iter_cote - 1]);
fprintf(fp, "%-20.4g", num_inte_result.cote_precision[num_inte_result.iter_cote - 1]);
}
if (num_inte_result.iter_sim > 0)
{
fprintf(fp, "\n%d次迭代 ", num_inte_result.iter_sim - 1);
fprintf(fp, "%-20.4g", num_inte_result.t_precision[num_inte_result.iter_sim - 1]);
fprintf(fp, "%-20.4g", num_inte_result.sim_precision[num_inte_result.iter_sim - 1]);
}
if (num_inte_result.iter_t > 0)
{
fprintf(fp, "\n%d次迭代 ", num_inte_result.iter_t - 1);
fprintf(fp, "%-20.4g", num_inte_result.t_precision[num_inte_result.iter_t - 1]);
}
fprintf(fp, "\n\n-------------------------------------------------------------------------------------------\n\n");
fprintf(fp, "\n所有迭代数据到此结束!");
fclose(fp);
}
void Cnumerical_analysisDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
free_iter_result(&num_inte_result);
CDialog::OnClose();
}
void Cnumerical_analysisDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
free_iter_result(&num_inte_result);
OnOK();
}
void Cnumerical_analysisDlg::OnBnClickedButtonGetVariable()
{
// TODO: 在此添加控件通知处理程序代码
analysis_variable();
}
void Cnumerical_analysisDlg::OnEnKillfocusEditPrecision()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
if (m_precision <= 0)
{
if (MessageBox("输入迭代精度可能出现错误!\n是否设置为默认值0.0001", "提示:", MB_OKCANCEL | MB_ICONWARNING) == IDOK)
{
m_precision = 0.0001;
}
}
UpdateData(false);
}
void Cnumerical_analysisDlg::OnEnKillfocusEditIterMax()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
if (m_iter_max_num == 0)
{
if (MessageBox("输入迭代次数可能出现错误!\n是否设置为默认值100", "提示:", MB_OKCANCEL | MB_ICONWARNING) == IDOK)
{
m_iter_max_num = 100;
}
}
UpdateData(false);
}
void Cnumerical_analysisDlg::OnEnKillfocusEditExpression()
{
// TODO: 在此添加控件通知处理程序代码
analysis_variable();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -