iOS开发技术-实验二-排序算法实验

课程名称 iOS开发技术

排序算法实验

一、 实验目的和要求
实验目的:
1)掌握Swift 数组、循环、函数、Lambda等语法;
2)理解新式语言的设计理念;
3)理解函数签名的意义;
4)了解基本的编程架构思想;
实验要求:
1)创建Swfit控制台程序,实现对Float型数组进行排序,可以使用任何排序算法。
2)将排序逻辑与比较逻辑分离,实现可对任何类型数组进行排序的函数,并对其测试;
3)完成实验报告文档,必须是docx格式!
4)实验报告要求排版正确、格式合规、内容丰富、图文并茂;
4)实验报告中要详细描述开发环境的配置过程、代码从编写到运行的过程、分析遇到的错误等。

二、 实验原理
1)Swift中的函数是一等公民;
2)通过将函数作为参数,可以将排序逻辑与比较逻辑分离;
3)Lambda表达式可以省掉那些能推断出来的部分;

三、 主要实验设备与软件

设备:个人PC、互联网;
系统:macOS或Linux或Windows10;
软件:XCode、VSCode、Swift For Windows;

四、 实验方法与步骤 

1.利用实验一配置的swift编写环境编写控制台程序,实现Int型数组排序。

选择冒泡排序。
代码编写:
方法一:数组序列:[200,5,8,4,2,3,55,99,1,0]

// 版本一:

func sort(arr:[Int]){
var retArr = arr 

    //外层是轮数,是元素-1
    for i in 0 ..< retArr.count-1{
        print("-------i\(i)----------")

        //内层循环比较的次数
        for j in 0 ..< retArr.count-i-1{
            print(j)
            if retArr[j] > retArr[j+1] {

                //交换位置
                let temp = retArr[j]
                retArr[j]=retArr[j+1]
                retArr[j+1]=temp
        }
    }
            print("\n")
}

//打印整个数组
for a in retArr{

    // \'\t 单引号+水平制表符
    print("\'\t\(a)")
}
 }

var arrToSort = [200,5,8,4,2,3,55,99,1,0]
//调用sort函数
sort(arr:arrToSort)

PASS:问题:此函数的逻辑对任何数值型数组都可用,但是,当向其传递 double 型数组时,出现参数类型不兼容的问题。改进见方法二。

2.将排序逻辑与比较逻辑分离,实现可对任何类型数组进行排序的函数,并对其测试;见方法二。

方法二:数组序列:[33,2,4,656,6,5656,33,22]

//版本 2:

func sort(arr:[Any],compareFunc:(Any,Any)->Bool){
var retArr = arr

//外层是轮数,是元素数量-1
for i in 0 ..< retArr.count-1 {
//print("----------\(i)----------")

//内层循环比较的次数
for j in 0 ..< retArr.count-i-1 {
//print(j)
if compareFunc(retArr[j],retArr[j+1]) {

//交换位置
let temp = retArr[j]
retArr[j]=retArr[j+1]
retArr[j+1]=temp
}
}
}
//打印整个数组看看
for a in retArr{
print(a)
}
}

//要排的数组
var arrToSort = [33,2,4,656,6,5656,33,22]
//元素比较函数
func comparElement(e1:Any,e2:Any)->Bool{
return (e1 as! Int) < (e2 as! Int)
}

//调用函数对 arrToSort 排序
sort(arr:arrToSort,compareFunc: comparElement)

PASS:把 sort 函数变得更通用,让它支持任何类型的数组。做法就是将排序逻辑与比较逻辑分离,比较逻辑以参数的形式传给排序函数。

3.对Float字符串数组排序。

数组序列:
[“jjjjkjkjkjkjkjkkjj”,“hkjjkjkjkhhhh”,“fdkjkkjkjddd”,“ssssjjs”,“oooo”,“ll”,“a”]

代码编写:
通用部分:

func sort(arr:[Any],compareFunc:(Any,Any)->Bool){
var retArr = arr
//外层是轮数,是元素数量-1
for i in 0 ..< retArr.count-1 {
//print("----------\(i)----------")
//内层循环比较的次数
for j in 0 ..< retArr.count-i-1 {
//print(j)
if compareFunc(retArr[j],retArr[j+1]) {
//交换位置
let temp = retArr[j]
retArr[j]=retArr[j+1]
retArr[j+1]=temp
}
}
}
//打印整个数组看看
for a in retArr{
print(a)
}
}

对字符串数组排序,以字符串的长度作比较:

