<jupyter_start><jupyter_text>Lecture 5:绘制正多边形 - **Name (姓名)**: [Write Your Name Here]- **Date (日期)**: [Write the Date on which you completed this assignment]- **Score (成绩)**:A+- **Comment By Teacher (评语)**: Super Good!  Problem1. 用已经学过的Turtle库内的绘图方法绘制正三角形、正4、5、6、7、... 边形2. 绘制一个半径为50圆  Objective 学习目标- 讲解上次作业- 继续思考尽量不编写重复代码这一编程原则的意义，理解“循环”的意义，初步见识如何使用循环语句来避免编写重复的代码- 理解同一个方法名在接受不同的外部数据时会完成类似但不完全的功能。方法接受的不同的数据成为这个方法可以接受的**参数**。一个方法接受的参数的名称、次序和个数是由编写这个方法的人决定的，他人在使用这个方法时需要参考编写该方法的人所公开的关于该方法的详细介绍。- 继续使用已掌握的turtle库内的方法练习绘制略复杂的几何图形，思考如何在指定的位置绘制图形- 初步学习turtle库中的两个新方法: `goto`， `seth`，引导思考数轴、平面直角坐标系和极坐标系的思想- 复习正三角形以及正多边形的几何特点- 学习圆的简单性质  Math- 组成一个正三角形或一个正多边形的每一条边的边长都相等。- 一个圆由一个中心位置和一个长度来确定，这个中心位置确定了圆的位置，这个长度可以用来确定圆的大小- 数轴是一个有方向和刻度的水平直线，每一个整数或者小数都可以在数轴上表示。在一个右侧朝向的数轴上，右侧的点表示的数比左侧的点表示的数大- 平面直角坐标系和极坐标系都是用一组（2个）按照事先设定的次序列出的数值的形式来表示二维平面中的某一个点的位置的坐标系统  Python<jupyter_code>from turtle import setup, reset, bye, pu, pd, bk, fd, left, right, st, ht, goto, seth
setup(800, 600, 0, 0) 
reset()
num_side = 10       # number of sides of a shape
length_side = 100    # length of each side.
angle = 360 / num_side
# steps before drawing 绘制前的准备
reset()
pu()
goto(0, -150)
st()
pd()

# drawing one side using each two code lines.
# 每两行绘制一条边
fd(length_side)
left(angle)
fd(length_side)
left(angle)
fd(length_side)
left(angle)
fd(length_side)
left(angle)
fd(length_side)
left(angle)
fd(length_side)
left(angle)
fd(length_side)
left(angle)
fd(length_side)
left(angle)
fd(length_side)
left(angle)
fd(length_side)
left(angle)

# steps after drawing 完成绘制后
pu()
ht()
num_side = 100                 # number of sides of a shape
length_side = 1000 / num_side    # length of each side.
angle = 360 / num_side

# steps before drawing 绘制前的准备
reset()
pu()
goto(0, -150)
st()
pd()

# drawing sides using loop flow control
# 使用循环控制语句来绘制所有的边
num_side_drawn = 0
while num_side_drawn < num_side:
    fd(length_side)
    left(angle)
    num_side_drawn = num_side_drawn + 1
