差分方程自動計算專案

_凌雲之志發表於2020-12-11

需求分析

在Windows端,從阿里雲伺服器中獲取差分資料,然後進行差分計算,最後以表格形式呈現結果。

軟體功能

1.在PC端的客戶端軟體實現登入。
2.登入後,從雲伺服器端獲取批量資料,儲存在本地。
3.客戶端根據獲取的資料,執行差分計算。
4.客戶端使用MFC實現結果展示。

拓撲圖

在這裡插入圖片描述

處理流程

在這裡插入圖片描述

程式碼模組

資料庫連線

標頭檔案SQLQuery.h

#pragma once
#include "mysql.h"
#include "DifferEqu.h"
#include <vector>

struct SQLQuery
{
	bool init();
	std::vector<DifferEqu> getData();
	 
private:
	MYSQL* conn = NULL;
};

連線程式碼

#include "pch.h"
#include "SQLQuery.h"
#include <vector>
#include "DifferEqu.h"

#pragma comment(lib, "libmysql.lib")

bool SQLQuery::init()
{
	conn = mysql_init(NULL);

	//建立MySQL資料庫連線
	if (mysql_real_connect(
		conn, "192.168.175.140", "root", "marry123",
		"equation", 3306, NULL, 0) == NULL) {

		printf("資料庫伺服器連線失敗, 錯誤原因: %s\n", mysql_error(conn));
		return false;
	}
	else {
		printf("資料庫伺服器連線成功!");
		return true;
	}
    return false;
}

std::vector<DifferEqu> SQLQuery::getData()
{
	//傳送資料請求命令
	const char* sql = "select * from factor";
	std::vector<DifferEqu> data;
	DifferEqu tmp;
	//傳送命令
	if (mysql_query(
		conn, sql) != 0) {
		printf("Error: 傳送查詢命令失敗!\n");
		exit(1);
	}

	//從資料庫伺服器獲取處理結果
	//返回值,是指向結果的指標
	//不適合大量資料傳輸
	MYSQL_RES* res_ptr = mysql_store_result(conn);
	if (res_ptr == NULL) {
		printf("Error: 傳送查詢命令失敗\n");
		exit(1);
	}

	int row = mysql_num_rows(res_ptr);
	for (int i = 0; i < row; i++) {
		//從結果中返回一行資料
		MYSQL_ROW ret_row = mysql_fetch_row(res_ptr);

		//解析資料
		tmp.a = atoi(ret_row[0]);
		tmp.y0 = atoi(ret_row[1]);

		data.push_back(tmp);
		//處理資料
		//顯示資料

	}
	//返回的資料用vector儲存
	return data;
}

差分計算程式碼

#pragma once
struct DifferEqu
{
	int a;
	int y0;
	int calc(int n); //計算函式,n表示冪
};
#include "DifferEqu.h"

int DifferEqu::calc(int n)
{
	int ret = 0;
	int tmp = 1;
	//計算 a的n次方
	for (int i = 1; i <= n; i++) {
		tmp = tmp * a;
	}
	ret = tmp * y0;
    return ret;
}

顯示到圖形介面

在MFC中的BOOL CequarionDlg::OnInitDialog()函式中新增如下程式碼進行表單設計。

//1.設定表頭樣式
	m_list.SetExtendedStyle(
		m_list.GetExtendedStyle()|
		LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);

	//2.設定表頭的表格
	m_list.InsertColumn(0, L"係數a", LVCFMT_LEFT, 100);
	for (int i = 1; i < 6; i++)
	{
		CString str = L"Y";
		int c = i - 1;
		str.Format(L"%s%d", str, c);
		m_list.InsertColumn(i, str, LVCFMT_LEFT, 100);
	}
	return TRUE;  // 除非將焦點設定到控制元件,否則返回 TRUE

資料載入

void CequarionDlg::OnBnClickedLoaddatabtn()
{
	//載入資料
	//1.使用資料庫管理介面,來獲取資料
	SQLQuery sql;
	sql.init();
	m_data = sql.getData();

	//獲取資料填充到使用者介面
	for (int i = 0; i < m_data.size(); i++) {
		m_data[i].a;
		CString str;
		str.Format(L"%d", m_data[i].a);
		m_list.InsertItem(i, str);
		
		str.Format(L"%d", m_data[i].y0);
		m_list.SetItemText(i, 1, str);
	}
}

差分計算

void CequarionDlg::OnBnClickedEqucalbtn()
{
	CString str;
	for (int i = 0; i < m_data.size(); i++)
	{
		for (int k = 1; k <= 4; k++)
		{
			int value = m_data[i].calc(k);
			str.Format(L"%d", value);
			m_list.SetItemText(i, k + 1, str);
		}
	}
}

結果展示

資料庫中的資料
在這裡插入圖片描述
計算結果
在這裡插入圖片描述

相關文章