第1关:if-else类型
任务描述
本关任务:根据成绩判断考试结果。
相关知识
在编程中,我们常常根据变量是否满足某个条件来执行不同的语句。
JavaScript
中利用以if
关键字开头的条件语句达到以上目的,根据if
后面括号内表达式的计算结果来进行分支控制。
if语句
一段完整的JavaScript
语句相当于一条主干路,从第一句开始执行直到最后一句。而if
语句是一条连接在干路上的支路,满足某个条件时程序进入支路中执行,执行完后回到干路。如下所示:
条件成立指if
后面的括号内的表达式的计算结果为true
。
if
语句的结构为:
if(表达式)
{
//上面的表达式成立则执行本语句
语句;
}
比如下面的例子会根据a
的正负输出相应的结果:
//求一个数的绝对值
function abs(a) {
if(a < 0) {//如果a是负数
a = -a;//取反
}
return a;
}
if-else语句
if-else
相当于干路分成了两条支路,程序执行遇到分支的时候,必须且只能选择其中一条继续执行,结束后回到干路。如下:
条件成立时执行语句1
,这里的语句1
是条件成立时你希望执行的语句,条件不成立时执行语句2
。
语句结构为:
if(条件表达式)
{
//条件成立执行语句1
语句1;
}
else
{
//条件不成立执行语句2
语句2;
}
下面是一个具体的例子:
//a为正数或0返回1,a为负数返回0
function num(a) {
if(a >= 0) {
return 1;
}
else {
return 0;
}
}
匹配问题
多个if-else
连接起来的时候会出现匹配问题,如下面的例子:
function abs(a) {
if(a >= 0)
if(a > 0)
a = 1;
else
a = -1;
return a;
}
从代码的缩进角度看来,程序中的else
和第一个if
实现了匹配。但是,实际上else
匹配的是第二个if
,因为JavaScript
中的else
遵循的是就近匹配,即else
会和最近的if
组合成一个完整的if-else
结构。
建议:if
语句执行部分加{}
,防止出现 if-else
不匹配问题。
编程要求
本关的编程任务是补全右侧代码片段中Begin
至End
中间的代码,具体要求如下:
-
根据分数
a
(百分制)返回考试结果; -
a
小于60
分返回unpass
,否则返回pass
; -
本题考察非嵌套的
if-else
语句; -
具体请参见后续测试样例。
测试说明
测试过程:
-
平台将读取用户补全后的
IfElse.js
; -
调用其中的
mainJs()
方法,并输入若干组测试数据; -
接着根据测试结果判断程序是否正确。
以下是测试样例:
测试输入: 59
预期输出: unpass
测试输入: 90
预期输出: pass
function mainJs(a) {
a = parseInt(a);
//请在此处编写代码
/********** Begin **********/
if(a<60){
return "unpass" ;
}
else{
return "pass" ;
}
/********** End **********/
}
第2关:switch类型
任务描述
北美五大湖的名称和面积如下:
名称 | 面积(平方公里) |
---|---|
Superior | 82414 |
Huron | 59600 |
Michigan | 58016 |
Erie | 25744 |
Ontario | 19554 |
本关任务:根据面积判断湖泊的名字。
相关知识
上一关讲解的是拥有少数分支的if-else
结构,实际开发的过程中,还会遇到多分支的情况,比如根据电话号码判断运营商,如果用if-else
型条件语句,代码会很长而且难以理解。所幸的是,JavaScript
提供了另外一种选择结构:switch
语句。
严格相等
在了解switch
语句之前,先要知道严格相等的概念,严格相等的符号为===
。
对于JavaScript
中的内置数据类型,如数字,字符串,布尔型等。严格相等要求比较双方的数据类型和值都相等,而相等==
只要求比较双方的值相等,因为可以进行数据类型转换。例子如下:
var string = "1";
var number1 = 1;
var number2 = 1;
console.log(string === number1);
console.log(number1 === number2);
输出结果: false
true
对于JavaScript
中的对象类型,严格相等要求双方的引用相同,即必须是同一个对象。如果不是同一个对象,即使双方的属性、值都相同,也被认为不等,比如下面的例子:
var class1 = {
id:251,
name:"class"
}
var class2 = {
id:251,
name:"class"
}
var class3 = class1;
console.log(class2 === class1);
console.log(class3 === class1);
输出结果:
false
true
虽然class1
和class2
的属性名、属性值都相等,但是不满足严格相等,因为它们是不同的对象,指向内存的不同地方。而class3
和class1
严格相等,因为它们指向内存的同一个地方。
switch语句
switch
是一种多分支的选择结构,采用等值判断,如下是结构图,其中T
表示条件成立,F
表示条件不成立,箭头表示语句的执行方向。
switch
语句的语法如下:
switch(表达式)
{
case 值1:语句1;
break;
case 值2:语句2;
break;
case 值3:语句3;
break;
default:语句;
break;
}
括号中的表达式计算后会得到一个值,该值会从上到下依次与case
关键字后面的值比较,如果满足严格相等,则执行相应case
后面的语句;如果与所有的值都不满足严格相等,则执行default
关键字后的语句。
当和case
后面的某一个值完成匹配并执行完语句后,需要用break
结束整个的switch
选择,否则会与后面的继续匹配。
//函数(方法):根据身份证号前两位判断所在省份
function judgeProvince(idCard) {
switch(idCard) {
case 31:console.log("上海");
break;
case 32:console.log("江苏");
break;
case 33:console.log("浙江");
break;
case 34:console.log("安徽");
break;
case 35:console.log("福建");
break;
case 36:console.log("江西");
break;
case 37:console.log("山东");
break;
default:console.log("未知");
break;
}
}
//调用上面的函数
judgeProvince(36);//输出“江西”
如果不加break
,代码会从满足switch
条件的地方开始执行,一直执行到最后,不符合的case
后面的语句也会被执行。
下面的例子根据输入的分数计算绩点(GPA)
:
//函数(方法):根据百分制的成绩计算GPA
function calGrade(grade) {
grade = parseInt(grade/10);//除以10后取整数
var gpa;
switch(grade) {
case 10://注意这后面没有break
case 9: gpa = 4;break;//90到100均为4
case 8: gpa = 3;break;
case 7: gpa = 2;break;
case 6: gpa = 1;break;
default: gpa = 0;break;
}
return gpa;
}
//调用上面的函数
console.log(calGrage(100));//输出4
当grade
为10
的时候,没有break
,会往下一直执行;执行到grade
为9
的时候,有break
,会终止switch
语句块,此时 gpa
被赋值4
,所以90
到100
分的返回值都是4
。
编程要求
本关的编程任务是补全右侧代码片段中Begin
至End
中间的代码,具体要求如下:
-
根据面积参数
a
返回湖泊的名字,湖泊的名称和面积的对照表在最上面的任务描述里面,这里不再赘述; -
没有对应的湖泊返回
error
; -
具体请参见后续测试样例。
测试说明
测试过程:
-
平台将读取用户补全后的
SwitchSeten.js
; -
调用其中的
mainJs()
方法,并生成若干组测试数据; -
接着根据测试结果判断程序是否正确。
以下是测试样例:
测试输入: 82414
预期输出: Superior
function mainJs(a) {
a = parseInt(a);
//请在此处编写代码
/********** Begin **********/
switch(a)
{
case 82414 :return "Superior" ;
break;
case 59600 :return "Huron" ;
break;
case 58016 :return "Michigan";
break;
case 25744 :return "Erie";
break;
case 19554 :return "Ontario";
break;
default: return "error" ;
break;
}
/********** End **********/
}