书写是为了更好的思考

writing 我经常在走路和睡前总结所学过的内容,思考遗留的问题,一段时间的阅读和思考之后,一个总体的知识框架就会逐渐浮现在脑海中。然后我会将它书写下来,然而,我往往非常惊讶地发现,当我书写的时候,新的内容仍然源源不断的冒出来,就像我的键盘自己也会思考一样。

大半年前的时候,我曾在一篇文章《跟波利亚学解题》中写到将问题求解的思维过程记录下来的好处,现在再次回忆起来,当时列出的几点其实不仅对于问题求解是大有好处,对于平时的思考也是同样的道理。

书写的好处有以下几点:

  • 书写是对思维的备忘:人在思考一个问题的时候,就像是在黑暗中打着电筒往前走(事实上,我们的工作记忆资源是有限的,有研究证明我们只能在工作记忆里面持有7加减2个项目;此外认知负荷也是有极限的),每一步推导都将我们往前挪一小步,然而电筒的光亮能照到的范围是有限的,我们走了几步发现后面又黑了,想到后面就忘了前面的,想到某个分支上去就忘了另一个分支,我们常常想着想着就想岔了,想岔了也就罢了,问题是一旦想岔了太远,就很难回到当初岔开的地方了。有时候,我们是如此努力地试图一下就走出很远,同时又老是怕忘记目前已经取得的进展和重要结论,结果意识的微光就在一个很小的范围内打转,始终无法往前走出很远。而将思维过程记录下来,则给了我们完全的回溯自己的思维轨迹的可能。举个具体的例子,平时面对一个问题我们常常首先会想出几个主要的、关键的思考方向,但是这个时候如果没有笔记,就只能一个一个展开思考,结果展开思考了一个,却忘掉了第二点是什么了。如果记笔记,我就会先一二三的罗列出思考的关键方向,然后逐一展开。思考任何一个分支的过程中有新的发现,但一时间没有剩余的思维去细想的话,就先用关键字记在一旁,一会回头再仔细思考。某种程度上这里笔记起到了备忘的作用。
  • 书写是对思维的缓存:正因为我们的工作记忆有限,所以我们在头脑中思考问题的时候就往往只能将几个最重要的核心概念保持在工作记忆中,导致想来想去在一个有限的范围内打转,思维总是走不太远。这方面我就有强烈的感觉,平时在走路的时候虽然也思考问题,但总是觉得思维的广度很有限。我们不妨设想数学家如果没有纸和笔的话,数学的发展会遭受到多大的阻碍,也许爱因斯坦能够在大脑中构思一个证明的最关键环节,但是你是否能够设想不用纸笔来“缓存”思维的中间步骤,而完全在大脑中证明费马大定理呢?有时候我甚至觉得能够用纸笔缓存思考的中间结果正是人类的理性之光能够走得如此之远的最重要条件。上一篇文章其实我原本的简记只有一半,另一半(更重要的那部分)却是在写成文章的时候自己冒出来的。
  • 书写是与自己的对话:在书写的时候,你不断地观察自笔端流出的信息,一行文字被你写下来之后,你就不用再将其费力地保持在大脑的临时记忆中,因为这行黑底白字会不断主动地通过视觉刺激来提醒你它的存在,于是你就可以将空出来的思维精力用于反思你自己的观点。不信你可以自己观察一下,如果不用纸笔,仅用大脑,是否很难在思考一个问题的同时对自己的思考进行反思呢?
  • 书写是与别人的交流:每个人的思维都有一些盲点,盲点之所以为盲点就是自己很难觉察得到,虽然我用了很长的时间来训练思维的客观和清晰,但总是不断发现自己的思维仍然还是时不时不自觉地陷入某个盲区,当我对人类思维的特点了解的越多,我就越是从心底里谦卑地认识到与人讨论是多么重要的一件事情,每个人的盲点不一样,你的盲点可以在别人那里得到补充,别人的盲点也可以被你纠正。三个臭皮匠顶一个诸葛亮的含义便在于此。写下来,与别人交流,最重要的价值就在于此。除了盲点之外,我们对于自己的知识体系中的缺口一般是很难觉知的,如果自己的思考因为对某个重要知识的无知,犯了严重的错误,一般自己是难以反省出来的——如果你不知道一个东西,很大的可能性是你也不知道你自己不知道它。而把自己的思考写出来让别人发现漏洞,则是对自己知识体系的善莫大焉。
  • 有时候,语言自己也会思考:在没有付诸笔端的时候,思想在脑海中的存在形式往往较为模糊、抽象,有时甚至是图像的形式,然而,如果需要写出来,甚至写出来给别人看和别人交流的话,就必须使用文字符号,文字符号其实有自己的一套系统,计算语言学上称为语义网络,同一个概念,在大脑中模糊的感觉,和明确地表达成某个特定的词语,是不一样的。你会因为用了某个特定的词语从而想到另一个词语,你写着写着就会发现一些词语就像本身有灵性一样,将其他的词语都带出来了。有时候,这种效应会导致书写变成一场文字游戏,但好的一面是有些时候也是有益于拓宽或启发思维的。

