前言:
因?yàn)橐郧白约阂蚕霃幕ヂ?lián)網(wǎng)上學(xué)習(xí)編程,但發(fā)現(xiàn)里面很多都是大坑肖爵,一段代碼放那扎酷,不知道在哪輸,還有些偽代碼遏匆,照著輸入了卻是錯(cuò)誤的代碼法挨。所以讓我感覺編程對(duì)新人極大的不友好∷瘢現(xiàn)在自己有機(jī)會(huì)寫這些文章,雖然還是個(gè)初學(xué)者凡纳,但我希望可以盡可能有耐心而且全面的寫好它窃植,希望新人能從中學(xué)習(xí)到許多,同時(shí)也希望編程不要再高高在上荐糜,可以更加親民一些巷怜,讓所有人都可以學(xué)習(xí)。
Swift第一周學(xué)習(xí)總結(jié)
1環(huán)境
練習(xí)Swift首先點(diǎn)擊Scode2(注:我的版本是7.2)然后選擇Get started with a playgroud ,如圖:
進(jìn)入后選擇ios暴氏,點(diǎn)擊下一步
選擇存儲(chǔ)位置后創(chuàng)建延塑,在這個(gè)環(huán)境下,你可以一邊輸入答渔,電腦一邊幫你運(yùn)行結(jié)果关带,但是這樣輸入會(huì)很慢。
另一種建立也是比較常用的方法:打開Scode2沼撕,選擇Create a new Xcode project,
然后選擇OS X下面的APPlication 里面的Command Line Tool,點(diǎn)擊下一步,如圖:
為文件命名宋雏,前面三個(gè)名字都要寫,第一個(gè)Product Name:為文件命名务豺,Oranganization Name:為公司名磨总,沒有可以自己YY,Organization Identifler:大部分是域名反寫加文件名,如baidu.com反寫就是com.baidu,沒有也可以自己YY笼沥,最后語言選擇Swift蚪燕,點(diǎn)擊下一步。
選擇位置創(chuàng)建好后奔浅,選擇main.swift馆纳,在里面就可以開始編寫程序了。(注:由于SWIFT編寫沒有main函數(shù)乘凸,主要是因?yàn)橛衜ain.swift厕诡,所有一定不要修改文件名)
tip:由于該文件下沒有手動(dòng)輸入方法,可以使用C為它提供手動(dòng)輸入方法,方法如下:
1.右擊左上文件處,選擇New File...新建铭污,如圖:
下拉選擇OS X中的Source里的C File,點(diǎn)擊下一步,如圖:
為文件命名為input寿羞,下面的勾要選上,下一步,選擇位置創(chuàng)建赂蠢。如圖
2.在左側(cè)選擇input.h绪穆,在里面寫入long inputInt();和 double inputDouble();(定義2個(gè)輸入類),如圖:
然后選擇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.點(diǎn)擊調(diào)試(在左上角)后提示BUILD SUCCEEDED就成功了。如圖:
有了這些玖院,你就可以遨游程序的海洋了2ず臁!难菌!
2程序設(shè)計(jì)
什么是程序试溯?
程序時(shí)指令的集合。
而程序設(shè)計(jì)就是通過編譯將SWIFT代碼變成機(jī)器代碼
實(shí)例:
print("Hello, World!", terminator:"")
print("大家好")
Swift語言的特點(diǎn):
1.使用print()輸出時(shí)郊酒,自動(dòng)添加換行符terminator:”\n”遇绞,如果不希望它自動(dòng)換行,只需輸入terminator:""即可
2.分號(hào)可以省略燎窘,除非一行寫多條語句摹闽,一般一行不會(huì)寫多條語句
3.Swift可以自動(dòng)推斷值的類型
4.整型Int最大只能算到20!褐健,如果要算更大的數(shù)要使用Double類型
5.注意每次程序上面有#import Foundation
3變量和常量
除了了常見的變量和常量付鹿,如:
//自動(dòng)確定變量類型(var:變量;let:常量)
var a = 100
let b = 50
//b=10 編譯錯(cuò)誤
還有元組铝量,如:
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個(gè)數(shù)的大小
//定義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但是它本質(zhì)還是Int
tip:關(guān)于常量和變量的定義:一般來說银亲,在Swift要盡量就數(shù)值類型定義為一個(gè)常量慢叨,因?yàn)橄到y(tǒng)會(huì)自動(dòng)對(duì)常量進(jìn)行優(yōu)化。只有對(duì)那些數(shù)值經(jīng)常發(fā)生改變的务蝠,才會(huì)定義為變量拍谐。而我的經(jīng)驗(yàn)就是不管什么先定義成常量,如果系統(tǒng)報(bào)錯(cuò)馏段,在對(duì)進(jìn)行修改...
4運(yùn)算符
算數(shù)運(yùn)算符:加轩拨,減,乘院喜,整除亡蓉,取余數(shù)。
關(guān)系運(yùn)算符:== 喷舀,!= 砍濒, > , >= 硫麻, < 爸邢, <= ,而它們的結(jié)果產(chǎn)生Bool值拿愧,即:true和false杠河。
var c = a + b
//輸出時(shí)在雙引號(hào)內(nèi)使用\()是轉(zhuǎn)義字符,可以直接輸出括號(hào)內(nèi)部值
print("\(c)")
//不加雙引號(hào)直接輸出值
print(a-b)
print(a*b)
//整數(shù)除以整數(shù)結(jié)果也是整數(shù)(不會(huì)出現(xiàn)小數(shù)部分)a/b表示a除以b取整數(shù)(不會(huì)四舍五入,直接切掉小數(shù)部分)券敌,而a%b表示a除以b取余數(shù)
print(a/b)
//12.0 swift 自動(dòng)推斷出為double
//手動(dòng)定義x唾戚,y為常量,類型為Double,值為321和123,輸出以小數(shù)的形式輸出
let x: Double = 321
let y: Double = 123
print(x/y)
//進(jìn)行數(shù)學(xué)運(yùn)算時(shí)左右兩邊必須類型相同
print(x/Double(b))
//Int取整數(shù)時(shí)不會(huì)四舍五入
展示一個(gè)簡單計(jì)算加減乘除運(yùn)算
print("請(qǐng)輸入第一個(gè)數(shù):")
let a = inputDouble()
print("請(qǐng)輸入第二個(gè)數(shù):")
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:除運(yùn)算符號(hào)等意外所有的東西都有自己的值待诅,比如:漢字~颈走,所以漢字也能進(jìn)行比較,一般查看漢族大小的方法有
//定義一個(gè)常量str
let str = "有獸焉"
//定義TEMP獲得str中的文字序號(hào)
for temp in str.utf16{
//打印temp
print(temp)
}
5分支結(jié)構(gòu)
分支結(jié)構(gòu)就是我們吃凼浚看見的If,else結(jié)構(gòu),也就是條件運(yùn)算立由,滿足條件是一種情況,不滿足是另一種情況序厉。
例如:
計(jì)算某一年是不是閏年:
import Foundation
print("請(qǐng)輸入一個(gè)年份锐膜,例如1982")
let year = inputInt()
//&&-短路與運(yùn)算(而且)
//||-短路或運(yùn)算(或者)
//四年1閏,百年不閏弛房,四百年又閏
if year % 4 == 0 && year % 100 != 0 || year % 400 == 0 {
print("\(year)年是閏年")
}
else {
print("\(year)年不是閏年")
}
進(jìn)化版:計(jì)算某年某月有多少天(注:代碼在最后)
提示:
1.要求用戶輸入年份道盏,月份
2.開始判斷,如果月份為1.3.5.7.8.10.12文捶,如果月份為4荷逞,6,9粹排,11
3.如果月份為2月种远,再判斷是平年還是閏年
4.輸出天數(shù)
計(jì)算個(gè)人所得稅,題目如下圖所示:
import Foundation
//計(jì)算實(shí)際資金
print("請(qǐng)輸入工資",terminator: "")
let salary = inputDouble()
print("請(qǐng)輸入五險(xiǎn)一金", terminator: "")
let insurance = inputDouble()
//定義diff判斷含稅級(jí)距
let diff = salary - insurance - 3500
//定義rate為稅率顽耳,稅率由于是小數(shù)坠敷,所以采用Double類型
let rate: Double
//定義deduction為速算扣除數(shù),因?yàn)槎惵适切?shù),為了后面方便計(jì)算射富,所以全部定義為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為個(gè)人所得稅
let tax = diff * rate - deduction
print("個(gè)人所得稅為:¥\(tax)元")
print("實(shí)際收入為:¥\(salary-insurance-tax)元")
使用switch計(jì)算判斷你的工資收入是什么級(jí)別的:
print("請(qǐng)輸入你的月薪", terminator:"")
//定義slary為你的年薪
let salary = inputInt() * 13
//如果年薪大于0膝迎,開始判斷
if salary >= 0{
switch salary {
case 0:print("你是一個(gè)無業(yè)游民")
//...兩邊為閉區(qū)間
case 1...30000:print("你是一個(gè)小碼畜")
case 30001...60000:print("你是一個(gè)碼奴")
case 60001...10000:print("你是一個(gè)大碼農(nóng)")
case 100001...200000:print("你是一個(gè)IT民工")
case 200001...500000:print("你是一優(yōu)秀的IT工程師")
//..<區(qū)間為左閉右開
case 500001..<10000000:print("你是一個(gè)IT精英")
case 10000000..<100000000:print("你是IT大哥")
default :print("你是IT領(lǐng)袖")
}
}
//如果你的工資為負(fù)數(shù)
else {
print("你是創(chuàng)業(yè)者")
}
6循環(huán)結(jié)構(gòu)
循環(huán)結(jié)構(gòu)分為三種循環(huán),當(dāng)型循環(huán)胰耗,直到型循環(huán)和for循環(huán)限次。下面演示用三種循環(huán)分別求1到100的和。
//求1到100的和方法1.for循環(huán)
var s = 0
//i的大小是從1到100遞加
for i in 1...100{
s += i
}
print("和是\(s)")
求1到100的和方法2.當(dāng)型循環(huán)
var i = 1
var s = 0
//當(dāng)x<=100時(shí)執(zhí)行循環(huán)
while i <= 100 {
s += i
i += 1
}
print("和為\(s)")
//求1到100的和方法3.直到循環(huán)(至少執(zhí)行1次)
var i = 1
var s = 0
repeat{
s += i
i += 1
}while i <= 100
print("和為\(s)")
進(jìn)階循環(huán)開始——————————————
1.找到1到100以內(nèi)所有的質(zhì)數(shù)
//定義一個(gè)新的算法isPrime(),它需要一個(gè)Int型的數(shù)n柴灯,輸出一個(gè)bool型的值
func isPrime(n:Int) -> Bool{
//定義一個(gè)變量i=2
var i = 2
//當(dāng)i<\sqrt{n}(注:可以極大提高運(yùn)行速度卖漫,在根號(hào)前的數(shù)如果沒有能整除的那么之后也就不會(huì)有了,數(shù)學(xué)優(yōu)化)
while i <= Int(sqrt(Double(n))) {
//如過有能被整出的弛槐,那么返回FALSE值
if n % i == 0 {
return false
//使循環(huán)提前結(jié)束
//break不夠好
}
//i自增
i += 1}
//否則返回true
return true
}
//n從1到100
for n in 1...100{
//這里面有一個(gè)簡寫就是isPrime(n)=true,默認(rèn)為true懊亡,所以省略
if isPrime(n){
//輸出所有返回值為true的n
print(n)
}
}
tips:在使用循環(huán)時(shí),窮舉法可以解決許多問題乎串,例如:
百錢百雞:有100塊店枣,公雞5塊一只速警,母雞3塊,小雞1塊3個(gè)鸯两,問要買100只雞有多少買法闷旧?
//百錢百雞
//GET:窮舉法
//最多買20只公雞
for x in 0...20 {
//最多買33只母雞
for y in 0...33 {
//最多買100只小雞
for z in 0...99{
//如果公雞加母雞加小雞等于100并且公雞錢加母雞錢加小雞錢為100并且小雞是3的倍數(shù)
if x+y+z == 100 && 5*x + 3*y + z/3 == 100 && z % 3 == 0{
//那么輸出所有滿足條件的結(jié)果
print("公雞\(x)只,母雞\(y)只,小雞\(z)只")
}
}
}
}
//2如果已知XY,則z=100-x-y(可以優(yōu)化程序)
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)只")
}
}
}
自行完成一個(gè)猜數(shù)字的游戲(注:代碼在最后)
tip:隨機(jī)生成一個(gè)100以內(nèi)的數(shù)(Int(arc4random_uniform(100)) + 1)
如果猜錯(cuò)钧唐,會(huì)提示猜大還是猜小了
用二分法最多7次猜出
7數(shù)組
數(shù)組相當(dāng)于一個(gè)容器忙灼,用來存儲(chǔ)其他東西。與數(shù)組類似的還有字典和集合钝侠。
數(shù)組的定義:
////放整數(shù)的數(shù)組该园,一般定義為變量進(jìn)行計(jì)算
//var ff:[Int]
////定義一個(gè)放整數(shù)的數(shù)組(6個(gè)元素,初始值為0)
//var f = [Int](count: 6, repeatedValue: 0)
////給數(shù)組1賦值100(數(shù)組的第一位為0)
//f[0] = 100
//數(shù)組
//1.創(chuàng)建數(shù)組
var array = [String] (arrayLiteral: "HELLO" ,"world")
var array2:[Int]=[]//創(chuàng)建數(shù)組的字面量語法(類型可以省略的)
var array3 = [1,2,23,5,4]
//創(chuàng)建數(shù)100位每個(gè)1
var array4 = [Int](count: 100, repeatedValue: 1)
var array5 = [String](arrayLiteral: "你好","世界")
//2.獲取數(shù)組元素的個(gè)數(shù)
print(array.count)
print( array2.count)
print(array3.count)
print(array4.count)
print(array5.count)
//3.數(shù)據(jù)的遍歷
for i in 0..<array3.count{
//[]是對(duì)數(shù)組進(jìn)行下標(biāo)運(yùn)算(算出指定位置的元素)
print(array3[i])
}
//3.1.只讀循環(huán)(不進(jìn)行修改)
for str in array5 {
print(str)
}
//3.2.修改數(shù)組
for i in 0..<array.count{
if i == 0{
array[i] = "你好"
}
}
//4.向數(shù)組中添加元素
array.append("i am")
array.append("coming")//依次插入
array.insert("my", atIndex: 1)//在第二個(gè)前面添加
print(array5)
//5.對(duì)數(shù)組刪除
//array.removeAll()//刪除所有
//array.removeAll(keepCapacity: true)//刪除所有但保留空間
//array.removeAtIndex(`)//刪除某一個(gè)
//array.removeFirst()//刪除第一個(gè)
//array.removeFirst(<#T##n: Int##Int#>)//刪除前n個(gè)
//array.removeLast()//刪除最后一個(gè)
//array.removeRange(2...3)//刪除一個(gè)區(qū)域
//6數(shù)組的復(fù)制
var array6 = array
array6[2] = "space"
print(array6)
let array7 = array6 + array5
print(array7)
//array6[2...4] = ["a","b"]//之后沒寫的自動(dòng)刪除
for (i,value) in array7.enumerate(){
print("\(i).\(value)")
}
數(shù)組的實(shí)例:
30個(gè)人圍成一圈報(bào)數(shù)帅韧,里初,15個(gè)基督徒,15個(gè)正常人忽舟。如果報(bào)道9就出去双妨,下一個(gè)人重新從1開始報(bào),以此類推最后全報(bào)完后15正常人全部出列叮阅,問他們是怎么站位的
//定義一個(gè)數(shù)組包含30人刁品,類型是BOOL型用來區(qū)分正常人和基督徒,展示先全部定位基督徒浩姥,即:true
var manArray = [Bool](count: 30, repeatedValue: true)
var counter = 0 //出列的數(shù)量
var num = 0 //報(bào)數(shù)
var index = 0 //數(shù)組的下標(biāo)
//當(dāng)出列人數(shù)小于15人時(shí)重復(fù)執(zhí)行
while counter < 15 {
//報(bào)數(shù)出列9挑随,如果人的下標(biāo)為TRUE,則開始循環(huán)
if manArray[index] {
//報(bào)數(shù)自增
num += 1
//直到報(bào)數(shù)為9
if num == 9 {
//那么把這個(gè)人標(biāo)記為FALSE即:正常人
manArray[index] = false
//并且出列人數(shù)加一
counter += 1
//并且報(bào)數(shù)重新開始
num = 0
}
}
//數(shù)組下標(biāo)自增,即:大家圍城圈報(bào)數(shù)
index+=1
//如果下標(biāo)等于最大人數(shù)及刻,即:報(bào)數(shù)報(bào)完一圈
if index == manArray.count{
//那么就從第一個(gè)人重新開始報(bào)
index = 0
}
}
//定義一個(gè)person獲取數(shù)組內(nèi)所有值
for person in manArray {
//如果值是true那么輸出基督徒否則輸出正常人
print(person ? "基":"非",terminator:"")
}
某年某月有多少天
print("請(qǐng)輸入年和月用空格隔開(例如:1980 2)")
let year = inputInt()
let mouth = inputInt()
let day :Int
//如果輸入的月份大于12或者小于1直接輸出時(shí)間錯(cuò)誤并退出
if mouth < 1 || mouth > 12 {
print("時(shí)間錯(cuò)誤")
exit(0)
}
//如果為月份為2月
else if mouth == 2 {
//雙條件使用三元運(yùn)算可以簡化代碼
//如果滿足閏年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)月有\(zhòng)(day)天")
猜數(shù)字的游戲
//定義一個(gè)100以內(nèi)隨機(jī)數(shù)為answer(由于隨機(jī)數(shù)每次只產(chǎn)生一個(gè),且不會(huì)改變骆莹,所以定義為常量)
let answer = Int(arc4random_uniform(100)) + 1
//定義一個(gè)整型變量為thyAnswer(thy=your颗搂,由于你的答案一直在變,所以為變量)
var thyAnswer:Int
//定義一個(gè)計(jì)數(shù)器幕垦,來計(jì)算你用多少猜對(duì)數(shù)
var counter = 0
repeat {
//計(jì)數(shù)器加一
counter += 1
//輸入你猜的數(shù)字
print("請(qǐng)輸入你猜的數(shù)字:", terminator:"")
thyAnswer = inputInt()
//判斷你的數(shù)和答案的大小
if thyAnswer > answer {
//如果大了提示小一點(diǎn)
print("小一點(diǎn)")
}else if thyAnswer < answer {
//如果小了提示大一點(diǎn)
print("大一點(diǎn)")
}else {
//否則就是猜對(duì)了
print("恭喜你猜對(duì)了丢氢,你總共猜了\(counter)")
}
}
//如果你的答案和標(biāo)準(zhǔn)答案不一樣,則一直循環(huán)
while thyAnswer != answer
if counter > 7{
//最后如果猜超過了7次先改,那么~~
print("你的智商該充值了")
}