跳转到内容

编程基础:选择

来自维基教科书,开放的世界,开放的书籍

试卷 1 - ⇑ 编程基础 ⇑

← 输入和输出 选择 迭代 →


编程的一个重要部分是使用选择,即在满足特定条件时执行某些操作的能力。这可能像在电脑游戏中,如果你吃了一根鸡腿,就增加你的血条,或者如果温度超过某个值,就把冷却棒插入核反应堆中。

IF 语句

[编辑 | 编辑源代码]

最常见的选择语句是 **IF 语句**,其理念是将一个值与某些条件进行比较,**IF** 该值和条件匹配,则以某种方式继续,否则执行其他操作。例如

If It is the queen Then
 Salute her
Else
 Treat them like a commoner
End


VB.NET Python
 If name = "Queen" Then
	console.writeline("Hello your Majesty")
 Else
	console.writeline("Get to the back of the queue!")
 End If
 if name == "Queen":
    print ("Hello your Majesty")
 else:
    print ("Get to the back of the queue!")

Else 部分是可选的,您可以直接忽略该公共者!(并丢弃 Else)

VB.NET Python
 If name = "Queen" Then
	console.writeline("Hello your Majesty")
 End If
 if name == "Queen":
    print ("Hello your Majesty")

您可能还希望在 If 语句中测试多个内容。例如

VB.NET
 If name = "Queen" And age >= 18 Then
	console.writeline("Hello your Majesty, I can serve you beer")
 Else
	console.writeline("Get out of my bar!")
 End If
Python
 if name == "Queen" and age >= 18:
    print ("Hello your Majesty, I can serve you beer")
 else:
    print ("Get out of my bar!")

关系运算符

[编辑 | 编辑源代码]

我们经常希望编写执行某种比较或测试的 IF 语句。我们在上面的示例中恰好完成了这一点,使用 age >= 18 测试 age 变量的值是否大于或等于 18。

您会从数学学习中识别出大多数这些运算符,但一些在计算中略有不同。以下运算符很简单

运算符 意义
> 大于
< 小于
>= 大于或等于
<= 小于或等于

在计算中不同的最重要的运算符是您可能已经多次使用过,甚至没有注意到,那就是 = 运算符。在大多数编程语言中,= 运算符用于 **赋值**,例如,如果我们想将值 "bunny" 赋值给名为 animal 的变量,我们编写 animal = "bunny",这在 VB.NET 和 Python 中是一样的。这两种语言在 **等于** 方面有所不同,我们在上面的示例中看到了这一点,测试 name 变量的值是否等于 "Queen"。在 VB.NET 中,等于运算符只是 =,而 Python 则使用 ==。这在编写 Python 时会导致一个非常常见的编程错误 - 如果我们尝试编写使用 = 的 IF 语句,就会出错

 if name = "Queen" and age >= 18:
    print("Hello your Majesty, I can serve you beer")

我们会收到类似于此的错误消息

   代码输出

Traceback (most recent call last)
  File "python", line 4
      if name = "Queen" and age >= 18 then
                   ^
SyntaxError: invalid syntax


最后,我们需要一个用于 **不等于** 的运算符。在 VB.NET 中,我们使用 <>,而在 Python 中,我们使用 !=。下面是一个非常糟糕的游戏的例子

VB.NET Python
	Dim secret_word, your_guess As String
	secret_word = "unlikely"
	console.WriteLine("Try to guess the secret word:")
	your_guess = console.ReadLine()
	If your_guess <> secret_word Then
		console.WriteLine("You lose")
	End If
secret_word = "unlikely"
print("Try to guess the secret word:")
your_guess = input()
if your_guess != secret_word:
	print("You lose")
练习:IF 语句

为以下内容编写一个 IF 语句

询问用户的眼睛颜色,如果他们说是绿色,就称他们为“地精”,否则他们一定是另一种类型的怪物

   代码输出

你的眼睛是什么颜色?
绿色
你是个地精?

或者

   代码输出

你的眼睛是什么颜色?
蓝色
请告诉我,你是另一种野兽吗?

答案

dim eyes as string
console.writeline("What eyes have thee?")
eyes = console.readline()
If eyes = "Green" Then
	console.writeline("Thou art a Goblin?")
Else
	console.writeline("Pray tell, be thou another form of beast?")
End If

通过输入“绿色”来尝试代码。它不起作用!我们需要调整 IF 语句:如果眼睛 = “绿色”或眼睛 = “绿色”,那么 'Or 部分确保它能够识别大小写字母 ' '或者我们可以使用 UCase(),我们将在后面了解更多关于此的信息 如果 UCase(眼睛) = "GREEN" 那么 'UCase 将整个输入转换为大写 </syntaxhighlight>


   代码输出

