1

我正在尝试创建一个程序,比较第一个和最后一个字符,比较倒数第二个和倒数第二个,比较倒数第三个和第三个字符,依此类推,如果这些字符中的任何一个匹配,则两者将转换为该字符的大写。

例子:

请输入文字:Hello Philippines 决赛:Hello PhIlippinEs

我无法创建任何代码,我被困住了

puts "Please enter text:"
set myText [gets stdin]

string index $myText 4 

有人能帮助我吗?

4

2 回答 2

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
于 2012-11-24T20:01:20.117 回答
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 中存在此使用的所有功能(尽管有些功能比更高版本慢得多)。

于 2012-11-25T11:45:48.097 回答