在开始书写你的想法之前,我知道很多人不书写的原因是因为觉得没有什么可写的,其实这是一个怪圈,你越是不开始书写,总是拿有限的思维缓存去默想一个问题,就越是没有内容可以写,如果你逼着自己将一些不成熟的想法写下来,看着自己写的内容,试着进一步拓展它们,就有可能在理性的道路上走得很远,很远。

祝大家书写快乐!

<think>嗯,用户现在问的是关于蓝桥杯单片机省赛如何写流程图以便更好地编写程序代码。首先,我需要回顾一下之前的对话历史,用户之前询问了可能会考的模块,现在转向了如何组织代码结构,特别是流程图的绘制。 用户可能是参赛的学生,对单片机编程有一定的基础,但在项目规划和代码结构上可能还不太熟练。他们可能已经掌握了各个模块的驱动编写,但在综合应用时遇到困难,不知道如何将各个模块整合在一起,导致代码混乱或者效率低下。流程图可以帮助他们理清思路,明确程序的结构和逻辑流程,从而更高效地编写代码。 接下来,我需要思考如何解释流程图的编写方法。首先,流程图的基本要素是什么?常用的符号比如开始/结束框、处理框、判断框、输入输出框等。然后,针对蓝桥杯单片机比赛的特点,流程图的绘制需要结合常见的模块,比如按键扫描、定时器中断、数码管显示、传感器数据处理等。 可能需要分步骤说明,比如确定功能模块、分层设计(硬件驱动层、功能模块层、应用逻辑层)、状态机设计等。同时,结合具体的例子,比如按键控制LED的场景,展示如何从流程图转化为代码结构。此外,还需要提醒注意事项,比如模块化、实时性、资源冲突等常见问题。 用户可能存在的深层需求是希望提高编程效率,减少调试时间,避免逻辑错误。因此,流程图不仅是规划工具,也是调试的参考。可能需要强调流程图在团队协作和代码维护中的重要性,以及如何通过流程图优化程序结构,比如使用状态机来处理复杂的逻辑。 需要确保回答结构清晰,步骤明确,并给出实际的例子帮助用户理解。同时,要使用用户容易理解的语言,避免过于专业的术语,或者对术语进行适当的解释。最后,总结流程图的好处,鼓励用户养成先画图再编码的习惯,以提高比赛中的效率和代码质量。</think>以下是针对蓝桥杯单片机省赛编写流程图的详细指南,结合竞赛特点和编程逻辑设计: --- ### **一、流程图的核心作用** 1. **逻辑可视化**:将复杂任务拆解为模块化步骤,明确程序运行顺序。 2. **减少调试时间**:提前发现逻辑漏洞(如按键优先级冲突、中断嵌套问题)。 3. **代码框架参考**:直接指导代码结构设计(如函数调用关系、全局变量定义位置)。 --- ### **二、流程图设计步骤** #### **步骤1:明确功能需求** - 将赛题分解为独立功能模块(示例): $$ \text{功能树} = \begin{cases} \text{输入模块} & \begin{cases} \text{按键扫描} \\ \text{传感器数据采集} \end{cases} \\ \text{处理模块} & \begin{cases} \text{数据滤波} \\ \text{状态机切换} \end{cases} \\ \text{输出模块} & \begin{cases} \text{数码管显示} \\ \text{LED/PWM控制} \end{cases} \end{cases} $$ #### **步骤2:分层设计流程图** **层级1:主程序框架** ```mermaid graph TD A[系统初始化] --> B[开启定时器中断] B --> C{主循环} C --> D[执行按键扫描] D --> E[更新显示数据] E --> F[处理传感器数据] F --> C ``` **层级2:定时器中断服务** ```mermaid graph TD A[进入中断] --> B[重装定时器初值] B --> C[数码管动态扫描] C --> D[更新PWM占空比] D --> E[退出中断] ``` #### **步骤3:关键模块细化** **示例:按键控制LED状态切换** ```mermaid graph TD A[检测按键按下] --> B{长按超过1s?} B -->|是| C[进入设置模式] B -->|否| D{短按次数统计} D --> E[根据次数切换LED模式] E --> F[更新EEPROM保存状态] ``` --- ### **三、流程图与代码映射技巧** 1. **条件判断** → `if/else`或`switch`语句 - 流程图菱形框对应代码分支结构: ```c if (key_flag) { // 处理按键 } else { // 默认状态 } ``` 2. **循环结构** → `while`或`for`循环 - 主循环对应`while(1)`: ```c while(1) { Key_Scan(); // 对应流程图中的"按键扫描"框 Display(); // 对应"更新显示"框 } ``` 3. **中断服务** → 函数内时间敏感操作 - 定时器中断中的数码管扫描: ```c void Timer0_ISR() interrupt 1 { Seg_Scan(); // 流程图中的"动态扫描"步骤 } ``` --- ### **四、竞赛优化技巧** 1. **状态机设计** - 用流程图描述状态迁移(示例): $$ \text{状态迁移表} = \begin{array}{|c|c|c|} \hline \text{当前状态} & \text{触发条件} & \text{下一状态} \\ \hline \text{显示温度} & \text{按键S1按下} & \text{显示湿度} \\ \hline \text{显示湿度} & \text{按键S2按下} & \text{参数设置} \\ \hline \end{array} $$ 2. **资源冲突规避** - 在流程图中标注关键资源(如`ADC`转换期间禁用中断): ```mermaid graph LR A[启动ADC转换] --> B[关闭中断] B --> C[等待转换完成] C --> D[读取ADC结果] D --> E[重新开启中断] ``` --- ### **五、常见错误规避** 1. **实时性冲突** - 在流程图中标注最大允许执行时间(如数码管扫描周期需≤5ms)。 2. **变量共享风险** - 用流程图标注跨模块全局变量(如`extern float temperature;`)。 3. **中断嵌套问题** - 明确标注中断优先级(如串口接收中断不嵌套定时器中断)。 --- ### **六、推荐工具** 1. **绘图软件**:Draw.io(在线免费)、Visio 2. **代码生成**:将流程图导出为注释模板: ```c // [流程图步骤1] 初始化外设 LED_Init(); Timer0_Init(); // [流程图步骤2] 启动主循环 while(1) { // ... } ``` --- **总结**:流程图是代码的“导航地图”,建议先完成70%的流程图设计再动手编码,可大幅减少调试时间。省赛题目通常具有清晰的模块划分,按流程图逐步实现各模块,最后进行联调即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值