• Welcome to Swift (苹果官方Swift文档初译与注解二十五)---171~180页(第四章 流程控制)


    For-Condition-Increment (For 循环) 

      除了for-in循环之外,Swift还支持传统C语言的for循环(使用一个条件和一个增量):

        for var index = 0; index < 3; ++index {

            println("index is (index)")

        }

        // index is 0

        // index is 1

        // index is 2

      这种循环的通用格式是:

        for initialization; condition; increment {

            statements

        }

      分号隔离了循环定义的三个部分(与C语言一样).但与C语言不同的是,Swift不需要使用小括号()来包住“initialization; condition; increment” 这部分块.

      循环执按如下步骤执行:

      1.当第一次进入循环,初始化表达式 initialization被执行一次,用了设置循环中的任意常量或者变量.

      2.计算条件表达式 condition,如果计算结果为false,循环结束,继续执行大括号(})后面的代码,如果计算结果为true,则不断的执行循环体内的语句.

      3.循环体中的语句都执行过后,计算增量表达式 increment,它可能是增加计数值,也可能是减少计数值,或者根据语句给循环体外某一变量设置的新值.增量表达式计算之后,返回到步  骤2,条件表达式再一次的被计算.

      循环的执行过程可以缩写为:

        initialization

        while condition {

            statements

            increment

        }

      值循环中,常量或变量唯一可以定义的地方是在初始化表达式中(例如: var index = 0),为了取得index在循环结束的最后值,必须中循环体开始之前定义index:

         var index: Int

        for index = 0; index < 3; ++index {

            println("index is (index)")

        }

        // index is 0

        // index is 1

        // index is 2

        println("The loop statements were executed (index) times")

        // prints "The loop statements were executed 3 times”

      注意,index在循环结束之后的最终值是3,而不是2.最后一次调用的增量表达式++index将index设置为3,这使得index<3结果为false,循环结束.

    While Loops (While 循环)

      while循环执行一组语句,直到条件为false.当第一次循环开始之前,不知道循环次数的情况下,while循环是最有效的.Swift提供了两种while循环:

      •   while 在每次循环之前,计算循环的条件
      •       do-while 在每次循环之后,计算循环的条件

    While

      while循环是根据单一条件开始的.如果条件是true,一组语句会被反复的执行,直到条件为false.

      while循环的通用格式:

        while condition {

            statements

        }

      下面的例子,演示了一个蛇和梯子(Snakes and Ladders)的简单游戏(也被叫做Chutes and Ladders):/**感觉翻译为蛇梯更准确一点,各位大神请自行替换,嘻嘻,这是编外话^_^*/

        

      游戏的规则如下:

    • 场地有25个方格,目标是达到或者越过25号方格.
    • 每次,你投掷一个六面的色子(dice),然后根据上图里由点组成的箭头所指示的水平路径,移动相应的格子.
    • 如果你到了梯子的底部,你将从梯子向上移动.
    • 如果你到了蛇的头部,你将从蛇头向下移动

      游戏的场地可以用一个Int值的数组来表示,它的大小通过常量finalSquare来设置.它(指常量)用了初始化数组,也用来判断获胜的条件.board被初始化为26个Int类型的0,而不是25个:

        let finalSquare = 25

        var board = Int[](count: finalSquare + 1, repeatedValue: 0)

      部分的方格(通过指定的值)用来设置梯子和蛇.有梯子的方格设置一个正数,表示将你移动到这个方格上面,有蛇的方格设置一个负数,表示将你移动到格子下面:

        board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02

        board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08

      方格3在梯子的底部,可以将你移动到方格11.

      为了表明这个, board[03] 等于+08,+08与整数8是等效的,一元加号操作符(+)与一元减号操作符(-)是为了对称性,所有小于10的数值都被添加了0补齐,这是为了定义的方格整齐(虽  然这不是严格要求的,但这样做可以保持代码的干净).

      玩家从零号格子开始,就是整个场地的左下角.第一次投掷的色子(dice)总是从这个方格开始:

        var square = 0

        var diceRoll = 0

        while square < finalSquare {

            // roll the dice

            if ++diceRoll == 7 { diceRoll = 1 }

             // move by the rolled amount

            square += diceRoll

            if square < board.count {

                // if we're still on the board, move up or down for a snake or a ladder

                square += board[square]

            }

        }

        println("Game over!")

      这个例子中使用了非常简单的色子投掷方法,而不是生产随机数.它是以diceRoll等于0开始,每次while循环, diceRoll都会通过前置增量操作符(++i)增加1,然后检查它的值是否过    大,++ diceRoll的返回值等于 diceRoll增加1之后的值.当返回值等于7的时候,说明色子投掷过大,并且重新设置为1.色子值的序列总是1, 2, 3, 4, 5, 6, 1, 2 ..等等.

      投掷色子之后,玩家向前移动diceRoll个方格.色子投掷的结果可能让玩家移动超过25号方格,这时游戏结束.为了限定界限,代码中在给数组board[square]添加值之前,会检查square  小于board的count属性.

      如果不执行检查,board[square]可能会访问越界,这会触发错误.如果square等于26,代码试图访问board[26],这超出了数组的大小.

      while的当前循环执行后,会根据检查循环条件来确定是否再次执行.如果玩家已经移动或者超过25号格子,循环条件为false,游戏结束.

      这个例子是非常适合while循环的.因为在循环开始的时候,游戏的长度是不明确的.相反的,循环结束的条件是清楚的.

  • 相关阅读:
    [HDU 1003] Max Sum
    Codeforces
    2016 年宁波工程学院第七届ACM校赛题解报告
    [DP] Light Oj 1017 Brush(III)
    GDUT-校赛-积水积木
    1031 Hungar的得分问题(二)
    HDU 1506 Largest Rectangle in a Histogram
    lightoj 1033 Generating Palindromes
    网络编程总结
    生产者消费者模型
  • 原文地址:https://www.cnblogs.com/caios/p/3823515.html
Copyright © 2020-2023  润新知