你多大了
11.8
你可能在上中学


   代码输出

你多大了
9
你不在上中学


   代码输出

你多大了
19
你不在上中学


使用一个 IF 语句编写代码来处理上述情况。提示:您可能需要在 IF ... THEN 部分中使用多个子句。

答案

dim age as single
console.writeline("How old are you:")
age = console.readline()
If age >= 11 And age < 17 Then
	console.writeline("You're probably at secondary school")
Else
	console.writeline("You're not at secondary school")
End If


现在来看一些非常简单的 AI

   代码输出

你今天感觉怎么样:快乐还是悲伤?
悲伤
你运动了吗:是还是否?不,去散散步,你可能会感觉好一些

在所有其他情况下,程序应该说:“对不起,我不知道该如何帮助”。使用一个 IF 语句编写代码来处理上述情况

答案

dim feel as string
dim exercise as string
console.writeline("How do you feel today: Happy or Sad?")
feel = console.readline()
console.writeline("Have you had some exercise: Yes or No?")
exercise = console.readline()
If feel = "Sad" AND exercise = "No" Then
	console.writeline("Go for a walk, you might feel better")
Else
	console.writeline("Sorry I don't know how to help")
End If
示例:多个 If 与嵌套 If

有时,当我们试图编写复杂的代码时,我们需要使用 If 的组合。在上面的示例中,我们可能仍然希望以尊重的方式对待未成年的女王,以轻蔑的态度对待未成年的平民,以尊重的方式对待 18 岁以上的女王,并以普通礼貌的方式对待 18 岁以上的平民。事实上,我们似乎需要 4 个不同的 IF 语句。我们可以这样解决

VB.NET


If name = "Queen" And age >= 18 Then
	console.writeline("Hello your Majesty, may one serve you beer?")
End If
If name = "Queen" And age < 18 Then
	console.writeline("I'm sorry your Majesty, you are too young to buy beer")
End If
If name <> "Queen" And age >= 18 Then '<> means not equal (so does !=)
	console.writeline("Hello mate, can I serve you beer?")
End If
If name <> "Queen" And age < 18 Then
	console.writeline("Get out of my pub, you are too young to buy beer")
End If

Python 3


if name == "Queen" and age >= 18:
   print ("Hello your Majesty, may one serve you beer?")
elif name == "Queen" and age <18:
   print ("I'm sorry your Majesty, you are too young to buy beer")
elif name != "Queen" and age >= 18:
   print ("Hello mate, can I serve you beer?")
elif name != "Queen" and age <18:
   print ("Get out of my pub, you are too young to buy beer")

这似乎很麻烦,我们现在将研究一种更优雅的解决方法,即使用嵌套 IF。首先,嵌套意味着将一个东西放在另一个东西里面,所以我们要将一个 IF 放在另一个 IF 里面。

VB.NET


If name = "Queen" Then
	If age < 18 Then
		console.writeline("I'm sorry your Majesty, you are too young to buy beer")
	Else
		console.writeline("Hello your Majesty, may one serve you beer?")	
	End If
Else
	If age >= 18 Then
		console.writeline("Hello mate, can I serve you beer?")
	Else
		console.writeline("Get out of my pub, you are too young to buy beer")
	End If
End If

Python 3


if name == "Queen":
   if age < 18:
      print ("I'm sorry your Majesty, you are too young to buy beer")
   else:
      print ("Hello your Majesty, may one serve you beer?")
else:
   if age >= 18:
      print ("Hello mate, can I serve you beer?")
   else:
      print ("Get out of my pub, you are too young to buy beer")

使用以下数据尝试上面的示例,两种解决方案都应该提供相同的答案

1. The name is Queen and the age is 18
2. The name is Quentin and the age is 28
3. The name is Queen and the age is 17
4. The name is Aashia and the age is 15
练习:嵌套 IF 语句

为以下内容编写 IF 语句嵌套

当一个人超过 21 岁且没有醉酒时,就可以租车。

   代码输出

你多大了?
22
很好,已经足够大了。你喝酒了吗?
是的
明天再来

它还应该处理

   代码输出

console.writeline("你多大了?")
20
console.writeline("你太小了,我恐怕。几年后再回来")

答案

dim age as integer
dim drinking as string
console.writeline("How old are you?")
age = console.readline()
if age >= 21 then
  console.writeline("Good, that's old enough. Have you been drinking?")
  drinking = console.readline()
  if drinking = "Yes" then
    console.writeline("Come back tomorrow")
  else
    console.writeline("Your carriage awaits")
  end if
else
  console.writeline("You're too young I'm afraid. Come back in a few years")
end if


创建一个登录屏幕来执行以下操作

   代码输出

