0

そのため、数字を中国語のピンインに変換するプログラムにまだ取り組んでいます。完全なコード (おかしなことをお許しください。下手なコーディングを手伝ってくれて本当に感謝しています)

local digitmap = {
   ["0"] = "ying2",
   ["1"] = "yi1",
   ["2"] = "er2",
   ["3"] = "san1",
   ["4"] = "si4",
   ["5"] = "wu3",
   ["6"] = "liu4",
   ["7"] = "qi1",
   ["8"] = "ba1",
   ["9"] = "jiu3",
}

print("Enter a number to be converted (up to 10 digits long):")

while true do
    number = tonumber(io.read("*line"))
    nlength = #(tostring(number))
    if number ~= nil and nlength <= 10 then
        break
    end
    print("Invalid input or too long. Please try again:")
end

if number == 0 then
fconvnumber = "ying2"
zero = true
end

local cwords = {}
for c in string.gmatch(number, "%d") do
cwords[#cwords + 1] = digitmap[c]
end

if nlength == 2 then
    cwords[nlength - 1] = cwords[nlength - 1] .. " shi2 "
elseif nlength == 3 then
    cwords[nlength - 1] = cwords[nlength - 1] .. " shi2 "
    cwords[nlength - 2] = cwords[nlength - 2] .. " bai3 "
elseif nlength == 4 then
    cwords[nlength - 1] = cwords[nlength - 1] .. " shi2 "
    cwords[nlength - 2] = cwords[nlength - 2] .. " bai3 "
    cwords[nlength - 3] = cwords[nlength - 3] .. " qian1 "
elseif nlength == 5 then
    cwords[nlength - 1] = cwords[nlength - 1] .. " shi2 "
    cwords[nlength - 2] = cwords[nlength - 2] .. " bai3 "
    cwords[nlength - 3] = cwords[nlength - 3] .. " qian1 "
    cwords[nlength - 4] = cwords[nlength - 4] .. " wan2 "
elseif nlength == 6 then
    cwords[nlength - 1] = cwords[nlength - 1] .. " shi2 "
    cwords[nlength - 2] = cwords[nlength - 2] .. " bai3 "
    cwords[nlength - 3] = cwords[nlength - 3] .. " qian1 "
    cwords[nlength - 4] = cwords[nlength - 4] .. " wan2 "
    cwords[nlength - 5] = cwords[nlength - 5] .. " shi2 "
elseif nlength == 7 then
    cwords[nlength - 1] = cwords[nlength - 1] .. " shi2 "
    cwords[nlength - 2] = cwords[nlength - 2] .. " bai3 "
    cwords[nlength - 3] = cwords[nlength - 3] .. " qian1 "
    cwords[nlength - 4] = cwords[nlength - 4] .. " wan2 "
    cwords[nlength - 5] = cwords[nlength - 5] .. " shi2 "
    cwords[nlength - 6] = cwords[nlength - 6] .. " bai3 "
elseif nlength == 8 then
    cwords[nlength - 1] = cwords[nlength - 1] .. " shi2 "
    cwords[nlength - 2] = cwords[nlength - 2] .. " bai3 "
    cwords[nlength - 3] = cwords[nlength - 3] .. " qian1 "
    cwords[nlength - 4] = cwords[nlength - 4] .. " wan2 "
    cwords[nlength - 5] = cwords[nlength - 5] .. " shi2 "
    cwords[nlength - 6] = cwords[nlength - 6] .. " bai3 "
    cwords[nlength - 7] = cwords[nlength - 7] .. " qian1 "
elseif nlength == 9 then
    cwords[nlength - 1] = cwords[nlength - 1] .. " shi2 "
    cwords[nlength - 2] = cwords[nlength - 2] .. " bai3 "
    cwords[nlength - 3] = cwords[nlength - 3] .. " qian1 "
    cwords[nlength - 4] = cwords[nlength - 4] .. " wan2 "
    cwords[nlength - 5] = cwords[nlength - 5] .. " shi2 "
    cwords[nlength - 6] = cwords[nlength - 6] .. " bai3 "
    cwords[nlength - 7] = cwords[nlength - 7] .. " qian1 "
    cwords[nlength - 8] = cwords[nlength - 8] .. " yi4 "
elseif nlength == 10 then
    cwords[nlength - 1] = cwords[nlength - 1] .. " shi2 "
    cwords[nlength - 2] = cwords[nlength - 2] .. " bai3 "
    cwords[nlength - 3] = cwords[nlength - 3] .. " qian1 "
    cwords[nlength - 4] = cwords[nlength - 4] .. " wan2 "
    cwords[nlength - 5] = cwords[nlength - 5] .. " shi2 "
    cwords[nlength - 6] = cwords[nlength - 6] .. " bai3 "
    cwords[nlength - 7] = cwords[nlength - 7] .. " qian1 "
    cwords[nlength - 8] = cwords[nlength - 8] .. " yi4 "
    cwords[nlength - 9] = cwords[nlength - 9] .. " shi2 "
end

while cwords[nlength] == "ying2" and zero ~= true do
    cwords[nlength] = nil
    nlength = nlength - 1
end

fconvnumber = table.concat(cwords)

fconvnumber = string.gsub(fconvnumber, "ying2 %a+%d", "ying2")
for i=1,nlength do
    fconvnumber = string.gsub(fconvnumber, "ying2 ying2", "ying2")
end
fconvnumber = string.gsub(fconvnumber, "yi1 shi2", "shi2")

print(fconvnumber)

たとえば、100 を入力すると、nlength は 3、cwords[nlength] == "ying2" となり、最後の配列が削除されます。しかし、それは再び循環せず、十の位の 0 を削除します。何らかの理由でロジックが欠落しているに違いないことはわかっていますが、表示されません。nlength の以前の値を使用するまでですか? ありがとうございました!

4

3 に答える 3

2

ロジックに問題はありません。cwordsまたはが正しくnlength初期化されていません。

ただし、コードは少し不安定です。ループごとに同じテストを 2 回行っています。これは危険信号である必要があります

次のように同じことを行うことができます。

while cwords[nlength] == "ying2" do
    cwords[nlength] = nil
    nlength = nlength - 1
end

またはこのように:

while cwords[#cwords] == "ying2" do
    table.remove(cwords)
end

しかし、最も効率的な方法は、ピンインへの変換を行う前に、ソース番号から末尾のゼロを削除することです。

while number % 10 == 0 do
    number = number / 10
end

または:

strnumber = strnumber:match('(.-)0*$')
于 2013-01-31T17:36:40.233 に答える
2

完全なコードを提供していないため、言うのは難しいですがcwords、投稿したコードに問題が見られないため、正しく入力されていないと思われます. これは私のために働く:

cwords = {1, "ying2", "ying2"}
nlength = #cwords
print("started with", #cwords)
repeat
if cwords[nlength] == "ying2" then
    cwords[nlength] = nil
    nlength = nlength - 1
end
until cwords[nlength] ~= "ying2"
print("ended with", #cwords)

whileロジックが単純なので、代わりにこれをループに変更することをお勧めします。

while nlength > 0 and cwords[nlength] == "ying2" do
    cwords[nlength] = nil
    nlength = nlength - 1
end
于 2013-01-31T17:07:55.060 に答える