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")
}