探秘atoi与atof的模拟之路:从原理到实践的全能指南!

news2024/11/16 19:55:03

目录

 ​编辑

一.atoi及atof库函数的工作原理

1.1atoi

1.2atof

1.3使用时的注意事项

注意事项

1. 检查输入字符串是否为 NULL

2. 检查字符串是否仅包含有效的数字字符

3. 检查转换结果是否在预期范围内

4. 使用更健壮的替代函数

二. 模拟实现atoi和atof

2.1模拟 atoi 和 atof 函数时的思路和注意事项

1.模拟 atoi 函数的思路

2.模拟 atof 函数的思路

3.注意事项

2.2 atoi的模拟实现 

2.3 atof的模拟实现

 三. 完结散花


 

                                            悟已往之不谏,知来者犹可追  

创作不易,宝子们!如果这篇文章对你们有帮助的话,别忘了给个免费的赞哟~

一.atoi及atof库函数的工作原理

在C语言编程中,字符串与数值之间的转换是常见的操作。为了简化这一操作,C标准库提供了一系列函数,其中atoi和atof是两个非常重要的函数它们分别用于将字符串转换为整数和浮点数

1.1atoi

首先,我们来看看atoi函数。atoi是“ASCII to integer”的缩写,它的主要功能是将一个ASCII码表示的字符串转换成整数。函数原型为int atoi(const char *nptr);,其中nptr是指向要转换的字符串的指针。这个函数会扫描整个字符串,跳过前面的空白字符(例如空格,制表符,换行符等),直到遇到第一个非空白字符为止。然后,从该字符开始,对连续的数字字符进行解析,直到遇到非数字字符为止。最后,将解析得到的数字字符转换为对应的整数,并返回该整数。如果字符串无法被解析为一个有效的整数,或者表示的数值超出了int类型的表示范围,那么atoi函数的行为是未定义的。因此,在使用atoi函数时,需要确保输入的字符串是有效的,且表示的数值在int类型的表示范围内。

以下是对atoiatof函数更具体的解释,并附带了一些示例代码,以帮助您更好地理解它们的用法。

#include <stdio.h>  
#include <stdlib.h>  
  
int main() {  
    const char *str1 = "12345";  
    const char *str2 = "  -6789"; // 前面有空格  
    const char *str3 = "abc123";  // 非数字开头  
    const char *str4 = "12345678901234567890"; // 超出int范围  
  
    int num1 = atoi(str1);  
    int num2 = atoi(str2);  
    int num3 = atoi(str3); // 将返回0,因为字符串不是以数字开头  
    int num4 = atoi(str4); // 超出int范围的行为是未定义的  
  
    printf("num1 = %d\n", num1); // 输出: num1 = 12345  
    printf("num2 = %d\n", num2); // 输出: num2 = -6789  
    printf("num3 = %d\n", num3); // 输出: num3 = 0  
    printf("num4 = %d\n", num4); // 输出可能不正确,因为超出了int的范围  
  
    return 0;  
}

在这个例子中,atoi 函数成功地将 str1 和 str2 转换为整数,但 str3 不能被转换为整数,因为它不是以数字字符开始的,所以 atoi 返回0。str4 表示的数字超出了 int 类型的范围,因此结果将是未定义的。

1.2atof

接下来,我们看看atof函数。atof是“ASCII to floating point”的缩写,它的功能是将一个ASCII码表示的字符串转换成浮点数。函数原型为double atof(const char *nptr);,其中nptr同样是指向要转换的字符串的指针。atof函数的处理方式与atoi类似,也是先跳过字符串前面的空白字符,然后从第一个非空白字符开始解析数字字符,直到遇到非数字字符为止不同的是,atof函数在解析数字字符时,会同时解析可能存在的正负号、小数点以及指数部分,以得到完整的浮点数表示。然后,将解析得到的数字字符转换为对应的浮点数,并返回该浮点数。如果字符串无法被解析为一个有效的浮点数,那么atof函数会返回0.0。

#include <stdio.h>  
#include <stdlib.h>  
  
int main() {  
    const char *str1 = "123.45";  
    const char *str2 = "  -678.90"; // 前面有空格  
    const char *str3 = "abc123.45"; // 非数字开头  
    const char *str4 = "1.23e-4";   // 科学计数法  
  
    double num1 = atof(str1);  
    double num2 = atof(str2);  
    double num3 = atof(str3); // 将返回0.0,因为字符串不是以数字开头  
    double num4 = atof(str4); // 可以解析科学计数法  
  
    printf("num1 = %f\n", num1); // 输出: num1 = 123.450000  
    printf("num2 = %f\n", num2); // 输出: num2 = -678.900000  
    printf("num3 = %f\n", num3); // 输出: num3 = 0.000000  
    printf("num4 = %f\n", num4); // 输出: num4 = 0.000123  
  
    return 0;  
}

