1、练习1

生成一个随机数,让一个用户去猜这个数是多少?

代码示例如下:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "math/rand" //math包中的rand函数可以用来生成随机数
  6. "time"
  7. )
  8.  
  9. func main() {
  10. var number int
  11. /*
  12. for i := 0;i < 10; i++ {
  13. number = rand.Intn(100)
  14. fmt.Printf("number:%d\n",number)
  15. }
  16. 因为伪随机的存在,rand生成的随机数都有一个固定的序列,比如第一次生成1,第二次生成20等等,随机数的序列是固定,我们可以通过给其一个随机的总值,如果随机的总值不一样,那么伪随机数的序列也不一样。我们不给,他就是按照一个默认的随机总值,所以伪随机数序列永远是一样的。
  17. */
  18. rand.Seed(time.Now().UnixNano()) //通过rand函数的Seed方法,来设置总值,这里我们以当前时间来设置总值,并且用的纳秒,十分精确了
  19. number = rand.Intn() //随机数的范围是0-100,但不包括100
  20. fmt.Printf("请猜一个数字,数字的范围是:[0-100)\n")
  21. for { //因为并不知道用户什么时候输入正确,所以是没有限制条件的,我们只能做一个死循环,配合switch语句满足条件了即可退出;
  22. var input int
  23. fmt.Scanf("%d\n", &input) //Scanf表示让用户输入,Scanf从终端读取一个整数,并传值给input变量,&表示获取到该变量内存地址
  24. var flag bool = false //通过设置flag变量,解决的是用户输入正确后可以退出
  25. switch {
  26. case number > input:
  27. fmt.Printf("您输入的数字太小\n")
  28. case number == input:
  29. fmt.Printf("恭喜您,答对了!\n")
  30. flag = true
  31. case number < input:
  32. fmt.Printf("您输入的数字太大\n")
  33. }
  34. if flag { //表示如果flag为真,则break退出这个for循环
  35. break
  36. }
  37. }
  38. }

执行结果如下:

补充:

Scanf那里一定要加上\n,因为加上的话就已经表示以回车换行符为止,这样就已经保证了能够获取到用户输入的真正的数字,你如果不加\n,他就不行了,就会识别2次一个是你输入的数字,一个是回车。

2、练习2

题目:求数组所有元素之和

方法1:(基础版)

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. a := []int{, , }
  9. sum :=
  10. for i := ; i < len(a); i++ {
  11. sum += a[i]
  12. }
  13. fmt.Println(sum)
  14. }

执行结果如下:

方法2:(高阶)

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "math/rand"
  6. "time"
  7. )
  8.  
  9. func main() {
  10. var arr []int
  11. rand.Seed(time.Now().UnixNano()) //通过rand函数的Seed方法,来设定随机数总值
  12. for i := ; i < len(arr); i++ {
  13. arr[i] = rand.Intn() //数组取值为随机数,随机数范围为[1-10000)
  14. }
  15.  
  16. var sum int
  17. for i := ; i < len(arr); i++ {
  18. sum = sum + arr[i]
  19. }
  20. fmt.Println("sum", sum)
  21. }

执行结果如下:

3、练习3

题目:找出数组中和为给定值的两个元素的下标,比如数组:[1,3,5,8,7],找出两个元素之和等于8的下标分别是(0, 4)和(1,2)

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. var arr []int
  9. for i := ; i < len(arr); i++ {
  10. arr[i] = i //数组初始化从0-9(因为是试题所以这里为了方便索引和元素值都是0-9)
  11. }
  12.  
  13. var sum int = //求两个元素之和为12的所有数组下标
  14. for i := ; i < len(arr); i++ { //思路就是i=0 和1-9的下标加一遍,和为12即满足条件,其余下标也同理,这里写2个for循环即可
  15. for j := i + ; j < len(arr); j++ {
  16. if arr[i]+arr[j] == sum { //如果元素和为12则打印
  17. fmt.Printf("i=%d j=%d\n", i, j)
  18. }
  19. }
  20. }
  21. } 

执行结果如下:

4、练习4

题目:下列程序输出什么?

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. var sa = make([]string, , )
  9. for i := ; i < ; i++ {
  10. sa = append(sa, fmt.Sprintf("%v", i))
  11. }
  12. fmt.Println(sa)
  13. }

