⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 numerical_analysisdlg.cpp

📁 在程序设计部分主要讨论了在读写函数表达式时
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			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 + -