在这个例子中,atof 函数成功地将 str1str2 和 str4 转换为浮点数。但是,由于 str3 不是以数字字符开始的,atof 函数返回了0.0。注意,atof 还可以解析科学计数法表示的浮点数,如 str4 所示。

1.3使用时的注意事项

注意事项

  • 使用 atoi 和 atof 时,应确保输入字符串是有效的,并且表示的数值在相应类型的表示范围内。
  • 这两个函数不会检查错误,比如输入字符串是否为 NULL 或者是否包含非数字字符。在实际应用中,你可能需要添加额外的错误检查逻辑。
  • 这两个函数在处理大数或异常输入时可能会产生不可预测的结果,因此在需要精确处理数值转换的场景中,建议使用更健壮的解析方法,比如 strtol 和 strtod 函数,它们提供了更详细的错误处理机制。

在实际应用中,使用 atoi 和 atof 函数时,确实需要添加额外的错误检查逻辑,以确保输入字符串的合法性以及转换结果的正确性。下面是一些关于如何添加错误检查逻辑的详细建议:

1. 检查输入字符串是否为 NULL

在使用 atoi 或 atof 之前,首先应该检查传入的字符串指针是否为 NULL如果指针为 NULL,直接进行转换将导致程序崩溃

const char *str = /* 获取或定义字符串 */;  
if (str == NULL) {  
    // 处理错误,例如打印错误消息或返回错误代码  
}


2. 检查字符串是否仅包含有效的数字字符

atoi 和 atof 函数会跳过字符串前面的空白字符,并尝试解析后续的字符为数字。但是,它们不会检查字符串中是否包含除数字、正负号、小数点和指数符号之外的其他字符。因此,如果需要更严格的验证,应该手动检查字符串内容。

#include <ctype.h> // 引入字符处理函数  
  
bool is_valid_number(const char *str) {  
    // 检查是否以正负号开头  
    if (*str == '+' || *str == '-') {  
        str++;  
    }  
      
    // 检查后续字符  
    while (*str != '\0') {  
        if (!isdigit(*str) && *str != '.' && (*str != 'e' && *str != 'E') &&  
            (!(*str == '+' || *str == '-') || (str > string && *(str - 1) == 'e' || *(str - 1) == 'E'))) {  
            return false; // 包含非法字符  
        }  
        str++;  
    }  
    return true; // 字符串仅包含有效数字字符  
}  
  
// 在转换之前调用此函数检查字符串  
if (!is_valid_number(str)) {  
    // 处理错误,字符串包含非法字符  
}


3. 检查转换结果是否在预期范围内

即使字符串看起来像是有效的数字,转换结果也可能不在预期范围内。例如,对于 atoi,如果转换的整数超出了 int 类型的表示范围,结果是未定义的。对于 atof,虽然结果通常是可预测的,但如果字符串表示的数值过大或过小,可能会导致精度损失。

int num = atoi(str);  
// 检查转换后的整数是否在int的表示范围内  
if (num > INT_MAX || num < INT_MIN) {  
    // 处理溢出错误  
}  
  
double fnum = atof(str);  
// 对于atof,通常没有直接的溢出检查,但可以检查特殊值或异常大的数值  
if (isinf(fnum) || isnan(fnum)) {  
    // 处理无穷大或非数字错误  
}


4. 使用更健壮的替代函数

如果可能的话,建议使用更健壮的替代函数,如 strtol 和 strtod,它们提供了更详细的错误处理机制。这些函数能够返回转换后的数值以及遇到的第一个非法字符的位置,从而提供了更多的错误信息。

#include <stdlib.h> // 引入 strtol 和 strtod  
  
char *endptr; // 用于存储遇到非法字符的位置  
long int num = strtol(str, &endptr, 10); // 10 表示使用十进制  
  
if (str == endptr) {  
    // 没有字符被转换,字符串不是有效的数字  
} else if (*endptr != '\0') {  
    // 字符串包含非法字符  
}


通过这些额外的错误检查逻辑,你可以增加程序的健壮性,确保在转换字符串为数值时能够正确处理各种异常情况。

