公式代码化之——二维表格数据C语言快速定位与读取方法分享

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

在使用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;      else          return 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];
已知前提条件有: 1. 内容是一个0到65535的数值. 2. 对应的二维表有很多个, 而且每个表的ROW COUNT和COLUMN COUNT都不固定. 3. 原始表格数据文件格式 a. 原始文件是文本格式, 文本行上表相对应. b. 每行由多个单词构成,单词之间由空格及制表符(TAB)的组合来分割. c. 第一行的单词用于定义COLUMN VALUE的命名 d. 从第二行开始, 每文本行对应二维表的一行. 第一个单词定义ROW VALUE的命名.从第二个单词开始, 每个单词均由数字构成, 描述二维表的内容. e. 空文本行表示二维表格结束. 根据上面的表格, 下面是原始数据: AAA BBB CCC DDD AAA 0 1 1 4 BBB 2 2 5 3 CCC 8 7 6 6 DDD 9 9 9 9 4. 输出格式要求: 生成C语言格式的描述. 包含ROW VALUE定义, COLUMN VALUE定义及二维数据结构.(根据上面的表格, 下面是个生成的例子) #define ROW_AAA 0 #define ROW_BBB 1 #define ROW_CCC 2 #define ROW_DDD 3 #define ROW_COUNT 4 #define COLUMN_AAA 0 #define COLUMN_BBB 1 #define COLUMN_CCC 2 #define COLUMN_DDD 3 #define COLUMN_COUNT 4 static <type> nuiTableData_a[][COLUMN_COUNT] = { 0, 1, 1, 4, 2, 2, 5, 3, 8, 7, 6, 6, 9, 9, 9, 9 }; 5. 原始表格数据一定是正确的, 不必考虑对原始数据的严格分析判断 6. 根据原始数据得出ROW COUNT和COLUMN COUNT 7. COLUMN VALUE从0开始, 依次递增. 8. ROW VALUE的定义和COLUMN VALUE定义类似, 但需要进行压缩判断.如果两列内容相同, ROW VALUE值也应该一样. 例如原始数据: … PPP 0 0 1 1 2 RRR 1 2 2 1 5 QQQ 0 1 2 3 4 SSS 1 2 2 1 5 TTT 9 9 8 8 7 … 那么生成的结果应是: … #define ROW_PPP 10 #define ROW_RRR 11 #define ROW_QQQ 12 #define ROW_SSS ROW_RRR #define ROW_TTT 13 … 题目: 编写一个程序。 读取一个文本表格文件, 并生成另一种格式的文件(C语言格式的H文件), 同时将表格的行列索引(AAA, BBB, CCC…,即ROW VALUE, COLUMN VALUE)以C语言的格式进行定义.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FastCAE2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值