04。仓颉表达式 / if...else / while

1,什么是仓颉表达式?

        ~凡是可以求值的语言元素都是仓颉表达式


    / / 语言元素可以理解为:如 if ... else 、while 、do ... while 这些程序可执行有规则的元素组合


2,什么叫算数表达式?

        ~一个或多个操作数经过零个或多个操作符计算结果的表达式。


        / / 操作数:就是可以计算的对象。如:1,2,3.。。。等。

        / / 操作符:就是算术运算符;如:+ 、 - 、 * 、/ 等。


3,仓颉的条件表达式包括 ?if 表达式?

        ~1,if  表达式 、if - let 表达式

**************************************************************************************************************

        ~2,if  表达式的样式:

                if ( 条件1) {

                        分支1 

                } else if(条件2) {

                        分支2

                }else {

                        分支3

                }

                // 分支1、2、3都是代码块,条件1、2都是 boolean 类型表达式

                /*

                        if 表达式执行顺序:

                         #1,条件1 的值是true ,就转到第2步;条件2 的值是 true,就转到第3步;如果都不满足,就转到第4步。

                        #2,执行分支1,转到第5步

                        #3,执行分支2,转到第5步

                        #4,执行分支3,转到第5步

                        #5,执行  if 表达式后边的代码

                */

        ~3,实战样例:

                

                   **************************************************************************************************************

4,仓颉的循环表达式?while 、do ... while 表达式?

        ~1,while 、do ... while 、 for - in 、while - let 表达式

        ~2,表达式样式:

                while (条件表达式) {

                        循环体

                }


        /*

                #1,如果条件是true,则跳转第2步,为false就跳转到第3步

                #2,执行循环体;再次判断条件表达式,是true继续第2步,是false跳转第3步

                #3,执行while表达式后面代码

        */


                do {

                        循环体

                }while(条件表达式)


        /*

                #1, 执行循环体,如果条件表达式,是true则跳转第2步;为false则跳转第3步

                #2,执行循环体;再次判断条件表达式,是true则继续第2步,是false跳转第3步

                #3,执行do ... while 表达式后边的代码

        */


        ~3,实战样式:

      

       

5,仓颉程序执行流程一般只会涉及到三种基本结构 ?

        ~顺序结构 、 分支结构 、 循环结构


        ~ 一般程序都是从头执行到尾的,所以都是顺序结构。

        ~ 分支结构呢,就是  条件表达式

        ~ 循环结构呢,就是  循环表达式


6,什么叫代码块?

        ~由大括号包含的零个或多个表达式就叫做代码块


        / / 代码块中,有一个以上表达式时,代码块的值和类型就是最后一个表达式的值和类型。

        / / 代码块中,没有表达式时,代码块的类型就是 “ Unit ” ,值就是 “  ( ) ”