二. 模拟实现atoi和atof

2.1模拟 atoi 和 atof 函数时的思路和注意事项

1.模拟 atoi 函数的思路

atoi 函数的主要作用是将一个字符串转换成整型数据。模拟实现这个函数时,可以按照以下步骤进行:

  1. 初始化变量
    • 定义一个 int 类型的变量 result,用于存储转换结果,初始化为 0。
    • 定义一个 int 类型的变量 sign,用于表示数字的符号,初始化为 1(表示正数)。
  2. 处理符号
    • 检查字符串的第一个字符是否为负号 '-'。如果是,将 sign 设置为 -1,并将字符串指针向后移动一位。
  3. 转换数字
    • 遍历字符串中的每个字符,只要字符是数字('0' 到 '9'),就将其转换为对应的整数值,并累加到 result 上。这通常通过字符与 '0' 的 ASCII 值之差来实现。
    • 在累加过程中,要检查 result 是否会溢出。这通常通过比较 result 与 INT_MAX 和 INT_MIN 来实现。
  4. 返回结果
    • 将 result 与 sign 相乘,得到最终的整型结果。
    • 返回结果。

2.模拟 atof 函数的思路

atof 函数的作用是将一个字符串转换成浮点型数据。模拟实现这个函数时,可以按照以下步骤进行:

  1. 初始化变量
    • 定义一个 double 类型的变量 result,用于存储转换结果,初始化为 0.0。
    • 定义一个 int 类型的变量 sign,用于表示数字的符号,初始化为 1(表示正数)。
    • 定义一个 double 类型的变量 fraction,用于处理小数部分,初始化为 0.1。
    • 定义一个 int 类型的变量 exponent 和 exponent_sign,用于处理科学计数法中的指数部分。
  2. 处理符号
    • 检查字符串的第一个字符是否为负号 '-'。如果是,将 sign 设置为 -1,并将字符串指针向后移动一位。
  3. 转换整数部分
    • 遍历字符串中的每个字符,直到遇到小数点或字符串结束。对于每个数字字符,将其转换为对应的整数值,并累加到 result 上。
  4. 转换小数部分
    • 如果字符串中包含小数点,继续遍历小数点后的字符。对于每个数字字符,将其转换为对应的整数值,并与 fraction 相乘后累加到 result 上。每次迭代后,fraction 需要乘以 0.1 以减小权重。
  5. 处理指数部分
    • 如果字符串中包含 'e' 或 'E' 后跟的数字,解析这些数字作为指数,并根据 exponent_sign 的值决定是乘以 10 的正数次幂还是负数次幂。
  6. 返回结果
    • 将 result 与 sign 相乘,得到最终的浮点型结果。
    • 返回结果。

3.注意事项

  1. 溢出处理
    • 在转换过程中,要特别注意整型和浮点型的溢出情况。对于整型,要检查累加结果是否超过 INT_MAX 或 INT_MIN。对于浮点型,虽然 double 类型通常能表示很大范围的数,但还是要避免不合理的计算导致精度损失或溢出。
  2. 错误处理
    • 如果字符串中包含非数字字符(除了可能的符号、小数点和指数表示外),应该考虑如何处理这些情况。你可以选择忽略它们,或者返回一个错误标志。
  3. 空指针检查
    • 在实现这些函数时,要确保输入的字符串指针不是空指针,以避免程序崩溃。
  4. 边界条件测试
    • 在编写完代码后,要进行充分的测试,特别是针对边界条件(如最大/最小整数、最大/最小浮点数、空字符串、只包含符号的字符串等)进行测试。
  5. 性能优化
    • 虽然这些模拟实现的性能可能不是最优的,但对于学习和理解 atoi 和 atof 的工作原理来说已经足够了。在实际应用中,可能会使用更高效的算法或库函数来进行字符串到数字的转换。

2.2 atoi的模拟实现 

#include <ctype.h> // 引入字符处理函数  
  
int my_atoi(const char *str) {  
    int sign = 1;  
    int result = 0;  
  
    // 跳过空白字符  
    while (isspace(*str)) {  
        str++;  
    }  
  
    // 检查符号  
    if (*str == '-') {  
        sign = -1;  
        str++;  
    } else if (*str == '+') {  
        str++;  
    }  
  
    // 转换数字字符  
    while (isdigit(*str)) {  
        if (result > INT_MAX / 10 || (result == INT_MAX / 10 && *str - '0' > 7)) {  
            // 处理溢出情况  
            if (sign == 1) {  
                return INT_MAX;  
            } else {  
                return INT_MIN;  
            }  
        }  
        result = result * 10 + (*str - '0');  
        str++;  
    }  
  
    return sign * result;  
}
if (result > INT_MAX / 10 || (result == INT_MAX / 10 && *str - '0' > 7)) {  
    // 处理溢出情况  
    if (sign == 1) {  
        return INT_MAX;  
    } else {  
        return INT_MIN;  
    }  
}

