420B污染度等级查询代码

c++

cpp 复制代码
// 420b等级-浓度表(粒径→各等级最大浓度值,个/100mL)
const QMap<int, QList<double>> MainWindow::size_rank_data = {
    {4,  {195, 390, 780, 1560, 3120, 6250, 12500, 25000, 50000, 100000, 200000, 400000, 800000, 1600000, 3200000}},
    {6,  {76, 152, 304, 609, 1220, 2430, 4860, 9730, 19500, 38900, 77900, 156000, 311000, 623000, 1250000}},
    {14, {14, 27, 54, 109, 217, 432, 864, 1730, 3460, 6920, 13900, 27700, 55400, 111000, 222000}},
    {21, {3, 5, 10, 20, 39, 76, 152, 306, 612, 1220, 2450, 4900, 9800, 19600, 39200}}
};// 等级查表函数
int  MainWindow::get_rank_420b(double conc, int size)
{
    // 1. 校验粒径是否有效
    if (!size_rank_data.contains(size)) {
        return -1;
    }

    // 2. 获取该粒径的等级阈值(个/100mL),转换为个/mL(除以100)
    QList<double> rank_thresholds = size_rank_data[size];
    for (int i = 0; i < rank_thresholds.size(); ++i) {
        rank_thresholds[i] /= 100.0;
    }

    // 3. 找到第一个大于等于当前浓度的阈值索引(原等级索引:0=等级1,1=等级2...14=等级15)
    int original_idx = -1;
    for (int i = 0; i < rank_thresholds.size(); ++i) {
        if (rank_thresholds[i] >= conc) {
            original_idx = i;
            break;
        }
    }

    // 4. 处理边界情况:浓度大于所有阈值(原等级15)
    if (original_idx == -1) {
        original_idx = 14; // 原等级15对应索引14
    }

    // 5. 等级映射:前3级(原1/2/3级 → 索引0/1/2)返回0;原4-15级 → 1-12级
    int new_rank_value = 0;
    QString new_rank_label = "等级0";

    // 前3级(原1/2/3级)
    if (original_idx <= 2) {
        new_rank_value = 0;
        new_rank_label = "等级0";
    }
    // 原4-15级 → 转换为1-12级
    else if (original_idx >= 3 && original_idx <= 14) {
        new_rank_value = original_idx - 2; // 原4级(索引3)→1,原5级(索引4)→2...原15级(索引14)→12
        new_rank_label = QString("等级%1").arg(new_rank_value);
    }

    // 6. 返回最终结果(标签+数值)
    return  new_rank_value;
}

py:

python 复制代码
# 420b等级-浓度表(粒径→各等级最大浓度值,个/100mL)
size_rank_data = {
    4:  [195, 390, 780, 1560, 3120, 6250, 12500, 25000, 50000, 100000, 200000, 400000, 800000, 1600000, 3200000],
    6:  [76, 152, 304, 609, 1220, 2430, 4860, 9730, 19500, 38900, 77900, 156000, 311000, 623000, 1250000],
    14: [14, 27, 54, 109, 217, 432, 864, 1730, 3460, 6920, 13900, 27700, 55400, 111000, 222000],
    21: [3, 5, 10, 20, 39, 76, 152, 306, 612, 1220, 2450, 4900, 9800, 19600, 39200]
}

def get_rank_420b(conc: float, size: int) -> int:
    """
    等级查表函数
    :param conc: 浓度(个/mL)
    :param size: 粒径(4/6/14/21)
    :return: 转换后的等级值(0~12),无效粒径返回 -1
    """
    # 1. 校验粒径是否有效
    if size not in size_rank_data:
        return -1

    # 2. 获取该粒径的等级阈值(个/100mL),转换为个/mL(除以100)
    rank_thresholds = [x / 100.0 for x in size_rank_data[size]]

    # 3. 找到第一个大于等于当前浓度的阈值索引
    original_idx = -1
    for i in range(len(rank_thresholds)):
        if rank_thresholds[i] >= conc:
            original_idx = i
            break

    # 4. 处理边界:浓度大于所有阈值 → 等级15(索引14)
    if original_idx == -1:
        original_idx = 14

    # 5. 等级映射规则
    new_rank_value = 0
    # 前3级(原1/2/3级 → 0)
    if original_idx <= 2:
        new_rank_value = 0
    # 原4~15级 → 1~12级
    elif 3 <= original_idx <= 14:
        new_rank_value = original_idx - 2

    return new_rank_value
相关推荐
学长毕设2 分钟前
基于SpringBoot的野生动物公益保护平台设计与实现-附源码
java·spring boot·后端
梦里寻码23 分钟前
我用 NestJS + Vue3 写了一套完整的研发管理系统(58 表 / 229 API / 130 项断言,全开源
前端·后端·算法
FRing0325 分钟前
vue2干货总结8(路由模块封装、router-link、声明式导航、路由重定向、编程式导航)
开发语言·前端·vue.js·vue2
旖旎夜光27 分钟前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习
SL_staff35 分钟前
离散制造排程破局:JVS-APS 四步闭环落地实践(开发者视角)
java·产品·全栈
这个昵称不容易1 小时前
SpringBoot 美容院管理系统:232个Java文件315个接口,5套角色从预约到发货一整条链路
java·springboot·毕设
猿人谷1 小时前
Surrogate Model:让进化算法学会“预测”,为什么它正在成为智能优化的重要技术?
后端·算法·架构
starzy19901 小时前
深入理解Scala嵌套函数:作用域封装之道
开发语言·scala
Sakura_j_h_1 小时前
从零写一个 MCP stdio Server:用 Python 校验博客文章格式
开发语言·python·自动化·ai工具·mcp·json-rpc
装不满的克莱因瓶2 小时前
【SpringAI Alibaba】ReactAgent记忆管理MessageTrimmingHook与MessageDeletionHook
java·人工智能·ai·ai编程·springai·springaialibaba