2015-07-10 29 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

谢谢你,我正在编辑我的程序给用户选择你给我的两个例子,第一个不问用户会打印多少次,第二个请求并使用你的例子来获得更多的优化! –