4.6 练习及解析

(1)将下列描述翻译成Swift表达式。

小李买了5支铅笔、1块橡皮、3本作业本和11个书签。每支铅笔2元,每块橡皮3元,每本作业本2.5元,每个书签0.5元,计算小李所花多少钱。

解析:

        //共26元
        var sum = 5*2+1*3+3*2.5+11*0.5

(2)设计一个表达式来生成1~7之间的随机数。

解析:

        // arc4random()为Swift标准函数库中的随机数生成函数
        var rand = arc4random()%7+1

(3)语、数、外3门科目进行测试,当3门科目的成绩都大于60且总分不小于200分时,成绩才为合格,使用Swift表达式来描述上述逻辑。

解析:

        var Language=60
        var Math=65
        var English=70
        if Language>60 && Math>60 && English>60 && (Language+Math+English)>200 {
            print("合格")
        }

(4)编写闰年判断的表达式。

闰年:1.能够被400整除。

2.能够被4整除但是不能够被100整除。

解析:

        var year = 2016
        if year%400==0 || ((year%4==0) && (year%100 ! = 0)) {
            print("闰年")
        }

(5)学校乒乓球比赛需要每班出一名主选手和一名辅助选手参赛,比赛分为上下两场,上半场主选手得分超过30分则下半场需要辅助选手进行,否则下半场依然由主选手进行,使用条件运算符(三目运算符)描述下半场比赛出赛的选手。

解析:

        var mark = 40
        var people = mark>30 ? "主选手" : "辅助选手"

(6)打印如下图案:

          **********
          *? ? ? ? ? ? ? ? *
          *? ? ? ? ? ? ? ? *
          **********

解析:

        for indexH in 1...4 {
            //每行有10列符号
            print("")
            for indexV in 1...10 {
              //第一行和最后一行为*
              if indexH==1 || indexH==4 {
                  print("*", separator: "", terminator: "")
              }else{
                  //第一列和最后一列为*
                  if indexV==1 || indexV==10 {
                      print("*", separator: "", terminator: "")
                  }else{
                      //其余为?
                      print("? ", separator: "", terminator: "")
                  }
              }
            }
        }

print()函数会自动在打印末尾添加换行符,使用带3个参数的print()函数,并且将后两个参数设置为空字符串可以屏蔽print函数的自动换行功能。

(7)打印出所有的“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身。

解析:

        for item in 100...999 {
            //获取个位数字
            var dig = item%10
            //获取十位数字
            var tens = item/10%10
            //获取百位数字
            var hundred = item/100
            //获取结果 这里可以考虑用pow(Double, Double) 函数代替dig*dig*dig
            var sum = dig*dig*dig + tens*tens*tens + hundred*hundred*hundred
            if sum == item {
              print(item)
            }
        }

(8)猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

解析:

        var count = 1
        for day in 1...9 {
            count = (count+1)*2
        }
        print(count)

(9)两个乒乓球队进行比赛,每队各出三人。甲队为p1、p2、p3三人,乙队为q1、q2、q3三人。抽签决定了比赛名单后,有人向队员打听比赛的名单。p1说他不和q1比,p3说他不和q1、q3比,请编写程序列出三队赛手的名单。

解析:

        //标识甲队
        var p1 = 1
        var p2 = 2
        var p3 = 3
        //标识乙队
        var q1 = 0
        var q2 = 0
        var q3 = 0
        for indexI in 1...3 {
            q1 = indexI
            for indexJ in 1...3 {
              q2 = indexJ
            for indexK in 1...3 {
                q3 = indexK
                if indexI ! = indexJ && indexI ! = indexK && indexJ ! = indexK {
                  if q1 ! = p1 && p3 ! = q1 && p3 ! = q3 {
                      print(q1, q2, q3)
                  }
                }
            }
        }
      }
      //输出 2,3,1

(10)求1+2! +3! +...+20!的和。

解析:

    var sumC = 0
    for var index in 1...20 {
        var tmp = 1
        while index > 0{
          tmp *= index
          index -= 1
        }
        sumC+=tmp
    }
    print(sumC)
    //输出2561327494111820313

(11)打印倒金字塔

      * * * * * * *
        * * * * *
          * * *
            *

解析:

        for indexJ in 1...7 {
            if indexJ < indexI{
              //先打因左侧空格
              print(" ", separator: "", terminator: "")
            }else if indexJ+(indexI-1)<=7 {
              //再打印*
              print("*", separator: "", terminator: "")
            }
        }
        //换行
        print("")
    }