这段代码是 my_atoi 函数中的一部分,它负责处理整数溢出的情况。在将字符串转换为整数时,我们需要确保结果不会超出 int 类型的表示范围。

让我们逐行解释这段代码:

  1. result > INT_MAX / 10:
    这一条件检查当前的 result 是否已经大于 INT_MAX 除以 10 的结果。INT_MAX / 10 实际上是整数能够表示的最大值去掉最后一位后的数。如果 result 已经大于这个数,那么再加上当前字符代表的数(0-9),结果肯定会溢出。

  2. result == INT_MAX / 10 && *str - '0' > 7:
    这一条件稍微复杂一些。它首先检查 result 是否等于 INT_MAX / 10,这表示 result 已经是整数能够表示的最大值去掉最后一位后的数。然后,它检查当前字符代表的数是否大于 7(即当前字符是否为 '8'、'9')。如果这两个条件都满足,那么将当前字符代表的数加到 result 上也会导致溢出。

一旦上述任一条件为真,代码就进入处理溢出情况的逻辑。

  1. if (sign == 1) { return INT_MAX; } else { return INT_MIN; }:
    这里根据符号 sign 来确定返回的值。如果 sign 为正(即 sign == 1),则返回 INT_MAX。这是因为当尝试将一个大于 INT_MAX 的数转换为 int 时,根据 C 语言的整数溢出行为,结果会是 INT_MAX。类似地,如果 sign 为负,则返回 INT_MIN,因为尝试将一个小于 INT_MIN 的数转换为 int 时,结果会是 INT_MIN

这种处理方式是遵循 C 语言中整数溢出的未定义行为(undefined behavior)的通常做法。在实际编程中,通常建议避免整数溢出,并在可能的情况下进行显式的错误检查和处理。

通过这段代码,我们可以确保 my_atoi 函数在转换过程中不会返回超出 int 范围的值,而是返回该类型的最大值或最小值,这符合 C 语言标准库函数 atoi 的行为。

2.3 atof的模拟实现

#include <math.h> // 引入数学函数  
  
double my_atof(const char *str) {  
    double sign = 1.0;  
    double result = 0.0;  
    double fraction = 0.1;  
    int exponent = 0;  
    int exponent_sign = 1;  
  
    // 跳过空白字符  
    while (isspace(*str)) {  
        str++;  
    }  
  
    // 检查符号  
    if (*str == '-') {  
        sign = -1.0;  
        str++;  
    } else if (*str == '+') {  
        str++;  
    }  
  
    // 转换整数部分  
    while (isdigit(*str)) {  
        result = result * 10.0 + (*str - '0');  
        str++;  
    }  
  
    // 检查小数点  
    if (*str == '.') {  
        str++;  
        // 转换小数部分  
        while (isdigit(*str)) {  
            result += (*str - '0') * fraction;  
            fraction *= 0.1;  
            str++;  
        }  
    }  
  
    // 检查指数部分  
    if ((*str == 'e') || (*str == 'E')) {  
        str++;  
        // 检查指数符号  
        if (*str == '-') {  
            exponent_sign = -1;  
            str++;  
        } else if (*str == '+') {  
            str++;  
        }  
        // 转换指数值  
        while (isdigit(*str)) {  
            exponent = exponent * 10 + (*str - '0');  
            str++;  
        }  
    }  
  
    // 应用指数  
    result *= pow(10.0, exponent_sign * exponent);  
  
    return sign * result;  
}

