MATLAB 之 Simulink 系统仿真实例和 S 函数的设计与应用

news2024/11/16 6:02:15

这里写目录标题

  • 一、Simulink 系统仿真实例
    • 1. 方法一
    • 2. 方法二
    • 3. 方法三
  • 二、S 函数的设计与应用
    • 1. 用 MATLAB 语言编写 S 函数
      • 1.1 主程序
      • 1.2 子程序
    • 2. S 函数的应用

一、Simulink 系统仿真实例

  • 下面的应用实例我们将分别采用不同建模方法为系统建模并仿真。
  • 例如,有初始状态为 0 的二阶微分方程 x ′ ′ + 0.2 x ′ + 0.4 x = 0.2 u ( t ) x''+0.2x'+0.4x=0.2u(t) x′′+0.2x+0.4x=0.2u(t),其中 u ( t ) u(t) u(t) 是单位阶跃函数,对此我们尝试建立系统模型并仿真 。

1. 方法一

  • 我们利用 Integrator(积分器)模块直接构造求解微分方程的模型。
  • 我们将原微分方程改写为 x ′ ′ = 0.2 u ( t ) − 0.2 x ′ − 0.4 x x''=0.2u(t)-0.2x'-0.4x x′′=0.2u(t)0.2x0.4x
  • x ′ ′ x'' x′′ 经积分作用得 x ‘ x‘ x x ′ x' x 再经积分模块作用就得 x x x,而 x ′ x' x x x x 经代数运算又产生 x ′ ′ x'' x′′,据此可以建立系统模型并仿真。步骤如下。
  • (1) 利用 Simulink 模块库中的基本模块不难建立如下图所示的系统模型。

在这里插入图片描述

  • 模型中各个模块说明如下。
  • ① u(t) 输入模块:它的 Step time 被设置为 0,模块名称由原来的 Step 改为 u(t)。
  • ② Gs 增益模块:增益参数 Gain 设置为 0.2。
  • ③ Add 求和模块:其图标形状 Icon shape 设置为 rectangular,符号列表 List of signs 设置为 ±-。
  • ④ Integrator 积分模块:参数不需要改变。
  • ⑤ G1 和 G2 反馈增益模块:增益参数分别设置为 0.4 和 0.2,它们的方向翻转可借助快捷菜单中的 Rotate & Flip ⟶ \longrightarrow Flip Block 命令或模型编辑窗口的 Diagram ⟶ \longrightarrow Rotate & Flip ⟶ \longrightarrow Flip Block 命令实现。
  • (2) 设置系统仿真参数。打开 Configuration Parameters 窗口,把仿真的终止时间设置为 20s。
  • (3) 仿真操作。双击示波器图标,打开示波器窗口。单击模型编辑窗口工具栏中的 Run 按钮,就可在示波器窗口中看到仿真结果的变化曲线,如下图所示。

在这里插入图片描述

2. 方法二

  • 利用传递函数模块(Transfer Fcn)建模。
  • 对方程 x ′ ′ + 0.2 x ′ + 0.4 x = 0.2 u ( t ) x''+0.2x'+0.4x=0.2u(t) x′′+0.2x+0.4x=0.2u(t) 两边取 Laplace 变换,得 s 2 X ( s ) + 0.2 s X ( s ) + 0.4 X ( s ) = 0.2 U ( s ) s^{2}X(s)+0.2sX(s)+0.4X(s)=0.2U(s) s2X(s)+0.2sX(s)+0.4X(s)=0.2U(s)
  • 经整理得传递函数 G ( s ) = X ( s ) U ( s ) = 0.2 s 2 + 0.2 s + 0.4 G(s)=\frac{X(s)}{U(s)}=\frac{0.2}{s^{2}+0.2s+0.4} G(s)=U(s)X(s)=s2+0.2s+0.40.2
  • 在 Continuous 模块库中有标准的传递函数(Transfer Fcn)模块可供调用,于是,就可以构建求解微分方程的模型并仿真。根据系统传递函数构建如下图所示的仿真模型。

在这里插入图片描述

  • 模型中各个模块说明如下。
  • (1) u(t) 模块:设置 Step time 为 0。
  • (2) G(S) 模块:双击 Transfer Fcn 模块,打开参数设置对话框,在 Numerator coefficients 文本框中输入传递函数的分子多项式系数 [0.2],在 Denominator coefficients 文本框中输入传递函数的分母多项式的系数 [1,0.2,0.4],如下图所示。