内容概要:本文详细介绍了一种基于Simulink的表贴式永磁同步电机(SPMSM)有限控制集模型预测电流控制(FCS-MPCC)仿真系统。通过构建PMSM数学模型、坐标变换、MPC控制器、SVPWM调制等模块,实现了对电机定子电流的高精度跟踪控制,具备快速动态响应和低稳态误差的特点。文中提供了完整的仿真建模步骤、关键参数设置、核心MATLAB函数代码及仿真结果分析,涵盖转速、电流、转矩和三相电流波形,验证了MPC控制策略在动态性能、稳态精度和抗负载扰动方面的优越性,并提出了参数自整定、加权代价函数、模型预测转矩控制和弱磁扩速等优化方向。; 适合人群:自动化、电气工程及其相关专业本科生、研究生,以及从事电机控制算法研究与仿真的工程技术人员;具备一定的电机原理、自动控制理论和Simulink仿真基础者更佳; 使用场景及目标:①用于永磁同步电机模型预测控制的教学演示、课程设计或毕业设计项目;②作为电机先进控制算法(如MPC、MPTC)的仿真验证平台;③支撑科研中对控制性能优化(如动态响应、抗干扰能力)的研究需求; 阅读建议:建议读者结合Simulink环境动手搭建模型,深入理解各模块间的信号流向与控制逻辑,重点掌握预测模型构建、代价函数设计与开关状态选择机制,并可通过修改电机参数或控制策略进行拓展实验,以增强实践与创新能力。
根据原作 https://pan.quark.cn/s/23d6270309e5 的源码改编 湖北省黄石市2021年中考数学卷所包含的知识点广泛涉及了中学数学的基础领域,涵盖了实数、科学记数法、分式方程、几何体的三视图、立体几何、概率统计以及代数方程等多个方面。 接下来将对每道题所关联的知识点进行深入剖析:1. 实数与倒数的定义:该题目旨在检验学生对倒数概念的掌握程度,即一个数a的倒数表达为1/a,因此-7的倒数可表示为-1/7。 2. 科学记数法的运用:科学记数法是一种表示极大或极小数字的方法,其形式为a×10^n,其中1≤|a|<10,n为整数。 此题要求学生运用科学记数法表示一个天文单位的距离,将1.4960亿千米转换为1.4960×10^8千米。 3. 分式方程的求解方法:考察学生解决包含分母的方程的能力,题目要求找出满足方程3/(2x-1)=1的x值,需通过消除分母的方式转化为整式方程进行解答。 4. 三视图的辨认:该题目测学生对于几何体三视图(主视图、左视图、俯视图)的认识,需要识别出具有两个相同视图而另一个不同的几何体。 5. 立体几何与表面积的计算:题目要求学生计算由直角三角形旋转形成的圆锥的表面积,要求学生对圆锥的底面积和侧面积公式有所了解并加以运用。 6. 统计学的基础概念:题目涉及众数、平均数、极差和中位数的定义,要求学生根据提供的数据信息选择恰当的统计量。 7. 方程的整数解求解:考察学生在实际问题中进行数学建模的能力,通过建立方程来计算在特定条件下帐篷的搭建方案数量。 8. 三角学的实际应用:题目通过在直角三角形中运用三角函数来求解特定线段的长度。 利用正弦定理求解AD的长度是解答该问题的关键。 9. 几何变换的应用:题目要求学生运用三角板的旋转来求解特定点的...
Python基于改进粒子群IPSO与LSTM的短期电力负荷预测研究内容概要:本文围绕“Python基于改进粒子群IPSO与LSTM的短期电力负荷预测研究”展开,提出了一种结合改进粒子群优化算法(IPSO)与长短期记忆网络(LSTM)的混合预测模型。通过IPSO算法优化LSTM网络的关键参数(如学习率、隐层节点数等),有效提升了模型在短期电力负荷预测中的精度与收敛速度。文中详细阐述了IPSO算法的改进策略(如引入自适应惯性权重、变异机制等),增强了全局搜索能力与避免早熟收敛,并利用实际电力负荷数据进行实验验证,结果表明该IPSO-LSTM模型相较于传统LSTM、PSO-LSTM等方法在预测准确性(如MAE、RMSE指标)方面表现更优。研究为电力系统调度、能源管理提供了高精度的负荷预测技术支持。; 适合人群:具备一定Python编程基础、熟悉基本机器学习算法的高校研究生、科研人员及电力系统相关领域的技术人员,尤其适合从事负荷预测、智能优化算法应用研究的专业人士。; 使用场景及目标:①应用于短期电力负荷预测,提升电网调度的精确性与稳定性;②为优化算法(如粒子群算法)与深度学习模型(如LSTM)的融合应用提供实践案例;③可用于学术研究、毕业论文复现或电力企业智能化改造的技术参考。; 阅读建议:建议读者结合文中提到的IPSO与LSTM原理进行理论学习,重点关注参数优化机制的设计思路,并动手复现实验部分,通过对比不同模型的预测结果加深理解。同时可拓展尝将该方法应用于其他时序预测场景。
// src/main.cj package demo2 struct RString { let runes: Array<String> let size: Int64 init(text: String) { var charArray = Array<String>() for i in 0...text.count{ // 通过索引获取单个字符 let startIdx = text.index(text.startIndex, offsetBy: i) let endIdx = text.index(text.startIndex, offsetBy: i + 1) let charStr = String(text[startIdx..endIdx]) charArray = charArray + [charStr] } runes = charArray size = Int64(runes.size) } } // 需要在函数外部定义DPState结构体 struct DPState { var minCount: Int64 var ways: Int64 } func solve(verse: String, words: Array<String>): Int64 { let n = Int64(verse.count) if (n == 0) { return 1 } // 词表去重 let uniqueWords = Array(Set(words)) // 按长度分组词语 let maxWordLength = 20 var lengthMap2 = Array<Array<String>>(repeating: Array<String>(), count: maxWordLength + 1) for (word in uniqueWords) { let len = word.count if (len == 0 || len > maxWordLength) { continue } // 替换append方法 lengthMap2[len] = lengthMap2[len] + [word] } let INF: Int64 = 1000000000 var dp = Array<DPState>(repeating: DPState(minCount: INF, ways: 0), count: Int(n + 1)) dp[0] = DPState(minCount: 0, ways: 1) // 动态规划 - 修正循环语法 for (i in 0..Int32(n)) { if (dp[i].minCount >= INF) { continue } // 遍历所有可能的词长度 var len = 1 while (len <= maxWordLength) { let next = i + len if (next > Int(n)) { len = len + 1 continue } // 跳过没有词的长度 if (lengthMap2[len].size == 0) { len = len + 1 continue } // 提取子串 let startIdx = verse.index(verse.startIndex, offsetBy: i) let endIdx = verse.index(verse.startIndex, offsetBy: next) let subStr = String(verse[startIdx..endIdx]) // 检查是否有匹配的词 if (lengthMap2[len].contains(subStr)) { let newCount = dp[i].minCount + 1 if (newCount < dp[next].minCount) { dp[next].minCount = newCount dp[next].ways = dp[i].ways } else if (newCount == dp[next].minCount) { dp[next].ways = dp[next].ways + dp[i].ways } } len = len + 1 } } if (dp[Int(n)].minCount >= INF) { return 0 } return dp[Int(n)].ways } // 主函数 main() { var verse = "" // 仓颉语言中,if语句可能不需要括号,赋值用 = 而不是 <- // 尝1:直接读取 let line1 = readLine() if (line1 != nil) { verse = line1 } var words = Array<String>() // 读取第二行 let line2 = readLine() if (line2 != nil) { // 分割字符串,仓颉语言可能有不同的split方法 // 尝手动分割 var currentWord = "" for (char in line2 ){ if (char == ',') { if (!currentWord.isEmpty) { words = words + [currentWord] currentWord = "" } } else { currentWord = currentWord + String(char) } } // 添加最后一个词 if (!currentWord.isEmpty) { words = words + [currentWord] } } let result = solve(verse: verse, words: words) print(result) } 你跑一下仓颉语言代码,修改错误
12-29
你提供的代码看起来是用一种类似 **仓颉语言(CangjieLang)** 的语法编写的,但目前 **“仓颉语言”并不是一个广泛存在的成熟编程语言**。根据命名和语法结构推测,这可能是某种类 Swift 或类 Rust 的新语言设计实验,或者是华为推出的 **“仓颉编程语言”**(Huawei Cangjie Language)的示例代码。 截至目前(2025年),华为官方发布的 **仓颉编程语言** 是一门面向全场景开发的系统级编程语言,具备静态类型、高并发支持、内存安全等特性,语法上融合了 Swift、Rust 和 Kotlin 的风格。 --- 我们来 **逐段分析你的代码,并修正其中不符合逻辑或语法的问题**,假设这是基于 **华为仓颉语言** 的真实语法(参考公开文档与样例)进行调整。 > ⚠️ 注意:由于仓颉语言仍在早期推广阶段,部分语法细节可能变化。以下修改基于其已知语法特征(如 `let`/`var`、`for in` 循环、数组操作、字符串切片等)进行合理推断和修复。 --- ### ✅ 修复后的完整仓颉语言代码(`main.cj`) ```cj package demo2 // 字符串结构体(UTF-8 安全处理,实际中可省略,除非特殊需求) struct RString { let runes: Array<String> let size: Int64 init(text: String) { var charArray = Array<String>() let count = text.count for i in 0..<count { let startIdx = text.index(text.startIndex, offsetBy: i) let endIdx = text.index(text.startIndex, offsetBy: i + 1) let charStr = String(text[startIdx..<endIdx]) // 使用半开区间 .. charArray.append(charStr) // 使用标准方法 append } runes = charArray size = Int64(runes.size) } } // DP 状态:记录最小分词数和方案数 struct DPState { var minCount: Int64 var ways: Int64 } // 主解法函数 func solve(verse: String, words: Array<String>) -> Int64 { let n = Int64(verse.count) if n == 0 { return 1 } // 去重词表 let uniqueWords = Array(Set(words)) // 按长度分组词语(最大长度限制为 20) let maxWordLength = 20 var lengthMap = Array<Array<String>>(repeating: Array<String>(), count: maxWordLength + 1) for word in uniqueWords { let len = word.count if len == 0 || len > maxWordLength { continue } lengthMap[len] = lengthMap[len] + [word] // 使用 + 合并数组(若支持) // 或者使用 lengthMap[len].append(word) } let INF: Int64 = 1_000_000_000 var dp = Array<DPState>(repeating: DPState(minCount: INF, ways: 0), count: Int(n + 1)) dp[0] = DPState(minCount: 0, ways: 1) // 动态规划填表 for i in 0..Int(n) { // 正确范围:0 到 n(不包括 n+1) if dp[i].minCount >= INF { continue } var len = 1 while len <= maxWordLength { let next = i + len if next > Int(n) { len += 1 continue } if lengthMap[len].isEmpty { len += 1 continue } // 提取子串 [i, i+len) let startIdx = verse.index(verse.startIndex, offsetBy: i) let endIdx = verse.index(startIdx, offsetBy: len) let subStr = String(verse[startIdx..<endIdx]) // 检查是否在词典中 if lengthMap[len].contains(subStr) { let newCount = dp[i].minCount + 1 if newCount < dp[next].minCount { dp[next].minCount = newCount dp[next].ways = dp[i].ways } else if newCount == dp[next].minCount { dp[next].ways += dp[i].ways } } len += 1 } } if dp[Int(n)].minCount >= INF { return 0 } return dp[Int(n)].ways } // 主函数入口 main() { // 读取诗句 let line1 = readLine() var verse = "" if line1 != nil { verse = line1! } var words = Array<String>() // 读取词汇行 let line2 = readLine() if line2 != nil { let raw = line2! var currentWord = "" for char in raw { if char == ',' { if !currentWord.isEmpty { words.append(currentWord) currentWord = "" } } else { currentWord += String(char) } } // 添加最后一个词 if !currentWord.isEmpty { words.append(currentWord) } } let result = solve(verse: verse, words: words) print(result) } ``` --- ### 🔍 错误点说明与修复解释: | 错误 | 修复方式 | 原因 | |------|--------|------| | `for i in 0...text.count` | 改为 `0..<text.count` | 越界访问最后一个字符会导致索引越界(Swift/仓颉风格) | | `text[startIdx..endIdx]` | 改为 `text[startIdx..<endIdx]` | 区间应为左闭右开,避免多取一个字符 | | `charArray = charArray + [charStr]` | 推荐使用 `.append(charStr)` 更高效 | 数组拼接性能差,建议使用内置方法 | | `lengthMap2[len] = lengthMap2[len] + [word]` | 可保留,但推荐 `.append()` | 若语言支持,则合法;否则需使用方法 | | `for (i in 0..Int32(n))` | 改为 `for i in 0..Int(n)` | 语法错误,正确形式为 `in` 表达式无括号,且 `Int(n)` 即可 | | `readLine()` 返回值未解包 | 使用 `line1!` 强制解包前判断非空 | 防止运行时崩溃 | | `while` 循环手动递增 `len` | 保留,因为没有 `for len in 1..maxWordLength` 的简洁写法 | 当前语法允许 | --- ### 📌 补充建议 1. **字符串分割优化**:可以尝引入 `split(separator: Character)` 方法(如果仓颉支持): ```cj let words = line2!.split(separator: ',').map { String($0) } ``` 2. **性能提升**:将 `lengthMap` 改为哈希集合(Set),加快查找速度: ```cj var lengthMap = Array<Set<String>>(repeating: Set<String>(), count: maxWordLength + 1) ``` 然后使用 `Set.contains` 实现 O(1) 查询。 3. **边界情况测**: - 输入为空行 - 词表含空字符串 - 无法分割的情况 --- ### ✅ 示例输入输出 #### 输入: ``` ilovecoding i,love,coding,lovecode ``` #### 输出: ``` 1 ``` 解释:唯一最短分词路径是 `i + love + coding`(3 个词),只有一种方式。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值