Go基础练习题 附讲解

一:数据类型篇

%d 十进制 %T 输出数据类型 %b将整数转化为整数型
%o 八进制 %x十六进制 %v使用默认格式输出值

1.编写代码统计出字符串 "hello沙河小王子"中汉字的数量。

package main
import "fmt"
func main() {
   target := "hello沙河小王子"
   count := 0
   for _, value := range target {
      if len(string(value)) >= 3 {
         count++
      }
   }
   fmt.Println(count)
}

注解:在go中,中文字符不能直接通过len函数来统计字符串字符长度,以为是以UTF-8格式进行存储,字符串上调用len函数,取得的是字符串包含字节个数,中文字符算三个字节,所以通过判断字符的长度来进行判断

二:运算符篇

2.有一堆数字,如果除了一个数字以外,其他数字都出现了两次,那么如何找到出现一次的数字?

package main
import "fmt"
func main() {
   var b = [...]int{1, 1, 2, 2, 4, 5, 5, 6, 6}
   //var c = [3]int{1, 1, 2}
   //var d = [3]int{1: 2, 2: 3, 0: 4}
   count := 0
   for _, value := range b {
      count ^= value
   }
   fmt.Println(count)
}

注解:^二进制两个不同才为1

三:数组和流程控制篇

3.编写代码打印9*9乘法表

package main
import "fmt"
func main() {
   for i := 1; i < 10; i++ {
      for j := 1; j <= i; j++ {
         fmt.Printf("%v*%v\t", j, i)
      }
      fmt.Println()
   }
}

4.对输出结果进行分析

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

注解:因为切片初始长度为5且为空,使用append添加元素后,容量不够可以扩容,所以输出后前面会存在一些空格

四:Map篇

5.写一个程序,统计一个字符串中每个单词出现的次数。比如:”how do you do”中how=1 do=2 you=1。

package main

import (
   "fmt"
   "strings"
)

func main() {
   test := "how do you do"
   result := count(test)
   for index, value := range result {
      fmt.Printf("the world:%v \t appeared:%v \n", value, index)
   }
}
func count(test string) map[string]int {
   test1 := strings.Split(test, " ")
   mapDemo := make(map[string]int, 10)
   for _, v := range test1 {
      mapDemo[v]++
   }
   return mapDemo
}

//the world:1      appeared:how 
//the world:1      appeared:you 
//the world:2      appeared:do

注解:根据map主键的增加,找出每个单词频率
6.对结果进行分析(大坑)

func main() {
type Map map[string][]int
m := make(Map)
s := []int{1, 2}
s = append(s, 3)
fmt.Printf("%+v\n", s)
m["q1mi"] = s
s = append(s[:1], s[2:]...)
fmt.Printf("%+v\n", s)
fmt.Printf("%+v\n", m["q1mi"])
}
//[1 2 3]
[1 3]  
[1 3 3]

注解:根据切片定义,切片本质是一个底层数组包括指针,容量,长度,s和m[“qimi”],它们是共享一个底层数组的,但是长度和容量是各顾各的,后面s修改了长度和索引为1的值,m[“qimi”]长度不受限制,但是值改变了
7.分金币

package main

import (
   "fmt"
)

/*
你有50枚金币,需要分配给以下几个人:Matthew,Sarah,Augustus,Heidi,Emilie,Peter,Giana,Adriano,Aaron,Elizabeth。
分配规则如下:
a. 名字中每包含1个'e'或'E'分1枚金币
b. 名字中每包含1个'i'或'I'分2枚金币
c. 名字中每包含1个'o'或'O'分3枚金币
d: 名字中每包含1个'u'或'U'分4枚金币
写一个程序,计算每个用户分到多少金币,以及最后剩余多少金币?
程序结构如下,请实现 ‘dispatchCoin’ 函数
*/
func dispatchCoin() (left int) {
   var (
      coins = 50
      user  = []string{
         "Matthew", "Sarah", "Augustus", "Heidi", "Emilie", "Peter", "Giana", "Adriano", "Aaron", "Elizabeth",
      }
      distribution = make(map[string]int, len(user))
   )
   for _, name := range user {
      getCoin := 0
      for _, n := range name {
         switch n {
         case 'e', 'E':
            getCoin += 1
         case 'i', 'I':
            getCoin += 2
         case 'o', 'O':
            getCoin += 3
         case 'u', 'U':
            getCoin += 4
         }
      }
      distribution[name] = getCoin
      coins -= getCoin
   }
   fmt.Printf("%v\n", distribution)
   return coins
}
func main() {
   left := dispatchCoin()
   fmt.Println("剩下:", left)
}