在 my_atof 函数的模拟实现中,这些变量扮演着重要的角色来执行浮点数转换。下面是每个变量的意义:

  1. double sign = 1.0;
    sign 变量用来存储浮点数的符号。如果字符串表示的数是正数,则 sign 保持为 1.0;如果是负数,则将其设置为 -1.0。在转换的最后阶段,result 会乘以 sign 来得到最终的带符号结果。

  2. double result = 0.0;
    result 变量用来存储转换过程中的累积结果。它初始化为 0.0,并在遍历字符串时根据每个字符的值进行更新。

  3. double fraction = 0.1;
    fraction 变量用于在转换小数部分时逐步减小小数位的权重。它初始化为 0.1,表示小数点后第一位的权重。每次迭代处理一个新的数字字符时,fraction 会乘以 0.1,以便在后续迭代中处理更小的小数位。

  4. int exponent = 0;
    exponent 变量用于存储科学计数法中的指数值。如果字符串中包含 'e' 或 'E' 后跟的数字,这些数字将表示指数的值,并存储在 exponent 中。

  5. int exponent_sign = 1;
    exponent_sign 变量用于存储指数的符号。如果指数是正的,则 exponent_sign 保持为 1;如果是负的,则将其设置为 -1。这将在应用指数时用来确定是将结果乘以 10 的正数次幂还是负数次幂。

在 my_atof 函数的执行过程中,这些变量根据字符串中的字符进行更新,并最终组合起来以计算最终的浮点数值。注意,my_atof 函数的实现中还有一些逻辑来处理整数部分、小数点和小数部分,以及指数的解析和应用。这些变量在这些步骤中扮演着关键的角色。

 三. 完结散花

好了,这期的分享到这里就结束了~

如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~

如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~

我们下期不见不散~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1526172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

罗马不是一天建成的:DevOps 转型分步指南

“罗马不是一天建成的”这句格言非常适合 DevOps。许多公司都渴望通过“闪电战”获得市场主导地位的即时满足感&#xff0c;但DevOps 的真正成功是一场马拉松&#xff0c;而不是短跑。它需要致力于建立可持续的 DevOps 文化——一种从头开始促进协作、自动化和安全性的文化。 …

计算机设计大赛 题目:基于深度学习的中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分&#xff1a;4.2 损失函数&#xff1a;4.3 搭建seq2seq框架&#xff1a;4.4 测试部分&#xff1a;4.5 评价NLP测试效果&#xff1a;4.6 梯度截断…

Linux编程4.8 网络编程-建立连接

1、服务器端 #include <sys/types.h> #include <sys/socket.h>int listen(int sockfd, int backlog);返回&#xff1a;成功返回0&#xff0c;出错返回-1。参数&#xff1a;sockfd:套接字的文件描述符backlog:定义了sockfd的挂起连接队列可能增长的最大长度。…

使用 ZipArchiveInputStream 读取压缩包内文件总数

读取压缩包内文件总数 简介 ZipArchiveInputStream 是 Apache Commons Compress 库中的一个类&#xff0c;用于读取 ZIP 格式的压缩文件。在处理 ZIP 文件时&#xff0c;编码格式是一个重要的问题&#xff0c;因为它决定了如何解释文件中的字符数据。通常情况下&#xff0c;Z…

【新手】win10安装nodejs V16.9.0详细教程

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

【数据挖掘】练习2:数据管理1

课后作业2&#xff1a;数据管理1 一&#xff1a;上机实验1 # 读入数据 data("CO2") # 查看数据集CO2中的变量名称&#xff0c;并将变量Treatment的名称更改为Treat names(CO2) names(CO2)[names(CO2) "Treatment"] <- "Treat" names(CO2)…

在AI创业热潮下,如何抓住AI赚钱机会,实现人生逆袭

随着人工智能技术的迅猛发展,AI创业热潮正席卷全球。这不仅为科技领域的专业人士提供了无限的商机,也为普通人开辟了全新的赚钱途径。本文将为您揭示在AI创业热潮下,普通人如何抓住AI赚钱机会,实现人生逆袭,同时探讨哪些行业适合应用AI技术。 一、普通人如何抓住AI赚钱机…

WanAndroid(鸿蒙版)开发的第四篇

前言 DevEco Studio版本&#xff1a;4.0.0.600 WanAndroid的API链接&#xff1a;玩Android 开放API-玩Android - wanandroid.com 其他篇文章参考&#xff1a; 1、WanAndroid(鸿蒙版)开发的第一篇 2、WanAndroid(鸿蒙版)开发的第二篇 3、WanAndroid(鸿蒙版)开发的第三篇 …

共谋企业出海新篇章纷享销客荣获数字中国企业峰会“卓越成果奖”

3月9日&#xff0c;2024数字中国企业峰会在杭州西湖中维香溢大酒店成功举办&#xff0c;众多数字化领域专家、知名企业 CIO 代表到场。峰会旨在推动数字化转型与创新发展&#xff0c;为企业出海和国际合作搭建交流与合作的平台。本次峰会的颁奖环节&#xff0c;纷享销客凭借其卓…

