【问题标题】:Fixing a for loop in Genie修复 Genie 中的 for 循环
【发布时间】:2015-10-02 12:37:53
【问题描述】:

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

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

【问题讨论】:

  • 查找for 语句的语法。
  • 该链接指向 C++ 代码。

标签: python vala genie


【解决方案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 ]

【讨论】:

    【解决方案2】:
    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++
    

    【讨论】:

    • 你可以找到更多练习here,和一个电报群here
    • 谢谢,我关于 Genie 的西班牙语维基:Genie Doc
    • 正式注明。这太棒了!现在精灵学习者太少了,加入精灵组,我们可以在那里互相帮助,发展社区。​​span>
    • 我希望精灵社区会增加。文档很难找到。这就是我创建那个wiki的原因。另外,我为 Genie 提出了一个标志,可以在logo 看到。这个标志代表一个 G 作为打开 C 的 VALA 键。
    • 这是个好主意,我之前也联系过一位设计师(要一个徽标)...我想帮助您建立您的网站!我能提供什么帮助?
    猜你喜欢
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 2019-12-10
    • 1970-01-01
    相关资源
    最近更新 更多