软件设计师考试……

抱着凑热闹的心态报名软件设计师考试了,可硬是没想到题目比我想象中的简单那么多,甚至让我有了我七成的把握通过——嗯,不过问题是,我竟然没有注意到最后三题是选做一题的,结果全给做了。

嗯,现在说重点,我发现最后一题有问题 ! (有问题又怎样?发现了又怎样?做对了又怎样?做错了又能怎样?)

题目是这样的:给定一个序列,确定它能不能由序列 1, 2, 3, 4, … n 经过一个栈之后生成

例如,序列 3, 2, 1 可以由序列 1, 2, 3 生成:

image

再比如, 1, 3, 2 也可以由序列 1, 2, 3 生成:

image

好吧,然后,题目就给出了一个示例程序要求补齐:(细节记不清了,但关键的地方还是记得很清楚的)

image

其中第一个空要求初始化堆栈(原本是C语言的,我这里懒得麻烦),这个简单到可以忽略。

第二个空也没有难度,忽略。

第三个空是无解的判断条件,很简单,自己意会去。

第五个空也很简单……

问题出在第四个空!第四个!

要求填入 “begin=” 后面的部分,可是,仅仅让它等于 maxNo-1 显然是不行的——考虑 4 3 2 7 6 9 8 5 1 这样一组数据就知道了。

 

于是我只好写成上面那种非常 tricky 的形式了……

而且除此之外我没有好的主意能够填入第四个空——难道,亲爱的出题者,你就是想要 ((j=maxNo-1),(maxNo=state[i]+1),j) 这个答案吗?

或者,你们的本意是没有内个 for 循环,就像注释的内样?——那倒也可以。

 

PS. 经测试,比较靠谱——虽然遇到重复的数据,比如 1, 3, 2, 4, 6 , 5, 6 这样,会死循环——但要避免这种情况,在它给的 5 个空之中、不加入分号的情况下,我是没有办法的。

PPS. 我身陷宁波;其他地方的小盆友,你们也遇到这道神奇的题目了吗?

PPPS. 代码,拿去玩吧,公有领域(Public Domain):

#include <iostream>
#include <stack>
using namespace std;

bool f (int n, int* state) {
    stack station;                                  /// Question 1
    int i,j,begin,maxNo=1;
    for(i=0;i
        if(!station.empty()) {                           /// Question 2
            if (station.top()==state[i]) {
                cout<<<" ";
                station.pop();
                ++i;
            } else if (state[i]
                return false;
            } else {
                begin=((j=maxNo-1),(maxNo=state[i]+1),j);/// Question 4: begin=?
                for(j=begin+1;j<=state[i];++j) {
                    station.push(j);
                }
                //begin=maxNo++-1;
                //station.push(begin+1);
            }
        } else {
            begin=maxNo;
            for(j=begin;j<=state[i];++j) {
                station.push(j);
            }
            maxNo=j;                                     /// Question 5
        }
    }
    return true;
}

