js的逻辑分支

1、if 单分支

语法:

if(条件){

        条件为真 执行的代码段

}

var age;
if(age>18){
   alert("已经成年了");
}

 if 中的细节

        if条件的结果是布尔值,所以可以将布尔值当做条件放入if的小括号中

if(true){
   alert("真的");
}else{
    alert("假的");
}

如果将别的非布尔值的表达式或数据放入条件小括号中,会发生隐形的类型转换

if(2){ // 这里的2被转换成了布尔型
	console.log(2);
}

2、if 双分支

if(条件表达式){
    当条件表示式的结果为true的时候要执行的代码
}else{
    当条件表达式的结果为false的时候要执行的代码   
}

if(age>18){
   alert("成年了");
}else{
    alert("未成年");
}

3、if 多分支

if(条件表达式1){
    当条件表达式1的结果为true的时候,要执行的代码
}else if(条件表达式2){
    当条件表达式2的结果为true的时候,要执行的代码
}else if(条件表达式3){
    当条件表达式3的结果为true的时候,要执行的代码
}
。。。

}else{

}
# 多分支可以有若干个else if,else根据需要可以有也可以没有

小案例:输入分数,判断分数的等级

var score = Number(prompt("请输入考试成绩:"));
if(isNaN(score)){
	alert("输入不正确");   
}else{
    if(score>=0 && score<60){
       alert("不及格");
    }else if(score>=60 && score<70){
       alert("及格了");
    }else if(score>=70 && score<80){
        alert("丙");         
    }else if(score>=80 && score<90){
        alert("乙");         
    }else if(score>=90 && score<=100){
        alert("甲");         
    }else{
        alert("输入不正确");
    }
}

4、分支结构的简写方式

如果单分支或双分支以及多分支的大括号中只有一行代码的时候,大括号可以省略

// 单分支的简写
var age;
if(age>18)
   alert("已经成年了");
// 双分支的简写
if(age>18)
   alert("成年了");
else
    alert("未成年");
// 多分支的简写
var score = Number(prompt("请输入考试成绩:"));
var score = Number(prompt("请输入考试成绩:"));
if(isNaN(score))
	alert("输入不正确");   
else{
    if(score>=0 && score<60)
       alert("不及格");
    else if(score>=60 && score<70)
       alert("及格了");
    else if(score>=70 && score<80)
        alert("丙");         
    else if(score>=80 && score<90)
        alert("乙");         
    else if(score>=90 && score<=100)
        alert("甲");         
    else
        alert("输入不正确");
}

5、分支结构的嵌套

定义三个数,求三个数中的最大值

var a,b,c;
if(a>b){
    if(a>c){
       alert("变量a最大");
    }else{
        alert("变量c最大");
    }
}else{
    if(b>c){
       alert("变量b最大");
    }else{
        alert("变量c最大");
    }
}

6、switch 多路判断

switch(变量){
    case 值1:
        执行的代码块
    break;
    case 值2:
        执行的代码块
    break;
    。。。
    default:
        执行代码块
}

使用说明:

  1. break表示当前分支执行后就结束switch的运行,后续代码不再运行

  2. default可以理解为判断语句中的else

  3. case理解为if来判断这个变量是否全等于某个值

 小案例:输入数字,判断是星期几

var day = Number(prompt("请输入一个0~7之间数字:"));
if(isNaN(day) || day<=0 || day>7){
    alert("输入错误");
}else{
    switch(day){
        case 1:
            alert("今天星期一");
        break;
        case 2:
            alert("今天星期二");
        break;
        case 3:
            alert("今天星期三");
        break;
        case 4:
            alert("今天星期四");
        break;
        case 5:
            alert("今天星期五");
        break;
        default:
            alert("输入错误");
    }
}

注意:使用多路判断的时候,能使用switch进行判断,就尽量使用switch,因为switch的判断都是确定的值,条件比较简单,所以效率高。

使用场景:

  • 如果判断的条件比较复杂,使用if

  • 条件是确定的值,分两种情况:

    • 如果判断的分支小于等于3个,就使用if,这时候的效率和switch一样

    • 如果大于3个,就使用switch。

  • switch判断使用的是全等于(===)