# steps after drawing 完成绘制后
pu()
ht()<jupyter_output><empty_output><jupyter_text>**思考**: 比较使用循环语句和不使用循环语句时，两段代码的相同与不同部分。进一步思考有没有可能继续改进以避免重复出现较多行相同的代码<jupyter_code>st() # show turtle (triangle) 显示小海龟
# observe the turtle orientation when executing the following codes
# 执行该单元格代码观察绘图区海归方向的变化
seth(0)
# observe the turtle orientation when executing the following codes
# 执行该单元格代码观察绘图区海归方向的变化
seth(90)
# observe the turtle orientation when executing the following codes
# 执行该单元格代码观察绘图区海归方向的变化
seth(180)
bye()<jupyter_output><empty_output><jupyter_text>Exercise**注意:**- 使用整个星期完成下面的练习- 本讲所有编程练习都要求练习者自行事先导入如下代码提供的方法和绘图设置- 如果您复制粘贴下面的代码，请注意修正其中存在的一处错误再运行```pythonfrom turtle import setup, reset, bye, pu, pd, bk, fd, left, right, st, ht，gotosetup(500, 400, 0, 0) reset()``` 1. 尝试按照下面列举的数据多次修改`setup(500, 400, 0, 0)`方法接受的外部数据，观察代码执行的效果有什么变化。你能总结出`setup`方法接收的每一个外部数据的意义吗。在下面的代码单元格中以注释的形式写上你的回答。    - `setup(400, 500, 0, 0)`            - `setup(800, 400, 0, 0)`    - `setup(400, 800, 0, 0)`    - `setup(500, 400, 200, 100)`    - `setup(500, 400, 200, 0)`    - `setup(500 ,400, 0, 200)`<jupyter_code># 在这里写上你的答案
# The first number 500 is the amount of units for the length of the paper. The second number 400 is the amount of units for the width of the paper.  
# The third number 200 is for moving the paper 200 unit to the right. The forth number 100 is for moving the paper 100 unit down.
# So the last two numbers is for moving the paper to the exact position you want.
from turtle import setup, reset, bye, pu, pd, bk, fd, left, right, st, ht, goto
setup(500, 400, 200, 100)
reset()<jupyter_output><empty_output><jupyter_text>2. 根据你目前学过的内容，在下面的代码单元格中以注释的形式详细说明已经学过的下列方法分别来自哪一个方法（仓）库、每一个方法完成的功能、所接受的参数（外部数据）的个数以及每一个参数的在该方法中的作用，即当这个方法中的该参数发生变化时，这个方法执行后得到的效果有什么变化。      注：如果是默认的仓库，在仓库名列下写"default"。<jupyter_code>#          方法名：print
#        所在仓库：Default
#   方法完成的功能：向屏幕输出一段字符串
# 参数个数以及意义：1个参数，表示要输出的字符串
   
#          方法名: input
#        所在仓库：default
#   方法完成的功能：The string is for the thing you want to show on the screen and wait for the users to type on their keyboard.
# 参数个数以及意义：1 parameter, Show the user type on the computer.

   
#          方法名: type
#        所在仓库：default
#   方法完成的功能：This is for showing the type of the parameter.
# 参数个数以及意义：1 parameter, the parameter you want to know the type of.

   
#          方法名: int
#        所在仓库：default
#   方法完成的功能：this is used for changing the type of the parameter into a integer.
# 参数个数以及意义：1 parameter, changing the parameter into a integer.

   
#          方法名: random
#        所在仓库：random
#   方法完成的功能：This is for generating random decimal numbers between 0 to 1.
# 参数个数以及意义：0 parameter, for generating number between 0 to 1.

   
#          方法名: randint
#        所在仓库：random
#   方法完成的功能：this is used to generate a random integer.
# 参数个数以及意义：2 parameters, for generating random numbers between the parameters you type.

   
#          方法名: goto
#        所在仓库：turtle
#   方法完成的功能：goto is used to move the turtle pointer to the coordinate (x, y) that you want it to.
# 参数个数以及意义：2 parameters, coordinate (x, y) where you want to move the pointer to.

   
#          方法名: setup
#        所在仓库：turtle
#   方法完成的功能：to setup a paper on your screen so you can draw.
# 参数个数以及意义：4 parameters, the first two are length and width of paper; the last two are position of the paper on your screen.

