用 TI 图 形 计 算 器 学 编 程 入 门 篇 要 学 编 程, 应 该 从 哪 种 语 言 入 手? 笔 者 推 荐 从 BASIC 语 言 入 手, 因 为 它 简 单 易 学, 在 许 多 国 家 都 作 为 一 种 计 算 机 程 序 的 教 学 语 言 和 入 门 语 言. TI Nspire TM CX CAS 中 文 彩 屏 机, 里 面 的 程 序 语 言 是 TI Basic 语 言, 拥 有 数 量 庞 大 的 内 置 函 数, 下 面 我 们 通 过 此 类 TI 图 形 计 算 器, 一 起 走 进 BASIC 的 学 习. 一 BASIC 的 故 事 BASIC 的 诞 生, 从 一 个 传 奇 的 故 事 开 始. 1964 年, 美 国 达 特 茅 斯 大 学 的 Thomas E. Kurtz(1928 ) 和 John G. Kemeny (1926.5.31 1992.12.26, 原 籍 匈 牙 利 ) 在 Fortran II 和 ALGOL 60 的 基 础 上 设 计 了 一 种 新 的 计 算 机 语 言, 命 名 为 Beginner's All purpose Symbolic Instruction Code, 意 为 初 学 者 通 用 符 号 指 令 代 码, 简 称 BASIC. 这 个 简 单 易 学 的 计 算 机 程 序 设 计 语 言 当 时 只 有 17 条 语 句, 12 个 函 数 和 3 个 命 令, 这 就 是 BASIC 始 祖 Dartmouth BASIC. 第 一 个 BASIC 程 序 ( 实 际 是 一 个 编 译 器 ) 于 当 地 时 间 1964 年 5 月 1 日 凌 晨 4 点 在 一 台 GE 265 (IBM 704) 主 机 中 成 功 运 行, 操 作 者 是 Mike Busch 和 John McGeachie. 从 此 Kurtz 和 Kemeny 作 为 BASIC 语 言 之 父 被 永 远 载 入 史 册. BASIC 语 言 自 诞 生 起 就 显 示 出 了 强 大 的 生 命 力, 各 种 版 本 层 出 不 穷. 从 APPLE Ⅱ 机 上 用 的 APPLE SOFT BASIC, 到 LASER 310 上 用 的 MSBASIC, 到 IBM PC 及 其 兼 容 机 上 用 的 BASICA 和 GW BASIC, 再 到 MS DOS 上 的 MS BASIC QuickBASIC 和 VisualBasic 1.0, 直 至 Windows 下 的 Visual Basic 和 Linux 下 的 XBasic YaBASIC 等 等, BASIC 无 处 不 在, 甚 至 许 多 电 子 游 戏 机 ( 例 如 小 霸 王 学 习 机 ) 和 微 型 电 子 词 典 ( 例 如 文 曲 星 ) 中 都 实 现 了 BASIC. 从 诞 生 之 初,BASIC 语 言 就 以 其 简 单 易 学 和 对 硬 件 要 求 低 等 特 点 受 到 了 广 大 程 序 设 计 人 员, 特 别 是 电 脑 初 学 者 的 青 睐, 历 经 四 十 载, 显 示 了 其 顽 强 的 生 命 力. 如 今 BASIC 语 言 在 许 多 国 家 都 作 为 一 种 计 算 机 程 序 的 教 学 语 言 和 入 门 语 言. 谭 浩 强 教 授 八 十 年 代 所 著 BASIC 语 言 一 书, 曾 经 多 次 再 版, 现 在 的 发 行 量 已 经 超 过 千 万 之 巨,BASIC 语 言 在 中 国 有 着 大 量 拥 趸, 许 多 编 程 爱 好 者 和 专 业 人 士 也 一 直 对 它 情 有 独 钟. 二 TI-BASIC 简 介 TI nspire 系 列 所 使 用 的 TI Basic 语 言 是 非 常 简 单 的 一 门 语 言, 同 时 也 是 局 限 性 很 大 的 一 门 语 言. 这 门 语 言 拥 有 数 量 庞 大 的 内 置 函 数, 其 中 相 当 一 部 分 是 数 学 函 数. 在 nspire 上 写 出 的 所 有 程 序 都 需 要 以 函 数 的 形 式 来 运 行, 这 一 点 会 在 具 体 的 例 子 中 解 释. 创 建 一 个 Nspire 程 序, 先 新 建 一 个 计 算 器 后, 然 后 按 b911 即 可 新 建 一 个 程 序, 如 右 图. TI Nspire 程 序 分 为 程 序 和 函 数 两 类. 程 序 能 够 定 义 全 局 变 量, 可 以 有 任 意 数 量 的 输 出 ( 或 者 不 输 出 ), 并 且 能 够 调 用 其 它 的 程 序 或 函 数. 而 函 数 则 只 能 输 出 一 个 结 果, 不 能 定 义 全 局 变 量, 也 不 能 调 用 其 它 的 程 序 或 函 数.
运 行 程 序 的 方 法 是 : 在 计 算 器 页 面 里 输 入 程 序 名 和 左 括 号, 然 后 输 入 各 项 参 数, 输 入 右 括 号 后 按 Enter 键. 三 程 序 基 础 知 识 ( 一 ) 整 体 结 构 与 数 据 类 型 Nspire 的 程 序 的 整 体 框 架 为 : 程 序 类 函 数 类 Define [ 程 序 名 ]( 参 数 1, 参 数 2, )= Prgm [ 命 令 行 ] EndPrgm Define [ 程 序 名 ]( 参 数 1, 参 数 2, )= Func [ 命 令 行 ] EndFunc 例 如 Nspire 上 的 Helloworld 程 序 可 以 用 如 下 的 代 码 实 现 : Define hw( )= Prgm Disp Helloworld! EndPrgm 在 nspire 编 程 中, 数 据 的 类 型 分 为 数 字 字 符 串 数 组 矩 阵 函 数 和 程 序. 函 数 和 程 序 在 前 文 已 经 介 绍 过, 数 字 指 所 有 的 整 数 和 浮 点 数 ; 字 符 串 指 在 双 引 号 中 的 数 据, 如 Helloworld ; 数 组 指 在 花 括 号 中 的 一 组 数 据, 如 {1,3,5,7,9}; 矩 阵 指 以 矩 阵 形 式 呈 现 的 一 组 数 据. 数 据 的 类 型 可 用 gettype() 函 数 判 定. 操 作 提 示 : 在 计 算 器 页 面, 按 b911 新 建 一 个 程 序, 按 b21 检 查 语 法 并 保 存, 按 /e 在 计 算 窗 口 与 程 序 窗 口 跳 转. 在 计 算 窗 口, 按 h 可 调 用 程 序 ( 或 变 量 ). 按 /r 可 调 用 字 符 串 符 号, 按 /) 可 调 用 数 组 符 号 {}, 按 t 可 调 用 一 系 列 矩 阵 符 号. 的 复 制. ( 二 ) 变 量 的 定 义, 即 赋 值 Nspire 程 序 的 变 量 可 以 通 过 三 种 方 式 定 义. 例 如 把 变 量 a 定 义 为 3, 有 如 下 三 种 方 式 : 方 式 1. a:=3 方 式 2. 3 a 方 式 3. Define a=3 除 了 数 字 以 外, 变 量 也 可 以 用 同 样 的 方 式 定 义 为 其 他 的 数 据 类 型. 此 外, 与 变 量 操 作 相 关 的 几 个 函 数 也 要 清 楚. 1. Local 函 数, 其 作 用 是 使 变 量 仅 在 该 程 序 或 函 数 中 有 效, 不 作 为 全 局 变 量. 格 式 为 : Local [ 变 量 名 1],[ 变 量 名 2], 2. Delvar 函 数, 其 作 用 是 将 变 量 删 除, 此 操 作 也 同 样 适 用 于 程 序 的 删 除. 格 式 为 :Delvar([ 变 量 名 ]) 3. CopyVar 函 数, 其 作 用 是 将 变 量 1 的 内 容 复 制 到 变 量 2, 此 操 作 同 样 适 用 于 程 序 格 式 为 :CopyVar([ 变 量 1],[ 变 量 2]) ( 三 ) 输 入 输 出 指 令 Nspire 程 序 有 两 种 输 入 指 令 和 三 种 输 出 指 令. 1. Request 输 入 指 令, 格 式 为 :Request [ 提 示,] 变 量 名 [,0] 输 入 指 令 的 第 一 种 为 Request, 它 要 求 用 户 输 入 的 数 据 为 数 字, 提 示 部 分 需 要 使 用 字
符 串 形 式. 后 面 的 0, 表 示 在 输 出 的 结 果 里 不 显 示 这 一 行 的 Request 提 示 和 用 户 输 入 值. 例 :Request 1+1=?, ans, 0 它 表 示 若 用 户 输 入 一 个 数 值, 它 将 被 存 入 变 量 ans. 2. RequestStr 输 入 指 令, 格 式 为 :RequestStr [ 提 示,] 变 量 名 [,0] RequestStr 与 Request 的 唯 一 不 同 在 于 它 对 用 户 输 入 的 值 将 以 字 符 串 形 式 存 入 变 量. 例 :RequestStr What s Your Name?, name, 0 3. Disp 输 出 指 令, 格 式 为 :Disp [ 内 容 ] Disp 是 最 基 本 的 输 出 指 令, 它 在 屏 幕 上 显 示 指 定 的 内 容, 该 内 容 可 以 是 除 程 序 以 外 的 任 意 数 据 类 型. 例 :Disp Helloworld Disp a+2 4. Tex 输 出 指 令, 格 式 为 :Text [ 内 容 ] [,0] Text 指 令 会 以 弹 出 对 话 框 的 形 式 输 出 内 容, 0 的 作 用 与 Request 中 的 0 相 同. 内 容 要 求 为 字 符 串 格 式. 有 一 行. 个 Else. 例 :Text You Win!, 0 5. Return 输 出 指 令, 格 式 为 : Return [ 内 容 ] Return 指 令 为 函 数 专 用 的 输 出 指 令, 它 使 函 数 返 回 指 定 的 内 容. 例 :Return factor(x) ( 四 ) 控 制 指 令 1. If 条 件 语 句 If 句 是 最 常 用 的 条 件 语 句, 它 有 不 同 的 形 式. ⑴ If 形 式, 格 式 为 :If [ 条 件 a] [ 命 令 a] 最 基 本 的 If 句, 它 表 示 : 如 果 条 件 a 成 立 则 执 行 命 令 a. 值 得 注 意 的 是, 命 令 a 只 能 例 :If x>5 x:=x 5 ⑵ If Then 形 式, 格 式 为 :If [ 条 件 a] Then [ 命 令 a] 与 上 一 种 不 同 的 是, 命 令 a 从 Then 之 后 延 续 到 之 前, 没 有 长 度 限 制. 例 :If x>5 Then x:=x 5 ⑶ If Then Else 形 式, 格 式 为 : If [ 条 件 a] Then [ 命 令 a] Else [ 命 令 b] 它 表 示 : 如 果 条 件 a 成 立 则 执 行 命 令 a, 否 则 执 行 命 令 b. 在 一 个 If 句 中 只 能 出 现 一 例 :If x>5 Then x:=x 5 Else
⑷ If Then ElseIf Then 形 式, 格 式 为 : If [ 条 件 a] Then [ 命 令 a] ElseIf [ 条 件 b] Then [ 命 令 b] 它 表 示 : 如 果 条 件 a 成 立 则 执 行 命 令 a, 如 果 条 件 a 不 成 立 而 条 件 b 成 立 则 执 行 命 令 b. 在 一 个 If 句 中 可 以 出 现 任 意 数 量 的 ElseIf Then. 例 如 :If x<3 then Disp Too Small ElseIf x>3 Then Disp Too Big ElseIf x=3 Then Disp Good! 2. For 循 环 语 句 For 是 nspire 三 种 循 环 句 当 中 的 一 种. 格 式 为 : For [ 变 量 名 ], [ 起 始 值 ], [ 结 束 值 ], [ 间 隔 ] [ 命 令 行 ] EndFor 例 如 :For x,1,5,1 EndFor 它 表 示 : 变 量 x 的 值 由 1 增 加 到 5 且 以 1 为 间 隔 递 增,x 每 增 加 1 就 输 出 一 次 2x 的 值. 所 以 这 段 代 码 的 输 出 应 当 为 : 2 4 6 8 10 3. While 循 环 语 句 While 也 是 一 种 循 环 句, 它 的 基 本 格 式 为 : While [ 条 件 ] [ 命 令 行 ] EndWhile 它 表 示 : 如 果 条 件 成 立 则 不 断 重 复 执 行 指 定 的 命 令, 直 到 条 件 不 成 立 为 止. 所 以 在 While 句 中 一 定 要 有 一 个 不 断 改 变 的 量, 否 则 就 会 成 为 一 个 死 循 环. 例 如 :x:=1 While x<6 x:=x+1 EndWhile 这 段 语 句 的 功 能 同 上 节 的 For 语 句 相 同. 4. Loop 循 环 语 句 Loop 是 一 种 死 循 环 句, 所 以 需 要 与 Exit 指 令 配 合 使 用. 格 式 为 : Loop [ 命 令 行 ] EndLoop 它 的 作 用 就 是 一 直 重 复 执 行 指 定 的 命 令. 例 如 :x:=1 Loop
If x 5 Exit EndLoop 这 段 语 句 的 功 能 同 上 两 节 的 语 句 相 同. 5. Try 语 句 Try 是 非 常 特 殊 的 一 种 句 法, 它 的 基 本 格 式 为 :Try [ 命 令 a] Else [ 命 令 b] 它 表 示 : 如 果 命 令 a 能 够 执 行 则 执 行 命 令 a, 否 则 执 行 命 令 b. EndTry 例 如 :Request Enter a number:, num, 0 Try If num<0 Disp num Else Disp Invalid Input EndTry 这 段 代 码 要 求 用 户 输 入 一 个 数 字, 如 果 该 数 小 于 零, 则 输 出 它 的 相 反 数. 但 是, 如 果 用 户 输 入 的 不 是 一 个 数 字 而 是 其 它 的 数 据 类 型 或 未 定 义 的 变 量, 程 序 则 无 法 判 定 其 是 否 小 于 零, 此 时 便 转 而 执 行 Else 后 的 命 令, 输 出 Invalid Input. 效 ) 6. ClrErr 指 令 此 命 令 清 除 当 前 的 错 误, 并 设 置 了 错 误 的 系 统 变 量 为 零. 7. PassErr 指 令 PassErr 将 传 递 try... EndTry 的 一 个 错 误. ( 五 ) 传 送 指 令 1. Lbl 和 Goto 简 单 来 说,Lbl 就 是 标 签,Goto 就 是 前 往 标 签. 例 :Lbl start x:=x 10 If x>0 Goto start 这 段 代 码 的 功 能 是 将 x 值 减 10, 如 果 减 10 后 的 值 大 于 零, 则 返 回 上 一 步 再 减 10. 2. Exit 和 Stop Exit 只 在 循 环 句 中 有 效, 表 示 跳 出 该 循 环. Stop 的 作 用 是 直 接 终 止 程 序 ( 在 函 数 中 无 例 :For i,1,10,1 x:=10+i If int(x/6)=x/6 Exit EndFor 这 段 代 码 表 示, 在 i 从 1 增 到 10 的 循 环 中, 如 果 i+10 能 被 6 整 除 则 跳 出 循 环. 例 :Define example(x)= Prgm If gettype(x) NUM Then
Text Invalid Input Stop 这 段 代 码 表 示, 如 果 用 户 输 入 的 不 是 数 字, 则 提 示 输 入 无 效, 直 接 终 止 程 序 的 运 行. 3. Return Return 命 令 将 退 出 一 个 子 程 序, 并 直 接 返 回 到 父 程 序 的 进 展. 4. Cycle Cycle 只 在 循 环 句 中 有 效, 它 表 示 结 束 程 序 循 环 的 某 一 次 周 期, 遇 到 时 立 即 开 始 循 环. 例 如 : Loca l a 0 a Wh il e a<10 Di sp a a+1 a If a>5 Cycl e a+1 a En dwh il e 此 代 码 显 示 0,2,4,6,7,8 和 9. 程 序 运 行 时, 首 先 在 循 环 体 内 执 行 a+ 1 a 两 次, 从 而 使 a+2 a. 然 而, 当 a 大 于 5 时, 第 二 个 a+ 1 a 不 会 执 行, 因 为 周 期 循 环 重 新 启 动. ( 六 ) 字 符 串 数 组 和 矩 阵 相 关 函 数 这 一 节 主 要 介 绍 有 关 字 符 串 数 组 和 矩 阵 的 主 要 函 数. 1. & 这 个 字 符 表 示 将 两 个 字 符 串 合 并. 例 : TI & nspire, 结 果 为 TI nspire. 2. InString() InString 函 数 会 返 回 一 个 ( 或 一 段 ) 字 符 在 字 符 串 中 出 现 的 位 置. 如 果 该 字 符 多 次 出 现, 则 返 回 第 一 次 出 现 的 位 置 : 例 :InString( cncalc, c ), 结 果 为 1;InString( TI nspire, ns ), 结 果 为 4. 3. left() 和 right() 如 函 数 名 称 所 表 示 的, 这 两 个 函 数 分 别 返 回 字 符 串 左 起 或 右 起 的 n 个 字 符. 例 :left( casio,3), 结 果 为 cas ;right( texas,3), 结 果 为 xas. 4. dim() dim() 函 数 返 回 字 符 串 的 长 度. 例 :dim( TI Nspire ), 结 果 为 9. 5. string() string() 函 数 将 一 个 任 意 的 表 达 式 转 换 为 字 符 串 形 式. 例 :string(1+2), 结 果 为 1+2. 6. expr() 该 函 数 将 字 符 串 形 式 的 表 达 式 进 行 计 算, 是 string() 的 逆 运 算. 例 :expr( 1+2 ), 结 果 为 3. 7. [ ] 方 括 号 的 作 用 是 返 回 数 组 的 第 n 个 元 素 或 矩 阵 的 第 i 行 j 列 的 元 素.
例 :{1,3,5,7,9}[3], 结 果 为 5; 1 3 [2 2], 结 果 为 7. 5 7 8. augment() augment() 函 数 将 两 个 数 组 进 行 合 并. 例 : augment({1,3,5},{2,4,6}), 结 果 为 {1,3,5,2,4,6}. 9. list Mat() 该 函 数 将 数 组 转 为 每 行 元 素 数 一 定 的 矩 阵. 例 :list Mat({1,3,5,7},2), 结 果 为 1 3 5 7 10. Mat list() 该 函 数 将 矩 阵 转 为 数 组. 例 :Mat list( 1 3 ), 结 果 为 {1,3,5,7}. 5 7 四 典 型 实 例 ( 一 ) 条 件 语 句 应 用 : 分 段 函 数 计 算 x ( x < 1), 例 1 编 写 一 个 程 序, 对 于 函 数 y = 2x 1 (1 x < 10), 输 入 x 的 值, 输 出 相 应 函 数 值. 3x 1 ( x 10), 分 析 : 利 用 If Then 语 句. 解 : 第 一 步 新 建 一 个 程 序. 按 c11 新 建 一 个 文 档 及 计 算 页, 按 b911 新 建 一 个 程 序, 命 名 为 prj03. 第 二 步 输 入 所 编 写 的 程 序. 在 程 序 窗 口, 输 入 以 下 程 序 : Request x=,x If x<1 then y:=x If 1 x<10 then y:=2x 1 If x 10 then y:=3x 1 Disp y,y 按 /r 可 调 用 字 符 串 符 号, 按 /t 可 调 用 定 义 符 :=, 按 /= 可 选 择 不 等 号. 第 三 步 检 查 语 法, 并 保 存 程 序.
按 b21 检 查 语 法 并 保 存, 如 有 错 误, 则 光 标 停 留 在 错 误 行. 第 四 步 运 行 程 序. 按 /e 跳 转 到 计 算 窗 口, 按 h 选 择 程 序 ( 或 输 入 程 序 名 称 ), 按 执 行, 弹 出 要 求 输 入 变 量 x 的 窗 口, 输 入 一 个 x 值,. 思 考 : 你 能 用 ElseIf 语 句 来 编 写 此 程 序 吗? ( 二 ) 循 环 语 句 应 用 ; 辗 转 相 除 法 与 最 大 公 约 数 求 两 个 正 整 数 的 最 大 公 约 数, 辗 转 相 除 法 ( 出 自 于 活 动 于 公 元 前 300 年 左 右 的 古 希 腊 数 学 家 欧 几 里 得 所 著 的 几 何 原 本 ) 的 算 法 过 程 是 : 用 较 大 的 数 m 除 以 较 小 的 数 n, 得 到 余 数 r, 即 除 式 m = nq + r (0 r n ), 再 用 除 数 n 除 以 余 数 r, 得 到 新 的 余 数. 反 复 执 行 这 一 步, 当 某 步 余 数 为 0 是, 该 步 的 除 数 就 是 最 大 公 约 数. 例 2 用 辗 转 相 除 法 求 8251 与 6105 的 最 大 公 约 数. 分 析 : 由 8251 6105=1 2146; 6105 2146=2 1813;2146 1813=1 333; 1813 333=5 148; 333 148=2 37;148 37=4 0. 最 大 公 约 数 为 37. 解 : 第 一 步 新 建 一 个 程 序. 按 c11 新 建 一 个 文 档 及 计 算 页, 按 b911 新 建 一 个 程 序, 命 名 为 zz. 第 二 步 输 入 所 编 写 的 程 序.
在 程 序 窗 口, 输 入 以 下 程 序 : Request m=,m Request n=,n While mod(m,n) 0 r:= mod(m,n) m:=n n:=r EndWhile Disp n 按 /r 可 调 用 字 符 串 符 号, 按 /t 可 调 用 定 义 符 :=, 按 /= 可 选 择 不 等 号. 其 中 mod() 为 取 余 函 数, 格 式 为 :mod( 表 达 式 1, 表 达 式 2). 第 三 步 检 查 语 法, 并 保 存 程 序. 按 b21 检 查 语 法 并 保 存, 如 有 错 误, 则 光 标 停 留 在 错 误 行. 第 四 步 运 行 程 序. 按 /e 跳 转 到 计 算 窗 口, 按 h 选 择 程 序 ( 或 输 入 程 序 名 称 ), 按 执 行, 弹 出 要 求 输 入 变 量 x 的 窗 口, 输 入 一 个 x 值,. 思 考 : 还 有 其 它 算 法 求 两 个 正 整 数 的 最 大 公 约 数 吗? ( 作 者 : 高 建 彪 邮 箱 :dsgjb@163.com,qq:76456245 2011 年 7 月 12 日 完 稿 于 中 山 市 东 升 高 中 ) 特 别 说 明 : 本 资 料 的 整 理 完 成, 感 谢 两 位 中 学 生 网 友 yvre imz 的 支 持.