答:输出结果如下:

解释:

sa切片在初始化时长度就是5了,因为类型为string,所以为默认值,也就是sa前五个元素是5个空字符串。

5、练习5

题目:使用golang标准包 “sort”对数组进行排序

代码示例如下:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "math/rand"
  6. "sort"
  7. )
  8.  
  9. func main() {
  10. var arr []int //使用一个随机的初始化数组
  11. for i := ; i < len(arr); i++ {
  12. arr[i] = rand.Intn()
  13. }
  14. fmt.Printf("arr:%v\n", arr) //排序前
  15. sort.Ints(arr[:]) //Ints是升序
  16.  
  17. fmt.Printf("arr:%v\n", arr) //排序后
  18. }

执行结果如下:

补充:

sort包中的Ints方法为什么只能传入切片呢?

因为:1、数组长度是固定的,如果传入的数组大于sort这里规定的数组长度,那就传不进去了,所以必须用切片;2、数组是值类型,传进去相当于拷贝一份,排序相当于对拷贝的副本进行排序,外面还是不会排序,所以一定要传一个切片进去;

6、练习6

题目:

实现一个密码生成工具,支持以下功能:

a) 用户可以通过-l指定生成密码的长度

b) 用户可以通过-t指定生成密码的字符集,比如-t num生成全数字的密码

-t char 生成包含全英文字符的密码, -t mix包含生成数字和英文的密码,

-t advance 生成包含数字、英文以及特殊字符的密码

提示:可以用标准包 “flag”解析命令行参数

思路:

1.先解析命令行参数;

2.定义变量接收用户选择;

3.生成随机密码for循环

代码示例如下:

  1. package main
  2.  
  3. import (
  4. "flag"
  5. "fmt"
  6. "math/rand"
  7. "time"
  8. )
  9.  
  10. var (
  11. numCharset = ""
  12. strCharset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  13. mixCharset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  14. advanceCharset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~!@#$%^&*()-_+=|?"
  15. )
  16.  
  17. func main() {
  18. var length int //定义一个密码长度的变量
  19. var charset string //定义一个密码字符集的变量
  20. flag.IntVar(&length, "l", , "-l the length of passwd") //因为int是值类型,所以终端输入传参必须要用&取地址,
  21. //IntVar参数依次是:传入值-终端参数-默认值-用法
  22. flag.StringVar(&charset, "t", "harden", "-t the charset of password")
  23. //StringVar参数依次是:传入值-终端参数-默认值-用法
  24. flag.Parse() //真正解析命令行参数,IntVar、StringVar只是设置命令行需要的一些参数
  25.  
  26. //判断用户输入的到底是什么?switch和if else都可以
  27. var userCharset string //定义一个变量来接收用户选择
  28. switch charset {
  29. case "num":
  30. userCharset = numCharset
  31. case "char":
  32. userCharset = strCharset
  33. case "mix":
  34. userCharset = mixCharset
  35. case "advance":
  36. userCharset = advanceCharset
  37. default:
  38. userCharset = mixCharset
  39. } //字符集功能编写完毕
  40.  
  41. //下面写生成随机密码最终部分
  42. var password []byte
  43. rand.Seed(time.Now().UnixNano()) //设置随机总值,这样就避免了随机密码重复
  44. for i := ; i < length; i++ { //想要几位密码就循环几次
  45. index := rand.Intn(len(userCharset)) //生成随机下标
  46. char := userCharset[index] //现在是字符,最终要存到一个字符串中
  47. password = append(password, char) //字符串中的字符是不能修改的,想要修改,需要将其放入切片,所以将一个个字符放入到切片中,切片是可以修改的
  48.  
  49. }
  50. strPassword := string(password) //将字符切片强制转换成字符串
  51. fmt.Printf("%s\n", strPassword)
  52. }

执行结果如下:

7、补充练习

打印出英文字母a-z;

思路:因为字母在底层存储都是assci码,所以我们借助这点来进行打印。大写的直接换成大写即可

代码示例如下:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. start := 'a'
  9. for i := ; i < ; i++ {
  10. fmt.Printf("%c", start)
  11. start +=
  12. }
  13. }

执行结果如下:

