Python-сообщество
- Начало
- » Python для новичков
- » Кривая елочка в Python
#1 Ноя. 28, 2022 14:24:52
MaksimVladimirov Зарегистрирован: 2022-11-28 Сообщения: 3 Репутация: 0 Профиль Отправить e-mail
Кривая елочка в Python
Здравствуйте! В колледже мне задали сделать новогоднею елочку с N этажами. Я сделал все что было в моих силах. Вопрос заключается в том как ее сделать ровной, у меня она как пизанская башня. Буду очень Вам благодарен! Жду ответа)
n = int(input("dd: ")) k = int(input("dd2: ")) p = 1 def christmas_tree(n): p = 1 for x in range(k + 1): for i in range(p, n + 1): print(" "*(n+n-i), "*"*(2*i+1)) p = p+2 n = n+1 christmas_tree(n)

Прикреплённый файлы:
pythonProject5 – mon.py 28.11.2022 14_03_56.png (52,6 KБ)
#2 Ноя. 28, 2022 16:14:37
Rodegast От: Пятигорск Зарегистрирован: 2007-12-28 Сообщения: 2640 Репутация: 179 Профиль Отправить e-mail
Кривая елочка в Python
dd = 10 dd2 = 3 def vetka(i): l = (dd*2-i)//2 return ' '*l + '*'*i + ' '*l def konus(): return "\n".join( vetka(x) for x in range(dd*2) if x%2 ) print("\n".join( konus() for x in range(dd2)))
С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.
#3 Ноя. 28, 2022 16:25:21
MaksimVladimirov Зарегистрирован: 2022-11-28 Сообщения: 3 Репутация: 0 Профиль Отправить e-mail
Кривая елочка в Python
Cпасибо, но Ваш код без соединений, получилось так что просто про дублировались треугольники, а надо чтоб был треугольник в треугольнике и сверху в низ она расширялась. У меня все это сделано, фотографию прикреплял, но она кривая! Как сделать ее ровной?
#4 Ноя. 28, 2022 16:35:39
Rodegast От: Пятигорск Зарегистрирован: 2007-12-28 Сообщения: 2640 Репутация: 179 Профиль Отправить e-mail
Кривая елочка в Python
print("\n".join( konus()[x*dd*2:] for x in range(dd2)))
С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.
Вывод последовательности/массива «ёлочкой», «пирамидой» — пример решения (вложенные циклы)
![]()
Выведите его на экран «ёлочкой» последовательности чисел до $N$.
Например для $N=12$ вы должны получить:
1 2 3 4 5 6 7 8 9 10 11 12 .
Эту задачу можно решить используя два подхода:
- Просто перебрать (обойти) массив (а в данном случае просто последовательность) так как мы это делаем для вывода элементов в строчку, но в определённые моменты выводить между элементами знак переноса строки и таким образом получить ёлочку.
- Рассмотреть ёлочку как таблицу из нескольких строк (их может быть и очень много) в которой каждая следующая строка длиннее предыдущей на $1$, а первая по своей длине $=1$.
Решение с циклом одного уровня
В этом подходе мы просто перебираем все числа до $n$ в цикле for, в каждом витке выводя очередное значение + иногда перенося строку:
var n, i, j, k:integer; begin writeln('vvedite chislo N:'); readln(n); // получаем число, до которого будем выводить ёлочку k:=1; // число символов которые можно вывести не перенося строку j:=0; // сколько мы вывели с последего переноса строки for i:=1 to N do begin write(i, ' '); // просто выводим в ждом витке j := j + 1; // учтём, что мы вывели ещё один символ (для будущего переноса) if (j>=k) then // не пора ли переносить строку? begin writeln(); // перенос строки j:=0; // в новой строке ёлочки мы ещё ничего не вывели (сбрасываем счетчик) k:=k+1; // следубщий раз выведем на 1 символ больше до переноса строки end; end; readln(); end.
Решение через вложенные циклы
Здесь мы рассмотрим код, иллюстрирующий второй подход:
Рассмотреть ёлочку как таблицу из нескольких строк (их может быть и очень много) в которой каждая следующая строка длиннее предыдущей на $1$, на первая по своей длине $=1$.
Ясно, что в таблице может быть сколько угодно строк (внешний цикл) + нам потребуется выводить каждую строку посимвольно (внутренний цикл).
При этом внешний цикл просто запускает вывод очередной строки и ничего не знает о том как именно эти строки выводятся — его задача состоит просто в том, чтобы контролировать диапазон значений и заново запускать цикл вывода строки.
Очередной внутренний цикл вывода строки начинает свою работу с того значения $i$, на котором он остановился предыдущий раз. Поэтому мы инкрементируем $i$ в единственном месте — а именно сразу после вывода на экран очередного значения.
var n, i, j, k:integer; begin writeln('vvedite chislo N:'); readln(n); // получаем число, до которого будем выводить ёлочку i:=1; k:=1; while (i<=n) do // просто контролируем диапазон begin for j:=1 to k do // вывод очередной строки begin if (i<=n) then // если мы всё ещё в диапазоне begin write(i, ' '); // выводим очередное значение (с пробелом) i:=i+1; // готовим следующее end else break; // досрочный выход из цикла end; writeln(); // переносим строку k:=k+1; // следующая строка будет длиннее на 1 символ end; readln(); end.
Массив как источник данных
Безусловно, мы можем использовать в качестве источника данных для ёлочки и одномерный массив (в программе для инициализации его случайными числами используется процедура -- решим задачу первым способом без вложенных циклов с одним источником данных):
var n, i, j, k:integer; a: array [1..17] of integer; // процедура заполнит массив случайными числами procedure initRandArray(var a: array of integer); var min, max, i: integer; begin randomize(); // инициал. датчик случайных чисел (вызов стандартной процедуры) min := -5; // левая граница max := 10; // правая граница < обходим переданный массив и инициализируем массив случайными числами>for i:=low(a) to high(a) do a[i] := random(max + abs(min)) + min; end; begin // начало тела программы N := 17; // число элементов массива initRandArray(a); // передаём по ссылке для заполнения случаными числами k:=1; // число символов которые можно вывести не перенося строку j:=0; // сколько мы вывели с последего переноса строки for i:=1 to N do begin write(a[i], ' '); // выводим очередной элемент массива j := j + 1; // учтём, что мы вывели ещё один символ (для будущего переноса строки) if (j>=k) then // не пора ли переносить строку? begin writeln(); // перенос строки j:=0; // в новой строке ёлочки мы ещё ничего не вывели (сбрасываем счетчик) k:=k+1; // следубщий раз выведем на 1 символ больше до переноса строки end; end; readln(); end.
Key Words for FKN + antitotal forum (CS VSU):
- ёлочка
- вывод поледовательности ёлочкой пирамидой
- вложенные циклы
- примеры решений задач на вложенные циклы
- вложенные циклы ёлочка Паскаль
Зачет
Для зачета требуется набрать 13 баллов. Для этого необходимо решить решить ВСЕ. нерешенные контрольные, а также задачи по непокрытым темам. Входные параметры для всех задач задавайте с помощью argparse либо sys.argv
Темы занятий
1.Введение. Python как калькулятор. Стандартные типы. Переменные.
2. Графические программы в Python.
3. Функции. События в графическом интерфейсе.
4. Классы и объекты.
5. Контрольная работа
6. Файлы, строки, словари.
7. Регулярные выражения. Форматирование выдачи.
8. Параметры командной строки. Работа с html в python.
9. Контрольная работа
11. Классы и объекты 2. Исключения.
12. Контрольная работа
Задачи
- Описание формата ClustAl.
- Примеры множественных выравниваний в формате ClustAl (Берете файлы с расширением .clustalw)
- Пример выравнивания в формате FASTA
- Примеры выравниваний в формате stokholm
- Примеры бактериальных геномов в формате GenBank.
- 2: (1 балл) Нарисуйте дом, состоящий как минимум из двух прямоугольников (корпус дома и окно), треугольной крыши, и три звезды над ним в случайных местах.
- 2: (1 балл) Нарисуйте ёлку из несколких треугольников. Нарисуйте на ней разноцветные (случайных цветов) шарики в случайных местах
- 2: (1 балл) Нарисуйте дом, состоящий как минимум из двух прямоугольников (корпус дома и окно), треугольной крыши, и N звезды над ним в случайных местах. Звезды не могут быть под домом и не могут пересекаться с домом.
- 2: (1 балл) Нарисуйте N ёлок из несколких треугольников в случайных местах. С вероятностью 1/2 ёлка имеет на себе шарики.
- 2: (1 балл) Создайте список случайных чисел от 0 до 100. Постройте список пар, в которых первое число соответствует элементу исходного списка, а второе является результатом преобразования x+случайное число от -50 до 50. Нарисуйте точки, такие что первое число в паре соответствует координате x, второе - координате y данных точек.
- 3: (1 балл) Нарисуйте дом, состоящий как минимум из двух прямоугольников (корпус дома и окно), треугольной крыши, и N звезды над ним в случайных местах. Звезды не могут быть под домом и не могут пересекаться с домом. Звездочки должны мигать с такой частотой, чтобы было красиво.
- 3: (1 балл) Нарисуйте N ёлок из несколких треугольников в случайных местах. Сверху должны падать снежинки.
- 4: (1 балл) Нарисуйте N ёлок из несколких треугольников в случайных местах. Каждая ёлка является объектом класса ChristmasTree. По клику мыши все елки меняют свое положение на случайное.
- 4: (1 балл) Нарисуйте N воздушных шариков из овала, маленького треугольника и линии в случайных местах (цвета шариков также случайные). Каждый шарик является объектом класса Balloon. При нажатии на левую кнопку мыши шарики медленно летят вверх.
- 5 кр1: (1 балл) Задача из 2 занятия.
- 5 кр1: (2 балла) Нарисуйте несколько кружков фиксированного радиуса в случайных местах. Сделайте так, чтобы мышью можно было бы перетаскивать эти кружки.
- 6: (1 балл) Прочесть из файла координаты x и у точек и их цвета. Нарисовать данные точки соответствующими цветами. В файле могут быть пустые строки и строки с комментариями (начинаются с символа #), которые нужно игнорировать.
#set 1 10 100 green 100 50 red #set 2 10 10 yellow
>gi|5524211|gb|AAD44166.1| cytochrome b [Elephas maximus maximus] LCLYTHIGRNIYYGSYLYSETWNTGIMLLLITMATAFMGYVLPWGQMSFWGATVITNLFSAIPYIGTNLV EWIWGGFSVDKATLNRFFAFHFILPFTMVALAGVHLTFLHETGSNNPLGLTSDSDKIPFHPYYTIKDFLG LLILILLLLLLALLSPDMLGDPDNHMPADPLNTPLHIKPEWYFLFAYAILRSVPNKLGGVLALFLSIVIL GLMPFLHTSKHRSMMLRPLSQALFWTLTMDLLTLTWIGSQPVEYPYTIIGQMASILYFSIILAFLPIAGX IENY >MCHU - Calmodulin - Human, rabbit, bovine, rat, and chicken ADQLTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTID FPEFLTMMARKMKDTDSEEEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREA DIDGDGQVNYEEFVQMMTAK
Простое рисование с помощью черепашки¶
У неё есть функции в стиле turtle.forward(. ) и turtle.left(. ) , с помощью которых черепашка может двигаться.
Перед тем как начать работу с черепашкой, необходимо импортировать соответствующий модуль. Мы рекомендуем экспериментировать с ней в интерактивной оболочке (для начала), т.к. при использовании файлов придётся заниматься дополнительной утомительной работой. Перейди в терминал и введи:
import turtle

Not seeing anything on Mac OS? Try issuing a command like turtle.forward(0) and looking if a new window opened behind your command line.
Используешь Ubuntu и получаешь сообщение об ошибке “No module named _tkinter”? Установи отсутствующий необходимый пакет: sudo apt-get install python3-tk
While it might be tempting to just copy and paste what’s written on this page into your terminal, we encourage you to type out each command. Typing gets the syntax under your fingers (building that muscle memory!) and can even help avoid strange syntax errors.
turtle.forward(25)

turtle.left(30)

Функция turtle.forward(. ) заставляет черепашку двигаться вперёд на указанное расстояние. turtle.left(. ) приказывает черепашке повернуться влево на указанную градусную меру угла. А turtle.backward(. ) и turtle.right(. ) действуют анлогично — первая заставляет черепашку двигаться назад, а вторая — поворачиваться вправо.
Если ты хочешь начать заново, введи turtle.reset() , чтобы стереть рисунок. Мы рассмотрим turtle.reset() подробнее немного позже.
Стандартная “черепашка” – всего лишь треугольник. Это не интересно! Придадим ей нормальный вид командой turtle.shape() :
turtle.shape("turtle")
Так намного лучше!
If you put the commands into a file, you might have recognized that the turtle window vanishes after the turtle finished its movement. (That is because Python exits when your turtle has finished moving. Since the turtle window belongs to Python, it terminates as well.) To prevent that, just put turtle.exitonclick() at the bottom of your file. Now the window stays open until you click on it:
import turtle turtle.shape("turtle") turtle.forward(25) turtle.exitonclick()
Python — язык программирования, в котором крайне важны отступы в коде. Подробности мы узнаем позже, в главах про функции, но сейчас тебе просто необходимо запомнить, что лишний пробел или символ табуляции перед строкой может вызвать ошибку.
Рисуем квадрат¶
You’re not always expected to know the anwer immediately. Learn by trial and error! Experiment, see what python does when you tell it different things, what gives beautiful (although sometimes unexpected) results and what gives errors. If you want to keep playing with something you learned that creates interesting results, that’s OK too. Don’t hesitate to try and fail and learn from it!
Упражнение¶
Нарисуй квадрат, как на рисунке ниже:

Для квадрата тебе понадобится прямоугольный, т.е. 90-градусный, угол.
Решение¶
turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90)
Notice how the turtle starts and finishes in the same place and facing the same direction, before and after drawing the square. This is a useful convention to follow, it makes it easier to draw multiple shapes later on.
Дополнительно¶
If you want to get creative, you can modify your shape with the turtle.width(. ) and turtle.color(. ) functions. How do you use these functions? Before you can use a function you need to know its signature (for example the number of parameters and what they mean.) To find this out you can type help(turtle.color) into the Python shell. If there is a lot of text, Python will put the help text into a pager, which lets you page up and down. Press the q key to exit the pager.
Видишь такую ошибку:
NameError: name 'turtle' is not defined
когда пытаешься просмотреть справку? В Python необходимо импортировать имена, перед тем, как обращаться к ним, т.е. в нашем случае необходимо выполнить import turtle перед help(turtle.color) .
Также найти информацию о функциях можно в онлайн-документации.
Если ты допустил ошибку, то ты можешь воспользоваться командой turtle.reset() , чтобы стереть рисунок, либо командой turtle.undo() ., чтобы отменить последние действия.
As you might have read in the help, you can modify the color with turtle.color( colorstring ) . These include but are not limited to “red,” “green,” and “violet.” See the colours manual for an extensive list.
Рисуем прямоугольник¶
Упражнение¶
Ты тоже можешь нарисовать прямоугольник?

Решение¶
turtle.forward(100) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(100) turtle.left(90) turtle.forward(50) turtle.left(90)
Дополнительно¶
How about a triangle? In an equilateral triangle (a triangle with all sides of equal length) each corner has an angle of 60 degrees.
Больше квадратов¶
Упражнение¶
Now, draw a tilted square. And another one, and another one. You can experiment with the angles between the individual squares.

На изображении показан поворот черепашки на 20 градусов. Ты же можешь попробовать, например, 30 или 40.
Решение¶
turtle.left(20) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.left(30) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.left(40) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90)
© Авторские права 2012–2014, OpenTechSchool and contributors.
Создано с помощью Sphinx 1.3.1.