在这里插入图片描述

  • 以后的操作与方法 1 相同。

3. 方法三

  • 利用状态方程模块(State-Space)建模。
  • 若令 x 1 = x x_{1}=x x1=x x 2 = x ′ x_{2}=x' x2=x,那么微分方程 x ′ ′ + 0.2 x ′ + 0.4 x = 0.2 u ( t ) x''+0.2x'+0.4x=0.2u(t) x′′+0.2x+0.4x=0.2u(t) 可写成 x ′ = [ x 1 ′ x 2 ′ ] = [ 0 1 − 0.4 − 0.2 ] [ x 1 x 2 ] + [ 0 0.2 ] u ( t ) x'=\begin{bmatrix}x^{'}_{1} \\x^{'}_{2} \end{bmatrix}=\begin{bmatrix} 0&1 \\ -0.4&-0.2 \end{bmatrix}\begin{bmatrix}x_{1} \\x_{2} \end{bmatrix}+\begin{bmatrix}0 \\0.2 \end{bmatrix}u(t) x=[x1x2]=[00.410.2][x1x2]+[00.2]u(t)
  • 写成状态方程为 { x ′ = A x + B u y = C x + D u \left\{\begin{matrix}x^{'}=Ax+Bu \\y=Cx+Du \end{matrix}\right. {x=Ax+Buy=Cx+Du
  • 式中, A = [ 0 1 − 0.4 − 0.2 ] A=\begin{bmatrix} 0&1 \\ -0.4 &-0.2 \end{bmatrix} A=[00.410.2] B = [ 0 − 0.2 ] B=\begin{bmatrix} 0 \\ -0.2 \end{bmatrix} B=[00.2] C = [ 1 0 ] C=\begin{bmatrix} 1&0 \end{bmatrix} C=[10] D = 0 D=0 D=0
  • 在 Continuous 模块库中有标准的状态方程(State-Space)模块可供调用,于是,就可以构建求解微分方程的模型并仿真。根据系统状态方程构建如下图所示的仿真模型。

在这里插入图片描述

  • 模型中各个模块说明如下:
  • (1) u(t) 输入模块:它的 Step time 被设置为 0。
  • (2) State-Space 模块:A、B、C、D 各文本框中依次输入 [0,1;-0.4,-0.2]、[0;0.2]、[1,0] 和 0,如下图所示。

在这里插入图片描述

  • 后面的操作与方法 1 相同。

二、S 函数的设计与应用

  • S 函数用于开发新的 Simulink 通用功能模块,是一种对模块库进行扩展的工具。S 函数可以采用 MATLAB 语言以及 C、C++、FORTRAN 等语言编写。
  • 在 S 函数中使用文本方式输入公式、方程,非常适合复杂动态系统的数学描述,并且在仿真过程中可以对仿真进行更精确的控制。
  • S 函数称为系统函数(System Function),采用非图形化的方式描述功能模块。
  • MATLAB 语言编写的 S 函数可以充分利用 MATLAB 所提供的丰富资源,方便地调用各种工具箱函数和图形函数使用;
  • C 语言编写的 S 函数可以实现对操作系统的访问,如实现与其他进程的通信和同步等。
  • 非 MATLAB 语言编写的 S 函数需要用编译器生成 MEX 文件。

1. 用 MATLAB 语言编写 S 函数

  • S 函数有固定的程序格式,可以从 Simulink 提供的 S 函数模板程序开始构建自己的 S 函数。

1.1 主程序

  • S 函数主程序的引导语句如下:
function [sys,x0,str,ts]=fname(t,x,u,flag)
  • 其中,fname 是 S 函数的函数名,t、x、u、flag 分别为仿真时间、状态向量、输入向量和子程序调用标志。 flag 控制在仿真的各阶段调用 S 函数的哪一个子程序,其含义和有关信息如下表所示。
取值功能调用函数名返回参数
0初始化mdllnitializeSizessys 为初始化参数,x0、str、ts 如定义
1计算连续状态变量的导数mdlDerivativessys 返回连续状态
2计算离散状态变量的更新mdIUpdatesys 返回离散状态
3计算输出信号mdlOutputssys 返回系统输出
4计算下一个采样时刻mdlGetTimeOfNextVarHitsys 返回下一步仿真的时间
9结束仿真任务mdlTerminate
  • Simulink 每次调用 S 函数时,必须给出这 4 个参数。sys、x0、str 和 ts 是 S 函数的返回参数。
  • sys 是一个返回参数的通用符号,它得到何种参数取决于 flag 值。例如,flag=3 时,sys 得到的是 S 函数的输出向量值。
  • x0 是初始状态值,如果系统中没有状态变量,x0 将得到一个空阵。
  • str 仅用于系统模型同 S 函数 API(应用程序编程接口)的一致性校验。对于 M 文件 S 函数,它将被置成一个空阵。
  • ts 是一个两列矩阵,一列是 S 函数中各状态变量的采样周期,另一列是相应的采样时间的偏移量。采样周期按递增顺序排列,ts 中的一行对应一个采样周期。对于连续系统,采样周期和偏移量都应置成 0。如果取采样周期为 -1,则将继承输入信号的采样周期。
  • 此外,在主程序输入参数中还可以包括用户自定义参数表: pl,p2,…,pn,这也就是希望赋给 S 函数的可选变量,其值通过相应 S 函数的参数对话框设置,也可以在命令行窗口赋值。
  • 于是 S 函数主程序的引导语句可以写成
function [sys,x0,str,ts]=fname(t,x,u,flag,pl,p2,,pn)
  • 主程序采用 switch-case 语句,引导 Simulink 到正确的子程序。

1.2 子程序

  • M 文件 S 函数共有 6 个子程序,供 Simulink 在仿真的不同阶段调用,这些子程序的前缀为 mdl。
  • 每一次调用 S 函数时,都要给出一个 flag 值,实际执行 S 函数中与该 flag 值对应的那个子程序。
  • Simulink 在仿真的不同阶段,需要调用 S 函数中不同的子程序。
  • (1) 初始化子程序 mdlInitializeSizes。子程序 mdlInitializeSizes 定义 S 函数参数,如采样时间、输入量、输出量、状态变量的个数以及其他特征。
  • 为了向 Simulink 提供这些信息,在子程序 mdlInitializeSizes 的开始处,应调用 simsizes 函数,这个函数返回一个 sizes 结构,结构的成员 sizes.NumContStates、sizes.NumDiscStates、sizes.NumOutputs 和 sizes.NumInputs 分别表示连续状态变量的个数、离散状态变量的个数、输出的个数和输入的个数。这 4 个值可以置为 -1,使其大小动态改变。
  • 成员 sizes.DirFeedthrough 是直通标志,即输入信号是否直接在输出端出现的标志,是否设定为直通,取决于输出是否为输入的函数,或者取样时间是否为输入的函数。1 表示 yes,0 表示 no。成员 sizes.NumSampleTimes 是模块采样周期的个数,一般取 1。
  • 按照要求设置好的结构 sizes 用 sys=simsizes(sizes) 语句赋给 sys 参数。除了 sys 外,还应该设置系统的初始状态变量 x0、说明变量 str 和采样周期变量 ts。
  • (2) 其他子程序。状态的动态更新使用 mdlDerivatives 和 mdIUpdate 两个子程序,前者用于连续状态的更新,后者用于离散状态的更新。这些函数的输出值,即相应的状态,均由 sys 变量返回。
  • 对于同时含有连续状态和离散状态的混合系统,则需要同时写出这两个函数来分别描述连续状态和离散状态。
  • 模块输出信号的计算使用 mdlOutputs 子程序,系统的输出仍由 sys变量返回。
  • 一般应用中很少使用 flag 为 4 和 9 的情况,mdlGetTimeOfNextVarHit 和 mdlTerminate 两个子程序较少使用。

2. S 函数的应用

  • 下面来看两个简单的 M 文件 S 函数例子。
  • 例如,我们采用 S 函数实现 y = n x y=nx y=nx,即把一个输入信号放大 n n n 倍。
  • (1) 利用 MATLAB 语言编写 S 函数,程序如下。
%****************************************
%S函数timesn.m,其输出是输入的n倍
%****************************************
function [sys,x0,str,ts]=timesn(t,x,u,flag,n)
switch flag
    case 0
        [sys,x0,str,ts]=mdlInitializeSizes;         %初始化
    case 3
        sys=mdloutputs(t,x,u,n);                    %计算输出量
    case {1,2,4,9}
        sys=[];
    otherwise                                       %出错处理
        error(num2str(flag));
end
%****************************************
%mdlInitializesizes:当flag为0时进行整个系统的初始化
%******************** ********************
function [sys,x0,str,ts]=mdlInitializeSizes()       
%调用函数simsizes以创建结构sizes
sizes=simsizes;
%用初始化信息填充结构sizes
sizes.NumContStates=0;          %无连续状态
sizes.NumDiscStates=0;          %无离散状态
sizes.NumOutputs=1;             %有一个输出量
sizes.NumInputs=1;              %有一个输入信号
sizes.DirFeedthrough=1;         %输出量中含有输入量
sizes.NumSampleTimes=1;         %单个采样周期
%根据上面的设置设定系统初始化参数
sys=simsizes(sizes);
%给其他返回参数赋值
x0=[];                          %设置初始状态为零状态
str=[];                         %将str变量设置为空字符串
ts=[-1,0];                      %假定继承输入信号的采样周期
%初始化子程序结束
%****************************************
% mdlOutputs:当flag值为3时,计算输出量
%****************************************
function sys=mdloutputs(t,x,u,n)
sys=n*u;
%输出量计算子程序结束
  • 将该程序以文件名 timesn.m 存盘。编好 S 函数后,就可以对该模块进行封装和测试了。
  • (2) 模块的封装与测试。
  • ① 建立 S-Function 模块和编写的S函数文件之间的联系。新建一个模型,向模型编辑窗口中添加 User-Defined Functions 子模块库中的 S-Function 模块、Sine Wave 模块和 Scope 模块,构建如下图所示的仿真模型。

在这里插入图片描述

  • 在模型编辑窗口中双击 S-Function 模块打开如下图所示的参数对话框,在 S-functionname 编辑框中输入 S 函数名 timesn 在 S-function parameters 编辑框中输入外部参数 n。
  • n 可以在 MATLAB 工作空间中用命令定义。如果有多个外部参数,参数之间用逗号分隔。

在这里插入图片描述

  • ② 模型封装。其具体操作与子系统的封装类似。在模型编辑窗口选中 S-Function 模块,再选择 Diagram ⟶ \longrightarrow Mask ⟶ \longrightarrow Create Mask 命令,或按 Ctrl+M 键,打开封装编辑器,选择 Parameters & Dialog 选项卡,在左侧控件工具箱中单击 Edit 工具,往中间的 Dialog box 区域的控件列表中添加编辑框控件 #1,选中该控件后,在右侧的 Property editor 区域中,在 Name 栏输入 n,Prompt 栏输入 “放大倍数”,勾选 Evaluate 复选框,具体如下图所示。

在这里插入图片描述- 设置完成后单击 OK 按钮。S 函数模块被封装后,双击它,则得到如下图所示的模块参数对话框。

在这里插入图片描述

  • 当输入 n 的值为 10 时,得到的仿真结果如下图所示。

在这里插入图片描述

  • 例如,我们采用 S 函数构造非线性分段函数 y = { 3 x x < 1 3 1 ≤ x < 3 3 − ( x − 3 ) 2 3 ≤ x < 4 2 4 ≤ x < 5 2 − ( x − 5 ) 2 5 ≤ x < 6 1 x ≥ 6 y=\left\{\begin{matrix} 3\sqrt{x}& x< 1\\ 3 & 1\le x< 3\\ 3-(x-3)^{2} &3\le x< 4 \\ 2 & 4\le x< 5\\ 2-(x-5)^{2} & 5\le x< 6\\ 1 &x\ge 6 \end{matrix}\right. y= 3x 33(x3)222(x5)21x<11x<33x<44x<55x<6x6
  • (1) 利用 MTALAB 语言编写 S 函数,程序如下:
function [sys,x0,str,ts]=sfunction(t,x, u,flag)
switch flag
    case 0
        [sys,x0,str,ts]=mdlInitializeSizes;
    case 3
        sys=mdlOutputs(t,x,u);
    case {1,2,4,9}
        sys=[];
    otherwise
        error(['Unhandled flag=',num2str(flag)]);
end
function [sys,x0,str,ts]=mdlInitializeSizes
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=0;
sizes.NumOutputs=1;
sizes.NumInputs=1;
sizes.DirFeedthrough=1;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=[];
str=[];
ts=[0,0];
function sys=mdlOutputs(t,x,u)
if u<1
    sys=3*sqrt(u);
elseif u>=1&&u<3
    sys=3;
elseif u>=3&&u<4
    sys=3-(u-3)^2;
elseif u>=4&&u<5
    sys=2;
elseif u>=5&&u<6
    sys=2-(u-5)^2;
else
    sys=1;
end
  • 将该程序以文件名 sfunction.m 存盘。
  • (2) 模块的测试。向模型编辑窗口中添加 S-Function 模块,并在其参数设置对话框中输入 M 文件名 sfunction,构建如下图所示的仿真模型。

在这里插入图片描述

  • 运行即可得到如下图所示的仿真结果。

在这里插入图片描述

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

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

相关文章

博客质量分计算——发布 version 5

目录 1. 背景2. 质量分 version 52.1 version 4 存在问题分析2.2 version 5 改进2.3 消融分析2.3.1 正向积极得分消融实验2.3.2 正向累积得分单变量实验2.3.3 非高分文章消融实验 2.4 V4 和 V5 版本质量分分布对比 3. 总结4. 参考 1. 背景 博客质量分顾名思义是用于衡量一篇博…

现代物理工程选讲:辐射探测与测量----射线与物质相互作用

重带电粒子与物质相互作用 与靶物质核外电子发生库伦相互作用电子获得能量脱离原子核的束缚&#xff08;或跃迁到高能级&#xff09;&#xff0c;从而被电离&#xff08;或激发&#xff09;每次碰撞只损失很小一部分能量&#xff08;~1/500)径迹是直线 阻止本领 Stopping Pow…

【Kubernetes资源篇】Secret加密数据配置管理详解

文章目录 一、Secret加密配置理论知识1、Secret是什么?2、Secret和configMap的区别3、Secret的参数和类型 二、实践&#xff1a;使用Secret进行加密1、方式一&#xff1a;环境变量方式引入2、方式二&#xff1a;卷挂载方式引入 一、Secret加密配置理论知识 1、Secret是什么?…

西安石油大学Python期末复习

Python期末复习 一、单选题 1. Python语言属于(C) A.机器语言 B.汇编语言 C.高级语言 D.以上都不是 2.Python 解释器环境中&#xff0c;用于表示上一次运算结果的特殊变量为(B) A. : B. _ C. > D.# 3.为了给整型变量x、y、z赋初值10&#xff0c…

Codeforces Round 868 (Div. 2) F. Random Walk(树上期望)

题目 n(n<2e5)个点的树&#xff0c; 从起点s出发&#xff0c;每次等概率选择一条边&#xff0c;随机游走到相邻点 若走到t&#xff0c;则停止&#xff0c;问每个点经过的期望次数&#xff0c;答案对998244353取模 思路来源 DLUT_Zeratul讲解 题解 需要分成三部分考虑…

Spring面试题--Spring中的循环引用(循环依赖)

我们以上述代码为例分析一下死循环产生的过程 为什么A是半成品呢&#xff1f; 如果熟悉bean的生命周期&#xff0c;那么在实例化对象A的时候&#xff0c;首先去调用的是构造函数&#xff0c;像是依赖注入还有接口的实现重写什么的&#xff0c;还有后置处理器&#xff0c;初始化…

【笔记】微机原理及接口技术3 -- 中断技术与DMA控制器

目录 中断技术中断概述中断处理过程 可编程定时器与计数器DMA 控制器8237A 结构工作方式工作时序 中断技术 中断概述 中断的流程是&#xff1f; CPU 正在执行进程 A此时外部或者内部中断请求发生&#xff0c;CPU 响应中断进程 A 暂时中断执行&#xff0c;转而运行中断服务程序…

华为OD机试真题 Python 实现【核酸检测人员安排】【2023Q1 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、补充说明五、Python算法源码六、效果展示1、输入2、输出 一、题目描述 在系统、网络均正常的情况下组织核酸采样员和志愿者对人群进行核酸检测筛查。 每名采样员的效率不同&#xff0c;采样效率为N人/小时。 由于外界变化&…

本地springboot项目上传到gitee

1.在gitee上新建一个仓库&#xff1a; 创建后可以拿到仓库地址&#xff1a;https://gitee.com/ouyangshuiming/linux_test.git 2. 选中 创建git仓库 3. 4.最后一步&#xff1a; 一定记得这里要写上一段话&#xff0c;才能成功提交&#xff1a;比如git 提交远程库 最后刷新…

MySQL的Join

1.Join用法 Join连接两张表,大致分为内连接,外连接,右连接,左连接,自然连接。 内连接又叫等值连接,此时的inner可以省略。 USING语句 MySQL中连接SQL语句中,ON子句的语法格式为:table1.column_name = table2.column_name。当模式设计对联接表的列采用了相同的命名样…

React hooks文档笔记(四) useRef

useRef 当想让组件记住一些信息&#xff0c;又不想触发新的渲染&#xff0c;可以使用ref&#xff1a;总是返回同一个对象。 1. state 和 refs 的比较 refs&#xff08;普通的 JavaScript 对象&#xff09; state 更改时不触发重新渲染 更改时触发重新渲染 可变的——修改/…

复现基于unet的眼底血管的医学图像分割项目

代码及数据集&#xff1a; MedicalImageSegmentation: 复现一个医学图像分割的项目 - Gitee.com xin麒/MedicalImageSegmentation - 码云 - 开源中国 (gitee.com) 两个都可以&#xff0c;差不多的&#xff08;要不就使用第二个吧&#xff0c;第二个后续都会继续更新&#xf…

【JUC-1】java多线程线程基础知识

线程创建方式 继承Thread类.实现Runable接口.实现Callable接口. Runable/Callable接口的实现, 都是重写其中的run/call方法, 实现任务逻辑, 再由线程执行器(可以是Thread类,也可以是线程池)并发执行run/call的逻辑. 而Thread类中的包含start方法, 可以控制线程启动,执行任务…

关于最小生成树

最小生成树问题&#xff0c;常用于将所有顶点连通的最大最小代价。比如十个城市去修路&#xff0c;不同成熟时之间修路的代价不同&#xff0c;让你找一个方案可以满足每个城市之间互相连通并且代价最小。 解决这个问题有两个算法&#xff0c;Prim算法和Kruskal算法。不同的是&a…

安装和配置nginx(含https)

文章目录 安装Nginx配置单独的配置&#xff1a;https配置 nginx为什么可以处理高并发 安装Nginx sudo yum update sudo yum install epel-release sudo yum install nginx sudo systemctl start nginx安装好后可以打开自己的域名 看一下默认的页面 配置 具体参考Link 位置 …

香港大学推出创新科技教育基金,拟支持Web3和生成式AI等领域教学

区块链技术是近年来备受关注的领域之一,其应用范围已经涵盖了金融、医疗、物流等众多行业。而随着区块链技术的不断发展和完善&#xff0c;越来越多的企业和机构开始将其应用到实际生产和业务中。作为其中一个重要的应用领域&#xff0c;金融领域也成为了区块链技术的重要应用场…

CTF加密解密—CRYPTO—easyrsa1

0x00 考察知识点 CTF 加解密合集&#xff1a;CTF 加解密合集 本道题实际上是在考察对RSA算法的练度问题&#xff0c;已知n&#xff0c;需要将n拆解为两个质数。 工具&#xff1a; http://www.factordb.com/index.php &#xff08;在线分离&#xff09; 0x01 题目 e 6553…

青岛大学_王卓老师【数据结构与算法】Week03_11_线性表的链式表示和实现11_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c;另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础–…

f(x)*g(x)的问题——C的缺陷

整理一道颇具争议的题目 #include<stdio.h> #define Mul(x,y) x*y int main() { int a1,b2,c3; printf("%d",Mul(ab,bc)); }关于这道题目&#xff0c;根据不同的编译器&#xff0c;答案会出现两种答案 11和14&#xff0c;见下面&#xff1a; 关于dev C: 关于…

【前端面试手册】CSS系列-回流与重构

本专栏收录于前端面试手册-CSS系列如果该文章对您有帮助还希望你能点一个小小的订阅&#xff0c;来增加博主创作的动力✍&#x1f3fb;话不多说开始进入正题 回流和重构在前端CSS中是一个常见的问题&#xff0c;那么你对回流何重构有哪些了解呢&#xff1f; 一、什么场景下会触…