- 締切済み
Tcl言語で漢数字変換を含んだ計算処理
長文失礼します。 二百五+十= を読み込み、書き込みファイルへ 二百五+十=二百十五 と出力することが今回実行したいことです。 下記ソースで、 例)三四+一五二=一八六 といった計算処理までは行えています(エラー処理は未実装)。 追記したいのは、十、百、千、万を含んだ漢数字を数字変換する処理です。 二百→2*100 五→5 →205といった処理の実装がうまくいかず困っています。 基本的な事項についての質問ですが、ご教授いただけないでしょうか。 よろしくお願いします。 #漢字から数字へ変換 proc kanNum {s_stVal} { set i_stval "" if {$s_stVal == "一"} { set i_stval "1" } if {$s_stVal == "二"} { set i_stval "2" } if {$s_stVal == "三"} { set i_stval "3" } if {$s_stVal == "四"} { set i_stval "4" } if {$s_stVal == "五"} { set i_stval "5" } if {$s_stVal == "六"} { set i_stval "6" } if {$s_stVal == "七"} { set i_stval "7" } if {$s_stVal == "八"} { set i_stval "8" } if {$s_stVal == "九"} { set i_stval "9" } if {$s_stVal == "十"} { set i_stval "10" } if {$s_stVal == "百"} { set i_stval "100" } if {$s_stVal == "千"} { set i_stval "1000" } if {$s_stVal == "万"} { set i_stval "10000" } set ret $i_stval return $ret } #数字から漢字へ変換(計算結果) proc numKan {s_ret} { set result "" if {$s_ret == "1"} { set result "一" } if {$s_ret == "2"} { set result "二" } if {$s_ret == "3"} { set result "三" } if {$s_ret == "4"} { set result "四" } if {$s_ret == "5"} { set result "五" } if {$s_ret == "6"} { set result "六" } if {$s_ret == "7"} { set result "七" } if {$s_ret == "8"} { set result "八" } if {$s_ret == "9"} { set result "九" } if {$s_ret == "10"} { set result "十" } if {$s_ret == "100"} { set result "百" } if {$s_ret == "1000"} { set result "千" } if {$s_ret == "10000"} { set result "万" } set ret2 $result return $ret2 } #たす数たされる数を桁数分取得する処理 proc kResp {tmpchar} { set len [string length $tmpchar] set i 0 while {$i < $len} { set tmpletter [string index $tmpchar $i] incr i set retRes [kanNum $tmpletter] #if {$tmpletter == "一"} { # set k_tal [expr $retRes * 100] # append ret3 $k_tal #} else { append ret3 $retRes #} } return $ret3 } eval { #ファイルパスの設定 set file_in "D:/tcl/Q.txt" set file_out "D:/tcl/A.txt" set iFile [open $file_in r] while {[gets $iFile line] != -1} { set lines(a) {} # if {[string match "*+*" $line]} { set qstring [lindex [split $line "="] 0] set s_stVal [lindex [split $qstring "+"] 0] set s_stVal2 [lindex [split $qstring "+"] 1] ##計算value1 set n_forwa [kResp $s_stVal] set r_kResp $n_forwa puts $r_kResp ##計算value2 set n_forwa2 [kResp $s_stVal2] set r_kResp2 $n_forwa2 puts $r_kResp2 ##計算結果 set s_ret [expr $r_kResp + $r_kResp2] puts $s_ret set str3 $s_ret set len3 [string length $str3] set i 0 while {$i < $len3} { set tmpchar3 [string index $str3 $i] incr i set sum [numKan $tmpchar3] puts $sum } append r_result $sum puts $r_result } lappend lines(a) "$line$r_result" } set oFile [open $file_out w] foreach line $lines(a) { puts $oFile "$line" } close $oFile }
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- teketon
- ベストアンサー率65% (141/215)
Tclはわかりません。 #たす数たされる数を桁数分取得する処理 漢数字から数字への変換を一括で行なっていますが、(1)桁を取得処理、(2)その桁の値を趣都空くする処理で分けましょう。 具体的にはproc kanNumの(1)十~万、(2)一~九で分けます。 (1)*(2)でその桁を作成出来ます。 ただし、1001みたいな漢数字をどう表現されるのか気になりますね。 千一なのか、一千一なのかその辺の考慮が必要です。
お礼
ご回答ありがとうございます。 参考にさせていただきます。