第二周學(xué)習(xí)小結(jié)
概述:
本周開始系統(tǒng)的對Swift語法部分進行學(xué)習(xí)。
Swift是面向?qū)ο蟮木幊桃虑耍谖业睦斫庵泄远嫦驅(qū)ο缶幊叹褪鞘紫葎?chuàng)建一個對象,然后通過向創(chuàng)建的對象發(fā)送消息指令來操作對象具练,使之滿足設(shè)計所需乍构。在大學(xué)曾經(jīng)學(xué)習(xí)過一些編程語言,但由于學(xué)習(xí)時間少扛点,內(nèi)容少哥遮,且學(xué)習(xí)目的僅是為了應(yīng)付考試。所以對學(xué)習(xí)Swift并沒有太多的幫助陵究。但是曾經(jīng)的學(xué)習(xí)經(jīng)歷讓我明白學(xué)好編程需要強大的邏輯思維作基礎(chǔ)眠饮,在編程過程中,很多時候需要你講自然語言翻譯成電腦語言铜邮,而為了精簡代碼仪召,你需要對復(fù)雜的自然語言進行提煉重組,盡量讓你寫出的代碼精簡高效松蒜,具備自然語言所描述的功能且具有高度的邏輯性扔茅,這樣即達到了預(yù)期的效果,又讓代碼變的美好秸苗。下面通過每一天的學(xué)習(xí)來進行總結(jié)召娜。
2016.08.01
1.swift可輸入類型
let myName = "龔資深"
let myClass : String
myClass = "Ios1605"
var myAge = 22
let myScore : Double
myScore = 99.5
這里需要說明的是,swift可以輸出整型數(shù)和浮點型數(shù)惊楼,以及字符串等萤晴,這些都和大多數(shù)編程語言類似吐句,但是swift擁有強大的類型推斷能力,可以直接賦值店读,賦值以后該變量的類型久確定嗦枢。注意所有的字符都要在英文輸入法的狀態(tài)下才可以。
2.swift運算符
按照參與運算的元素來分屯断,可以將swift的運算符分為一元文虏、二元和三元運算符。
print("加法運算結(jié)果\(a + b)")
print("\(a) - \(b) = \(a - b)")
print("\(a) * \(b) = \(a * b)")
print("\(a) / \(b) = \(a / b)")
print("\(a) % \(b) = \(a % b)") //求余數(shù)
以上是算數(shù)運算符
a > b
a < b
a == b
a != b
a >= b
a <= b
以上為關(guān)系運算符
if a == b && c == d{
}
else if a == b || e == f
以上是短路運算符殖演。即都成立為真(首行)氧秘,或一個成立即可。
let c = a < b ? a : b
唯一的三元運算符
問好前面的條件為真趴久,取冒號前面的值丸相,否則取冒號后面的值。注意問好前打空格彼棍,否則會被認為是可空類型灭忠。
2016.08.02
元組(tuple)
用一個變量或者一個常量就能保存多項數(shù)據(jù)信息的類型
var stu = (1001, "王大錘", true, 23)
print(stu.0)
print(stu.1)
print(stu.2)
print(stu.3)
let stu: (id: Int, name: String, gender: Bool, age: Int) = (1001, "王大錘", true, 23)
print(stu.id)
print(stu.name)
存儲和調(diào)用信息
(x,y) = (y,x)
print(x,y)
可以用元組來交換信息
switch選擇
switch a{
case 1:
case 2:
default:
}
casei相當于入口,會根據(jù)a值的多少進入相應(yīng)的窗口完成指令座硕。注意弛作,無論什么情況必須有defaule。
2016.08.03
循環(huán)結(jié)構(gòu)
本日主要講解了swift中的循環(huán)結(jié)構(gòu)华匾,主要分為三大類映琳,即for循環(huán),while循環(huán)和repeat-while循環(huán)蜘拉。
for i in 1..<10{
print("\(i).hello world")
} cewwasz
for _ in 1...10{ //省略了參數(shù)
print("hello world")
}
for循環(huán)主要針對需要滿足一定循環(huán)次數(shù)的需求萨西,比如很明確的需要盡心多少次循環(huán),需要對某些事物進行便利的時候旭旭,其條件布明顯則選用for循環(huán)
var i = 0
while i < 10{
print("hello world")
i += 1
}
while循環(huán)谎脯,在滿足while后面的條件的情況下就會循環(huán),這種循環(huán)結(jié)構(gòu)在條件明確的情況下您机,可以選用,一直到條件不再成立為止
var i = 0
repeat{
print("hello world")
i += 1
}while i < 10
與while循環(huán)不一樣的是年局,無論條件是什么际看,該循環(huán)都會無條件執(zhí)行一次,然后再判斷條件是否還成立矢否,成立的話就繼續(xù)循環(huán)仲闽,不成立久終止循環(huán)。
2016.08.04
程序就是指令的結(jié)合僵朗,而再復(fù)雜的程序也是基于簡單的循環(huán)選擇分支等結(jié)構(gòu)組成的屑彻。老師重點讓我們掌握了四個小程序
1.賭博
func roll() -> Int{
return Int(arc4random_uniform(6)) + 1
}
var money = 1000
repeat{
print("玩家總資產(chǎn):¥\(money)元")
var debt : Int
repeat{
print("請下注:", terminator:" ")
debt = inputInt()
}while debt <= 0 || debt > money
var needsGoOn = false
let firstPoint = roll() + roll()
print("玩家搖出了\(firstPoint)點")
switch firstPoint{
case 7, 11:
money += debt
print("玩家勝")
case 2,3,12:
money -= debt
print("莊家勝")
default:
needsGoOn = true
}
while needsGoOn{
let currentPoint = roll() + roll()
print("玩家搖出了\(currentPoint)點")
if currentPoint == 7{
money -= debt
print("莊家勝")
needsGoOn = false
}
else if currentPoint == firstPoint{
print("玩家勝")
money += debt
needsGoOn = false
}
}
}while money > 0
if money <= 0
{
print("你破產(chǎn)了")
}
在這段程序中,核心的矛盾是顶吮,第一次搖出的兩個數(shù)之和為7和11時社牲,玩家勝利;為2悴了,3搏恤,12時莊家勝,若為其他數(shù)則繼續(xù)搖湃交,搖到7時莊家勝熟空,搖到于第一次搖的一樣的數(shù)時玩家勝。因此我們應(yīng)該先寫出第一次搖的情況搞莺。仔細琢磨一下息罗,只是一次分情況的搖,不用循環(huán)才沧,且分支結(jié)構(gòu)明顯迈喉,所以選用switch完成第一次搖的情況,如下:
switch firstPoint{
case 7, 11:
money += debt
print("玩家勝")
case 2,3,12:
money -= debt
print("莊家勝")
default:
needsGoOn = true
}
這里的needgoon是表示糜工,如果第一次搖沒有結(jié)束游戲弊添,就要進行下一次。注意這是一個條件捌木,且不需要無條件進行第一次油坝,所以選用while來進行接下來的搖數(shù):
while needsGoOn{
let currentPoint = roll() + roll()
print("玩家搖出了\(currentPoint)點")
if currentPoint == 7{
money -= debt
print("莊家勝")
needsGoOn = false
}
else if currentPoint == firstPoint{
print("玩家勝")
money += debt
needsGoOn = false
}
}
先梳理好思路,找到主要矛盾刨裆,完成主要的代碼部分澈圈,再進行修飾,加入賭金本金之類的帆啃,就完成了這一段代碼
2.猜數(shù)字
func roll() -> Int{
return Int(arc4random_uniform(99)) + 1
}
var yournum : Int
let compnum = roll()
repeat{
print("請輸入你的數(shù)字:")
yournum = inputInt()
if yournum > compnum{
print("little")
}
else if yournum < compnum{
print("more")
}
else{
print("good")
}
}while yournum != compnum
這段代碼用了if else的分支結(jié)構(gòu)瞬女,主要作用是用于單一方面的條件,成立如何努潘,不成立如何诽偷。當然也可以有多個if語句。
2016.08.05
1.數(shù)組
var array1 = [Int]()//空數(shù)組
var array: [Int] = []//空數(shù)組
var array3 = [99, 12, 34, 156, 7]
var array4 = [Int](count: 100, repeatedValue: 1)
var array5 = [String]()
var array6 = [String](count: 4, repeatedValue: "kkk")
var array7 = [";;", "kkk", "djiwodj"]
數(shù)組的創(chuàng)建有多種方法疯坤,但直接復(fù)制法(3)和指定數(shù)量(4)用的較多
print(array7.count)
獲取數(shù)組元素個數(shù)
for index in 0..<array7.count{
//[]是對數(shù)組進行下標(索引)運算(取出指定位置的元素)
print(array7[index])
if index == 1{
array7[index] = "de"
}
}
//只讀循環(huán)(每個元素都要遍歷报慕,在循環(huán)過程中不能修改數(shù)組元素)
for str in array7{
print(str)
}
對數(shù)組中的元素進行遍歷
array1.append(1)
array1.append(3) // 追加,放在前一個的后面
array1.insert(4, atIndex: 0)// 插入压怠,前面是值眠冈,后面是位置參數(shù)
array1.insert(7, atIndex: array1.count) //插到最后一個
向數(shù)組中添加元素
array1.removeAll()
array1.removeAll(keepCapacity: <#T##Bool#>)// true久只刪數(shù)據(jù),保留空間
array1.removeAtIndex(<#T##index: Int##Int#>) //刪指定位置的
array1.removeFirst() //刪第一個
array1.removeFirst(<#T##n: Int##Int#>) //刪前面n個
刪除的方法還有很多菌瘫,這里是一部分
let array8 = array7 //復(fù)制全部
var array9 = array7[1...2] // [1..<2] // 復(fù)制一部分
數(shù)組的復(fù)制
let array10 = array1 + array3
同種類型數(shù)組相加,可以合并
數(shù)組是對大量數(shù)據(jù)進行操作的有效方法蜗顽,通過運用數(shù)組和循環(huán)選擇等結(jié)構(gòu)的組合應(yīng)用布卡,通過簡單的代碼完成復(fù)雜的問題。
接前一天的四個程序雇盖,接下來的兩個就搖用到數(shù)組
2.冒泡排序
var array = [44, 78, 2, 39, 89, 12, 66]
for j in 0..<array.count - 1{
var stop = false
for i in 0..<array.count - 1 - j{
if array[i] > array[i + 1] {
(array[i], array[i + 1]) = (array[i + 1], array[i])
stop = true
}
}
if !stop{
break
}
}
print(array)
冒泡法排序的核心矛盾是兩兩比較忿等,將兩者中較大的數(shù)換到后面去,然后每遍歷一次就將一個最大的數(shù)放在最后刊懈。寫stop是當檢測到?jīng)]有交換但循環(huán)未完这弧,提前結(jié)束循環(huán)保證效率。
3.簡單選擇
var array = [44, 78, 2, 39, 89, 12, 66]
for i in 0..<array.count - 1{
var minIndex = i
for j in i + 1..<array.count{
if array[j] < array[minIndex]{
minIndex = j
}
}
(array[i], array[minIndex]) = (array[minIndex], array[i])
}
print(array)
}
簡單選擇是首先確定一個存放目標值的變量虚汛,這里為minindex匾浪,然后初始默認與i代表的數(shù)一致,通過j對i以后的數(shù)進行遍歷卷哩,當找到比minindex更小的數(shù)以后蛋辈,講minindex的值(這里的值表示數(shù)組的索引號,初始為i)與j代表的索引號交換将谊,第一次循環(huán)完后minindex索引代表的值就是數(shù)組的最小值冷溶,再遇第一個值交換,然后i= i+1尊浓,接著繼續(xù)做同樣的事逞频,指示循環(huán)次數(shù)減少1。
4.百雞百元
for i in 0...20{
for j in 0...33{
let n = 100 - i - j
if n % 3 == 0 && i * 5 + j * 3 + n / 3 == 100{
print(i,terminator: " ")
print(j,terminator: " ")
print(n)
}
}
}
這是一個窮舉法栋齿,將所有情況遍歷一次苗胀,求解。值得注意的是瓦堵,第三個調(diào)節(jié)寫成循環(huán)時基协,程序會因為不夠優(yōu)化而報錯。這也告訴我們要學(xué)會優(yōu)化程序菇用。