编程错误集锦(长期更新)

本文汇总了编程中常见的错误,包括标准库快排浮点数比较、if语句判断、整型除法赋值浮点数、不正确的小括号使用、memset函数的应用以及int与long类型转换的问题。通过实例解释了这些错误的原因及修正方法,帮助程序员避免类似的陷阱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       1.使用标准库快排函数时浮点数的比较

//错误样例
int Mycmp(const void *a, const void *b)     
{
    return *(double *)a - *(double *)b;
}

//正确样例
int Mycmp(const void *a, const void *b)     
{
    if (*(double *)a > *(double *)b)
    {
        return 1;
    }
    return -1;
}

       解释:标准库里的快排函数中的自定义比较函数的返回值类型为int。错误样例中的函数定义返回类型为int,而实际返回类型为double,这样会造成将double类型的数据赋值给int类型的数据的效果,也就是数据丢失。浮点型赋值给整型时小数位的数据会丢失并且不会进行四舍五入,所以0.9赋值给int类型的数据时int类型得到的值为0。


       2.使用if语句进行变量值的判断

//错误样例
if (x = 5)      //普通写法
{
    //Do something;
}

if (5 = x)      //好的写法
{
    //Do something;
}

//正确样例
if (x == 5)     //普通写法
{
    //Do something;
}

if (5 == x)     //好的写法
{
    //Do something;
}
       解释:当我们需要写“==”符号时却写成了“=”是一种十分常见的编程失误。但是有一种技巧性写法可以让我们更容易发现此类错误。那就是把常量值写在左边,变量写在右边。很明显好的写法中的错误样例编译不会通过,因为赋值运算符的左值不能为常量或表达式,而普通写法的错误样例编译却可以通过,这样的错误不容易被发现。

       3.整型数做除法的值赋给浮点数

//错误样例
double aver;
int sum, n;
aver = sum / n;
//或者
aver = sum / 10;

//正确样例
double aver;
int sum, n;
aver = (double)sum / n;
//或者
aver = sum / 10.0;

       解释:当我们使用整数之间的除法想要得到浮点数这样的结果,很容易直接把整数除法的结果赋给浮点数,事实上在C/C++中这样的结果是先得到整数除法的结果再把结果强转为浮点数,这样导致了数据的错误,应该首先将其中整数强制转换为浮点数,这样才会进行浮点数的运算从而得到正确的浮点数结果,避免了数据的错误。


       4.取一个十进制数某一位的次方

//比如取一个3位数的百位然后求它的三次方

//错误样例
a = x / 100 * x / 100 * x / 100;

//正确样例
a = (x / 100) * (x / 100) * (x / 100);

       解释:这是在做一道ACM题中发现的错误,怎么提交都没有过,然后把错误样例改成正确的样例就过了,我错误的认为了不加括号进行运算的结果与加括号是一样的,很容易举一个反例:求425的百位数的三次方应该是64,错误样例的结果却是72,因为百位数对下一个x的十位数相乘造成了进位从而导致结果的不同。所以,不要图方便不写小括号。


       5.memset函数的使用

#define N 100
int num[N];
char ch[N];

//正确用法
memset(num, 0, sizeof(num));
memset(num, -1, sizeof(num));
memset(ch, 100/*只要是在char类型的范围之内*/, sizeof(ch));

//错误用法
memset(num, 1/*或者其它非0和-1的数*/, sizeof(num));

       解释:因为整数在计算机的存储方式是以二进制补码存储的,其中正数的二进制补码就是本身的二进制原码存储,而负数的补码的则是二进制原码的反码再加一得到的。因为符号位1代表负,0代表正,所以0在计算机中每一位的值都是0,-1在计算机中每一位的值都是1。memset函数的功能是把从第一参数为指定内存开始处向后的第三参数的字节数的每一个字节内存的值都设置为第二参数的值,所以在int型数组中集体赋值只有0和-1是有效的,因为int型变量所占的字节数一般是2或者4个字节,但是如果是在char型数组中,那么集体赋值在整个char类型范围都能有效,因为char类型变量所占的字节数就是1。

       6.int与long或long long类型的赋值

// 正确写法
long long x = 1LL << 32;

// 错误写法
long long x = 1 << 32;

       解释:上面的样例中,1左移32位已经超过了4字节int类型的范围,目前绝大部分计算机没有给整数后面写英文后缀时都是默认为int型,int类型的1左移32位后还是int型,只不过结果已经溢出了,然后才强制转换赋值给long long类型,所以会导致x赋值错误。正确写法应该要在1后面写LL以声明该常数为long long类型常数,这样一来运算就都是long long类型的运算了,就不会导致溢出。




基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值