//要排的数组
var arrToSort =
["jjjjkjkjkjkjkjkkjj","hkjjkjkjkhhhh","fdkjkkjkjddd","ssssjjs","o
ooo","ll","a"]
//元素比较函数
func comparElement(e1:Any,e2:Any)->Bool{
return (e1 as! String).count < (e2 as! String).count
}
//调用函数对 arrToSort 排序
sort(arr:arrToSort,compareFunc: comparElement)

使用 Lambda 表达式(也可以叫匿名函数,它出现的唯一目的就是简化代码)进一步简化调用 sort 的代码:

//调用函数对 arrToSort 排序

sort(arr:arrToSort,compareFunc: {(e1:Any,e2:Any)->Bool in
return (e1 as! String).count < (e2 as! String).count
})

PASS:由于函数最后一句的值默认就是被返回的值,所以 return 可以省。简化如下,

//调用函数对 arrToSort 排序

sort(arr:arrToSort,compareFunc: {(e1:Any,e2:Any)->Bool in
(e1 as! String).count < (e2 as! String).count
})

PASS:由 sort 函数的定义,可以推断 comparFunc 的参数类型和返回类型,所以都可以省。简化如下, //调用函数对
arrToSort 排序

sort(arr:arrToSort,compareFunc: {e1,e2 in
(e1 as! String).count < (e2 as! String).count
})

PASS:比较函数的参数,有别名,$n,n 从 0 开始,对应每个参数:

//调用函数对 arrToSort 排序

sort(arr:arrToSort,compareFunc: {($0 as! String).count < ($1 as!
String).count})

PASS:如果函数的最后一个参数是函数,可以将 Lambda 放在小括号外面:

//调用函数对 arrToSort 排序

sort(arr:arrToSort){
($0 as! String).count < ($1 as! String).count
}

PASS:函数可以作为参数的前提是:函数是一等公民。

五、 实验数据记录、处理及结果分析
(代码运行部分采用菜鸟教程自带swift编辑器运行,方便代码实时查看。swift控制台dos窗口运行结果类似,步骤见实验一)
对Int型数组进行冒泡排序。
数组序列:[200,5,8,4,2,3,55,99,1,0]
在这里插入图片描述
在这里插入图片描述

将排序逻辑与比较逻辑分离。
数组序列:[33,2,4,656,6,5656,33,22]
在这里插入图片描述

对Float字符串数组排序。
数组序列:[“jjjjkjkjkjkjkjkkjj”,“hkjjkjkjkhhhh”,“fdkjkkjkjddd”,“ssssjjs”,“oooo”,“ll”,“a”]
在这里插入图片描述
在这里插入图片描述

六、讨论、心得
知识总结
Swift数组
数组的类型指的是数组中每个元素的类型;特点:1)有序,2)读速度快;相当于 Java 中的 List。
let 定义的数组常量,不仅常量本身不能改变,其每个元素也是常量。
Swift 数组使用有序列表存储同一类型的多个值。相同的值可以多次出现在一个数组的不同位置中。
Swift 数组会强制检测元素的类型,如果类型不同则会报错,Swift 数组应该遵循像Array这样的形式,其中Element是这个数组中唯一允许存在的数据类型。
如果创建一个数组,并赋值给一个变量,则创建的集合就是可以修改的。这意味着在创建数组后,可以通过添加、删除、修改的方式改变数组里的项目。如果将一个数组赋值给常量,数组就不可更改,并且数组的大小和内容都不可以修改。

Swift字典
相当于 Java 中的 Map。
每个元素有两个值组成(Key-Value)。
是无序的,不能以序号访问其中的元素。必须知道元素的 key,通过 key 获取其 value。
Swift 字典用来存储无序的相同类型数据的集合,Swift 字典会强制检测元素的类型,如果类型不同则会报错。
Swift 字典的key没有类型限制可以是整型或字符串,但必须是唯一的。
如果创建一个字典,并赋值给一个变量,则创建的字典就是可以修改的。这意味着在创建字典后,可以通过添加、删除、修改的方式改变字典里的项目。如果将一个字典赋值给常量,字典就不可修改,并且字典的大小和内容都不可以修改。
Swift函数
Swift 函数用来完成特定任务的独立的代码块。
Swift使用一个统一的语法来表示简单的C语言风格的函数到复杂的Objective-C语言风格的方法。
函数声明: 告诉编译器函数的名字,返回类型及参数。
函数定义: 提供了函数的实体。
Swift 函数包含了参数类型及返回值类型:

函数定义

Swift 定义函数使用关键字 func。定义函数的时候,可以指定一个或多个输入参数和一个返回值类型。每个函数都有一个函数名来描述它的功能。通过函数名以及对应类型的参数值来调用这个函数。函数的参数传递的顺序必须与参数列表相同。
函数的实参传递的顺序必须与形参列表相同,-> 后定义函数的返回值类型。
以下定义了一个函数名为 runoob 的函数,形参的数据类型为 String,返回值也为 String:

func runoob(site: String) -> String {
    return (site)
}

函数签名

函数参数个数+函数参数类型+函数返回类型;注意里面没有函数名。
比如下面 2 个函数:

func add(a:Int,b:Int)->Int{
return a+b
}
func sub(a:Int,b:Int)->Int{
return a-b
}

其签名为:(Int,Int)->Int
函数签名就是其类型,比如定可以指向 add 和 sub 的变量:

var function:(Int,Int)->Int = add
//通过变量调用函数:
let r1 = function(9,2)

函数调用

可以通过函数名以及对应类型的参数值来调用函数,函数的参数传递的顺序必须与参数列表相同。
以下定义了一个函数名为 runoob 的函数,形参 site 的数据类型为 String,之后我们调用函数传递的实参也必须 String 类型,实参传入函数体后,将直接返回,返回的数据类型为 String。

func runoob(site: String) -> String {
    return (site)
}
print(runoob(site: "111"))

以上程序执行输出结果为:


111

课程感悟
通过这次实验,掌握了Swift数组、循环、函数、Lambda表达式的用法;进一步加强了ios开发的学习;理解了函数签名的意义。为以后的进一步深入开发打下坚实基础。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值