#          方法名: seth
#        所在仓库：turtle
#   方法完成的功能：Is used to turn the turtle pointer instead of using the code left and right.
# 参数个数以及意义：1 parameter, the angle you want to turn the turtle.<jupyter_output><empty_output><jupyter_text>3. 使用`turtle`绘图库中已经学过的方法（可以不使用`goto`和`seth`），在一个或多个代码单元格中编写任意行数的代码，绘制出按下面排列的一组(5个)正方形。      具体要求：   - 最中间的正方形位于画布（绘图区）的正中央   - 每一个正方形的边长为80   - 你的代码可以使用也可以不使用`while`循环语句   - 如果你没有使用`while`循环语句，请给你所写的每一行代码进行注释，解释每一行代码的作用。   - 如果你使用了`while`循环语句，你仅需要给`while`循环内的每一行代码进行注释，解释每一行代码的作用。但需要整个代码结尾以注释的形式详细介绍你在使用while循环时碰到了哪些错误，你是怎么发现和修正这些错误并最终让程序正确运行的。<jupyter_code>from turtle import setup, reset, bye, pu, pd, bk, fd, left, right, st, ht, goto, speed
num_side = 4
length_side = 80
angle_turn = 360 / num_side
setup(500,400,0,0)
reset()
pu()
goto(40,-40)
right(90)
pd()
num_side_drawn = 0               # giving the number 0 the name num_side_drawn
while num_side_drawn < num_side: # if num_side_drawn is smaller than num_side than do -
    fd(length_side)              # -go forward length_side which is length_side = 80 -
    left(angle_turn)             # -turn left;angle_turn = 360 / num_side. num_side = 4 
    num_side_drawn = num_side_drawn + 1 # add 1 to num_side_drawn 
right(90)
fd(80)
num_side_drawn = 0
while num_side_drawn < num_side:
    fd(length_side)
    left(angle_turn)
    num_side_drawn = num_side_drawn + 1
right(90)
fd(80)
num_side_drawn = 0
while num_side_drawn < num_side:
    fd(length_side)
    left(angle_turn)
    num_side_drawn = num_side_drawn + 1
right(90)
fd(80)
num_side_drawn = 0
while num_side_drawn < num_side:
    fd(length_side)
    left(angle_turn)
    num_side_drawn = num_side_drawn + 1
right(90)
fd(80)
ht()
#I found that if I did not turn the right way the While would mess the drawing up.
#If the code in the While block was turn left than you have to turn right.
bye()<jupyter_output><empty_output><jupyter_text>3. 使用`turtle`绘图库中已经学过的方法，在一个或多个代码单元格中编写任意行数的代码，绘制出如下图所示的图形。   图形描述：图片中所描述的图形可以有两种构图方式：   - 它可以认为是一个大的正三角形和其内部的一个倒立的小的正三角形组合而成，其中大三角形的边长是小三角形边长的2倍；   - 它也可以认为仅由3个小的正三角形按照一定的规律排列而成      具体绘制要求：   - 图中的大三角形的边长是240，相应的小三角形的变长是120   - 整个图形在绘图区中的具体位置可随意设定，但底边需要水平不能倾斜且不能有任何部分超出绘图区而导致大三角形的显示不完整   - 大三角形中倒立的小三角形最上方的一条边（也可以理解为最上方的小三角形的底边）也必须是水平不能倾斜   - 所有的三角形必须是正三角形。   - 不要求代码中出现`while`语句   - 请给你所写的每一行代码进行注释，解释每一行代码的作用。   - 可以有多种途径完成此图的绘制，你仅需要提供一种途径的代码即可，如果你有兴趣，欢迎你提供多套代码。      **提示**：      - 下面代码声明的变量和值作为**礼物**送给你，它们会帮助你精确的控制所要绘制的三角形之间的位置关系，你可以选择其中的一个使用在你的代码中。如果你觉得这个礼物对你有帮助，请在代码中以注释的形式感谢它。同时，你可以尝试将这个礼物（神秘）数字（`1.7321`）换成别的数字（例如`1.5`或者`2`）, 重新运行代码，观察绘制的图形有什么变化？    ```python    GIFT_VALUE1 = 120 * 1.7321 / 2    GIFT_VALUE2 = 120 * 1.7321     GIFT_VALUE3 = 1.7321 / 2    ```<jupyter_code>from turtle import setup, reset, bye, pu, pd, bk, fd, left, right, st, ht, goto, speed
setup(500,400,0,0)    # Get a paper that have the area 200000
reset()               # Reset the paper to show the pointer
pu()                  # Pen up
left(180)             # Turn left 180 degrees
fd(60)                # go foward 60 units
pd()                  # pen down
left(60)              # turn left 60 degrees
fd(120)               # forward 120 units
left(120)             # turn left 120 degrees
fd(240)               # forward 240 units
left(120)             # turn left 120 degrees
fd(240)               # forward 240 units
left(120)             # turn left 120 degrees
fd(120)               # forward 120 units
left(120)             # turn left 120 degrees
fd(120)               # forward 120 units
right(120)            # turn right 120 degrees
fd(120)               # forward 120 units
right(120)            # turn right 120 degrees
fd(120)               # forward 120 units
ht()                  # hide the turtle pointer
# 1 + 2 + 3 + ... + n = 2000
# (n + 1) * n / 2 = 2000
# n is roughly about 62
# (62 + 1) * 62 / 2 = 1953
# The king have 47 bags of grain left.
# He gave 1953 bags in 62 days.
num_days = 0               # number of days
num_bags = 2000            # total number of bags
sum_bags = 0               # in the num_days' day, the number of bags that was given out

