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 ” ,值就是 “  ( ) ”


内容概要:本文档是一份关于交换路由配置的学习笔记,系统地介绍了网络设备的远程管理、交换机与路由器的核心配置技术。内容涵盖Telnet、SSH、Console三种远程控制方式的配置方法;详细讲解了VLAN划分原理及Access、Trunk、Hybrid端口的工作机制,以及端口镜像、端口汇聚、端口隔离等交换技术;深入解析了STP、MSTP、RSTP生成树协议的作用与配置步骤;在路由部分,涵盖了IP地址配置、DHCP服务部署(接口池与全局池)、NAT转换(静态与动态)、静态路由、RIP与OSPF动态路由协议的配置,并介绍了策略路由和ACL访问控制列表的应用;最后简要说明了华为防火墙的安全区域划分与基本安全策略配置。; 适合人群:具备一定网络基础知识,从事网络工程、运维或相关技术岗位1-3年的技术人员,以及准备参加HCIA/CCNA等认证考的学习者。; 使用场景及目标:①掌握企业网络中常见的交换与路由配置技能,提升实际操作能力;②理解VLAN、STP、OSPF、NAT、ACL等核心技术原理并能独立完成中小型网络搭建与调;③通过命令示例熟悉华为设备CLI配置逻辑,为项目实施和故障排查提供参考。; 阅读建议:此笔记以实用配置为主,建议结合模拟器(如eNSP或Packet Tracer)动手实践每一条命令,对照拓扑理解数据流向,重点关注VLAN间通信、路由选择机制、安全策略控制等关键环节,并注意不同设备型号间的命令差异。
多旋翼无人机组合导航系统-多源信息融合算法(Matlab代码实现)内容概要:本文围绕多旋翼无人机组合导航系统,重点介绍了基于多源信息融合算法的设计与实现,利用Matlab进行代码开发。文中采用扩展卡尔曼滤波(EKF)作为核心融合算法,整合GPS、IMU(惯性测量单元)、里程计和电子罗盘等多种传感器数据,提升无人机在复杂环境下的定位精度与稳定性。特别是在GPS信号弱或丢失的情况下,通过IMU惯导数据辅助导航,实现连续可靠的位姿估计。同时,文档展示了完整的算法流程与Matlab仿真实现,涵盖传感器数据预处理、坐标系转换、滤波融合及结果可视化等关键环节,体现了较强的工程实践价值。; 适合人群:具备一定Matlab编程基础和信号处理知识,从事无人机导航、智能控制、自动化或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于多旋翼无人机的高精度组合导航系统设计;②用于教学与科研中理解多传感器融合原理与EKF算法实现;③支持复杂环境下无人机自主飞行与定位系统的开发与优化。; 阅读建议:建议结合Matlab代码与理论推导同步学习,重点关注EKF的状态预测与更新过程、多传感器数据的时间同步与坐标变换处理,并可通过修改噪声参数或引入更多传感器类型进行扩展实验。
源码来自:https://pan.quark.cn/s/28c3abaeb160 在高性能计算(High Performance Computing,简称HPC)范畴内,处理器的性能衡量对于改进系统构建及增强运算效能具有关键价值。 本研究聚焦于一种基于ARM架构的处理器展开性能评估,并就其性能与Intel Xeon等主流商业处理器进行对比研究,特别是在浮点运算能力、存储器带宽及延迟等维度。 研究选取了高性能计算中的典型任务,诸如Stencils计算方法等,分析了在ARM处理器上的移植编译过程,并借助特定的执行策略提升运算表现。 此外,文章还探讨了ARM处理器在“绿色计算”范畴的应用前景,以及面向下一代ARM服务器级SoC(System on Chip,简称SoC)的性能未来探索方向。 ARM处理器是一种基于精简指令集计算机(Reduced Instruction Set Computer,简称RISC)架构的微处理器,由英国ARM Holdings公司研发。 ARM处理器在移动设备、嵌入式系统及服务器级计算领域获得广泛应用,其设计优势体现为高能效比、低成本且易于扩展。 当前的ARMv8架构支持64位指令集,在高性能计算领域得到普遍采用。 在性能测环节,重点考察了处理器的浮点运算能力,因为浮点运算在科学计算、图形渲染和数据处理等高性能计算任务中扮演核心角色。 实验数据揭示,ARM处理器在双精度浮点运算方面的性能达到475 GFLOPS,相当于Intel Xeon E5-2680 v3处理器性能的66%。 尽管如此,其内存访问带宽高达105 GB/s,超越Intel Xeon处理器。 这一发现表明,在数据密集型应用场景下,ARM处理器能够展现出与主流处理器相匹敌的性能水平。 在实践...
// 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 个词),只有一种方式。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值