c++的const总结(转)

为什么使用const&#xff1f;采用符号常量写出的代码更容易维护&#xff1b;指针常常是边读边移动&#xff0c;而不是边写边移动&#xff1b;许多函数参数是只读不写的。const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替)&#xff0c;分类如下&#xff1a;…

二类医疗器械经营备案怎么办?怎么办理?二类的有效期多久?

第二类医疗器械工商登记怎么办&#xff1f; 这就是本文的主要内容。 下面&#xff0c;我们给大家分享一下第二类医疗器械工商登记的要求和材料。 经营第二类医疗器械只需到当地药品监督管理部门办理工商登记即可。 那么第二类医疗器械注册时应该怎么做呢&#xff1f; 第二类医疗…

计算机毕业设计 | vue+springboot 在线花店后台管理系统(附源码)

1&#xff0c;绪论 1.1 项目背景 随着社会发展&#xff0c;网上购物已经成为我们日常生活的一部分。但是&#xff0c;至今为止大部分电商平台都是从人们日常生活出发&#xff0c;出售都是一些日常用品比如&#xff1a;食物、服装等等&#xff0c;并未发现一个专注于鲜花的电商…

Linux:搭建ntp服务器

我准备两个centos7服务器 一个为主服务器连接着外网&#xff0c;并且搭建了ntp服务给其他主机同步 另外一个没有连接外网&#xff0c;通过第一台设备去同步时间 首先两个服务器都要安装ntp软件 yum -y install ntp 再把他俩的时间都改成别的 左侧的是主服务器&#xff0c;主…

docker安装Milvus

docker安装Milvus 拉去CPU版本的milvus镜像 $ sudo docker pull milvusdb/milvus:0.10.0-cpu-d061620-5f3c00 docker pull milvusdb/milvus:0.10.0-cpu-d061620-5f3c00 mkdir -p milvus/conf cd milvus/conf ls wget https://raw.githubusercontent.com/milvus-io/milvus/v0.1…

“有主权国家秘密买入比特币”!1900亿基金准备进场!卡塔尔国家主权基金也要出手了?

近期暴涨的两大"造富神话"——黄金、比特币&#xff0c;双双下跌。上周五&#xff0c;国际金价小幅下跌&#xff0c;这是近四周以来&#xff0c;黄金首次录得周下跌。比特币日内最大跌幅超6%&#xff0c;价格一度跌破65000美元&#xff0c;打破了此前多天的上涨氛围。…

离职率太高怎么分析?看BI工具如何有效降低员工离职率

近年来&#xff0c;随着全球经济形势的动荡和人才市场竞争的加剧&#xff0c;离职率已成为企业管理和人力资源领域备受瞩目的焦点议题。离职率的高低不仅直接影响着企业的运营和稳定&#xff0c;同时也反映了员工对工作环境、职业发展和福利待遇的认可程度。 因此&#xff0c;企…

nodejs实现链接shp的属性信息(替换字段或者追加字段)

写在前面 偶尔听到同事说一个数据处理重复性的流程太多&#xff0c;就了解了下&#xff0c;原来是1份shp数据对应着一个xls属性文件&#xff0c;需要把xls文件里的一部分属性更新到shp的相关字段中&#xff0c;当然这种操作是可以用ArcGIS或者QGIS实现&#xff0c;但是当数据特…

鸿蒙-项目创建及了解

目录 项目创建 1.App普通项目创建 2.元服务创建 项目结构 .hvigor .idea AppScope entry EntryAbility.ts pages resources module.json5 ohosTest hvigorfile.ts build-profile.json5 oh_modules build-profile.json5 hvigorfile.ts 项目运行 项目创建 F…

vue3+ts+element-plus实际开发之统一掉用弹窗封装

vue3tselement-plus实际开发之统一掉用弹窗封装 插槽1. 官网介绍先理解 插槽、具名插槽、 作用域插槽、动态插槽名、具名作用域插槽属性和使用方法 2. 统一调用弹窗封装dome实战- 使用场景&#xff1a;- 对el-dialog进行数据动态设置- 新建一个ts文件用于统一存放组件&#xff…

Windows系统安装配置Everything结合内网穿透实现公网环境搜索本地文件

文章目录 前言1.软件安装完成后&#xff0c;打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前言 要搭建一个在线资料库&#xff0c;我们需要两个软件的支持&#xff0c;分别是cpolar&#xff08;用于搭建内网穿透数据隧道…