Раздел «Язык Си».PythonTurtleWhileEng:

Циклы while

Можем написать цикл, который САМ РЕШАЕТ когда закончить работу.

Пример: спираль внутрь - пока можно рисовать

Когда рисовали спираль из центра наружу, мы задавали n — количество отрезков спирали.

Можно задавать размер size_start — размер самого большого отрезка, d - на сколько уменьшается следующий отрезок.

Не считать, сколько поместится отрезков, а написать "рисуй, пока длина отрезка > 0"

Используем для этого цикл while

# команды до цикла
while условие :
    команды        # выполняем много раз, пока условие да
# команды после цикла

Если условие да (True), то команды выполняются. Если условие стало нет (False), то команды не выполняются и делаем команды после цикла (если есть).

# -*- coding: utf-8 -*-
import turtle           
import time

def spiral(size, d):

    while size > 0:
        t.fd(size)
        t.right(90)
        size -= d


t = turtle.Turtle()
t.shape("turtle")
t.width(3)

spiral(300, 20)

turtle.done()

spi1.png

Задача Веер

Самую большую линию рисуем первой. Ее длина size. Каждую следующую линию рисуем меньше на d. Каждый раз поворачиваемся на угол ang.

Рисуем, пока длина линии > 0.

1 веер рисует функция veer(size, d, ang)

Пример Dashes

# -*- coding: utf-8 -*-
import turtle

# Будем рисовать черточки. Первая - большая,
# вторая меньше, третья - еще меньше и так далее
# Когда размер будет равен 0, перестанем рисовать

def dash_reduce(size):
# Это цикл "с условием"
# Он проверяет условие (как if).
# Только if делает одно действие,
# а while много: пока размер > 0
    while size > 0:
        pd()
        fd(size)
        pu()
        fd(size)
        size -= 20


t = turtle.Turtle()
t.shape("turtle")
t.width(5)
t.color('red')

dash_reduce(100)

turtle.done()

Задача Квадраты

Написать программу, которая рисует такие квадраты.

Самый маленький квадрат (size) рисуем первым. Все остальные квадраты больше на 20. Написать функцию def sqchain(размер), которая рисует такую картинку. Писать с while.

Функция рисует квадраты пока size < 300

Задача Круги

Самый большой круг (size) рисуем первым. Все остальные круги меньше на 20. Написать функцию def rings(size), которая рисует такую картинку. Писать с while.

Функция рисует круги пока size > 0

t.circle(100) - рисует 1 круг радиусом 100

Пример Наибольший общий делитель (НОД).

Есть 2 линии (size1 и size2). Нужно найти такую линию, чтобы из нее можно сделать линию size1 и size2.

Чтобы найти такую линию есть алгоритм Евклида.

HOD(a,b)=HOD(b, a%b). Ищем такие остатки пока a%b != 0.

import turtle
import math

def write(data):
    t.write(data, font=("Arial", 24, "normal"))

# Функция ищет наибольший отрезок (линию)
# для двух других
# Алгоритм Евклида
def nod(size1, size2):
    colors = ["blue", "red", "green", "yellow", "orange"]
    number = 0
    t.pd()
    write(size1)
    
    while size1 % size2 != 0:
        t.color(colors[(number) % 5])
        t.fd(size1)
        
        t.color(colors[(number+1) % 5])
        write(size2)
        t.fd(size2)
        t.bk(size2)
        
        t.pu()
        t.rt(90)
        t.fd(30)
        t.lt(90)
        t.pd()
        
        # найдем новый остаток:
                                # size1 = 123  size2 = 21
        tmp = size1             # tmp = 123
        size1 = size2           # size1 = 21  size2 = 21
        size2 = tmp % size2     # 123 % 21 = 18
                                # size1 = 21   size2 = 18
                                
        number += 1
        
    t.color(colors[(number+1)%5])
   
    return size2

t = turtle.Turtle()
t.shape("turtle")
t.width(5)

t.pu()
t.bk(400)
t.pd()

size = nod(228, 336)

write (size)

turtle.done()

Задача Наибольший общий делитель для квадратов

Написать функцию nod(size1, size2), которая ищет самый большой квадрат, из которого можно СОСТАВИТЬ квадрат size1 и квадрат size2.

Треугольные числа (пример)

Шары (круги) можно сложить в пирамиду:

Числа, из которых получается такая пирамида называются треугольными (1,3,6, 10, 15, 21...).

Можно написать программу, которая рисует такую пирамиду.

import turtle
import math

def write(data):
    t.write(data, font=("Arial", 24, "normal"))

def circle(size, color):
    t.begin_fill()
    t.color('black', color)
    t.circle(size)
    t.end_fill()


def line_circle(n, size, color):
    p0 = t.pos()
    
    t.seth(0)
    for i in range(n):
        t.pd()
        circle(size, color)
        t.pu()
        t.fd(2*size)
    
    t.goto(p0)
    
def next_level(size):
    t.pd()
    #h = 2 * size * math.cos(math.pi / 6)
    t.rt(120)
    t.fd(2 * size)
    t.lt(120)
    t.pu() 
    
def piramida(max_total, size):
    colors = ["blue", "red", "green", "yellow", "orange"]
    total = 0
    level = 0
    n = 1
    
    while total + n <= max_total:
        total += n
        line_circle(n, size, colors[level])
        next_level(size)
        write(total)
        level += 1
        n += 1
        
    return max_total - total

t = turtle.Turtle()
t.shape("turtle")
t.width(5)

ostatok = piramida(4, 50)

t.pu()
t.fd(50)
write(ostatok)

turtle.done()

Задача Кирпичная пирамида.

Построить пирамиду из кирпичей.

1. Написать функцию rect(size), которая рисует 1 кирпич. Стороны кирпича: size и size*2/3.

2. Написать функцию, line_rect(n, size), которая рисует полоску из n кирпичей.

3. Написать функцию piramida(max_total, size), которая рисует пирамиду из кирпичей. На первой линии - один кирпич, на второй - 2, на третьей - три и так далее. "Лишние" кирпичи в пирамиду не кладем.

4. Написать функцию all(max_total, size), которая из всех кирпичей рисует несколько пирамид (чтобы все кирпичи были собраны).