go语言练习(二)

5.1 求1-100之间的奇数之和、偶数之和

package main

import (
	"fmt"
)

func main() {
	var odd, even float64 = 0, 1
	for i := 1; i <= 100; i++ {
		if i%2 == 0 {
			even *= float64(i)
		} else {
			odd += float64(i)
		}
	}
	fmt.Println(odd, even)
}

5.2 定义一个整型数组,元素个数为10,打印出数组元素中的最大数、最小数。

package main

import (
	"fmt"
)

func main() {
	var nums = [100]int{1, 2, 3, 4, 5, 6, 7, 8, 9, -1}
	max, min := nums[0], nums[0]
	for _, v := range nums {
		if max < v {
			max = v
		}
		if min > v {
			min = v
		}
	}
	fmt.Println(max, min)
}

5.3 打印出所有的水仙花数。

package main

import (
	"fmt"
)

func main() {
	for i := 100; i < 1000; i++ {
		a := i / 100
		b := i / 10 % 10
		c := i % 10
		if a*a*a+b*b*b+c*c*c == i {
			fmt.Println(i)
		}
	}
}

5.4 FizzBuzz是英国学校里常玩的游戏,从1数到100,如果遇见了3的倍数要说Fizz,如果遇见了5的倍数要说Buzz,如果既是3的倍数又是5的倍数要说FizzBuzz。编写一个程序,按游戏要求打印数字1-100。

package main

import (
	"fmt"
)

func main() {
	for i := 1; i < 100; i++ {
		switch {
		case (i%3 == 0) && (i%5 == 0):
			fmt.Println(i, "FizzBuzz")
		case i%3 == 0:
			fmt.Println(i, "Fizz")
		case i%5 == 0:
			fmt.Println(i, "Buzz")
		}
	}
}

5.5 若一个数恰好等于它的平方数的右端,则这个数称为同构数。如5的平方是25,5是25中的右端的数,5就是同构数。找出1-1000之间的同构数。

package main

import (
	"fmt"
)

func main() {
	for i := 1; i < 1000; i++ {
		n := 10
		if i > 10 {
			n = 100
		}
		if i > 100 {
			n = 1000
		}
		if i*i%n == i {
			fmt.Println(i)
		}
	}
}

5.6 一球从100m高度自由落下,每次落地后反跳回原来高度的一半,再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

package main

import (
	"fmt"
)

func main() {
	h := 100.0
	s := 0.0
	for i := 0; i < 10; i++ {
		s += h
		h /= 2.0
		s += h
	}
	s -= h
	fmt.Println("共经过", s, "米。第10次反弹时高度为", h)
}

5.7 某铁路线上共有10个车站,如果每两个车站之间需要一种车票,问共需准备多少种车票?

package main

import (
	"fmt"
)

func main() {
	sum := 0
	for i := 0; i < 10; i++ {
		for j := i + 1; j < 10; j++ {
			sum++
		}
	}
	fmt.Println(sum)
}

5.8 从键盘输入字符串str,使用for range语句遍历该字符串中的每一个字符,并打印输出。

package main

import (
	"fmt"
)

func main() {
	var str string
	fmt.Scan(&str)
	for _, v := range str {
		fmt.Println(string(v))
	}
}

6.5 设字典map1的键是string型,值是int型,初始化为[psw1:123 psw2:456 psw3:789],要求删除键值对psw2:456,增加键值对psw4:135,请编写程序实现上述功能。

 

package main

import (
	"fmt"
)

func main() {
	var map1 = map[string]int{"psw1": 123, "psw2": 456, "psw3": 789}
	delete(map1, "psw2")
	map1["psw4"] = 135
	fmt.Println(map1)
}

 

 

6.6 创建一个float64类型的Slice,初始化并计算该Slice元素平均值。

 

package main

import (
	"fmt"
)

func main() {
	var slice = []float64{1.0, 1.5, 2.2, 3.6}
	var sum float64
	for _, v := range slice {
		sum += v
	}
	avg := sum / float64(len(slice))
	fmt.Println(avg)
}

 

 

6.7 利用bytes包中的字节切片函数,统计文本文件中含有er单词的个数。

 

package main

import (
	"bytes"
	"fmt"
	"os"
)

func main() {
	var sum int
	buf := make([]byte, 1024)
	f, _ := os.Open("words.txt")
	defer f.Close()
	n, _ := f.Read(buf)
	for _, sentence := range bytes.FieldsFunc(buf[:n], f1) {
		for _, words := range bytes.Fields(sentence) {
			if bytes.Contains([]byte(words), []byte("er")) {
				fmt.Println(string(words))
				sum++
			}
		}
	}
	fmt.Println("含有er的单词总数为", sum)
}

