zoukankan      html  css  js  c++  java
  • 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
    ",number)
            }
            因为伪随机的存在,rand生成的随机数都有一个固定的序列,比如第一次生成1,第二次生成20等等,随机数的序列是固定,我们可以通过给其一个随机的总值,如果随机的总值不一样,那么伪随机数的序列也不一样。我们不给,他就是按照一个默认的随机总值,所以伪随机数序列永远是一样的。
        */
        rand.Seed(time.Now().UnixNano()) //通过rand函数的Seed方法,来设置总值,这里我们以当前时间来设置总值,并且用的纳秒,十分精确了
        number = rand.Intn(100)          //随机数的范围是0-100,但不包括100
        fmt.Printf("请猜一个数字,数字的范围是:[0-100)
    ")
        for { //因为并不知道用户什么时候输入正确,所以是没有限制条件的,我们只能做一个死循环,配合switch语句满足条件了即可退出;
            var input int
            fmt.Scanf("%d
    ", &input) //Scanf表示让用户输入,Scanf从终端读取一个整数,并传值给input变量,&表示获取到该变量内存地址
            var flag bool = false     //通过设置flag变量,解决的是用户输入正确后可以退出
            switch {
            case number > input:
                fmt.Printf("您输入的数字太小
    ")
            case number == input:
                fmt.Printf("恭喜您,答对了!
    ")
                flag = true
            case number < input:
                fmt.Printf("您输入的数字太大
    ")
            }
            if flag { //表示如果flag为真,则break退出这个for循环
                break
            }
        }
    }

    执行结果如下:

    补充:

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

    2、练习2

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

    方法1:(基础版)

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        a := [3]int{1, 5, 10}
        sum := 0
        for i := 0; i < len(a); i++ {
            sum += a[i]
        }
        fmt.Println(sum)
    }

    执行结果如下:

    方法2:(高阶)

    package main
    
    import (
        "fmt"
        "math/rand"
        "time"
    )
    
    func main() {
        var arr [10]int
        rand.Seed(time.Now().UnixNano())  //通过rand函数的Seed方法,来设定随机数总值
        for i := 0; i < len(arr); i++ {
            arr[i] = rand.Intn(10000) //数组取值为随机数,随机数范围为[1-10000)
        }
    
        var sum int
        for i := 0; 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 [10]int
        for i := 0; i < len(arr); i++ {
            arr[i] = i //数组初始化从0-9(因为是试题所以这里为了方便索引和元素值都是0-9)
        }
    
        var sum int = 12                //求两个元素之和为12的所有数组下标
        for i := 0; i < len(arr); i++ { //思路就是i=0 和1-9的下标加一遍,和为12即满足条件,其余下标也同理,这里写2个for循环即可
            for j := i + 1; j < len(arr); j++ {
                if arr[i]+arr[j] == sum {  //如果元素和为12则打印
                    fmt.Printf("i=%d j=%d
    ", i, j)
                }
            }
        }
    } 

    执行结果如下:

    4、练习4

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

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        var sa = make([]string, 5, 10)
        for i := 0; i < 10; 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 [10]int //使用一个随机的初始化数组
        for i := 0; i < len(arr); i++ {
            arr[i] = rand.Intn(10000)
        }
        fmt.Printf("arr:%v
    ", arr) //排序前
        sort.Ints(arr[:])           //Ints是升序
    
        fmt.Printf("arr:%v
    ", 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     = "0123456789"
        strCharset     = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
        mixCharset     = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
        advanceCharset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~!@#$%^&*()-_+=|?"
    )
    
    func main() {
        var length int                                           //定义一个密码长度的变量
        var charset string                                       //定义一个密码字符集的变量
        flag.IntVar(&length, "l", 16, "-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 := 0; i < length; i++ {    //想要几位密码就循环几次
            index := rand.Intn(len(userCharset)) //生成随机下标
            char := userCharset[index]           //现在是字符,最终要存到一个字符串中
            password = append(password, char)    //字符串中的字符是不能修改的,想要修改,需要将其放入切片,所以将一个个字符放入到切片中,切片是可以修改的
    
        }
        strPassword := string(password) //将字符切片强制转换成字符串
        fmt.Printf("%s
    ", strPassword)
    }

     执行结果如下:

    7、补充练习

    打印出英文字母a-z;

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

    代码示例如下:

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        start := 'a'
        for i := 0; i < 26; i++ {
            fmt.Printf("%c", start)
            start += 1
        }
    }

     执行结果如下:

  • 相关阅读:
    I2C总线驱动框架详解
    Allegro封装的制作
    轮询与中断 简单分析
    SMI#、SCI#信号在OS、BIOS、EC中的中断方式(Linux)
    var
    集合元素重复问题
    子类重写父类属性和方法
    内存(转)
    DesiredSize,RenderSize&& Width ,ActualWidth
    sql select(A.B)拼接
  • 原文地址:https://www.cnblogs.com/forever521Lee/p/9338157.html
Copyright © 2011-2022 走看看