1

最初と最後の文字を比較したり、2番目と2番目の文字を比較したり、3番目と3番目の文字を比較したりするプログラムを作成しようとしています。これらの文字のいずれかが一致すると、2つはその文字の大文字に変換されます。

例:

テキストを入力してください:こんにちはフィリピン決勝: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 に答える