int main() {
    int n, *state;
    cout<<"How many? "; cin>>n;
    state=new int[n];
    for(int i=0;i
        cin >> state[i];
    cout<<<
    delete[] state;
    return 0;
}

IF
04-17 553
<think>好的,我需要帮助用户了解系统设计中的硬件选型、软件开发及实现细节,特别是总体架构、控制单元、电机驱动、传感器数据读取、无线通信和自动控制逻辑。首先,我得整理系统设计的各个模块,并参考用户提供的引用内容。 首先,系统总体架构通常包括核心控制单元、硬件模块、软件架构和通信部分。引用3提到核心控制单元用STM32,传感器模块包括光照传感器,无线通信用ESP8266。所以需要将这些部分组织起来,说明各模块的作用和连接方式。 接下来是硬件选型。用户提到的引用1中区分了不同控制器适用的场景,比如STM32用于工业级伺服系统,所以需要根据应用场景选择控制器。比如,如果系统需要高精度控制,STM32F103可能更合适。同时,引用2和3提到了具体的传感器和模块,比如HCSR501红外传感器、DS18B20温度传感器,这些都需要在硬件选型部分列出,并说明选型依据,比如精度、响应速度、通信接口等。 然后是软件开发部分。引用2提到了初始化和配置硬件模块、PWM生成、传感器数据处理、无线通信功能。需要分步骤说明,比如使用HAL库初始化STM32,PWM驱动电机,传感器数据通过ADC或单总线协议读取,无线模块通过AT指令或MQTT协议通信。自动控制逻辑可能需要PID算法,引用2提到优化算法以提高响应速度。 实现细节方面,控制单元需要详细说明STM32的配置,比如时钟设置、外设初始化。电机驱动部分要解释PWM频率和占空比如何调节速度。传感器数据读取要说明具体的通信协议和数据处理方法,比如DS18B20的单总线协议,数据滤波算法。无线通信部分要描述如何通过ESP8266连接Wi-Fi,数据传输格式,比如JSON或自定义协议。自动控制逻辑需要结合传感器数据,比如光照强度超过阈值时触发电机动作,并可能涉及状态机或定时任务。 还要注意引用文献的应用场景,比如引用1提到STM32用于医疗机器人,说明高可靠性需求,这可能影响硬件选型和软件的错误处理机制。引用3中的电源管理模块也需要提及,确保系统稳定供电。 用户可能关心如何集成各模块,调试方法,以及扩展功能,比如能耗监测,这在引用2中提到,可以作为优化部分讨论。需要确保各部分解释清晰,技术细节准确,比如PWM的具体配置参数,通信协议的选择理由。 最后,生成相关问题时要围绕系统设计的不同方面,比如硬件选型考虑因素、软件开发工具、通信协议选择、调试方法等,帮助用户深入理解。</think>### 系统设计详解 #### **一、系统总体架构设计** 系统通常分为以下层级: 1. **核心控制单元**:负责协调各模块工作,执行控制算法(如STM32系列)[^3] 2. **硬件功能模块**:包括传感器、执行器、通信模块等 3. **软件架构**:分层设计(驱动层、算法层、应用层) 4. **通信接口**:UART/SPI/I2C等有线通信,Wi-Fi/蓝牙等无线连接[^2] #### **二、硬件选型关键要素** | 模块类型 | 典型器件 | 选型依据 | 应用示例 | |----------|----------|----------|----------| | **主控芯片** | STM32F103 | 72MHz主频+12位ADC+7定时器 | 工业级运动控制[^1] | | **电机驱动** | L298N | 峰值电流2A,PWM调速 | 窗帘/小型机械臂 | | **环境传感器** | DS18B20 | ±0.5℃精度,单总线协议 | 温度监测系统 | | **人体感应** | HCSR501 | 7m探测距离,数字输出 | 智能安防系统 | | **无线模块** | ESP8266 | 802.11 b/g/n协议,AT指令控制 | 物联网设备 | #### **三、软件开发流程** ```python # 伪代码示例:自动控制逻辑 while True: light = read_light_sensor() # 光照强度采集 temp = read_ds18b20() # 温度采集 if light > threshold or temp > 30: set_motor_speed(70%) # PWM调速 send_status(esp8266) # 状态上报 sleep(1000) # 1秒周期 ``` 1. **驱动层开发** - 使用STM32CubeMX配置时钟树、GPIO、定时器 - PWM信号生成示例: $$f_{PWM} = \frac{TIM\_Clock}{(ARR+1)(PSC+1)}$$ 其中ARR为自动重装载值,PSC为预分频系数 2. **传感器数据处理** - DS18B20温度转换公式: $$T = \frac{DigitialValue}{16} \quad (^{\circ}C)$$ - 采用滑动窗口滤波算法: $$Output = \frac{1}{N}\sum_{i=0}^{N-1}x_{n-i}$$ 3. **无线通信实现** - ESP8266 AT指令协议栈: ```AT+CIPSTART="TCP","api.iot.com",1883``` ```AT+CIPSEND=18``` ```{"temp":25,"light":1200}``` #### **四、关键实现细节** 1. **电机控制** - 采用互补PWM输出防止电机短路 - 死区时间设置公式: $$t_{dead} = \frac{DTG[7:0] \times t_{Tclk}}}{256}$$ 2. **低功耗设计** - 使用STM32的STOP模式: $$I_{stop} = 20\mu A \quad @3.3V$$ - 传感器轮询间隔动态调整 3. **故障保护机制** - 过流检测:ADC实时监测电机电流 $$I_{max} = \frac{V_{ref}}{R_{shunt}}$$ - 看门狗电路设计: $$t_{timeout} = 4 \times 32768 \times \frac{1}{LSE}$$ #### **五、系统优化方向** 1. 增加PID控制算法提升响应速度: $$u(t) = K_p e(t) + K_i \int_0^t e(\tau)d\tau + K_d \frac{de(t)}{dt}$$ 2. 采用MQTT协议优化物联网通信 3. 添加能耗监测功能: $$E = \sum_{t=0}^T V(t) \cdot I(t) \cdot \Delta t$$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值