13.3 Go章节练习题
练习1:定义1个整数,1个小数,访问变量,打印数值和类型,更改变量的数值,打印数值
练习2:同时定义3个整数,
练习3:同时定义3个字符串
练习4:定义变量后,没有初始值,直接访问变量?
练习5:尝试定义全局变量
练习6:常量组中定义常量,如果没有赋值和上一行一致,写法?
package main import "fmt" //全局变量,函数体外 var ( addr string score float64 ) func main() { //局部变量,简短声明赋值 i := 100 f := 99.9 fmt.Printf("类型:%T 值%v ", i, i) fmt.Printf("类型:%T 值%v ", f, f) //同时定义三个整数 n1, n2, n3 := 1, 2, 3 fmt.Println(n1, n2, n3) s1, s2, s3 := "断剑重铸之日", "骑士归来之时", "稳住我能carry" fmt.Println(s1, s2, s3) fmt.Println(s2) fmt.Println(s3) //定义变量,默认值,值类型可以修改,引用类型nil不得直接使用 var name string fmt.Println(name) var age int fmt.Println(age) var m map[string]string fmt.Println(m) //读取全局变量 addr = "昌平沙河" score = 99.99 fmt.Println(addr) fmt.Println(score) fmt.Println(".........我是分割线.......") //常量定义 const ( sunday = iota Monday Tuesday Wedensday = "星期三" Thursday = "星期四" Friday = iota Saturday ) fmt.Println(sunday) fmt.Println(Tuesday) fmt.Println(Friday) fmt.Println(Saturday) }
1.每种基本类型的变量,各声明5个变量,并打印变量的数值,以及类型。
2.声明几个常量。
3.交换2个变量的值。
4.定义一个四位数的整数,分别获取各个位数的值
5.让用户输入账号密码, 并且接受用户账号密码
package main import "fmt" func main() { s1 := "我是字符串" //string b1 := 'w' var b2 byte = 'w' //byte是uint8的别名 var b3 rune = '于' //rune是int32的别名,字符本质存的是字节码 f1 := 123.45 i1 := 12345678 b4 := true b5 := false fmt.Printf("%T %v ", s1, s1) fmt.Printf("%T %v %c ", b1, b1, b1) fmt.Printf("%T %v %c ", b2, b2, b2) fmt.Printf("%T %v %c ", b3, b3, b3) fmt.Printf("%T %v ", f1, f1) fmt.Printf("%T %v ", i1, i1) fmt.Printf("%T %v ", b4, b4) fmt.Printf("%T %v ", b5, b5) fmt.Println("-----分割线----") //定义赋值常量 const pi = 3.1415926 const ( Sunday = "星期天" Monday = 1 ) fmt.Println("-----分割线----") //交换变量的值 a := 3 b := 2 a, b = b, a fmt.Println(a) fmt.Println(b) fmt.Println("-----分割线----") //定义一个四位数的整数,分别获取各个位数的值 num1 := 1983 geWei := num1 % 10 shiWei := (num1 / 10) % 10 baiWei := (num1 / 100) % 10 qianWei := (num1 / 1000) % 10 fmt.Println(geWei) fmt.Println(shiWei) fmt.Println(baiWei) fmt.Println(qianWei) //键盘输入账号密码且打印 var username string var password string fmt.Print("输入账号:") fmt.Scan(&username) fmt.Print("输入密码:") fmt.Scan(&password) fmt.Printf("用户输入的账号%s,密码%s ", username, password) }
1.使用if语句完成:给定数字:如果为1,就输出星期一,如果为2,就输出星期二,以此类推,一直到7,输出星期日。如果是其他数字,就输出"错误信息"。
2.作业1改为switch方式
3.使用if语句完成:给定月份,输出该月属于哪个季节。3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬季
4.作业3改用switch方式
5.模拟登录,键盘上输入用户名和密码,如果用户名是admin密码是123,或者用户名是zhangsan密码是zhangsan123,都表示可以登录。否则打印登录失败
6.使用if语句完成:给定年龄,如果小于18岁,输出青少年,如果大于等于18并且小于30岁,输出青年,否则输出中老年。
7.用switch完成简单 "+-*/"计算器
8.随机猜数游戏
9.100以内,计算奇数和,偶数和
10.百钱买白鸡 百元百鸡,一百元钱买100只鸡,公鸡5元一只,母鸡3元一只,小鸡1元3个。
package main import ( "fmt" "math/rand" "time" ) func testIf() { var num int fmt.Println("请输入数字:1-4") fmt.Scan(&num) if num == 1 { fmt.Println("星期一") } else if num == 2 { fmt.Println("星期二") } else if num == 3 { fmt.Println("星期三") } else if num == 4 { fmt.Println("星期四") } else { fmt.Println("输入有误,重新输入") } } func testSwitch() { var num int fmt.Println("请输入数字:1-4") fmt.Scan(&num) switch num { case 1: fmt.Println("星期一") case 2: fmt.Println("星期二") case 3: fmt.Println("星期三") case 4: fmt.Println("星期四") default: fmt.Println("输入有误,重新输入") } } func testIf2() { var num int fmt.Println("请输入月份") fmt.Scan(&num) if num == 3 || num == 4 || num == 5 { fmt.Println("春天来了,又到了...") } else if num == 6 || num == 7 || num == 8 { fmt.Println("夏天到了,又可以....") } else if num == 9 || num == 10 || num == 11 { fmt.Println("秋天到了,适合休息,秋游") } else if num == 12 || num == 1 || num == 2 { fmt.Println("春天到了,万物冬眠") } else { fmt.Println("输入月份有误") } } func testSwitch2() { var num int fmt.Println("请输入月份") fmt.Scan(&num) switch num { case 3, 4, 5: fmt.Println("春困") case 6, 7, 8: fmt.Println("夏乏") case 9, 10, 11: fmt.Println("秋天适合郊游") case 12, 1, 2: fmt.Println("冬眠") default: fmt.Println("输入月份有误") } } func userPwd() { var username string var pwd string fmt.Println("请输入用户名:") fmt.Scan(&username) fmt.Println("请输入密码:") fmt.Scan(&pwd) if username == "oldboy" && pwd == "oldboy666" { fmt.Println("登录成功") } else { fmt.Println("登录失败") } } func ageTest() { var age int fmt.Println("请输入你的年纪:") fmt.Scan(&age) if age < 18 { fmt.Println("你好,小老弟") } else if age > 18 && age < 30 { fmt.Println("你好,青年") } else { fmt.Println("你个遭老头子,坏得很") } } func switchCalc() { var num1 int fmt.Print("输入num1:") fmt.Scan(&num1) var num2 int fmt.Print("输入num2:") fmt.Scan(&num2) var oper string fmt.Println("输入运算符:") fmt.Scan(&oper) switch oper { case "+": fmt.Println(num1 + num2) case "-": fmt.Println(num1 - num2) case "*": fmt.Println(num1 * num2) case "/": fmt.Println(num1 / num2) default: fmt.Println("运算符有误") } } func caishuzi() { /* 猜数游戏: step1:产生随机数 step2:循环猜数 */ //1.产生系统的随机数 rand.Seed(time.Now().UnixNano()) randNum := rand.Intn(50) //fmt.Println(randNum) num := 0 //2.猜,如果猜不对,一直循环 for i := 0; num != randNum; i++ { fmt.Printf("第%d次输入数字: ", i) fmt.Scan(&num) if num > randNum { fmt.Println("猜大了") } else if num < randNum { fmt.Println("猜小了") } else { fmt.Println("恭喜你,猜对了!!") } } } //100以内,计算奇数和,偶数和 func jiou() { //奇数 num := 0 num2 := 0 for i := 0; i < 100; i++ { if i%2 == 0 { num += i } if i%2 == 1 { num2 += i } } fmt.Println("100以内偶数和:", num) fmt.Println("100以内奇数和:", num2) } /* 百钱买白鸡 百元百鸡,一百元钱买100只鸡,公鸡5元一只,母鸡3元一只,小鸡1元3个。 100元,一共买100只鸡 公鸡可买数量范围 [0,20] 数量a 母鸡可买数量范围 [0,33] 数量b 最多买100只鸡,所以不可能全部买小鸡,300只超量了 小鸡可买数量范围[100-a-b] 去掉a,b的数量,就是剩下小鸡的数量 */ func ji() { for a := 0; a <= 20; a++ { //公鸡的数量 for b := 0; b <= 33; b++ { //母鸡的数量 c := 100 - a - b //小鸡的数量 //所有组合可能性如下 //fmt.Printf("公鸡数量%d 母鸡数量%d 小鸡数量%d ", a, b, c) //如果三只鸡的钱总数是100 并且 没有剩余的钱,组合就正确了 //公鸡价格5元一只,母鸡价格3元一只,小鸡数量3元一个,所以c/3等于价格 //并且小鸡数量取余3,没有余数,代表没有零钱 if a*5+b*3+c/3 == 100 && c%3 == 0 { fmt.Printf("百钱买白鸡:公鸡数量:%d ,母鸡数量:%d ,小鸡数量:%d ", a, b, c) } } } } func main() { ji() }
1.操场上有一群人,人数在100到200之间。三人一组多1人,四人一组多2人,五人一组多3人。问操场上共有多少人。
2.两个自然数x,y相除,商3余10,被除数,除数,商,余数的和是163,求被除数,除数
3.某数学竞赛中,参赛人数大约在380-450之间。比赛结果,全体考生的总平均分为76分,男生的平均分为75,女生的平均分为80.1,求男女生各有多少人。
4.给定一个数组,arr1 := [10] int{5,4,3,7,10,2,9,8,6,1},求数组中所有数据的总和。
5.二维数组的遍历
6.给定一个整型数组,长度为10。数字取自随机数。
package main import ( "fmt" "math/rand" "time" ) //操场人数 func playGround() { for i := 100; i <= 200; i++ { if i%3 == 1 && i%4 == 2 && i%5 == 3 { fmt.Println(i) } } } // func test1() { // 两个自然数x,y相除,商3余10,被除数,除数,商,余数的和是163,求被除数,除数 /* 思路: 自然数x,y加上商,余数总和是163 条件商3余数10,那么去掉这个数,x+y的总和是150 */ for x := 0; x < 150; x++ { //y的值 y := 150 - x if x/y == 3 && x%y == 10 { fmt.Printf("被除数%d 除数%d ", x, y) } } } func student() { //某数学竞赛中,参赛人数大约在380-450之间。比赛结果,全体考生的总平均分为76分,男生的平均分为75,女生的平均分为80.1,求男女生各有多少人。 /* 思路,人数一共380-450之间 i 求男生数量 x 女生数量 y 条件,全体人数平均分76,男生平均分75,女生平均分80.1 */ //嵌套循环计算 for i := 380; i < 450; i++ { for x := 0; x < i; x++ { y := i - x //计算人数 //总分数=男生分数+女生分数 if float64(i*76) == float64(x*75)+float64(y)*(80.1) { fmt.Printf("男生人数:%d 女生人数%d 总人数%d ", x, y, i) } } } } func test2() { //给定一个数组,arr1 := [10] int{5,4,3,7,10,2,9,8,6,1},求数组中所有数据的总和。 arr1 := [10]int{5, 4, 3, 7, 10, 2, 9, 8, 6, 1} num := 0 for _, v := range arr1 { num += v } fmt.Println("数组元素总和", num) } //二维数组 /* 二维数组:存储的是一维的一维 arr :=[3][4]int 该二维数组的长度,就是3。 存储的元素是一维数组,一维数组的元素是数值 */ func test3() { arr := [3][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}} //默认值 [[1 2 3 4] [0 0 0 0] [0 0 0 0]] fmt.Println(arr) //取出二维数组元素 for _, v1 := range arr { for _, v2 := range v1 { fmt.Println("二维数组中的元素:", v2) } } } //给定一个整型数组,长度为10。数字取自随机数。 func makeArray() { /* 给定一个整型数组,长度为10。数字取自随机数。 [1,10] */ //初始化数组 arr := [10]int{} fmt.Println(arr) //随机数种子 rand.Seed(time.Now().UnixNano()) //循环生成写入元素,正常写入 for i := 0; i < len(arr); i++ { x := 0 //验证:x是否已经存储过了 /* 循环验证x是否已经存储,如果已经有,再取随机数,再验证,直到不重复 */ //循环验证 for { //生成随机数 x = rand.Intn(10) + 1 // 8 flag := true //true:代表不重复值可以用,false代表值重复,不可以使用 //循环检测,次数依次少于元素个数 for j := 0; j < i; j++ { //如果x元素已经存在,结束循环 if x == arr[j] { flag = false break } } //如果为真,就停止死循环 if flag { //判断标记的值 break } } arr[i] = x } fmt.Println(arr) } func main() { makeArray() }
1.给定一个路径名: pathName:="http://192.168.15.33/static/aa.jpeg" 获取文件名称:aa.jpeg
2.给定一个以下字符串:统计大写字母的个数,小写字母的个数,非字母的个数。
str:="aekjffjkJDJ294384848DKFJFJkdjfhfh2943845593nfnJRIEIFJ"
package main import ( "fmt" "strings" ) /* 练习2:给定一个路径名: pathName:="http://192.168.10.1:8080/Day33_Servlet/aa.jpeg" 获取文件名称:aa.jpeg 给定一个以下字符串:统计大写字母的个数,小写字母的个数,非字母的个数。 str:="aekjffjkJDJ294384848DKFJFJkdjfhfh2943845593nfnJRIEIFJ" */ func main() { pathName := "http://192.168.10.1:8080/Day33_Servlet/aa.jpeg" //取出末尾元素方式一 //slistStr:=strings.Split(pathName,"/") //fmt.Println(slistStr[len(slistStr)-1:]) //方式二,找到/符号的索引,加一取出 fileName := pathName[strings.LastIndex(pathName, "/")+1:] fmt.Printf("%T %v ", fileName, fileName) //统计个数 str:="aekjffjkJDJ294384848DKFJFJkdjfhfh2943845593nfnJRIEIFJ" count1 := 0 count2 := 0 count3 := 0 for i := 0; i < len(str); i++ { if str[i] >= 'A' && str[i] <= 'Z' { count1++ } else if str[i] >= 'a' && str[i] <= 'z' { count2++ } else { count3++ } } fmt.Printf("大写字母:%d,小写字母:%d,非字母:%d ", count1, count2, count3) }
1.练习:递归算法求5的阶乘
2.练习:兔子生兔子:fibonacci数列:第1,2两项数值都为1,从第3项开始,是前两项之和。使用递归算法,求第12项的数值。
func getfactorial(n int)int{ if n== 1{ return 1 } return getfactorial(n-1) *n }
1.一条协程打印100数字,另一条协程打印100字母
package main import ( "fmt" "time" ) func printNum() { for i := 0; i < 100; i++ { fmt.Println("goroutine1 打印数字:", i) time.Sleep(1 * time.Second) } } func printChar() { for i := 0; i < 100; i++ { fmt.Printf("goroutine2 打印【字符】: %c ", i) time.Sleep(1 * time.Second) } } func main() { //如果不加go协程去运行,函数会等待运行 //加go 并发版运行,抢占式运行,每次结果都不一样 //可以设置睡眠时间,查看go协程是并发运行 go printChar() go printNum() time.Sleep(10 * time.Second) fmt.Println("main结束。。。") }
1.创建并启动一个子 goroutine,打印100个数字,要保证在main goroutine结束前结束。(使用管道)
package main import ( "fmt" "time" ) //利用chan阻塞的特性,延迟main进程结束 func printNum(ch1 chan bool) { for i := 1; i <= 100; i++ { fmt.Println(i) time.Sleep(10 * time.Millisecond) } ch1 <- true //写入一个标志位,true } func main() { //练习1:创建并启动一个子 goroutine,打印100个数字,要保证在main goroutine结束前结束。 ch1 := make(chan bool) printNum(ch1) <-ch1 //读取管道数据,如果没读到数据,会一直阻塞,延迟main进程结束 }
1.通道channel的用法例题
package main import ( "fmt" "time" ) func main() { //go的ok语法 ch1 := make(chan int) go sendData(ch1) //channel关闭后不得再写入,可以读取 //channel如果没关闭,且没有数据,再读取channel会pannic //读取数据 for { time.Sleep(1*time.Second)//每秒读一次 data,ok:=<-ch1//返回值data,与ok布尔值 if !ok{ fmt.Println("数据读取完毕,通道已经关闭",ok) break } fmt.Printf("已读取到数据【%d】%v ",data,ok) } } func sendData(ch1 chan int) { for i := 1; i < 10; i++ { ch1 <- i //向通道写入数据 } fmt.Println("数据写入完毕") close(ch1)//关闭管道,接收方已经无法取数据 }