2015-07-10 53 views
1

我是新的編程技巧,並以少量基礎技巧開始。所以我的問題是:我試圖運行一個代碼,詢問用戶名稱並將其打印在屏幕上,其運行正常。所以我試圖做一些特殊的事情,現在添加一些代碼,要求用戶在屏幕上打印多少次這個名字,但是當我這樣做時,它會啓動一個無限循環,直到我關閉程序纔會停止。試圖接收來自用戶的價值並增加它的價值

這裏其代碼

function metodoDois() 
    print("Write a name: ") 
    name = io.read(); 
    print("Write how many times that it will be printed on screen: ") 
    quantidade = io.read() 

    k = 0; 
    while name do 
    k = k+1; 
    io.write("\n", name, " ", k) 
    if k == quantidade then 
     name = not name; 
    end 
    end 
end 

metodoDois() 
+2

'io.read'返回一個字符串。您需要使用「tonumber」將其轉換爲數字進行比較。 –

+0

可能重複的[Lua elseif不能正常工作](http://stackoverflow.com/questions/31224290/lua-elseif-not-working-properly) –

+0

感謝它的工作! –

回答

1

通常,爲了重複計算的已知次數時,它使用for迴路。

function metodoDois() 
    print("Write a name:") 
    local name = io.read() 
    print("Write how many times that it will be printed on screen:") 
    local quantidade = io.read() 

    for k = 1, quantidade do 
     io.write("\n", name, " ", k) 
    end 

end 

metodoDois() 

這樣,就避免了明確建立控制變量k並以驢執行在每個迭代測試:所以,如果你沒有使用while環路具體原因,你可以一起去何時結束。實際上,for -loopis中的控制變量k在每次迭代時都會自動更新,讓循環在這個變量獲得其最終值時結束。 此外,k是本地for -loop(即,它不之前或之後存在),從而使代碼的可讀性和不容易出錯(參見:Local Variables and Blocks在lua的參考。)

+1

沒錯。我只會爲控制變量保留'k'以更好地顯示問題和答案的內容。也許是相同的輸出。 – dlask

+1

謝謝,我花了兩個小時試圖解決這個問題,現在你的幫助可以得到它的工作 另外這個工作在我的方式與其他人的一些幫助轉換爲數字,但你的方式更簡單,我可以學習更多的東西^。^ 再次感謝! –

+1

@PierPaolo簡單地說,我會遵循OP的命名和輸出,所以我會在您的示例中使用'k'而不是'I',並使用'io.write(「\ n」,name,「」,k )而不是'io.write(name ..「\ n」)''。只是爲了表明'k'變量是必需的,並且程序行爲在這些變化之後被保留。 – dlask

1

問題是你的「quantidade」變量正在被讀作一個字符串,而你的「k」變量是一個數字。數字和字符串並不相同,因此,例如,1"1"不一樣。

爲了解決這個問題,簡單地將存儲在「quantidade」變量的多個第一利用tonumber()功能,讀出通過改變quantidade = io.read()quantidade = tonumber(io.read())像這樣:

function metodoDois() 
    print("Write a name: ") 
    name = io.read(); 
    print("Write how many times that it will be printed on screen: ") 
    quantidade = tonumber(io.read()) 
    k = 0; 

    while name do 
     k = k+1; 
     io.write("\n", name, " ", k) 
     if k == quantidade then 
      name = not name; 
     end 
    end 
end 

metodoDois() 

同樣,這僅僅是一個挑剔,但該代碼似乎有點未優化!我推薦使用更像這樣的東西:

function metodoDois() 
    print("Write a name: ") 
    local name = io.read(); 
    print("Write how many times that it will be printed on screen: ") 
    local quantidade = tonumber(io.read()) 

    for k = 1, quantidade do 
     io.write(name.." "..k.."\n") 
    end 
end 

metodoDois() 
+1

謝謝你,我正在編輯我的程序給用戶選擇你給我的兩個例子,第一個不問用戶會打印多少次,第二個請求並使用你的例子來獲得更多的優化! –