華為倉頡編程語言實踐體驗
目前華為倉頡編程語言因為其推出時間較短,生態系統不完善。官網資料權威,但比較龐大難懂。快速實驗入門,是學習一門編程語言的法寶。網上靠譜的資料稀少,特此撰文介紹,幫助初學者減少挫折感,樹立學習信心。
概述
我是在windows10中,使用目前最新的實驗環境:CodeArts IDE for Cangjie 3.4.1和2025 年 7 月推出首個長期支持版本(LTS 1.0.0)。
華為倉頡編程語言簡介和實驗壞境搭建 可見https://blog.csdn.net/cnds123/article/details/149467143
CodeArts IDE for Cangjie新建工程(Project)步驟
CodeArts IDE 提供了一個 Cangjie 項目向導,幫助您更輕松地創建新項目并配置環境。使用步驟:
步驟1、 在主菜單中,選擇文件 > 新建 > 工程(Project) 。
步驟2、 在打開的“新建工程”對話框中,從左側列表選擇“Cangjie”,填入項目參數。參見下圖:
??? (1)設置項目名稱和路徑。新建工程的名稱默認為包名。
??? (2)在“產物類型”的下拉框中選擇“executable”、“static”、 “dynamic” 選項,生成不同的產物,使用默認executable即可。
步驟3、 單擊“創建”按鈕,將自動產生一段簡單的示例代碼。
步驟4、把 main.cj 內容替換為你的代碼。注意保留頂端的package語句。CodeArts IDE for Cangjie的包機制通常與項目的目錄結構存在隱性關聯(類似 Java等語言),IDE 自動生成的 package 包名 (如package mydemo)對應項目中 demo 目錄下的代碼。
【CodeArts IDE for Cangjie其它常用操作簡介
若想關閉CodeArts IDE for Cangjie已經啟動的項目(Project),在主菜單中,選擇文件 >關閉項目。
打開已關閉項目(Project),在主菜單中,選擇文件 >打開項目
前面提到,新建工程(Project),在主菜單中,選擇文件 > 新建 > 工程(Project)。
注:細心的讀者可能發現中文這些菜單項用語有點不一致。項目、工程是一個意思,英文是Project。
順便提示:快速縮進(Indent)和反縮進(Unindent)代碼塊的操作
與主流 IDE 類似
縮進代碼塊:
??? 先選中需要縮進的代碼塊(可通過鼠標拖動或快捷鍵 Shift+↑/↓ 選擇)
??? 按下 Tab 鍵,選中的代碼塊會整體向右縮進一個層級
反縮進代碼塊:
??? 同樣先選中需要反縮進的代碼塊
??? 按下 Shift+Tab 組合鍵,選中的代碼塊會整體向左減少一個縮進層級
】
特別提示:華為倉頡編程語言是大小寫敏感的。
實驗1、讀入一個數,判斷其奇偶性
新建一個名為Experiment_1 的工程,在主菜單中,選擇文件 > 新建 > 工程(Project)
用下面的實驗代碼,替換原來自動生成的main.cj 內容
import std.convert.*
main() {print("請輸入一個整數:")var str: String = readln()var n = Int64.parse(str)// 判斷奇偶if (n % 2 == 0) {println("${n} 是偶數")} else {println("${n} 是奇數")}return 0
}
參見下圖:
圖示中,在下部的“終端”部分,為“請輸入一個整數”提供一個數值9,程序判斷9是奇數。
上面的實驗代碼,問題在于如果用戶輸入非數字將出錯中斷運行,下面是(使用try異常處理)改進:
import std.convert.*
import std.io.*main(){print("請輸入一個整數:")while (true) {var str: String = readln()if (str.isEmpty()) {print("輸入為空,請重新輸入一個整數:")continue}// 使用 try-catch 捕獲 parse 可能拋出的異常try {var n = Int64.parse(str)if( n % 2 == 0) {println("${n} 是偶數")} else {println("${n} 是奇數")}break} catch(e:IllegalArgumentException){print("輸入非法,請輸入一個有效的整數:")}}return 0
}
實驗2、生成1~100整數的代碼
新建一個名為Experiment_2 的工程,實驗過程參見實驗1,下面僅給出實驗代碼:
import std.random.*main() {// 先拿到 Int8 范圍內的隨機數let n: Int8 = Random().nextInt8()// 映射到 1~100:// 1. n % 100 得到 0~99// 2. +1 得到 1~100let number: Int8 = (n % 100 + 100) % 100 + 1 // 兩次 %100 保證非負println(number)
}
實驗3、猜數游戲
一個使用倉頡編程語言編寫的猜數字(100 以內)游戲程序。
新建一個名為Experiment_3 的工程,實驗過程參見實驗1,下面僅給出實驗代碼:
import std.convert.*
import std.io.*
import std.random.*main() {// 輸出游戲歡迎信息println("歡迎來到猜數字游戲!")println("我已經想好了一個1到100之間的整數。")println("請你猜一猜這個數字是多少?")// 先拿到 Int8 范圍內的隨機數let n: Int8 = Random().nextInt8()// 映射到 1~100let target: Int8 = (n % 100 + 100) % 100 + 1 // 兩次 %100 保證非負// 注釋掉調試輸出,正式游戲不顯示答案// println(target)var guess: Int8 = 0 // 聲明猜測變量,擴大作用域while (true) {// 提示用戶輸入猜測的數字,合并重復提示print("請輸入你的猜測(1-100):")var str: String = readln()if (str.isEmpty()) {println("輸入為空,請重新輸入一個整數:")continue}// 使用 try-catch 捕獲 parse 可能拋出的異常try {guess = Int8.parse(str)// 檢查范圍if (guess >= 1 && guess <= 100) {break // 輸入有效,退出輸入循環} else {println("請輸入1到100之間的數字:")}} catch(e:IllegalArgumentException){println("輸入非法,請輸入一個有效的整數:")}}// 主游戲循環,每次猜測后重新獲取輸入while (true) {if (guess < target) {println("猜小了!再試試更大的數字。")} else if (guess > target) {println("猜大了!再試試更小的數字。")} else {println("恭喜你猜對了!")break}// 重新獲取用戶輸入print("請再次輸入你的猜測(1-100):")var str: String = readln()try {guess = Int8.parse(str)} catch(e:IllegalArgumentException) {println("輸入非法,已自動使用上一次猜測值,請輸入有效整數:")}} println("游戲結束,謝謝參與!")
}
改進版
添加有猜測計數,記錄你幾次才對的,源碼如下:
package demo2import std.convert.*
import std.io.*
import std.random.*main() {// 輸出游戲歡迎信息println("歡迎來到猜數字游戲!")println("我已經想好了一個1到100之間的整數。")println("請你猜一猜這個數字是多少?")// 生成1~100的隨機數let n: Int8 = Random().nextInt8()let target: Int8 = (n % 100 + 100) % 100 + 1 // 映射到1~100var guess: Int8 = 0 var guessCount: Int = 0 // 新增:猜測次數計數器// 第一次輸入并驗證while (true) {print("請輸入你的猜測(1-100):")var str: String = readln()if (str.isEmpty()) {println("輸入為空,請重新輸入一個整數:")continue}try {guess = Int8.parse(str)if (guess >= 1 && guess <= 100) {guessCount += 1 // 新增:有效猜測,計數+1break} else {println("請輸入1到100之間的數字:")}} catch(e:IllegalArgumentException){println("輸入非法,請輸入一個有效的整數:")}}// 主游戲循環while (true) {if (guess < target) {println("猜小了!再試試更大的數字。")} else if (guess > target) {println("猜大了!再試試更小的數字。")} else {// 新增:顯示猜測次數println("恭喜你猜對了!")println("你一共猜了 ${guessCount} 次")break}// 重新輸入并計數print("請再次輸入你的猜測(1-100):")var str: String = readln()try {guess = Int8.parse(str)if (guess >= 1 && guess <= 100) {guessCount += 1 // 新增:有效猜測,計數+1} else {println("請輸入1到100之間的數字,本次輸入不計數:")}} catch(e:IllegalArgumentException) {println("輸入非法,本次輸入不計數,請輸入有效整數:")}} println("游戲結束,謝謝參與!")
}