所有字体里面显示字体类型都是英文怎么办(英文字体常见字体)
589
2022-05-29
这些年我学过各种编程语言,从最早的C语言到C++,再到C#、PHP、JAVA,再到IOS开发、Python,到最新的GO语言,学得是真的杂。有时候觉得编程语言恰恰是最简单的,而通过一门编程语言能够解决实际问题或深入底层才是其价值所在,并且当我们学好一门编程语言后,其他编程语言都非常类似,殊途同归,学起来也很迅速。
源码-:
https://github.com/eastmountyxz/Go-learning
前文参考:
[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及
[GO语言基础] 二.编译运行、语法规范、注释转义及API标准库知识普及
[GO语言基础] 三.变量声明、数据类型、标识符及编程练习12题
[GO语言基础] 四.算术运算、逻辑运算、赋值运算、位运算及编程练习
[GO语言基础] 五.顺序控制语句和条件控制语句(if、else、switch)
[GO语言基础] 六.循环控制语句、流程控制及编程练习(for、break、continue、goto)
文章目录
一.for循环控制
1.基本语法
2.for-range循环
3.for编程经典案例
4.类似while和do-while循环
二.多重循环控制
案例1:循环计算平均成绩
案例2:循环打印金字塔和倒三角
三.跳转控制语句
1.break
2.continue
四.goto语句
五.跳转控制语句return
六.Golang编程练习
1.题目
2.解答
七.总结
一.for循环控制
1.基本语法
for循环的语法格式:
for 循环变量初始化; 循环条件; 循环变量迭代 { 循环操作语句 }
for循环主要有四要素,包括:
循环变量初始化
循环条件
循环操作(语句),也叫循环体
循环变量迭代
for循环语句基本流程如下:
for循环的执行顺序说明如下:
执行循环变量初始化,比如 n := 1
执行循环条件,比如 n <= 10
如果循环条件为真,就执行循环操作
执行循环变量迭代,比如i++
反复执行上述三个步骤,直到循环条件为False,就退出for循环
下面举个简单的例子:
package main import "fmt" func main() { //for循环 for n := 1; n <= 10; n++ { fmt.Println("Eastmount", n) } }
输出结果如下图所示:
for的第二种语法格式:
for循环条件是返回一个布尔值的表达式,第二种方式是将变量初始化和变量迭代写到其他位置。
for 循环判断条件 { //循环执行语句 }
案例如下所示:
for的第三种语法格式:
下面的写法等价于 for; ; {} ,它是一个无限循环,通常需要配合break语句使用。
for { //循环执行语句 }
案例如下所示:
2.for-range循环
Go语言中range关键字用于for循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回key-value对。数组后续文章介绍,这里主要介绍遍历字符串。
使用for-range实现字符串遍历
具体案例如下所示:
package main import "fmt" func main() { //1.for-range遍历字符串 str := "Eastmount CSDN" for index, val := range str { fmt.Printf("index=%d, value=%c \n", index, val) } //2.for-range遍历数组 nums := []int{2, 3, 4} for i, num := range nums { fmt.Printf("index=%d, value=%d \n", i, num) } }
输出结果如下图所示:
如果我们的字符串含有中文,那么传统的遍历字符串方式就会错误,会出现乱码。原因是传统对字符串的遍历是按照字节来遍历,而一个汉字在utf8编码对应3个字节。 如何解决呢?需要将str转换成[]rune切片即可。
rune
golang中string底层是通过byte数组实现的。中文字符在unicode下占2个字节,在utf-8编码下占3个字节,而golang默认编码正好是utf-8。rune 等同于int32,常用来处理unicode或utf-8字符。
下面展示具体的代码。
package main import "fmt" func main() { //1.字符串遍历-传统方法 str := "CSDN!秀璋" str2 := []rune(str) //将str转换成[]rune for i := 0; i < len(str2); i++ { fmt.Printf("index=%d, value=%c \n", i, str2[i]) } fmt.Println("") //2.字符串遍历-for range for index, val := range str { fmt.Printf("index=%d, value=%c \n", index, val) } fmt.Println("") //3.如果不转rune直接遍历(乱码) for i := 0; i < len(str); i++ { fmt.Printf("index=%d, value=%c \n", i, str[i]) } }
输出结果如下图所示,前面两种方式正确(按字节遍历),第三种方式会出现乱码。
3.for编程经典案例
下面介绍各编程语言中循环都会出现的案例,计算1到100的个数及总和。
package main import "fmt" func main() { var result = 0 var num = 0 for i := 1; i <= 100; i++ { result += i num++ } fmt.Println("1+2+...+100 =", result) fmt.Println("个数 =", num) }
输出结果如下图所示:
流程图如下图所示:
4.类似while和do-while循环
由于Golang只有for循环,没有while关键字和do-while语法,所以只能通过for循环来模拟while和do-while循环,即使用for+break实现。
(1) while循环
for循环模拟while循环的核心代码如下图所示,需要注意:
for循环是一个无限循环
break语句是跳出for循环
类似于Java或C语言的while循环语句:
int i = 0; while(i<10){ // notice there is only < do something }
案例如下,使用while输出10句“hello world”。
package main import "fmt" func main() { //类似while循环 var i int = 1 for { //循环条件 if i > 10 { break //结束循环 } fmt.Println("hello world", i) i++ } }
输出结果如下图所示:
(2) do-while循环
由于do-while是先执行后判断,所以for循环模拟do-while循环的核心代码如下图所示:
需要注意:
由于do-while是先执行后判断,因此至少执行一次
当循环条件成立后,就会执行break跳出for循环
package main import "fmt" func main() { //使用do-while实现输出10句"hello world" var j int = 1 for { //先执行后判断 fmt.Println("hello world", j) j++ if j > 10 { break //结束循环 } } }
二.多重循环控制
具体含义为:
将一个循环放在另一个循环体内,就形成了嵌套循环。在外边的for称为外层循环,在里面的for循环称为内层循环。建议一般使用两层,最多不要超过3层。
实质上,嵌套循环就是把内层循环当成外层循环的循环体,当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可以结束外层的当次循环,开始下一次循环。
设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次。
下面通过案例进行多重循环理解,这也是循环的一个难点和重点。正如韩老师所说,编程过程中遇到困难是很常见的,我们需要注意:
先易后难,将一个复杂的问题分解成简单的问题。
先死后活,将代码写死板慢慢转变为灵活。
学会解决,遇到困难要学会利用搜索引擎或论坛独立解决。
案例1:循环计算平均成绩
题目:统计3个班成绩情况,每个班有4名同学,求出各个班的平均分和所有班级的平均分。学生的成绩从键盘输入。
解题思路
首先学会统计1个班的成绩情况,求出该班的平均分,该班为4位同学;然后考虑通过循环计算3个班的情况。
package main import "fmt" func main() { //求出各个班的平均分和所有班级的平均分(3个班 每个班有4名同学) //解题:外层循环班级数 内存循环计算每个班级平均成绩 var totalsum float64 = 0.0 for j := 1; j <= 3; j++ { var sum float64 = 0.0 for i := 1; i <= 4; i++ { var score float64 fmt.Printf("请输入第%d班 第%d个学生的成绩 \n", j, i) fmt.Scanln(&score) //累计总分 sum += score } fmt.Printf("第%d个班级的平均分是%v \n", j, sum / 4) //计算各个班的总结成绩 totalsum += sum } fmt.Printf("各个班级的总成绩是%v 平均分是%v \n", totalsum, totalsum / (4* 3)) }
输出结果如下图所示:
同时,为了更灵活的编写代码,我们可以尝试将循环控制常量3个班和4位同学修改为变量,具体如下:
var classNum int = 3
var stuNum int = 4
package main import "fmt" func main() { //求出各个班的平均分和所有班级的平均分(3个班 每个班有4名同学) //解题:外层循环班级数 内存循环计算每个班级平均成绩 var classNum int = 3 var stuNum int = 4 var totalsum float64 = 0.0 for j := 1; j <= classNum; j++ { var sum float64 = 0.0 for i := 1; i <= stuNum; i++ { var score float64 fmt.Printf("请输入第%d班 第%d个学生的成绩 \n", j, i) fmt.Scanln(&score) //累计总分 sum += score } //注意golang数据类型需要转换一致才能运算 int->float64 fmt.Printf("第%d个班级的平均分是%v \n", j, sum / float64(stuNum)) //计算各个班的总结成绩 totalsum += sum } result := totalsum / float64(stuNum * classNum) fmt.Printf("各个班级的总成绩是%v 平均分是%v \n", totalsum, result) }
如果需要继续统计各班及格人数,怎么实现呢?
通过if判断语句进行比较即可
案例2:循环打印金字塔和倒三角
打印金字塔是经典的案例,在前面的第二篇文章也布置过。下面我们通过for循环打印各种金字塔,思路为:
两层循环,一个控制金字塔层数,一个控制每一层的输出
打印图形通常由字符和空格组成,寻找对应的规律
由简至繁,比如先打印矩形,再尝试半个三角形金字塔,再打印完整金字塔
首先介绍打印矩形和半个三角形金字塔代码。
package main import "fmt" func main() { var totalLevel int = 5 //1.打印矩形 for i := 1; i <= totalLevel; i++ { //i表示层数 for j := 1; j <= totalLevel; j++ { //每层输出 fmt.Print("*") } fmt.Println() //换行 } fmt.Println() //2.打印正三角半个金字塔 for i := 1; i <= totalLevel; i++ { //i表示层数 for j := 1; j <= i; j++ { //每层输出 fmt.Print("*") } fmt.Println() //换行 } fmt.Println() //3.打印倒三角半个金字塔 for i := 1; i <= totalLevel; i++ { //i表示层数 for j := (totalLevel - i); j >= 0; j-- { //每层输出 fmt.Print("*") } fmt.Println() //换行 } }
输出结果如下图所示:
理解上述代码之后,我们再打印金字塔,其规律为:
空格 + * + 空格 * 1层 1个* 规律: 2*层数-1 空格 4个 规律:总层数-当前层数 *** 2层 3个* 规律: 2*层数-1 空格 3个 规律:总层数-当前层数 ***** ******* *********
完整代码如下,包括实心金字塔和空心金字塔。
package main import "fmt" func main() { /* 打印金字塔 * 1层 1个* 规律: 2*层数-1 空格 4个 规律:总层数-当前层数 *** 2层 3个* 规律: 2*层数-1 空格 3个 规律:总层数-当前层数 ***** ******* ********* */ var totalLevel int = 5 //方法一 打印实心金字塔 for i := 1; i <= totalLevel; i++ { //i表示层数 //先打印空格 for j := (totalLevel - i); j >= 0; j-- { fmt.Print(" ") } //打印星号 for k := (2 * i - 1); k > 0; k-- { fmt.Print("*") } fmt.Println() //换行 } fmt.Println() //方法二 打印空心金字塔 for i := 1; i <= totalLevel; i++ { //i表示层数 //先打印空格 for j := 1; j <= (totalLevel - i); j++ { fmt.Print(" ") } //打印星号 for k := 1; k <= (2 * i - 1); k++ { //每层第一个和最后一个打印* 最底层全部打印* if k == 1 || k == (2 * i - 1) || i == totalLevel { fmt.Print("*") } else { fmt.Print(" ") } } fmt.Println() //换行 } }
输出结果如下图所示:
三.跳转控制语句
1.break
break语句用于终止某个语句块的执行,用于中断当前for循环或跳出switch语句。基本语法如下:
{ .... break .... }
其示意图如下图所示(引用至韩老师)。
首先结合之前1+2+…+100介绍一个简单案例,求出当和第一次大于20的当前数字。
package main import "fmt" func main() { //求出当和第一次大于20的当前数字 sum := 0 for i := 1; i <= 100; i++ { sum += i //求和 if sum > 20 { fmt.Println("sum大于20时当前数字是", i) break //跳出循环 } } }
输出结果如下图所示:
break语句的注意事项:
break语句出现在多层嵌套的语句块中,可以通过标签指明要终止的是哪一层语句块。
break默认会跳出最近的for循环
break后面可以指定标签,跳出标签对应的for循环
通过标签跳出for循环指定层的代码如下所示:
package main import "fmt" func main() { //通过标签跳出for循环指定层 label1: for i := 0; i < 4; i++ { //label2: for j := 0; j < 10; j++ { if j ==2 { //默认跳出最近的循环 这里尝试跳出外层循环 break label1 } fmt.Println("j =", j, "i =", i) } } }
运行结果如下,当j等于2时跳出所有循环,即调转至label1。:
2.continue
continue语句用于结束本次循环,它将继续执行下一次循环。其基本语法如下:
{ ... continue ... }
流程图如下所示,它将结束本次循环,继续迭代执行下一次循环。
同样,continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环,这个和前面的break标签使用规则一样。
举个简单案例:
package main import "fmt" func main() { //continue跳出当前循环 for i := 0; i < 4; i++ { for j := 0; j < 10; j++ { if j ==2 { continue } fmt.Println("j =", j, "i =", i) } } }
输出结果如下图所示,每次都没有输出j=2。
如果我们需要使用continue打印100以内的奇数,则可以编写如下代码:
四.goto语句
Golang中的goto语句可以无条件转移到程序中指定的行,goto常与条件语句配合使用,用以实现条件转移或跳出循环体。注意,在GO程序设计中一般不主张使用goto语句,以避免造成流程的混乱,使理解和调试程序都产生困难,同样C语言也不主张使用。
goto label .... label: statement
其执行流程如下图所示:
下面介绍一个简单的案例:
package main import "fmt" func main() { //goto语句 fmt.Println("aaaaa") var n int = 30 if n > 20 { goto label } fmt.Println("bbbbb") fmt.Println("ccccc") label: fmt.Println("ddddd") fmt.Println("eeeee") fmt.Println("fffff") }
输出结果如下图所示:
五.跳转控制语句return
return使用在方法或函数中,表示跳出所在的方法或函数。在分享函数的时候,我会详细介绍。
return使用说明:
如果return是在普通的函数,则表示跳出该函数,即不再执行函数中return后面代码,也可以理解成终止函数。
如果return是在main函数,表示终止main函数,也就是终止程序。
package main import "fmt" func main() { //return语句 for i := 1; i<=10; i++ { if i==3 { return } fmt.Println("输出结果", i) } fmt.Println("over") }
输出结果如下图所示:
六.Golang编程练习
1.题目
(1) 打印1到100之间所有是9倍数的整数的个数及总和。
(2) 循环依次输出“East 秀璋”字符串的所有字符。
(3) 打印9*9乘法表。
(4) 模拟网站登录验证机制.假设有3次机会,如果用户名为“Eastmount”,密码为“666666”提示登录成功,否则提示剩余机会;最终超过3次则提示“输入错误次数过多,无法登录”。
(5) 随机生成1到100的一个数,如果生成99这个数就停止,计算一共使用多少次。
(6) 输入如下4*5的矩阵。
1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20
(7) 利用循环求Fibonacci数列的前10个数。
(8) 求2到200间的全部素数。
2.解答
(1) 打印1到100之间所有是9倍数的整数的个数及总和。
代码如下:
package main import "fmt" func main() { var max int = 100 var count int = 0 var sum int = 0 for i := 1; i <= max; i++ { if i % 9 == 0 { count++ sum += i } } fmt.Printf("count=%v sum=%v \n", count, sum) }
输出结果如下图所示:
(2) 循环依次输出“East 秀璋”字符串的所有字符。
在数组上使用range将传入index和值两个变量。如果我们不需要使用该元素的序号,则使用空白符"_"省略。
package main import "fmt" func main() { str := "East=秀璋" //方法1 fmt.Printf("utf-8遍历字符串\n") for _, s := range str { fmt.Printf("utf-8遍历: %c %v \n", s, s) } fmt.Println("") //方法2 str2 := []rune(str) for i := 0; i < len(str2); i++ { fmt.Printf("utf-8遍历: index=%d, value=%c \n", i, str2[i]) } fmt.Println("") //方法3 乱码 fmt.Printf("unicode遍历字符串\n") for i := 0; i < len(str); i++ { ch := str[i] fmt.Printf("unicode遍历: %c %d\n", ch, ch) } }
输出结果如下图所示:
(3) 打印9*9乘法表。
代码如下:
package main import "fmt" func main() { //9*9乘法表 var num int = 9 for i := 1; i <= num; i++ { for j := 1; j <= i; j++ { fmt.Printf("%v*%v=%v \t", j, i, j*i) } fmt.Println() } }
输出结果如下图所示:
(4) 模拟网站登录验证机制.假设有3次机会,如果用户名为“Eastmount”,密码为“666666”提示登录成功,否则提示剩余机会;最终超过3次则提示“输入错误次数过多,无法登录”。
代码如下:
package main import "fmt" func main() { //模拟网站登录 var name string var pwd string var loginChance = 3 for i := 1; i <= 3; i++ { //输入信息 fmt.Println("请输入用户名") fmt.Scanln(&name) fmt.Println("请输入密码") fmt.Scanln(&pwd) if name == "Eastmount" && pwd == "666666" { fmt.Println("恭喜你登录成功") break } else { loginChance-- fmt.Printf("输入错误,你还有%v次机会\n", loginChance) } } if loginChance <= 0 { fmt.Println("输入错误次数过多,无法登录") } }
输出结果如下图所示:
(5) 随机生成1到100的一个数,如果生成99这个数就停止,计算一共使用多少次。
提示:该题目无限循环模拟break语句,通过rand.Seed()随机生成数字,然后进行判断
package main import ( "fmt" "math/rand" "time" ) func main() { //随机生成1到100的一个数,如果生成99这个数就停止 var count int = 0 for { //种子生成 使用系统时间的不确定性来进行初始化 rand.Seed(time.Now().UnixNano()) num := rand.Intn(100) + 1 fmt.Println("num =", num) count++ if (num == 99) { break } } fmt.Println("生成随机数99共使用次数 =", count) }
输出结果如下图所示:
(6) 输入如下4*5的矩阵。
代码如下:
package main import "fmt" func main() { var n int = 4 var m int = 5 var res int = 0 for i := 1; i <= n; i++ { for j := 1; j <= m; j++ { fmt.Printf("%v\t", i*j) res++ } fmt.Println("") } }
输出结果如下图所示:
(7) 利用循环求Fibonacci数列的前10个数。
该函数的特点是第1、2两个数为1,从第3个数开始为前两个数的和。
解题思路对应的流程如下图所示:
package main import "fmt" func main() { //Fibonacci数列 var f1 int = 1 var f2 int = 1 var f3 int fmt.Printf("%v\n%v\n", f1, f2) for i := 1; i <= 10; i++ { f3 = f1 + f2 fmt.Printf("%v\n", f3) f1 = f2 f2 = f3 } }
输出结果如下图所示:
(8) 求2到200间的全部素数。
解题思路:输入n,如果n不能被用2到sqrt(n)或2到n/2间的任一整数整除,则是素数。当然,2到(n-1)整除是最原始的方法。对应的算法流程如下:
代码如下:
package main import "fmt" func main() { //求2到200间的全部素数 var n int var k int var i int var m int = 0 for n = 2; n <= 200; n++ { k = n / 2 //如果n被i整除终止内循环 for i = 2; i <= k; i++ { if n % i == 0 { break } } //如果i>k+1表示n未被整除 if i >= k + 1 { fmt.Printf("%d\t", n) //m控制换行 输出10个素数换行 m = m + 1 if m % 10 == 0 { fmt.Println() } } } }
运行结果如下图所示:
七.总结
写到这里,这篇基础性Golang文章介绍完毕,希望您喜欢!祝大家新年快乐,牛气冲天,也希望自己能分享更优秀、更深入的文章。
一.for循环控制
1.基本语法
2.for-range循环
3.for编程经典案例
4.类似while和do-while循环
二.多重循环控制
案例1:循环计算平均成绩
案例2:循环打印金字塔和倒三角
三.跳转控制语句
1.break
2.continue
四.goto语句
五.跳转控制语句return
六.Golang编程练习
1.题目
2.解答
Go基本运算和进制转换了解后,后面的文章将详细介绍Go语言的条件语句和循环语句知识,并结合案例进行普及。希望这篇基础性文章对您有帮助,写得不好的地方还请海涵。同时非常感谢参考文献中的大佬们的文章分享,尤其是韩顺平老师,深知自己很菜,得努力前行。也希望自己能深入下去,未来四年好好研究Go编程语言,做更多实际工程,写更好的文章,共勉!
源代码-:
https://github.com/eastmountyxz/Go-learning
感谢华为云的礼物,希望能与大家一起在华为云社区共同进步,且看且珍惜。
原文地址:https://blog.csdn.net/Eastmount/article/details/113826055
(By:娜璋AI之家 Eastmount 2021-08-10 星期二 夜于贵阳 )
参考文献:
Go官网:https://golang.org/
韩老师视频:https://www.bilibili.com/video/BV1pt41127FZ
https://www.runoob.com/go/go-tutorial.html
Go中文网在线标准库文档:https://studygolang.com/pkgdoc
《C程序设计》谭浩强老师
《GO高级编程》
https://www.runoob.com/go/go-range.html
Go
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。