注解:题中所给依旧是一个map,通过两层for循环,将字符分别统计,最后输出

五:结构体篇

8.使用“面向对象”的思维方式编写一个学生信息管理系统。
学生有id、姓名、年龄、分数等信息
程序提供展示学生列表、添加学生、编辑学生信息、删除学生等功能

package main

import (
   "fmt"
   "os"
)

type student struct {
   id   int
   name string
}
//创造一个map来接收学生信息
var studentList = make(map[int]*student)

//新添加学生的信息
func newstudent(id int, name string) *student {
   return &student{
      id,
      name,
   }
}
//修改
func (e *student) editStudent(name string) {
   e.name = name
}

// 列出学生信息列表
func listStudent() {
   if len(studentList) == 0 {
      fmt.Println("学生列表为空")
   } else {
      for i, v := range studentList {
         fmt.Printf("学号:%d 姓名:%s\n", i, v.name)
      }
   }
}

// 增加学生信息
func addStudent() {
   var key int
   var name string
   fmt.Printf("请输入学生学号:")
   //这个函数将会返回个数
   fmt.Scanln(&key)
   _, ok := studentList[key]
   have := ok
   for have {
      fmt.Println("学号已经存在")
      fmt.Printf("请输入学生学号:")
      fmt.Scanln(&key)
      _, ok := studentList[key]
      have = ok
   }
   fmt.Printf("请输入学生姓名:")
   fmt.Scanln(&name)
   newstudent := newstudent(key, name)
   studentList[key] = newstudent
}
func editStudent() {
   var key int
   fmt.Printf("请输入需要修改信息学生的学号:")
   fmt.Scanln(&key)
   _, ok := studentList[key]
   if ok {
      var name string
      fmt.Printf("请输入需要修改学生学号:")
      fmt.Scanln(&name)
      studentList[key].editStudent(name)
      fmt.Printf("修改成功\n")
      listStudent()
   } else {
      fmt.Println("学号不存在")
   }
}
func deleteStudent() {
   var key int
   fmt.Printf("请输入需要删除学生的学号:")
   fmt.Scanln(&key)
   _, ok := studentList[key]
   if ok {
      delete(studentList, key)
      listStudent()
      fmt.Println("删除成功")
   } else {
      fmt.Println("学号不存在")
   }
}

func main() {
   fmt.Println("欢迎进入学生管理系统")
   //无限循环
   for {
      fmt.Println(`
         1.展示学生列表
         2.添加学生
         3.编辑学生信息
         4.删除学生
         5.退出
         `)

      fmt.Printf("请选择你的操作:")
      var input int
      //函数扫描标准输入中给定的输入文本
      //它返回成功扫描的项目数
      fmt.Scanln(&input)
      //fmt.Printf("你选择的操作是:%d\n、", input)
      switch input {
      case 1:
         listStudent()
      case 2:
         addStudent()
      case 3:
         editStudent()
      case 4:
         deleteStudent()
      case 5:
         os.Exit(1)

      default:
         fmt.Println("请按照规则输入")
      }
   }
}

六:基础包篇

补充:同一个项目下只能有一个mod文件,不同的mod是在不同的项目下,同一个mod下的文件可以相互引用

9.编写一个calc包实现加减乘除四个功能函数,在snow这个包中引入calc包并调用其加减乘除四个函数实现数学运算。

package main
import (
   "fmt"
   "os"
   "strconv"
   "weishuaibo.com/xxx/test/calc"
)
func main() {
   for {
      var a, b, c string
      var result float64
      fmt.Printf("请输入表达式:")
      fmt.Scanln(&a, &b, &c)
      //ParseFloat是一个内置的函数,
      //可以将一个字符串值转换为一个浮点数
      aa, _ := strconv.ParseFloat(a, 64)
      cc, _ := strconv.ParseFloat(c, 64)
      if b == "+" {
         result = calc.Sum(aa, cc)
      } else if b == "-" {
         result = calc.Sub(aa, cc)
      } else if b == "*" {
         result = calc.Mul(aa, cc)
      } else if b == "/" {
         result = calc.Div(aa, cc)
      } else {
         os.Exit(0)
      }
      fmt.Printf("%v \n", result)
   }
}

运算符包:

package calc

func Sum(a float64, b float64) float64 {
   return (a + b)
}
func Sub(a float64, b float64) float64 {
   return (a - b)
}
func Mul(a float64, b float64) float64 {
   return (a * b)
}
func Div(a float64, b float64) float64 {
   return (a / b)
}

详细查看:我的笔记链接
感谢观看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万物皆可der

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值