7、switch 穿透写法

如果case后面不写break,那当前case执行后,会继续执行后面的case中的代码

输出1~5:

var day;
switch(day){
    case 1:
        alert("今天星期一");
    break;
    case 2:
        alert("今天星期二");
    break;
    case 3:
        alert("今天星期三");
    case 4:
        alert("今天星期四");
    break;
    case 5:
        alert("今天星期五");
    break;
    default:
        alert("输入错误");
}

当day的值为2的时候,不会执行后面的代码,当day的值为3的时候,执行完3的代码,还会执行4的代码,因为3的代码后面没有break。

这时候可以利用switch的这个特性,简写一些代码:

小案例:输入一个月份,判断并输出这个月有多少天?

var month = Number("请输入一个月份:");
if(isNaN(month) || month<=0 || month>12){
    alert("输入错误");
}else{
    switch(day){
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            alert("这个月有31天");
        break;
        case 4:
        case 6:
        case 9:
        case 11:
            alert("这个月有30天");
        break;
        case 2:
            alert("这个月有29天或28天");
        break;
        default:
            alert("输入错误");
    }
}

8、三元运算

if双分支有一种简写方式:

        条件?条件成立时运行的代码段:条件不成立时运行的代码段;

a>b?console.log(a):console.log(b);

三元运算有个特点:可以将整个表达式当做一个值,可以赋值给一个变量,也可以输出

var max = a>b?a:b; // 将a与b中较大的数赋值给变量max
console.log(a>b?a:b); // 将a与b中较大的数输出

前端小白的学习记录,希望各位大神指点

### STM32实现差速转向PID控制算法 #### 关于STM32控制器及其应用 STM32是一款广泛应用于嵌入式系统的微控制器,其强大的性能使其成为机器人控制系统中的理想选择。通过集成霍尔编码器增量式PID控制方法,可以有效实现机器人的速度调节与稳定运行[^2]。 对于差速转向的PID控制,核心在于计算左右轮的速度差异,并将其转化为PWM信号来调整电机转速。以下是具体实现思路: 1. **获取左右轮速度数据** 使用霍尔传感器采集左右轮的实际转速信息,并转换为线速度 $v_l$ $v_r$。这些数据可以通过定时器中断配合编码器脉冲计数获得。 2. **计算目标速度误差** 基于阿克曼转向模型或其他运动学方程,设定期望的目标速度 $v_{l\_target}$ $v_{r\_target}$。实际速度与目标速度之间的偏差作为输入传递给PID控制器[^3]。 3. **设计PID控制器** PID控制器的核心公式如下所示: \[ u(t) = K_p e(t) + K_i \int_0^t e(\tau)d\tau + K_d \frac{de(t)}{dt} \] 其中,$u(t)$ 是输出控制量(即PWM占空比),$e(t)$ 表示当前时刻的速度误差,而 $K_p$, $K_i$, $K_d$ 则分别为比例、积分微分系数。 4. **生成PWM波形** 将经过PID运算得到的结果映射到合适的PWM范围,用于驱动直流电机或步进电机。这一步通常借助TIM外设完成硬件级PWM输出配置[^1]。 下面给出一段简化版的C语言代码示例,展示如何基于HAL实现上述逻辑: ```c #include "stm32f1xx_hal.h" // 定义全局变量 float kp = 1.2, ki = 0.05, kd = 0.8; // 调整参数至最佳值 float error_prev = 0; float integral = 0; void PID_Controller(float target_speed, float actual_speed, TIM_HandleTypeDef *htim){ static uint16_t pwm_output; // 计算误差项 float error = target_speed - actual_speed; integral += error; float derivative = error - error_prev; // 更新前一次误差记录 error_prev = error; // 执行PID计算 float output = kp*error + ki*integral + kd*derivative; // 映射到PWM区间 [0, 100%] if(output > 100) output = 100; if(output < 0) output = 0; pwm_output = (uint16_t)(output / 100.0 * htim->Init.Prescaler); __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, pwm_output); // 设置比较寄存器更新PWM周期 } // 主函数部分省略... ``` 此代码片段展示了基本框架,需进一步完善初始化过程及外部设备连接细节才能正常工作。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值