Go语言基础练习题系列2
1、练习1
生成一个随机数,让一个用户去猜这个数是多少?
代码示例如下:
package main import (
"fmt"
"math/rand" //math包中的rand函数可以用来生成随机数
"time"
) func main() {
var number int
/*
for i := 0;i < 10; i++ {
number = rand.Intn(100)
fmt.Printf("number:%d\n",number)
}
因为伪随机的存在,rand生成的随机数都有一个固定的序列,比如第一次生成1,第二次生成20等等,随机数的序列是固定,我们可以通过给其一个随机的总值,如果随机的总值不一样,那么伪随机数的序列也不一样。我们不给,他就是按照一个默认的随机总值,所以伪随机数序列永远是一样的。
*/
rand.Seed(time.Now().UnixNano()) //通过rand函数的Seed方法,来设置总值,这里我们以当前时间来设置总值,并且用的纳秒,十分精确了
number = rand.Intn() //随机数的范围是0-100,但不包括100
fmt.Printf("请猜一个数字,数字的范围是:[0-100)\n")
for { //因为并不知道用户什么时候输入正确,所以是没有限制条件的,我们只能做一个死循环,配合switch语句满足条件了即可退出;
var input int
fmt.Scanf("%d\n", &input) //Scanf表示让用户输入,Scanf从终端读取一个整数,并传值给input变量,&表示获取到该变量内存地址
var flag bool = false //通过设置flag变量,解决的是用户输入正确后可以退出
switch {
case number > input:
fmt.Printf("您输入的数字太小\n")
case number == input:
fmt.Printf("恭喜您,答对了!\n")
flag = true
case number < input:
fmt.Printf("您输入的数字太大\n")
}
if flag { //表示如果flag为真,则break退出这个for循环
break
}
}
}
执行结果如下:
补充:
Scanf那里一定要加上\n,因为加上的话就已经表示以回车换行符为止,这样就已经保证了能够获取到用户输入的真正的数字,你如果不加\n,他就不行了,就会识别2次一个是你输入的数字,一个是回车。
2、练习2
题目:求数组所有元素之和
方法1:(基础版)
package main import (
"fmt"
) func main() {
a := []int{, , }
sum :=
for i := ; i < len(a); i++ {
sum += a[i]
}
fmt.Println(sum)
}
执行结果如下:
方法2:(高阶)
package main import (
"fmt"
"math/rand"
"time"
) func main() {
var arr []int
rand.Seed(time.Now().UnixNano()) //通过rand函数的Seed方法,来设定随机数总值
for i := ; i < len(arr); i++ {
arr[i] = rand.Intn() //数组取值为随机数,随机数范围为[1-10000)
} var sum int
for i := ; i < len(arr); i++ {
sum = sum + arr[i]
}
fmt.Println("sum", sum)
}
执行结果如下:
3、练习3
题目:找出数组中和为给定值的两个元素的下标,比如数组:[1,3,5,8,7],找出两个元素之和等于8的下标分别是(0, 4)和(1,2)。
package main import (
"fmt"
) func main() {
var arr []int
for i := ; i < len(arr); i++ {
arr[i] = i //数组初始化从0-9(因为是试题所以这里为了方便索引和元素值都是0-9)
} var sum int = //求两个元素之和为12的所有数组下标
for i := ; i < len(arr); i++ { //思路就是i=0 和1-9的下标加一遍,和为12即满足条件,其余下标也同理,这里写2个for循环即可
for j := i + ; j < len(arr); j++ {
if arr[i]+arr[j] == sum { //如果元素和为12则打印
fmt.Printf("i=%d j=%d\n", i, j)
}
}
}
}
执行结果如下:
4、练习4
题目:下列程序输出什么?
package main import (
"fmt"
) func main() {
var sa = make([]string, , )
for i := ; i < ; i++ {
sa = append(sa, fmt.Sprintf("%v", i))
}
fmt.Println(sa)
}
答:输出结果如下:
解释:
sa切片在初始化时长度就是5了,因为类型为string,所以为默认值,也就是sa前五个元素是5个空字符串。
5、练习5
题目:使用golang标准包 “sort”对数组进行排序
代码示例如下:
package main import (
"fmt"
"math/rand"
"sort"
) func main() {
var arr []int //使用一个随机的初始化数组
for i := ; i < len(arr); i++ {
arr[i] = rand.Intn()
}
fmt.Printf("arr:%v\n", arr) //排序前
sort.Ints(arr[:]) //Ints是升序 fmt.Printf("arr:%v\n", arr) //排序后
}
执行结果如下:
补充:
sort包中的Ints方法为什么只能传入切片呢?
因为:1、数组长度是固定的,如果传入的数组大于sort这里规定的数组长度,那就传不进去了,所以必须用切片;2、数组是值类型,传进去相当于拷贝一份,排序相当于对拷贝的副本进行排序,外面还是不会排序,所以一定要传一个切片进去;
6、练习6
题目:
实现一个密码生成工具,支持以下功能:
a) 用户可以通过-l指定生成密码的长度
b) 用户可以通过-t指定生成密码的字符集,比如-t num生成全数字的密码
-t char 生成包含全英文字符的密码, -t mix包含生成数字和英文的密码,
-t advance 生成包含数字、英文以及特殊字符的密码
提示:可以用标准包 “flag”解析命令行参数
思路:
1.先解析命令行参数;
2.定义变量接收用户选择;
3.生成随机密码for循环
代码示例如下:
package main import (
"flag"
"fmt"
"math/rand"
"time"
) var (
numCharset = ""
strCharset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
mixCharset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
advanceCharset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~!@#$%^&*()-_+=|?"
) func main() {
var length int //定义一个密码长度的变量
var charset string //定义一个密码字符集的变量
flag.IntVar(&length, "l", , "-l the length of passwd") //因为int是值类型,所以终端输入传参必须要用&取地址,
//IntVar参数依次是:传入值-终端参数-默认值-用法
flag.StringVar(&charset, "t", "harden", "-t the charset of password")
//StringVar参数依次是:传入值-终端参数-默认值-用法
flag.Parse() //真正解析命令行参数,IntVar、StringVar只是设置命令行需要的一些参数 //判断用户输入的到底是什么?switch和if else都可以
var userCharset string //定义一个变量来接收用户选择
switch charset {
case "num":
userCharset = numCharset
case "char":
userCharset = strCharset
case "mix":
userCharset = mixCharset
case "advance":
userCharset = advanceCharset
default:
userCharset = mixCharset
} //字符集功能编写完毕 //下面写生成随机密码最终部分
var password []byte
rand.Seed(time.Now().UnixNano()) //设置随机总值,这样就避免了随机密码重复
for i := ; i < length; i++ { //想要几位密码就循环几次
index := rand.Intn(len(userCharset)) //生成随机下标
char := userCharset[index] //现在是字符,最终要存到一个字符串中
password = append(password, char) //字符串中的字符是不能修改的,想要修改,需要将其放入切片,所以将一个个字符放入到切片中,切片是可以修改的 }
strPassword := string(password) //将字符切片强制转换成字符串
fmt.Printf("%s\n", strPassword)
}
执行结果如下:
7、补充练习
打印出英文字母a-z;
思路:因为字母在底层存储都是assci码,所以我们借助这点来进行打印。大写的直接换成大写即可
代码示例如下:
package main import (
"fmt"
) func main() {
start := 'a'
for i := ; i < ; i++ {
fmt.Printf("%c", start)
start +=
}
}
执行结果如下:
Go语言基础练习题系列2的更多相关文章
- Go语言基础练习题系列1
1.练习1 题目:使用fmt分别打印字符串.二进制.十进制.十六进制.浮点数. package main import ( "fmt" ) func main() { var a ...
- 带你学够浪:Go语言基础系列-环境配置和 Hello world
文章每周持续更新,原创不易,「三连」让更多人看到是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 前面几周陆陆续续写了一些后端技术的文章,包括数据库.微 ...
- 【GoLang】GO语言系列--002.GO语言基础
002.GO语言基础 1 参考资料 1.1 http://www.cnblogs.com/vimsk/archive/2012/11/03/2736179.html 1.2 https://githu ...
- Golang 入门系列(三)Go语言基础知识汇总
前面已经了 Go 环境的配置和初学Go时,容易遇到的坑,大家可以请查看前面的文章 https://www.cnblogs.com/zhangweizhong/category/1275863.html ...
- C#语言基础
第一部分 了解C# C#是微软公司在2000年7月发布的一种全新且简单.安全.面向对象的程序设计语言,是专门为.NET的应用而开发的.体现了当今最新的程序设计技术的功能和精华..NET框架为C#提供了 ...
- 黑马程序员_ C语言基础(二)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 概览 今天基础知识分为以下几点内容(注意:循环.条件语句在此不再赘述): 1.Hello W ...
- 基础知识系列☞Abstract和Virtual→及相关知识
转载地址→http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的 ...
- Object Pascal 语言基础
Delphi 是以Object Pascal 语言为基础的可视化开发工具,所以要学好Delphi,首先要掌握的就是Object Pascal 语言.Object Pascal语言是Pascal之父在1 ...
- C语言基础(转载自大海笔记)
# C语言基础2015年03月26日10:04:411. 语言排行榜C——java——objective-C2. 进制:进制:进位机制.用普通的话讲,应该为人为的定义一种度量来标识一样东西 ...
随机推荐
- 利用powerdesigner创建表模型后导出sql语句方法,以及报错 Generation aborted due to errors detected during the verification of the model.的解决办法
今天用powerdesigner建了表模型,下面先说一下导出sql语句的步骤. 1.选项 2. 然后就报错了,下面说解决办法,很简单. 你没看错,把模型检查的√去掉就行了~~ 导出表名不带双引号的设置 ...
- SQL查询语句 [2]
一.快捷查询 快捷查询方式是一种多字段查询的简化写法,在多个字段之间用'|'隔开表示OR,用'&'隔开表示 AND. 1.不同字段相同查询条件 在 Home/controller/UserC ...
- ==, equals, hashcode的理解
一.java对象的比较 等号(==): 对比对象实例的内存地址(也即对象实例的ID),来判断是否是同一对象实例:又可以说是判断对象实例是否物理相等: equals(): 对比两个对象实例是否相等. 当 ...
- Mysql GROUP_CONCAT 使用注意事项
GROUP_CONCAT 函数返回一个字符串结果,该结果由分组中的值连接组合而成,常和 GROUP BY 连用. 如果需要自定义分隔符可以使用 SEPARATOR. 示例: SELECT GROUP_ ...
- 高性能MySQL笔记-第5章Indexing for High Performance-001B-Tree indexes(B+Tree)
一. 1.什么是B-Tree indexes? The general idea of a B-Tree is that all the values are stored in order, and ...
- Mat的迭代器使用
如果你熟悉 C++的 STL 库,那一定了解迭代器(iterator)的使用.迭代器可以方便地遍历所有元素.Mat 也增加了迭代器的支持,以便于矩阵元素的遍历.下面的例程功能跟上一节的例程类似,但是由 ...
- SDUT 3375 数据结构实验之查找三:树的种类统计
数据结构实验之查找三:树的种类统计 Time Limit: 400MS Memory Limit: 65536KB Submit Statistic Problem Description 随着卫星成 ...
- WordCount 编码与测试
word count github 项目地址:https://github.com/liuqiang666/wordCount PSP表格 PSP2.1 PSP阶段 预估耗时(小时) 实际耗时( ...
- java全栈day13----Eclipse项目的jar包导出与使用jar包
01eclipse快捷键 Ctrl+T:查看所选中类的继承树 例如,在下面代码中,选中Teacher类名,然后按Ctrl+T,就会显示出Teacher类的继承关系 * B: 查看所选中方法的源代码 ...
- Visual Studio 代码格式化插件(等号自动对齐、注释自动对齐等)
1.下载地址 插件:Code alignment 下载地址 2.介绍 Based on principles borrowed from mathematics and other discipli ...