只会输出的程序是「死」的。用
询问和询问数值,程序就能听你说话。
设 名字 = 询问("你叫什么名字?")
打印("你好," + 名字)
运行到 询问 时程序会停下来等你敲字,按回车继续。询问 拿回来的永远是文字——即使你输入 123,它也是文字 "123" 而不是数字 123。
不想要提示语就直接 询问()。
设 年龄 = 询问数值("你多大了?")
打印("明年你就 " + 文本(年龄 + 1) + " 岁")
询问数值 会把文字转成数字,而且输错会自动重问:
你多大了?abc
「abc」不是数字,请重新输入。
你多大了?18
输入 1.5 得到小数,输入 18 得到整数。
因为「文字」和「数字」是两类不同的东西(见变量与类型):
设 a = 询问() # 输入 5,a 是文字 "5"
设 b = 询问数值() # 输入 5,b 是数字 5
打印(a + a) # "55" ← 文字接起来
打印(b + b) # 10 ← 数字相加
想把 询问 拿到的文字变成数字,用 整数(...) 或 小数(...)。
拼文字老用 + 文本(x) + 很啰嗦。@ 让这件事变轻松——{} 里直接写名字或算式:
设 名字 = "小明"
设 年龄 = 18
打印(@"你好,{名字},明年 {年龄 + 1} 岁")
# 你好,小明,明年 19 岁
{} 里能放任何表达式——变量、算术、函数调用都行。想显示字面的大括号,用 {{ 和 }}。
@ 只在字符串开头有特殊意思,串里面的 @ 是普通字符——打印("联系 [email protected]") 不受影响。想直接敲一个 @ 就用 @"..." 这种写法。
示例/07-猜数字.cnp 是真的能玩的猜数字游戏:
设 答案 = 随机数(1, 100)
循环 真
设 猜 = 询问数值("请输入你猜的数字:")
如果 猜 == 答案
打印("猜中了!")
跳出
否则 如果 猜 < 答案
打印("小了,再大一点")
否则
打印("大了,再小一点")
程序还想要输入、但输入已经没了(比如按了 Ctrl+D),询问数值 会报错停下:
错误[CN0310]: 还需要一个数字,但输入已经结束了
这是故意的:早期版本这里会陷入死循环,程序卡死。报错停下比卡住好。
💡 JS 后端也能交互输入:
cnp 运行 --js在 node 里按整行 UTF-8 读输入,中文不乱码;生成的 JS 在浏览器里会自动用prompt弹窗输入。详见运行程序的几种方式。
学过 Python 的人,看这里——这一章学的,用 Python 写是这样。零基础可以直接跳过,去下面做「练一练」。
先把这一章串成一个完整程序(CNplus):
设 名字 = 询问("你叫什么?")
设 年龄 = 询问数值("你多大了?")
打印(@"你好,{名字},明年 {年龄 + 1} 岁")
同一个程序,用 Python 写:
名字 = input("你叫什么?") # 询问
年龄 = int(input("你多大了?")) # 询问数值(要手动转)
print(f"你好,{名字},明年 {年龄 + 1} 岁") # @ 格式串 → f-string
| CNplus | Python |
|---|---|
询问(提示) |
input(提示)(永远返回文字) |
询问数值(提示) |
int(input(提示))(要手动转,还不会自动重问) |
@"…{x}…" |
f"…{x}…"(f-string) |
{{ }} 字面大括号 |
一样 |
关键差异:CNplus 的 询问数值 把「要文字」和「要数字」分成了两个函数,且输错自动重问;Python 只有 input()(拿到的永远是文字),要数字得自己 int(),输错了直接崩。CNplus 把这两处新手坑都包好了。
下一步:做练习,然后继续下一课。