在使用C语言转化公式进行计算时,易发现读取二维表格是一个较为困难的问题。尽管查找了相关资料,但未发现特定的解决方法。因此,作者自行开发了一套代码,以实现对二维表格数据的检索。
二维表格
编写公式时,我们可能需要使用一些经验数据来计算参数值,这就需要我们查表以获取相应的数值。例如某个公式中涉及的参数C,其值由角度θ和lg(A)决定,其中θ和面积A是已知量。
表1 C的经验公式

使用表格选取数据时,我们需要输入的两个量θ和lg(A),查表得到参数C的值。首先需要确定一种估算方法,因为实际情况下给出的角度不一定是整数,比如θ可能为32.15°,lg(A)可能为1.496。
由于在实际工况下给出的参数通常并不能精准匹配到表格中给出的参数值,因此在查表时需要对数据进行筛选和处理这里有两种较为常用的方法:
1.最近点优先原则: 采用欧氏距离度量给出的参数点与表格中给出的参数点之间的距离,选取与给出参数点最近点的数据点作为最终结果 ,例如给定的角度θ=32.15°处于30°和40°中间,相对更靠近30°,lg(A)=1.496处于lg(A)=1.4和lg(A)=1.5之间,相对更靠近1.5,根据距离的大小估计C的值最接近4.6,那么C=4.6,如下表所示,黄色区域的值。

2.加权平均原则: 根据欧氏距离筛选出与给出数据点最近的四个数据点,采用加权平均方法得到最终输出。权重的确定可采用距离的反比来确定。如下图所示,对黄色区域的四个数据进行加权平均。

由于上述两种方法为较为简单常用的数据筛选方法,实际情况下需要根据具体表数据类型来确定数据筛选与处理策略,在本文的情况下中直接采用最近点优先原则即可。
数据存储
解决估算的问题,就需要考虑以何种格式存储数据。当然如果处理表格较少,可以将数据写成容器或者其他形式存储在代码内,但是考虑到后期维护的方便性,建议使用Excel表格,或者使用txt文档存储数据,如果后期有对经验公式的数据进行修改,可以直接修改文档。本文使用txt文档存储数据,存储效果如下图所示。

数字之间用空格符号分隔,只存储了C的数据,并将txt文档命名为TableC。
代码实现步骤
确定了数据的估算方法和存储方法,接下来就需要考虑如何根据已知信息找到我们需要的数值,总共分为以下三步:
➤ 1、根据输入的角度θ、lg(A)、横轴数组和纵轴数组进行判断需要读取哪一行那一列的数据,输出读取数据所在行和所在列,使用的函数为GetNearestElementPosition()。
➤ 2、根据输入的txt文件路径,和所需数据所在行,输出txt文件中对应行的字符串,使用的函数为ReadLine()。
➤ 3、根据输入的字符串和所需数据所在列,输出对应列的数据,使用的函数为Extract()。
判断数据所在行列
首先需要根据输入的数据判断出需要读取的行和列。函数GetNearest()可以根据输入的目标数判断距离较近的值。函数GetNearestElementPosition()的作用是判断数组中与目标值差距最小的数的位置。
#include<iostream>#include<fstream>#include<math.h>#include <sstream>using namespace std;/** @brief 判断目标数与传入参数距离* @input 与目标数进行距离判断的两个数、目标值* @return 距离目标数较近的数* @author YuHaoHao(1813481317@qq.com)* @date 2023-04-22*/double GetNearest(double x, double y, double target) {if (target - x >= y - target)return y;elsereturn x;}/** @brief 寻找数组中与目标值差值最小的数的位置* @input 数组、数组元素个数、目标值* @return 数组中与目标数差值最小的数的位置* @author YuHaoHao(1813481317@qq.com)* @date 2023-04-22*/int GetNearestElementPosition(double arr[], int n, double target) {double result = 0;if (target <= arr[0]){result = arr[0];

文章介绍了在C语言中处理二维表格数据的挑战,提出了两种数据筛选方法:最近点优先原则和加权平均原则。通过实现GetNearestElementPosition、ReadLine和Extract等函数,实现了从txt文件中读取和处理数据。最后,通过FindNumber函数整合整个流程,根据给定参数从表格中查找相应数据。
最低0.47元/天 解锁文章
600

被折叠的 条评论
为什么被折叠?



