Циклы while
Проблема
Хотим нарисовать n квадратов. Первый квадрат со стороной size, следующие на d меньше.
import turtle
t = turtle.Turtle()
# рисуем 1 квадрат
def sq(size):
for i in range(4):
t.fd(size)
t.lt(90)
# рисуем n квадратов, первый со стороной size, следующие на d меньше
def sqn(size, d, n):
for i in range(n):
sq(size) # 1 квадрат
size = size - d # сторона следующего квадрата меньше на d
# так рисуем 3 квадрата, первый со стороной 200, остальные на 40 меньше
# sqn(200, 40, 3)
# тут вводим с клавиатуры, а потом рисуем
s0, d, n = map(int, input().split())
sqn(s0, d, n)
При вызове sqn(200, 40, 3) получили рисунок (хорошо):
При вызове sqn(200, 40, 7) получили рисунок (плохо, квадрат с отрицательной длиной стороны):
Задача 1
Написать программу с функцией
sqin(size, n) которая для
sqin(200, 3) рисует так:
Пробуем формулу
Надо нарисовать квадраты. Первый со стороной size. Каждый следующий на d меньше. Нарисовать сколько сможем квадратов, пока длина стороны у квадрата > 0.
Можно n не задавать, а вычислять. Придумаем формулу для n.
Изменяем код и проверяем:
import turtle
t = turtle.Turtle()
# рисуем 1 квадрат
def sq(size):
for i in range(4):
t.fd(size)
t.lt(90)
# рисуем сколько сможем квадратов, первый со стороной size, следующие на d меньше
def sqn(size, d):
n = size / d
for i in range(n):
sq(size) # 1 квадрат
size = size - d # сторона следующего квадрата меньше на d
# тут вводим с клавиатуры, а потом рисуем
s0, d = map(int, input().split())
sqn(s0, d)
Напишем формулу
Напишем формулу для n. Которая вычисляет n по size и d.
Напишем формулу в программу:
import turtle
t = turtle.Turtle()
# рисуем 1 квадрат
def sq(size):
for i in range(4):
t.fd(size)
t.lt(90)
# рисуем сколько сможем квадратов, первый со стороной size, следующие на d меньше
def sqn(size, d):
n = size / d
t.write(n)
for i in range(n):
sq(size) # 1 квадрат
size = size - d # сторона следующего квадрата меньше на d
# тут вводим с клавиатуры, а потом рисуем
s0, d = map(int, input().split())
sqn(s0, d)
turtle.done()
Ввели:
Получили:
Ввели
Получили:
Не хватает 1 квадрата со стороной 140. Поправьте формулу сами.
Цикл while
Можем написать цикл, который САМ РЕШАЕТ когда закончить работу.
Можно не считать, сколько надо рисовать квадратов, а рисовать пока size > 0.
Используем для этого цикл
while
# команды до цикла
while условие :
команды # выполняем много раз, пока условие да
# команды после цикла
Если условие да (True), то команды выполняются. Если условие стало нет (False), то команды не выполняются и делаем команды после цикла (если есть).
import turtle
t = turtle.Turtle()
# рисуем 1 квадрат
def sq(size):
for i in range(4):
t.fd(size)
t.lt(90)
# рисуем n квадратов, первый со стороной size, следующие на d меньше
def sqall(size, d):
while size > 0: # пока size > 0 делай:
sq(size) # 1 квадрат
size = size - d # сторона следующего квадрата меньше на d
# тут вводим с клавиатуры, а потом рисуем
s0, d = map(int, input().split())
sqall(s0, d)
turtle.done()
Пример: спираль внутрь - пока можно рисовать
Когда рисовали спираль из центра наружу, мы задавали
n
количество отрезков спирали.
Можно задавать размер
size_start
размер самого большого отрезка,
d
- на сколько уменьшается следующий отрезок.
Не считать, сколько поместится отрезков, а написать "рисуй, пока длина отрезка > 0"
# -*- 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()
Задача Веер
Самую большую линию рисуем первой. Ее длина
size
. Каждую следующую линию рисуем меньше на
d
. Каждый раз поворачиваемся на угол
ang
.
Рисуем, пока длина линии > 0.
1 веер рисует функция
veer(size, d, ang)
Задача 3. Вложенные квадраты > 50
Нарисовать вложенные квадраты с помощью функции sqin(size), пока size больше 50.
sqin(200) нарисует:
Задача 4. Вложенные квадраты больше sizemin
Измените программу с функцией
sqall(size, d, sizemin)
Функция должна рисовать синие (blue) квадраты начиная от
size, каждый следующий на
d меньше.
Нарисовать все синие квадраты больше
sizemin.
Нарисовать 1 красный квадрат размера
sizemin.
Пример 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), которая из всех кирпичей рисует несколько пирамид (чтобы все кирпичи были собраны).
- sqn(200, 40, 3):
- sqn(200, 40, 7):
- sqin(200, 3):