Go程序设计语言课后习题答案-第三章(基本数据)
第三章
- 整数
- 浮点数
- 复数
- 布尔值
- 字符串
- 常量
这一章阅读体验很好,因为书上给的示例很炫酷,产生的结果是炫酷的图形,然而想要理解却挺头痛,因为需要一些基础的图形学知识,这章习题做得比较头疼,不是因为代码逻辑,而是因为”业务逻辑”
练习3.1
假如函数f返回一个float64型的无穷大值,就会导致SVG文件含有无效的
我的想法是将无穷大和
math.MaxFloat64
进行比较,比它还大就替换为最大值1
2
3
4
5
6
7func TestMax(t *testing.T) {
var z float64
if 1/z > math.MaxFloat64{
fmt.Println(math.MaxFloat64)
}
}
练习3.2
用math包的其他函数试验可视化效果.你是否能生成各种曲面,分别呈鸡蛋盒状、雪坡状或马鞍状
- 没有完全搞明白,三维映射到二维的过程,不过整个代码的逻辑还是很清晰的,这一题略过
练习3.3
按高度给每个多边形上色,使得封顶呈红色(#ff0000),谷底呈蓝色(#0000ff)
- 思路是得到最大值最小值,将中间部分分为256个部分,然后每个z值都能映射到一个颜色,想着可以平滑过渡,然而效果却很糟糕😰
- svg的polygon显示颜色,只要在每个polygon上面添加fill属性就可以了
1 | package main |
练习3.4
仿照1.7节的示例Lissajous的方法,构建一个web服务器,计算并生成曲面,同时将svg数据写入客户端.服务器必须如下设置Content-Type报头 w.Header().set("Content-Type","image/svg+xml")
- 这个问题比较简单,体现了Go的接口思维,将main改成函数,传入
io.Writer
接口,将fmt.Printf
改为fmt.Fprintf
就可以了,最后web请求加Header让浏览器识别svg
1 | func main() { |
练习3.5
用image.NewRGBA函数和color.RGBA类型或color.YCbCr类型实现一个Mandelbrot集的全彩图
- 又是一个图形学,一维变量最简单的方式是R=G=B,最后出来一个平滑变化的灰度图。作者要求变成全彩图(喂!大哥,我是来学Golang的,不是来搞图形学的),我也不知道这需要什么图形学知识😕,不过看到有人给出了这样一个看起来很简单也符合题目要求的变化
1 | func mandelbrot(z complex128) color.Color { |
练习3.6:
超采样通过对几个临近像素颜色取样并取均值,是一种减少锯齿化的方法.最简单的做法是将每个像素分为4个”子像素”.给出实现方式
- 暂时略过
练习3.7:
另一种简单的分形是运用牛顿法求某个函数的复数解,比如z的四次方-1 = 0.以平面上各点作为牛顿法的起始,根据逼近其中一个根(共有四个根)所需的迭代次数对该点设定灰度.再根据求得的根对每个点进行全彩上色
- 暂时略过
练习3.8:
生成高度放大的分形需要极高的数学精度.分别用以下四种类型(complex64,complex128,big.Float,big.Rat)表示数据实现同一个分形(后面两种类型由math/big包给出.big.Float类型随意选用float32/float64浮点数,但精度有限;big.Rat类型使用无限精度的有理数.)它们在计算性能和内存消耗上相比如何?放大到什么程度,渲染的失真变得可见
- 暂时略过
练习3.9:
编写一个web服务器,它生成分形并将图像写入客户端.要让客户端得以通过HTTP请求的参数指定x,y值和放大系数
- 终于有一题能做的了😭,读取查询参数,修改函数输出传入参数io.Writer
1 | package main |
练习3.10:
编写一个非递归的comma函数,运用bytes.Buffer,而不是简单的字符串拼接
- 得到字符串长度,先对三取余,然后每三位循环一次,最后一个循环特殊处理
- 使用bytes.Buffer.String得到结果
1 | package main |
练习3.11
完善comma函数,以支持浮点数处理和一个可选的正负号的处理
- 先处理(剔除)前置符号,在处理后置浮点数,最后
stings.Join
连接起来
1 | package main |
练习3.12
编写一个函数,判断两个字符串是否是相互打乱的,也就是说它们有着相同的字符,但是对应不同的顺序
- 遍历字符串A,对比字符在两个字符串的个数是否相等
- 字符串遍历有坑,得到的是数字,需要string转换一下类型
1 | package main |
练习3.13
编写KB、MB的常量声明,然后扩展到YB
- iota
暂略