Go语言基础练习题系列2的更多相关文章

  1. Go语言基础练习题系列1

    1.练习1 题目:使用fmt分别打印字符串.二进制.十进制.十六进制.浮点数. package main import ( "fmt" ) func main() { var a ...

  2. 带你学够浪:Go语言基础系列-环境配置和 Hello world

    文章每周持续更新,原创不易,「三连」让更多人看到是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 前面几周陆陆续续写了一些后端技术的文章,包括数据库.微 ...

  3. 【GoLang】GO语言系列--002.GO语言基础

    002.GO语言基础 1 参考资料 1.1 http://www.cnblogs.com/vimsk/archive/2012/11/03/2736179.html 1.2 https://githu ...

  4. Golang 入门系列(三)Go语言基础知识汇总

    前面已经了 Go 环境的配置和初学Go时,容易遇到的坑,大家可以请查看前面的文章 https://www.cnblogs.com/zhangweizhong/category/1275863.html ...

  5. C#语言基础

    第一部分 了解C# C#是微软公司在2000年7月发布的一种全新且简单.安全.面向对象的程序设计语言,是专门为.NET的应用而开发的.体现了当今最新的程序设计技术的功能和精华..NET框架为C#提供了 ...

  6. 黑马程序员_ C语言基础(二)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 概览 今天基础知识分为以下几点内容(注意:循环.条件语句在此不再赘述):   1.Hello W ...

  7. 基础知识系列☞Abstract和Virtual→及相关知识

    转载地址→http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的 ...

  8. Object Pascal 语言基础

    Delphi 是以Object Pascal 语言为基础的可视化开发工具,所以要学好Delphi,首先要掌握的就是Object Pascal 语言.Object Pascal语言是Pascal之父在1 ...

  9. C语言基础(转载自大海笔记)

    # C语言基础2015年03月26日10:04:411.    语言排行榜C——java——objective-C2.    进制:进制:进位机制.用普通的话讲,应该为人为的定义一种度量来标识一样东西 ...

随机推荐

  1. phonegap创建项目

    cordova create LynApp com.LynApp "LynApp"cd LynAppcordova platform add androidcordova buil ...

  2. 去除Activity上面的标题边框

    实现方法:1.在代码中实现:在此方法setContentView(R.layout.main)之前加入:requestWindowFeature(Window.FEATURE_NO_TITLE);标题 ...

  3. 第4章 ZK基本特性与基于Linux的ZK客户端命令行学习 4-1 zookeeper常用命令行操作

    ls path [watch] watch是一个监督者.quota是zookeeper的子目录.目录就是节点的意思,对于zookeeper来说它是以一个节点来说的,所以说/就是根节点,zookeepe ...

  4. 使用HttpClient进行Post通信

    ---------------siwuxie095                         首先到 Apache官网 下载相关的库文件     Apache官网:http://www.apac ...

  5. cocos2dx中的内存管理方式

    转载:http://www.cocoachina.com/bbs/read.php?tid=195219 今天看了一下cocos2dx的内存管理机制,有些地方不太好理解搞了挺长的时间,现在感觉自己理解 ...

  6. 对private protected public的详解:

    #include <iostream> #include <stack> #include <queue> #include <exception> # ...

  7. iOS symbolicatecrash工具crash日志分析

    若一个App没有加入Crashlytics或者Buggly这些崩溃日志监控,那么我们在App崩溃的时候如何获取崩溃信息呢? 此时我们可以通过symbolicatecrash工具对手机日志来进行分析定位 ...

  8. Java50道经典习题-程序43 求奇数个数

    题目:求0—7所能组成的奇数个数,奇数中不包含重复数字. public class Prog43 { public static void main(String[] args) { //0-7能组成 ...

  9. c#继承、多重继承

    c#类 1.c#类的继承 在现有类(基类.父类)上建立新类(派生类.子类)的处理过程称为继承.派生类能自动获得基类的除了构造函数和析构函数以外的所有成员,可以在派生类中添加新的属性和方法扩展其功能.继 ...

  10. c# 时间格式处理,获取格式: 2014-04-12T12:30:30+08:00

    C#  时间格式处理,获取格式: 2014-04-12T12:30:30+08:00 一.获取格式: 2014-04-12T12:30:30+08:00 方案一:(局限性,当不是当前时间时不能使用) ...