func f1(a rune) bool {
	return a == ',' || a == '.' || a == '!'
}

 

7.1 已知三角形三边a、b、c,编写函数求三角形面积公式area(),求三角形面积。

 

package main

import (
	"fmt"
	"math"
)

func main() {
	var a, b, c float64
	fmt.Scan(&a, &b, &c)
	fmt.Println("area=", area(a, b, c))

}

func area(a, b, c float64) float64 {
	var s = (a + b + c) / 2.0
	return math.Sqrt(s * (s - a) * (s - b) * (s - c))
}

 

 

7.2 编写函数find(),在整型数组arr中查找最大元素下标max和最小元素下标min,要求数组作为函数参数,且使用多返回值同时返回查找结果max和min。

 

package main

import (
	"fmt"
)

func main() {
	var num = [10]int{1, 3, 5, 7, 9, 0, 2, 4, 6, 8}
	fmt.Println(find(num))

}

func find(arr [10]int) (max, min int) {
	for i, v := range arr {
		if arr[max] < v {
			max = i
		}
		if arr[min] > v {
			min = i
		}
	}
	return
}

 

 

7.3 编写一个函数,用于计算float64类型Slice的元素平均值,要求将Slice作为函数参数传递给处理函数。

 

package main

import (
	"fmt"
)

func main() {
	var num = []float64{1, 3, 5, 7, 9, 0, 2, 4, 6, 8}
	fmt.Println(average(num))

}

func average(slice []float64) float64 {
	var sum float64
	for _, v := range slice {
		sum += v
	}
	return sum / float64(len(slice))
}

 

 

7.4 设计一个变参函数max(),该函数可以找出不定数量整型数组中的最大值。

 

package main

import (
	"fmt"
)

func main() {
	fmt.Println(max(1, 3, 9, 7))

}

func max(args ...int) int {
	var m int = args[0]
	for _, v := range args {
		if m < v {
			m = v
		}
	}
	return m
}

 

 

7.5 编写函数fac(),使用递归调用计算n!。

 

package main

import (
	"fmt"
)

func main() {
	fmt.Println(fac(10))
}

func fac(n int) int {
	if n == 0 {
		return 1
	}
	return n * fac(n-1)
}

 

 

7.7 使用panic-and-recover机制编写一个检测用户账号合法性的程序,比如用户中不能出现空格,不能出现非法字符,比如‘,’、'#'、'!'等。

 

package main

import (
	"fmt"
	"strings"
)

func main() {
	defer func() {
		if err := recover(); err != nil {
			fmt.Println("Exception:", err)
		}
	}()

	var name string
	fmt.Scan(&name)
	check(name)
}

func check(name string) {
	if strings.ContainsAny(name, ",#! ") {
		panic("用户名含有非法字符")
	} else {
		fmt.Println(name)
	}
}

8.1 班上有30个学生,每个学生的信息包括学号、姓名、性别、年龄、三门课的成绩。要求建立学生信息的结构体student,输入这30个学生的信息,然后打印输出各项数据。

 

package main

import (
	"fmt"
)

type student struct {
	num   string
	name  string
	sex   string
	age   int
	score [3]float32
}

func main() {
	var stu [30]student
	for i := 0; i < len(stu); i++ {
		fmt.Scan(&stu[i].num, &stu[i].name, &stu[i].sex, &stu[i].age, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2])
	}
	for _, v := range stu {
		v.print()
	}

}

func (stu *student) print() {
	fmt.Println("学号:", stu.num)
	fmt.Println("姓名:", stu.name)
	fmt.Println("年龄:", stu.age)
	fmt.Println("性别:", stu.sex)
	fmt.Println("数学:", stu.score[0])
	fmt.Println("语文:", stu.score[1])
	fmt.Println("英语:", stu.score[2], "\n")
}

 

 

8.2 有4名学生,每个学生包括学号、姓名、成绩,编写函数找出成绩最高学生的学号、姓名和成绩。

 

package main

import (
	"fmt"
)

type student struct {
	num   string
	name  string
	score float32
}

func main() {
	var stu = [4]student{<!-- -->{"001", "Tom", 90}, {"002", "Jim", 77}, {"003", "Pony", 99}, {"004", "Lily", 90}}
	var max float32 = stu[0].score
	var index int
	for i, v := range stu {
		if max < v.score {
			max = v.score
			index = i
		}
	}
	fmt.Println(stu[index])
}

 

 

