TI-BASIC 入门:使用 TI-83/TI-84 解决数学问题





5.00/5 (1投票)
我们将学习如何对 TI-83 / TI-84 图形计算器进行编程,然后编写程序来解决几个数学问题,包括确定一个数是否为素数、找出两个数的最大公约数以及计算内切圆的半径。
引言
我们可以使用 TI-83 或 TI 84 计算器来完成更多工作,而不仅仅是分析图形和模拟概率事件;我们可以对它们进行编程来解决重复性的数学问题。对计算器进行编程可以帮助我们更快地解决问题,减少输入错误的可能性,并更容易地应用暴力破解算法。
在本教程中,我们将学习 TI-BASIC,即 TI-83 或 TI-84 的编程语言,然后以编程方式解决六个数学问题。
背景
编程相关活动在“Programming Screen”(编程屏幕)中可用,通过按 [PRGM]
键即可进入。屏幕顶部有三个选项卡
- EXEC:执行程序。我们将在本教程稍后执行我们创建的程序
- EDIT:查看或修改程序的代码。我们可能会在本教程中访问此选项卡进行程序调试
- NEW:创建新程序。
要删除程序,请前往 Memory -> Mem Mgmt/Del -> Prgm
,按 [2ND][+][2][7]
,滚动到所需程序,然后按 [DEL]
键。
要键入字母,请按 [ALPHA]
键,然后按带有所需字母的键。
“Hello World”
让我们从创建一个新程序开始:[PRGM] -> NEW -> 1:Create New
,该程序将显示消息“HELLO WORLD”。在本教程中,我们将程序命名为“HELLO”。
TI-BASIC 有一组预制命令,也称为 **tokens**(令牌),这些命令使计算器能够执行特定任务,例如显示消息、比较值,甚至打开和关闭单个像素。如果您用其他语言编程过,可以将令牌视为关键字。我们在程序中使用令牌。
要查看令牌,请按 [PRGM]。在新屏幕的顶部有三个选项卡,每个选项卡都包含许多令牌
- CTL (Control):这些令牌控制程序的结构。常用的令牌包括 if/else 和循环。
- I/O (Input/Output):这些令牌从用户获取输入并显示消息、图形和表格。
- EXEC:我们可以在程序中执行其他程序
要显示“HELLO WORLD”消息,请在 I/O 选项卡中选择第三个令牌 3:Disp
,然后键入“HELLO WORLD”。
要运行程序,请按 [2ND][MODE]
返回主屏幕,然后按 [PRGM]
选择 HELLO,然后按 [ENTER]
。
代码, 执行,
常用令牌
以下是大多数程序中使用的令牌列表
I/O 令牌
| 将字符串或数字显示在屏幕上。字符串左对齐,数字右对齐 | Disp "HELLO WORLD" 或者Disp 5*9 |
| 提示用户输入一个数字,该数字将存储在变量中 | Prompt A (将用户输入的数字存储在变量 A 中) |
CTL 令牌
If [条件] 那么 [语句] Else [语句] End | 创建 If/Else 情况。有三种类型。 If [条件] 如果条件为真,我们只执行下一条语句 If [条件] 如果条件为真,我们执行 Then 和 End 令牌之间的所有语句 If [条件] 我们执行多个语句并包含一个 else 子句。 | If A=42 Disp "ONE STATEMENT ONLY"
If A=42 那么 Disp "TWO" Disp "STATEMENTS" End
If A=42 那么 Disp "TRUE" Else Disp "FALSE" End |
For (X, start, end) [语句] End | X 的值从 start 开始,在运行 For 和 End 令牌之间的语句后,X 的值增加 1。这会一直持续到 X 的值等于 end。这是一个 for 循环。 | For (X,1,10) Disp X End (这将显示数字 1 到 10) |
While [条件] [语句] End | 只要条件为真或为 1,语句就会执行。这是一个 while 循环。 | While X=42 Disp "X IS STILL 42" End |
Repeat [条件] [语句] End | 这类似于 while 循环,但语句会执行一次,然后检查条件,或者更简洁地说,这是一个保证至少执行一次语句的 while 循环。这等同于 do/while 循环。 |
Repeat X=42 Disp "X IS 42" End |
| 退出程序 | While 1 Disp "WILL DISPLAY" STOP Disp "WILL NOT DISPLAY" End |
注意:要将数字赋给变量,我们按 [STO>]
键,它会创建一个箭头符号 (->)。例如,42->X
将 X
赋值为 42。
解决数学问题
让我们通过编程解决几个数学问题,以便更熟悉 TI-BASIC 编码。我们假设所有用户输入都是数字。
数学问题 1:将输入乘以 10
例如,如果用户输入 5,我们的程序将显示 50。
要提示用户输入数字,我们使用 Prompt
令牌。要显示数字的十倍,我们使用 Disp
令牌。这是我们的代码
Prompt X (this asks the user to supply a value and that value is stored in X)
Disp 10X (we display 10*X)
或者,我们也可以将 X
的值重新赋值为 10X
。
Prompt X 10X->X Disp X
数学问题 2:暴力破解两个输入之间的数字之和
例如,如果用户输入 1 和 5,我们的程序将显示 9,因为 2+3+4=9。
由于我们向用户询问两个数字,因此我们使用两个 Prompt
令牌。要迭代用户输入的两个数字之间的数字,我们可以使用 for、while 或 repeat (do/while) 循环。我们假设用户的第二个数字大于第一个数字。为了提高程序清晰度,我们还使用一个变量 S
来存储数字的总和。
Prompt X Prompt Y 0->S For (A,X+1,Y-1) S+A->S End Disp S
数学问题 3:使用 For 循环计算幂
例如,如果用户输入 3 和 4,我们的程序将显示 81。
虽然我们可以轻松地使用 [^]
键找到一个数的幂,但我们尝试用老式的方法来计算:多次乘法。
与上一个程序类似,我们可以使用两个 Prompt
令牌来提示用户输入两个数字。但是,一个更节省空间的技术是将两个 Prompt
令牌合并为一个:Prompt X,Y
。我们使用 for 循环不断将第一个数乘以自身,直到它乘以自身的次数等于第二个数字。我们还创建一个变量 P
来存储最终结果。
Prompt X,Y 1->P For (A,1,Y) PX->P End Disp P
数学问题 4:确定输入是素数还是合数
例如,如果用户输入 79,我们的程序将显示“PRIME”。如果用户输入 80,我们的程序将显示“COMPOSITE”。
如果一个数的因子只有 1 和它本身,那么它就是素数。更具描述性地说,如果一个数从 2 到该数的平方根之间不存在任何数,当该数除以这些数时余数为 0,则该数是素数。否则,该数是合数。
要检查一个数是否为素数,我们遍历从 2 到其平方根的每个数,并检查它除以循环的数是否余数为 0。要检查余数,我们可以使用 [Math]->NUM -> 0:remainder(
中的余数函数。如果余数为 0,则我们的数是合数,因此我们显示“COMPOSITE”并退出程序。如果所有数都已循环,那么我们的数一定是素数,我们显示“PRIME”。
Prompt X For (A,2,sqrt(X)) If remainder(X,A)=0 Then Disp "COMPOSITE" Stop End (marks the end of the if statement) End (marks the end of the for loop) Disp "PRIME"
数学问题 5:使用欧几里得算法找出两个输入的 GCD
例如,如果用户输入 72 和 15,我们的程序将显示 3。
注意:还有一个内置的 GCD 函数,位于 [MATH]->NUM->9: gcd(
。
欧几里得算法依赖于两个定理
- 如果 a = bt + r,则 gcd(a, b) = gcd(b, r)
- 如果 a = bt,则 gcd(a, b) = b
…通过重复应用第一个定理来创建具有更小数字的新方程,直到它们最终简化为第二个定理(注意没有 r 项),从而确定两个数字的 GCD。
例如,求 gcd(72,15)
72 = 15 * 4 + 12
根据定理 1,gcd(72,15) = gcd(15,12)。为了举例说明,我们假设我们不知道 gcd(15, 12)。由于 gcd(…) 可以表示为方程,反之亦然,而我们的目标是最终得到形式为 a = bt 的方程,让我们尝试将 gcd(15, 12) 表示为两个更小数字的 GCD,同时得到一个更小的方程。在这个方程中,a = 72,b = 15,r = 12,即 72/15 的余数。简化
15 = 12 * 1 + 3, since gcd(15,12) = gcd(12,3)
请注意,在这个方程中 a = 15,它在前一个方程中是 b 的值;b = 12,它在前一个方程中是 r 的值;r = 3,即 15/12 的余数)。
12 = 3* 4, since r is now 0, Euclid’s Algorithm finishes
因此,根据定理 2,gcd(72, 15) = 3。
我们在将一个方程简化为另一个方程时注意到几个观察结果
- 新方程中的 a = 前一个方程中的 b
- 新方程中的 b = 前一个方程中的 r
- 新方程中的 r = 新 a 和新 b 的余数
- 如果新方程中的 r 为 0,则 GCD 为新的 b。如果新方程中的 r 不为 0,则重复。
我们编写欧几里得算法
Prompt A,B remainder(A,B)->R Repeat R=0 B->A R->B remainder(A,B)->R End Disp "THE GCD IS",B (we can shorten two Disps into one by separating the messages with a comma)
或者,我们也可以编写一个稍微长一些的版本,同样有效
Prompt A,B remainder(A,B)->R While 1 If R=0 Then Disp "THE GCD IS",B Stop Else B->A R->B remainder(A,B)->R End End
数学问题 6:求内切圆半径
例如,内切圆是内接于三角形的圆。如果用户输入的三角形边长为 3,4,5,我们的程序将显示 1。
虽然这个问题比算法问题更具数学性,但它是使用优雅和简洁而非蛮力力量的一个很好的例子。计算器是一个工具,一个助手,其有用性取决于其人类用户选择的策略。解决这个问题有很多方法,但让我们选择一种可以最大限度地减少代码量的方法。
设 a、b 和 c 为三角形的边。设 r 为内切圆的半径。
由于内切圆与 a、b 和 c 相切,因此它与每条边形成 90 度角。因此,三角形的面积为 ar/2 + br/2 + cr/2。根据海伦公式,三角形的面积也为 \(\sqrt{(s(s-a)(s-b)(s-c))}\),其中 s 是三角形的半周长,(a+b+c)/2。将计算三角形面积的两个表达式相等,我们得到
sqrt(s(s-a)(s-b)(s-c)) = ar/2 + br/2 + cr/2 (please use the square root symbol instead of typing sqrt) = r(a+b+c) / 2 = sr r = sqrt(s(s-a)(s-b)(s-c)) / s
让我们将其编写成代码
Prompt A,B,C (A+B+C)/2->S sqrt((S(S-A)(S-B)(S-C)))/S->R (please use the square root symbol instead of typing sqrt) Disp "THE INCIRCLE’S RADIUS IS",R
总结
我们通过编程解决了六个数学问题!击掌!我希望这篇文章能让您更好地理解 TI-83 / TI-84 的一些编程功能。虽然我们完全专注于代数,但您也可以创建程序来解决微积分、概率、线性代数等问题。
感谢您的阅读。如果您有任何反馈,请在下方留言。
延伸阅读
- TI-Basic 入门套件(包含数十篇关于 TI-83 或 TI-84 编程的教程)