while sum_bags < num_bags:
    num_days = num_days + 1
    sum_bags = sum_bags + num_days   # current number of bags that's given out is equal to total number of bags given out last day plus the number of today
     
final_num = sum_bags - num_days
print("The king can give",final_num ,"in", num_days - 1,"days.")
left_bags = num_bags - final_num
print("The king have",left_bags ,"left.")
num_days = 0
num_bags = 2000
sum_bags = (num_days + 1) * num_days / 2
while sum_bags < num_bags:
    sum_bags = (num_days + 1) * num_days / 2
    num_days = num_days + 1 
if sum_bags > num_bags :
    final_num = (num_days - 1) * (num_days - 2) / 2
else :
    print("ho")
print("The king can give",final_num ,"in", num_days - 2,"days.")
left_bags = num_bags - final_num
print("The king have",left_bags ,"left.")
num_days = 0               # number of days
num_bags = 2000            # total number of bags
sum_bags = 2000               # in the num_days' day, the number of bags that was given out

while sum_bags > 0:
    num_days = num_days + 1
    sum_bags = sum_bags - num_days   # current number of bags that's given out is equal to total number of bags given out last day plus the number of today
     
left_bags = sum_bags + num_days
final_num = num_bags - left_bags
print("The king can give",final_num ,"in", num_days - 1,"days.")
print("The king have",left_bags ,"left.")
num_days = 0               # number of days
num_bags = 2000            # total number of bags
sum_bags = 0               # in the num_days' day, the number of bags that was given out

while sum_bags < num_bags:
    sum_bags = sum_bags + num_days   # current number of bags that's given out is equal to total number of bags given out last day plus the number of today
    num_days = num_days + 1 
final_num = sum_bags - num_days + 1
print("The king can give",final_num ,"in", num_days - 2,"days.")
left_bags = num_bags - final_num
print("The king have",left_bags ,"left.")<jupyter_output>The king can give 1953 in 62 days.
The king have 47 left.
{'fraction_non_alphanumeric': 0.0930499206209208, 'fraction_numerical': 0.04039513141647557, 'mean_word_length': 3.5981346309813462, 'pattern_counts': {'":': 0, '<': 32, '<?xml version=': 0, '>': 26, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 5, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '502917', 'license': 'MIT', 'n_tokens_mistral': 5603, 'n_tokens_neox': 5528, 'n_words': 1202, 'path': 'assignments/2021-05-08/Jason_assignment_006_marked.ipynb', 'repo_name': 'qqiang00/ElementaryMathPython', 'size': '11338'}