2

我想在 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)

我还按照这里的建议尝试了 for 循环:

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

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

4

2 回答 2

1
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++
于 2016-12-15T21:50:56.987 回答
1

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

这里有几点:

  • for像这样使用 Genie 循环时,它只是生成一个数字序列。请注意生成需要使用的递减数字序列,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 ]
于 2015-10-02T16:02:59.600 回答