TCL测试题目(B卷)
一、填空题(每题3分,共30分)
1、regexp { ([0-9]+) *([a-z]+)} " there is 100 apples" total num word
puts " $total ,$num,$word"
最后输出结果为100 apples ,100,apples
2、regsub there "They live there lives " their x
puts $x
最后输出结果为They live their lives
3、(每空1分)
TCL提供三种形式的置换:变量置换、命令置换和反斜杠置换。
4、t x 10
t y $x+100
最后输出结果为 10+100
5、(每空1分)
t x 100
t y “$x ddd” 此句输出内容为 100 ddd
t y {/n $x } 此句输出内容为 /n $x
t y [expr {$x+10}] 此句输出内容为: 110
6、建立一个数组day,它有两个元素monday,tuesday,值分别为1 2
创建语句为: t day(monday) 1
t day(tuesday) 2
7、lindex {1 2 {3 4}} 2
输出结果为: 3 4
8、linrt {1 2 {3 4}} 1 7 8 {9 10}
输出结果为: 1 7 8 {9 10} 2 {3 4}
9、string first ab defabc
输出结果为: 3
10、catch {return “all done”} string
t string
输出结果为: all done
二、简答题(每题10分,共30分)
1、 #!/usr/bin/tclsh
#
# Demonstrate operators and
# math functions
t PI [expr 2 * asin(1.0)]
if {$argc == 3} {
t X [lindex $argv 0]
t Y [lindex $argv 1]
t Rad [lindex $argv 2]
t Dist [expr sqrt(($X*$X)+($Y*$Y))]
t Cir [expr 2*$PI*$Rad]
t Area [expr $PI*$Rad*$Rad]
puts stdout "Distance = $Dist"
puts stdout "Circumference = $Cir"
puts stdout "Area = $Area"
} el {
puts stdout "Wrong argument count!"
puts stdout "Needs X, Y, and Radius"
}
提示,asin(1.0)值为1.5707963 Linux下以上脚本程序输出内容为:
Distance = 5.0 (答出给3分)
Circumference = 31.415926 (答出给分 4分 )
Area = 78.539815 (答出给分 3分)
2、 #!/usr/bin/tclsh
#
# Demonstrate global variables
# and backslash substitution
if {$argc >= 1} {
t N 1
foreach Arg $argv {
puts stdout "$N: $Arg\n"
t N [expr $N + 1]
if {$Arg == "ring"} {
puts stdout "\a"
}
}
} el {
puts stdout "$argv0 on X Display $env(DISPLAY)\n"
}
Linux中以上脚本命名为hello3,则运行脚本,以下结果为:
$ ./l
./l on X Display :0.0 (答出给5分)
$ ./l ring
1: ring (答出给5分)
3、当y值分别为 a b c 时
以下程序运行结果是什么?为什么是这个结果
t x 10
switch $y {
a {incr $x}
b {incr $x}
default {incr $x}
}
1 2 3 incr 后直接跟整型值变量即可,多”$”会将$x当作新变量赋初值0,加一后为1
(答出结果给 5分,讲出原因给5分)
三、编程题(每题20分,共40分)
1、编写一个过程,使用递归方法,实现阶乘运算
proc fac {x} { //过程格式正确给5分
if {$x < 0} { //有错误处理给3分
error "Invalid argument $x: must be a positive integer"
} elif {$x <= 1} {
return 1 //有递归结束条件给5分
} el {
return [expr $x * [fac [expr $x-1]]] //递归循环体正确给 7分
}
}
2、不用format命令,编写一个过程实现二进制数转为十进制数
proc TransBToD {value} { //过程格式正确给5分
t val 0
t len [string length $value] //设置中间变量给3分
for {t i [expr $len - 1]} {$i >= 0} {incr i -1} {
incr val [expr [string index $value $i] << [expr $len - $i - 1]]
} //写出算法给10分
return $val //有返回给2分
}