8.4 有一批图书,每本书有书名、作者、书号、出版日期4项数据,希望既可以通过书名查询,也可以使用作者或书名来查询图书。编写方法来实现此功能,如果查到,打印出此书的书名、作者、书号和出版日期信息。如果查不到此书,则打印出“无此书”。

 

package main

import (
	"errors"
	"fmt"
	"strings"
)

type Book struct {
	Name   string
	Author string
	Isdn   string
	Date   string
}

func main() {
	var books = []Book{
		{"Clojure程序设计", "Aaron Bedra", "9787115308474", "2013年4月"},
		{"Go语言程序设计", "王鹏", "9787302347231", "2014年1月"},
		{"TCP Sockets编程", "Jesse Stirumer", "9787115330529", "2013年10月"},
		{"Haskell趣学指南", "Miran Lipovaca", "9787115335593", "2014年1月"}}
	for {
		var field, value string
		switch menu() {
		case 1:
			field = "name"
			fmt.Print("请输入书名:")
			fmt.Scan(&value)
		case 2:
			field = "author"
			fmt.Print("请输入作者:")
			fmt.Scan(&value)
		case 3:
			field = "isdn"
			fmt.Print("请输入ISDN:")
			fmt.Scan(&value)
		default:
			return
		}
		if b, err := find(books, field, value); err == nil {
			fmt.Println(b)
		} else {
			fmt.Println(err)
		}
	}
}

func find(books []Book, field, value string) (b Book, err error) {
	for _, v := range books {
		if v.IsMatch(field, value) {
			return v, nil
		}
	}
	return b, errors.New("无此书")
}

func (b *Book) IsMatch(field, value string) (r bool) {
	switch field {
	case "name":
		r = strings.Contains(b.Name, value)
	case "author":
		r = strings.Contains(b.Author, value)
	case "isdn":
		r = strings.Contains(b.Isdn, value)
	default:
		r = false
	}
	return
}

func menu() int {
	fmt.Println("1.根据书名查询")
	fmt.Println("2.根据作者查询")
	fmt.Println("3.根据书号查询")
	fmt.Println("4.退出")
	fmt.Print("请选择:")
	var choice int
	fmt.Scan(&choice)
	return choice
}

 

 

8.5 有两个单链表a,b。设节点中包含学号、姓名。从链表a中删除所有与链表b中学号相同的节点。

 

package main

import (
	"fmt"
)

type Student struct {
	Id   int
	Name string
}

type Node struct {
	Student
	Next *Node
}

type LinkList struct {
	head *Node
	tail *Node
}

func main() {
	var link, another *LinkList
	var stu = [4]Student{<!-- -->{1, "Timi"}, {2, "Jack"}, {3, "Lucy"}, {4, "Lily"}}

	link = link.Create()
	for _, v := range stu {
		link.Add(v)
	}
	fmt.Print("LinkList A:")
	link.Print()

	another = another.Create()
	another.Add(stu[0])
	another.Add(stu[1])
	another.Add(stu[3])
	fmt.Print("\nLinkList B:")
	another.Print()

	link.Diff(another)
	fmt.Print("\nA-B:")
	link.Print()
}

func (link *LinkList) Create() *LinkList {
	link = new(LinkList)
	link.head = nil
	link.tail = nil
	return link
}

func (link *LinkList) Add(stu Student) {
	if link == nil {
		return
	}
	var node = new(Node)
	node.Id = stu.Id
	node.Name = stu.Name
	node.Next = nil
	if link.head != nil {
		link.tail.Next = node
		link.tail = node
	} else {
		link.head = node
		link.tail = node
	}
}

func (link *LinkList) Del(index int) {
	if link.head == nil {
		return
	}
	if index == 0 {
		if link.head.Next == nil {
			link.head = nil
			link.tail = nil
		} else {
			link.head = link.head.Next
		}
		return
	}
	p := link.head
	for i := 0; i < index-1 && p != nil; i++ {
		p = p.Next
	}
	if p.Next != nil {
		p.Next = p.Next.Next
	} else {
		p.Next = nil
		link.tail = p
	}
}

func (link *LinkList) Diff(another *LinkList) {
LOOP:
	p1 := link.head
	var index int
	for p1 != nil {
		p2 := another.head
		for p2 != nil {
			if p1.Id == p2.Id {
				link.Del(index)
				goto LOOP
			}
			p2 = p2.Next
		}
		index++
		p1 = p1.Next
	}
}

func (link *LinkList) Print() {
	p := link.head
	for p != nil {
		fmt.Printf("%v->", p.Student)
		p = p.Next
	}
	fmt.Print("nil")
}

 

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wangchuang2017

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值