输入用户名
Jonny5
已识别!输入密码
活着
请输入 Jonny5

如果他们输入错误的用户名,它应该立即将他们踢出,并且不询问密码。如果他们输入错误的密码,它应该将他们踢出。

答案

dim name as string
dim password as string
console.writeline("Enter username:")
name = console.readline()
if name = "Jonny5" then
  console.writeline("RECOGNISED!  Enter password:")
  password = console.readline()
  if password = "Alive" then
    console.writeline("Please enter " & name)
  else
    console.writeline("INCORRECT! Get out!")
  end if
else
  console.writeline("Username not recognised. Get out!")
end if


扩展:单行 IF 语句

正如您现在应该意识到的那样,许多编程都是尽可能快地完成事情。您可能已经厌倦了编写冗长的 if 语句,不得不一直按回车键来创建新行。有一种更快的编码方式:单行 IF 语句。

VB.NET
 If(input >= 18,console.writeline("drink beer"),console.writeline("drink cola"))
Python
 print ("drink beer") if int(input()) >= 18 else print ("drink cola")

这是一种更短的编写方式

VB.NET Python
 If input >= 18 then
  console.writeline("drink beer")
 Else
  console.writeline("drink cola")
 End if
 if int(input()) >= 18:
   print ("drink beer")
 else:
   print ("drink cola")

但要小心,这种代码通常更难阅读,因此更难调试。一旦它通过了解释器/编译器,它几乎肯定不会运行得更快,它只是为了让你节省一点空间。对于考试,请坚持使用较长的版本。

Case 语句

[编辑 | 编辑源代码]

另一种类型是 **Case 语句**,它可以用多个 if 语句来概括,其中将值与多个条件进行比较,并执行第一个匹配的条件的操作,否则执行默认操作。

Case Enter Restaurant and pick up menu
If Egg and Chips available Then
 Order Egg and Chips
End If
If Pie and Chips available Then
 Order Pie and Chips
End If
If Curry and Chips available Then
 Order Curry and Chips
End If
If Pizza and Chips available Then
 Order Pizza and Chips
End If
Default
 Leave hungry
End

但是,大多数编程语言都会提供一种缩短的实现 case 语句的方法,而无需编写所有这些 if 语句。例如,在 VB.NET 中,我们使用 select case

Dim number As Integer = 5
Select Case number
    Case 1, 2, 3
        Console.WriteLine("Between 1, 2, 3 inclusive")
    Case 4 to 8
        Console.WriteLine("Between 4 and up to 8")
        'This is the only case that is true
    Case 9
        Console.WriteLine("Equal to 9")
    Case 10
        Console.WriteLine("Equal to 10")
    Case Else
        Console.WriteLine("Not between 1 and up to 10")
End Select
   代码输出

介于 4 到 8 之间


练习:Case 语句

创建一个程序,让人们输入动物的名称,它会输出该动物发出的声音。它应该处理的动物有

  • 猪 - Oink
  • 牛 - Moo
  • 熊 - Grr
  • 羊 - Baa
  • 老虎 - Grr
  • 其他所有 - 喵

尝试只使用 5 个 case 语句完成此任务。

答案

Dim animal As string
animal = console.readline()
Select Case animal 
    Case "Pig"
        Console.WriteLine("Oink")
    Case "Cow"
        Console.WriteLine("Moo")
    Case "Bear", "Tiger"
        Console.WriteLine("Grr")
    Case "Sheep"
        Console.WriteLine("Baa")
    Case Else
        Console.WriteLine("Meow")
End Select


您现在将使用 case 语句创建一个电子钢琴。

注意 频率
A 220.00
B 246.94
C 261.63
D 293.66
E 329.63
F 349.23
G 392.00

在下面的代码中创建一个 case 语句,它将播放上面写的音符。while true 循环意味着代码将永远不会结束,并且将永远继续。为了获得额外的分数,请尝试让代码接受大小写输入

'instruction statement here
While True
  'input and case statements here
While End

记住,要发出声音,请使用

console.beep(2000,500) 'beep at 2000Hz for 0.5 seconds

答案

dim note as char
console.writeline("please insert a musical note:")
While True
  note =  Console.ReadKey().KeyChar
  'note =  Console.Readline() 'also works, but it less fun
  Select Case UCase(note)
    Case "A"
        Console.Beep(220,50)
    Case "B"
        Console.Beep(247,50)
    Case "C"
        Console.Beep(262,50)
    Case "D"
        Console.Beep(294,50)
    Case "E"
        Console.Beep(330,50)
    Case "F"
        Console.Beep(349,50)
    Case "G"
        Console.Beep(392,50)
  End Select
End While
华夏公益教科书