我正在尝试创建一个程序,比较第一个和最后一个字符,比较第二个和第二个字符,比较第三个和第三个到最后一个,依此类推,如果这些字符中的任何一个匹配,这两个将被转换为该字符的大写。
示例:
请输入文字:你好菲律宾 决赛:HEllo PhIlippinEs
我无法创建任何代码,我坚持使用
puts "Please enter text:"
set myText [gets stdin]
string index $myText 4
有人能帮助我吗?
答案 0 :(得分:3)
此程序还会将菲律宾的第一个i
大写,因为它与字符串的开头和结尾等距。
proc compare_chars {str} {
set letters [split $str ""]
for {set i [expr {[llength $letters] / 2}]} {$i >= 0} {incr i -1} {
set a [lindex $letters $i]
set b [lindex $letters end-$i]
if {$a eq $b} {
lset letters $i [set L [string toupper $a]]
lset letters end-$i $L
}
}
join $letters ""
}
puts [compare_chars "Hello Phillipines"]
# outputs => HEllo PhIllipinEs
答案 1 :(得分:2)
对此进行编码的最简单方法是在分割字符上使用foreach
。 (这在形式上并不是最有效的,但正确编码非常容易。)
puts "Please enter text:"
set myText [gets stdin]
set chars [split $myText ""]
set idx 0
foreach a $chars b [lreverse $chars] {
if {[string equals -nocase $a $b]} {
lset chars $idx [string toupper $a]
}
incr idx
}
set output [join $chars ""]
puts $output
请注意,foreach
正在迭代列表的副本;并发修改没有问题。实际上,编码视角中唯一模糊不清的部分实际上是我们需要在上面的idx
变量中跟踪要修改的索引。
使用Tcl 8.6,你可以写:
set chars [split $myText ""]
set output [join [lmap a $chars b [lreverse $chars] {
expr {[string equals -nocase $a $b] ? [string toupper $a] : $a}
}] ""]
这取决于是否有新的lmap
命令。
如果你真的坚持使用8.3(它的不支持并且已经存在多年,那么你应该优先升级到更新的东西)然后试试这个:
set chars [split $myText ""]
set idx [llength $chars]
set output {}
foreach ch $chars {
if {[string equals -nocase $ch [lindex $chars [incr idx -1]]]} {
append output [string toupper $ch]
} else {
append output [string tolower $ch]
}
}
这种使用的所有功能都出现在8.3中(尽管有些功能比以后的版本慢得多)。