在Genie中修复for循环

时间:2015-10-02 12:37:54

标签: python vala genie

我想在Genie中做一个简单的密码检查程序,但是我陷入了for循环。这是我想模仿的python代码:

#-----------------------------------------------
# password_test.py
#    example of if/else, lists, assignments,raw_input,
#    comments and evaluations
#-----------------------------------------------
# Assign the users and passwords
users = ['Fred','John','Steve','Ann','Mary']
passwords = ['access','dog','12345','kids','qwerty']
#-----------------------------------------------
# Get username and password
usrname = raw_input('Enter your username => ')
pwd = raw_input('Enter your password => ')
#-----------------------------------------------
# Check to see if user is in the list
if usrname in users:
    position = users.index(usrname) #Get the position in the list of the users
    if pwd == passwords[position]: #Find the password at position
        print 'Hi there, %s. Access granted.' % usrname
    else:
        print 'Password incorrect. Access denied.'
else:
    print "Sorry...I don't recognize you. Access denied."

这是我能得到的:

[indent=4]

init
    users: array of string = {"Fred","John","Steve","Ann","Mary"}
    passwords: array of string = {"access","dog","12345","kids","qwerty"}

    print "Enter user name"
    var usrname = stdin.read_line()
    print "Enter password"
    var pwd = stdin.read_line()

    var position = 1
    var i = 1
    for i=0 to i < users.length
        if (users[i]==usrname)
            position += 1
            if pwd == passwords[position]
                print "Hi there, %d. Access granted."
            else
                print "Password incorrect. Access denied."
        else
            print "Sorry...I don't recognize you. Access denied."

但是,我一直在编译器上收到错误:

$ valac evenmores.gs 
evenmores.gs:15.18-15.18: error: syntax error, expected `do' but got `<' with previous identifier
    for i=0 to i < users.length
                 ^
Compilation failed: 1 error(s), 0 warning(s)

我也尝试了here中建议的for循环:

for (i = 0; i < users.length; i++)

无济于事。我会提供一些帮助。感谢。

2 个答案:

答案 0 :(得分:1)

您应该删除var i = 1并使用for i:int = 0 to (users.length - 1)

这里有几点:

  • 当像这样使用Genie for循环时,它只生成一个数字序列。请注意,要生成递减的数字序列,您需要使用downto而不是to。下面给出了迭代数组的更好方法
  • Genie是强类型和阻止作用域。当您第一次尝试for循环时,可能会收到错误"The name 'i' does not exist in the context of `main'",这就是您添加var i = 1的原因。但是,您可以将变量声明为for循环的一部分,如上所示。通常对于stringint等基本类型,我更喜欢将类型显式化,但您也可以使用类型推断。 for var i = 0 to (users.length -1)也可以使用

要迭代数组,最好使用for item in array语法。对于您的示例,这将看起来像:

[indent=4]
init
    users: array of string = {"Fred","John","Steve","Ann","Mary"}
    passwords: array of string = {"access","dog","12345","kids","qwerty"}

    print "Enter user name"
    usrname:string = stdin.read_line()
    print "Enter password"
    pwd:string = stdin.read_line()

    position:int = 0
    for var user in users
        if (user==usrname)
            if pwd == passwords[position]
                print "Hi there, %s. Access granted.", usrname
            else
                print "Password incorrect. Access denied."
        else
            print "Sorry...I don't recognize you. Access denied."
        position++

您运行它时会看到代码存在根本问题。我认为更好的解决方案是使用字典:

[indent=4]
init
    var access = new dict of string,string
    access[ "Fred" ] = "access"
    access[ "John" ] = "dog"
    access[ "Steve" ] = "12345"
    access[ "Ann" ] = "kids"
    access[ "Mary" ] = "qwerty"

    print "Enter user name"
    username:string = stdin.read_line()
    print "Enter password"
    pwd:string = stdin.read_line()

    if !(username in access.keys)
        print "Sorry...I don't recognize you. Access denied."
    else
        if pwd == access[ username ]      
            print "Hi there, %s. Access granted.", username
        else
            print "Password incorrect. Access denied."

关键点:

  • Genie字典需要libgee才能工作,因此您需要安装Gee及其开发文件。要构建程序,请使用valac --pkg gee-0.8 my_example.gs
  • 字典由键和值组成。要测试用户名不存在,请使用!运算符和in关键字。另请注意.keys
  • 要访问字典中的值,请使用包含该键的方括号:access[ username ]

答案 1 :(得分:1)

[EDIT ERROR](抱歉)

Solución(不需要libgee):

init
    users: array of string = {"Fred","John","Steve","Ann","Mary"}
    passwords: array of string = {"access","dog","12345","kids","qwerty"}

    print "Enter user name"
    usrname:string = stdin.read_line()
    print "Enter password"
    pwd:string = stdin.read_line()  

    error:int = 0                   
    cont:int = 0        
    for var user in users
        if (user!=usrname)
            error++
            if error == (users.length)      
                print "No reconocido. Acceso denegado."             
        if (user==usrname)
            position:int = cont                 
            if pwd == passwords[position]               
                print "OK: Acceso Concedido."
            else                
                print "Password incorrecta."            
        cont++