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

Циклы 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) получили рисунок (хорошо):

sq_3.png

При вызове sqn(200, 40, 7) получили рисунок (плохо, квадрат с отрицательной длиной стороны):

sq_7.png

Задача 1

Написать программу с функцией sqin(size, n) которая для sqin(200, 3) рисует так:

sq_in.png

Пробуем формулу

Надо нарисовать квадраты. Первый со стороной size. Каждый следующий на d меньше. Нарисовать сколько сможем квадратов, пока длина стороны у квадрата > 0.

Можно n не задавать, а вычислять. Придумаем формулу для 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
   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.

n = size / 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
  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()

Ввели:

200 40
Получили:

Ввели

200 70

Получили:

Не хватает 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()

spi1.png

Задача Веер

Самую большую линию рисуем первой. Ее длина 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), которая из всех кирпичей рисует несколько пирамид (чтобы все кирпичи были собраны).

Attachment sort Action Size Date Who Comment
sq_3.png manage 1.8 K 26 Mar 2020 - 11:26 TatyanaDerbysheva sqn(200, 40, 3)
sq_7.png manage 2.5 K 26 Mar 2020 - 11:27 TatyanaDerbysheva sqn(200, 40, 7)
sq_in.png manage 3.5 K 26 Mar 2020 - 11:27 TatyanaDerbysheva sqin(200, 3)