前言:
因为以前自己也想从互联网上学习编程,但发现里面很多都是大坑,一段代码放那,不知道在哪输,还有些伪代码,照着输入了却是错误的代码。所以让我感觉编程对新人极大的不友好。现在自己有机会写这些文章,虽然还是个初学者,但我希望可以尽可能有耐心而且全面的写好它,希望新人能从中学习到许多,同时也希望编程不要再高高在上,可以更加亲民一些,让所有人都可以学习。
Swift第一周学习总结
1环境
练习Swift首先点击Scode2(注:我的版本是7.2)然后选择Get started with a playgroud ,如图:
进入后选择ios,点击下一步
选择存储位置后创建,在这个环境下,你可以一边输入,电脑一边帮你运行结果,但是这样输入会很慢。
另一种建立也是比较常用的方法:打开Scode2,选择Create a new Xcode project,
然后选择OS X下面的APPlication 里面的Command Line Tool,点击下一步,如图:
为文件命名,前面三个名字都要写,第一个Product Name:为文件命名,Oranganization Name:为公司名,没有可以自己YY,Organization Identifler:大部分是域名反写加文件名,如baidu.com反写就是com.baidu,没有也可以自己YY,最后语言选择Swift,点击下一步。
选择位置创建好后,选择main.swift,在里面就可以开始编写程序了。(注:由于SWIFT编写没有main函数,主要是因为有main.swift,所有一定不要修改文件名)
tip:由于该文件下没有手动输入方法,可以使用C为它提供手动输入方法,方法如下:
1.右击左上文件处,选择New File...新建,如图:
下拉选择OS X中的Source里的C File,点击下一步,如图:
为文件命名为input,下面的勾要选上,下一步,选择位置创建。如图
2.在左侧选择input.h,在里面写入long inputInt();和 double inputDouble();(定义2个输入类),如图:
然后选择input.c,输入
#include "input.h"
long inputInt() {
long a;
scanf("%ld",&a);
return a;
}
double inputDouble (){
double a;
scanf("%lf",&a);
return a;
}
如图:
最后,选择myfirst-Bridging-Header.h输入:
#import "input.h"
如图:
3.点击调试(在左上角)后提示BUILD SUCCEEDED就成功了。如图:
有了这些,你就可以遨游程序的海洋了!!!
2程序设计
什么是程序?
程序时指令的集合。
而程序设计就是通过编译将SWIFT代码变成机器代码
实例:
print("Hello, World!", terminator:"")
print("大家好")
Swift语言的特点:
1.使用print()输出时,自动添加换行符terminator:”\n”,如果不希望它自动换行,只需输入terminator:""即可
2.分号可以省略,除非一行写多条语句,一般一行不会写多条语句
3.Swift可以自动推断值的类型
4.整型Int最大只能算到20!,如果要算更大的数要使用Double类型
5.注意每次程序上面有#import Foundation
3变量和常量
除了了常见的变量和常量,如:
//自动确定变量类型(var:变量;let:常量)
var a = 100
let b = 50
//b=10 编译错误
还有元组,如:
let stu:(id:Int,name:String,gender:Bool,age:Int) = (1001,"王大锤",true,23)
//输出方法1
print(stu.0)
print(stu.1)
print(stu.2)
print(stu.3)
//输出方法2
print(stu.age)
print(stu.gender)
print(stu.id)
print(stu.name)
tips:元组可以很方便的交换2个数的大小
//定义x和y
var x= 10,y=11
//交换
(x,y)= (y,x)
//输出
print("x=\(x),y=\(y)")
自定义类型,如:
typealias ASP = Int
var a: ASP = 100
虽然a的类型是ASP但是它本质还是Int
tip:关于常量和变量的定义:一般来说,在Swift要尽量就数值类型定义为一个常量,因为系统会自动对常量进行优化。只有对那些数值经常发生改变的,才会定义为变量。而我的经验就是不管什么先定义成常量,如果系统报错,在对进行修改...
4运算符
算数运算符:加,减,乘,整除,取余数。
关系运算符:== ,!= , > , >= , < , <= ,而它们的结果产生Bool值,即:true和false。
var c = a + b
//输出时在双引号内使用\()是转义字符,可以直接输出括号内部值
print("\(c)")
//不加双引号直接输出值
print(a-b)
print(a*b)
//整数除以整数结果也是整数(不会出现小数部分)a/b表示a除以b取整数(不会四舍五入,直接切掉小数部分),而a%b表示a除以b取余数
print(a/b)
//12.0 swift 自动推断出为double
//手动定义x,y为常量,类型为Double,值为321和123,输出以小数的形式输出
let x: Double = 321
let y: Double = 123
print(x/y)
//进行数学运算时左右两边必须类型相同
print(x/Double(b))
//Int取整数时不会四舍五入
展示一个简单计算加减乘除运算
print("请输入第一个数:")
let a = inputDouble()
print("请输入第二个数:")
let b = inputDouble()
print("\(a)+\(b)=\(a+b)")
print("\(a)-\(b)=\(a-b)")
print("\(a)*\(b)=\(a*b)")
print("\(a)/\(b)=\(a/b)")
print("\(a)%\(b)=(\(a%b))")
tips:除运算符号等意外所有的东西都有自己的值,比如:汉字~,所以汉字也能进行比较,一般查看汉族大小的方法有
//定义一个常量str
let str = "有兽焉"
//定义TEMP获得str中的文字序号
for temp in str.utf16{
//打印temp
print(temp)
}
5分支结构
分支结构就是我们常看见的If,else结构,也就是条件运算,满足条件是一种情况,不满足是另一种情况。
例如:
计算某一年是不是闰年:
import Foundation
print("请输入一个年份,例如1982")
let year = inputInt()
//&&-短路与运算(而且)
//||-短路或运算(或者)
//四年1闰,百年不闰,四百年又闰
if year % 4 == 0 && year % 100 != 0 || year % 400 == 0 {
print("\(year)年是闰年")
}
else {
print("\(year)年不是闰年")
}
进化版:计算某年某月有多少天(注:代码在最后)
提示:
1.要求用户输入年份,月份
2.开始判断,如果月份为1.3.5.7.8.10.12,如果月份为4,6,9,11
3.如果月份为2月,再判断是平年还是闰年
4.输出天数
计算个人所得税,题目如下图所示:
import Foundation
//计算实际资金
print("请输入工资",terminator: "")
let salary = inputDouble()
print("请输入五险一金", terminator: "")
let insurance = inputDouble()
//定义diff判断含税级距
let diff = salary - insurance - 3500
//定义rate为税率,税率由于是小数,所以采用Double类型
let rate: Double
//定义deduction为速算扣除数,因为税率是小数,为了后面方便计算,所以全部定义为Double类型
let deduction: Double
if diff <= 0 {
rate = 0.00
deduction = 0
}else if diff <= 1500{
rate = 0.03
deduction = 0
}else if diff <= 4500{
rate = 0.1
deduction = 105
}else if diff <= 9000{
rate = 0.2
deduction = 555
}else if diff <= 35000{
rate = 0.25
deduction = 1005
}else if diff <= 55000{
rate = 0.3
deduction = 2755
}else if diff <= 80000{
rate = 0.35
deduction = 5505
}else{ rate = 0.45
deduction = 13505
}
//定义tax为个人所得税
let tax = diff * rate - deduction
print("个人所得税为:¥\(tax)元")
print("实际收入为:¥\(salary-insurance-tax)元")
使用switch计算判断你的工资收入是什么级别的:
print("请输入你的月薪", terminator:"")
//定义slary为你的年薪
let salary = inputInt() * 13
//如果年薪大于0,开始判断
if salary >= 0{
switch salary {
case 0:print("你是一个无业游民")
//...两边为闭区间
case 1...30000:print("你是一个小码畜")
case 30001...60000:print("你是一个码奴")
case 60001...10000:print("你是一个大码农")
case 100001...200000:print("你是一个IT民工")
case 200001...500000:print("你是一优秀的IT工程师")
//..<区间为左闭右开
case 500001..<10000000:print("你是一个IT精英")
case 10000000..<100000000:print("你是IT大哥")
default :print("你是IT领袖")
}
}
//如果你的工资为负数
else {
print("你是创业者")
}
6循环结构
循环结构分为三种循环,当型循环,直到型循环和for循环。下面演示用三种循环分别求1到100的和。
//求1到100的和方法1.for循环
var s = 0
//i的大小是从1到100递加
for i in 1...100{
s += i
}
print("和是\(s)")
求1到100的和方法2.当型循环
var i = 1
var s = 0
//当x<=100时执行循环
while i <= 100 {
s += i
i += 1
}
print("和为\(s)")
//求1到100的和方法3.直到循环(至少执行1次)
var i = 1
var s = 0
repeat{
s += i
i += 1
}while i <= 100
print("和为\(s)")
进阶循环开始——————————————
1.找到1到100以内所有的质数
//定义一个新的算法isPrime(),它需要一个Int型的数n,输出一个bool型的值
func isPrime(n:Int) -> Bool{
//定义一个变量i=2
var i = 2
//当i<\sqrt{n}(注:可以极大提高运行速度,在根号前的数如果没有能整除的那么之后也就不会有了,数学优化)
while i <= Int(sqrt(Double(n))) {
//如过有能被整出的,那么返回FALSE值
if n % i == 0 {
return false
//使循环提前结束
//break不够好
}
//i自增
i += 1}
//否则返回true
return true
}
//n从1到100
for n in 1...100{
//这里面有一个简写就是isPrime(n)=true,默认为true,所以省略
if isPrime(n){
//输出所有返回值为true的n
print(n)
}
}
tips:在使用循环时,穷举法可以解决许多问题,例如:
百钱百鸡:有100块,公鸡5块一只,母鸡3块,小鸡1块3个,问要买100只鸡有多少买法?
//百钱百鸡
//GET:穷举法
//最多买20只公鸡
for x in 0...20 {
//最多买33只母鸡
for y in 0...33 {
//最多买100只小鸡
for z in 0...99{
//如果公鸡加母鸡加小鸡等于100并且公鸡钱加母鸡钱加小鸡钱为100并且小鸡是3的倍数
if x+y+z == 100 && 5*x + 3*y + z/3 == 100 && z % 3 == 0{
//那么输出所有满足条件的结果
print("公鸡\(x)只,母鸡\(y)只,小鸡\(z)只")
}
}
}
}
//2如果已知XY,则z=100-x-y(可以优化程序)
for x in 0...20 {
for y in 0...33 {
let z = 100 - x - y
if 5*x + 3*y + z/3 == 100 && z % 3 == 0{
print("公鸡\(x)只,母鸡\(y)只,小鸡\(z)只")
}
}
}
自行完成一个猜数字的游戏(注:代码在最后)
tip:随机生成一个100以内的数(Int(arc4random_uniform(100)) + 1)
如果猜错,会提示猜大还是猜小了
用二分法最多7次猜出
7数组
数组相当于一个容器,用来存储其他东西。与数组类似的还有字典和集合。
数组的定义:
////放整数的数组,一般定义为变量进行计算
//var ff:[Int]
////定义一个放整数的数组(6个元素,初始值为0)
//var f = [Int](count: 6, repeatedValue: 0)
////给数组1赋值100(数组的第一位为0)
//f[0] = 100
//数组
//1.创建数组
var array = [String] (arrayLiteral: "HELLO" ,"world")
var array2:[Int]=[]//创建数组的字面量语法(类型可以省略的)
var array3 = [1,2,23,5,4]
//创建数100位每个1
var array4 = [Int](count: 100, repeatedValue: 1)
var array5 = [String](arrayLiteral: "你好","世界")
//2.获取数组元素的个数
print(array.count)
print( array2.count)
print(array3.count)
print(array4.count)
print(array5.count)
//3.数据的遍历
for i in 0..<array3.count{
//[]是对数组进行下标运算(算出指定位置的元素)
print(array3[i])
}
//3.1.只读循环(不进行修改)
for str in array5 {
print(str)
}
//3.2.修改数组
for i in 0..<array.count{
if i == 0{
array[i] = "你好"
}
}
//4.向数组中添加元素
array.append("i am")
array.append("coming")//依次插入
array.insert("my", atIndex: 1)//在第二个前面添加
print(array5)
//5.对数组删除
//array.removeAll()//删除所有
//array.removeAll(keepCapacity: true)//删除所有但保留空间
//array.removeAtIndex(`)//删除某一个
//array.removeFirst()//删除第一个
//array.removeFirst(<#T##n: Int##Int#>)//删除前n个
//array.removeLast()//删除最后一个
//array.removeRange(2...3)//删除一个区域
//6数组的复制
var array6 = array
array6[2] = "space"
print(array6)
let array7 = array6 + array5
print(array7)
//array6[2...4] = ["a","b"]//之后没写的自动删除
for (i,value) in array7.enumerate(){
print("\(i).\(value)")
}
数组的实例:
30个人围成一圈报数,,15个基督徒,15个正常人。如果报道9就出去,下一个人重新从1开始报,以此类推最后全报完后15正常人全部出列,问他们是怎么站位的
//定义一个数组包含30人,类型是BOOL型用来区分正常人和基督徒,展示先全部定位基督徒,即:true
var manArray = [Bool](count: 30, repeatedValue: true)
var counter = 0 //出列的数量
var num = 0 //报数
var index = 0 //数组的下标
//当出列人数小于15人时重复执行
while counter < 15 {
//报数出列9,如果人的下标为TRUE,则开始循环
if manArray[index] {
//报数自增
num += 1
//直到报数为9
if num == 9 {
//那么把这个人标记为FALSE即:正常人
manArray[index] = false
//并且出列人数加一
counter += 1
//并且报数重新开始
num = 0
}
}
//数组下标自增,即:大家围城圈报数
index+=1
//如果下标等于最大人数,即:报数报完一圈
if index == manArray.count{
//那么就从第一个人重新开始报
index = 0
}
}
//定义一个person获取数组内所有值
for person in manArray {
//如果值是true那么输出基督徒否则输出正常人
print(person ? "基":"非",terminator:"")
}
某年某月有多少天
print("请输入年和月用空格隔开(例如:1980 2)")
let year = inputInt()
let mouth = inputInt()
let day :Int
//如果输入的月份大于12或者小于1直接输出时间错误并退出
if mouth < 1 || mouth > 12 {
print("时间错误")
exit(0)
}
//如果为月份为2月
else if mouth == 2 {
//双条件使用三元运算可以简化代码
//如果满足闰年2月就有29天否则为28天
day = year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ? 29 : 28
// if year % 4 == 0 && year % 100 != 0 || year % 400 == 0 {
// day = 29
// }else{
// day = 28
// }
//如果月份为4,6,9,11则为30天
}else if mouth == 4 || mouth == 6 || mouth == 9 || mouth == 11 {
day = 30
//余下的为31天
}else{
day = 31
}
//输出某年某月有几天
print("\(year)年\(mouth)月有\(day)天")
猜数字的游戏
//定义一个100以内随机数为answer(由于随机数每次只产生一个,且不会改变,所以定义为常量)
let answer = Int(arc4random_uniform(100)) + 1
//定义一个整型变量为thyAnswer(thy=your,由于你的答案一直在变,所以为变量)
var thyAnswer:Int
//定义一个计数器,来计算你用多少猜对数
var counter = 0
repeat {
//计数器加一
counter += 1
//输入你猜的数字
print("请输入你猜的数字:", terminator:"")
thyAnswer = inputInt()
//判断你的数和答案的大小
if thyAnswer > answer {
//如果大了提示小一点
print("小一点")
}else if thyAnswer < answer {
//如果小了提示大一点
print("大一点")
}else {
//否则就是猜对了
print("恭喜你猜对了,你总共猜了\(counter)")
}
}
//如果你的答案和标准答案不一样,则一直循环
while thyAnswer != answer
if counter > 7{
//最后如果猜超过了7次,那么~~
print("你的智商该充值了")
}