Практикум по программированию для школьников

Материал из ALT Linux Wiki

Тот, кто виноват в создании этой страницы :) предполагает, что здесь, прежде всего, будут размещены примеры программ, написанных на языке Python учащимися или с их участием. Хорошо, если эти программы будут такими, чтобы их можно было использовать в учебном процессе (по разным предметам, не только по информатике). Можно, впрочем, и не на питоне, можно и одну задачу решить на разных языках. Можно и не про образовательный процесс.

Некоторые программы, здесь уже размещённые, могут быть катастрофически не дописаны. Это очень хорошо, ведь над такой программой ещё можно работать.

Что написать

Визуализация гомотетии

Режим котиков

Заготовка

from tkinter import *
import math
okno = Tk()
okno.geometry('1500x700+10+10')
okno.resizable(False,False)
holst = Canvas(okno,width = 1500,height=700, bg = "white")
holst.create_line(450,350,1050,350, arrow = LAST)
holst.create_line(750,650,750,50,arrow = LAST)
alfa=170
r=200
x1=750+((r*0.6)*math.cos(math.radians(alfa*0.75)))
y1=350-((r*0.6)*math.sin(math.radians(alfa*0.75)))
holst.create_oval(x1-10,y1-10,x1+10,y1+10)
x2=750+((r*0.6)*math.cos(math.radians(alfa*0.25)))
y2=350-((r*0.6)*math.sin(math.radians(alfa*0.25)))
holst.create_oval(x2-10,y2-10,x2+10,y2+10)
holst.create_arc(750-r,350-r,750+r,350+r,start=0,extent=alfa)
x1=750+((r)*math.cos(math.radians(alfa*0.75+10)))
y1=350-((r)*math.sin(math.radians(alfa*0.75+10)))
x2=750+((r*1.2)*math.cos(math.radians(alfa*0.75)))
y2=350-((r*1.2)*math.sin(math.radians(alfa*0.75)))
holst.create_line(x1,y1,x2,y2)
x1=750+((r)*math.cos(math.radians(alfa*0.75-10)))
y1=350-((r)*math.sin(math.radians(alfa*0.75-10)))
holst.create_line(x1,y1,x2,y2)
x1=750+((r)*math.cos(math.radians(alfa*0.25+10)))
y1=350-((r)*math.sin(math.radians(alfa*0.25+10)))
x2=750+((r*1.2)*math.cos(math.radians(alfa*0.25)))
y2=350-((r*1.2)*math.sin(math.radians(alfa*0.25)))
holst.create_line(x1,y1,x2,y2)
x1=750+((r)*math.cos(math.radians(alfa*0.25-10)))
y1=350-((r)*math.sin(math.radians(alfa*0.25-10)))
holst.create_line(x1,y1,x2,y2)
holst.pack()

Примеры

Тренажёр для изучения координат

Программа, интересная и как тренажёр для учебной работы с координатами (5-7 класс) и как пример несложной программы, которую может написать (или разобраться в её коде) начинающий программист (8-9 класс)

from tkinter import *
import random
okno = Tk()
okno.geometry('1500x700+0+0')
koordinatkax=random.randint(-14,14)
koordinatkay=random.randint(-6,6)
holst = Canvas(okno, width=1500, height = 600, bg = "white")
holst.create_line(0,300,1500,300,fill="black",width=3,arrow=LAST)
holst.create_line(750,600,750,0,fill="black",width=3,arrow=LAST)
metka = Label(okno,font=20,text="Привет всем! Найди точку с координатами x = " + str(koordinatkax) + ",  y = " + str(koordinatkay))
metka.place(x = 0,y = 620)
metkaX = Label(holst,font=20,text="X")
metkaX.place(x = 1475,y =310)
metkaY = Label(holst,font=20,text="Y")
metkaY.place(x =760,y = 10)
#положительные метки Y
metka1Y = Label(holst,font=12,text="1")
metka1Y.place(x =725,y = 240)
metka2Y = Label(holst,font=20,text="2")
metka2Y.place(x =725,y = 190)
metka3Y = Label(holst,font=20,text="3")
metka3Y.place(x =725,y = 140)
metka4Y = Label(holst,font=20,text="4")
metka4Y.place(x =725,y = 90)
metka5Y = Label(holst,font=20,text="5")
metka5Y.place(x =725,y = 40)
#метка 0
metka0 = Label(holst,font=20,text="0")
metka0.place(x =725,y = 305)
#положительные метки X
metka1X = Label(holst,font=20,text="1")
metka1X.place(x =792,y = 308)
metka2X = Label(holst,font=20,text="2")
metka2X.place(x =842,y = 308)
metka3X = Label(holst,font=20,text="3")
metka3X.place(x =892,y = 308)
metka4X = Label(holst,font=20,text="4")
metka4X.place(x =942,y = 308)
metka5X = Label(holst,font=20,text="5")
metka5X.place(x =992,y = 308)
metka6X = Label(holst,font=20,text="6")
metka6X.place(x =1042,y = 308)
metka7X = Label(holst,font=20,text="7")
metka7X.place(x =1092,y = 308)
metka8X = Label(holst,font=20,text="8")
metka8X.place(x =1142,y = 308)
metka9X = Label(holst,font=20,text="9")
metka9X.place(x =1192,y = 308)
metka10X = Label(holst,font=20,text="10")
metka10X.place(x =1242,y = 308)
metka11X = Label(holst,font=20,text="11")
metka11X.place(x =1292,y = 308)
metka12X = Label(holst,font=20,text="12")
metka12X.place(x =1342,y = 308)
metka13X = Label(holst,font=20,text="13")
metka13X.place(x =1392,y = 308)
metka14X = Label(holst,font=20,text="14")
metka14X.place(x =1442,y = 308)
#отрицательные метки Y
metka1Y = Label(holst,font=20,text="-1")
metka1Y.place(x =725,y = 340)
metka2Y = Label(holst,font=20,text="-2")
metka2Y.place(x =725,y = 390)
metka3Y = Label(holst,font=20,text="-3")
metka3Y.place(x =725,y = 440)
metka4Y = Label(holst,font=20,text="-4")
metka4Y.place(x =725,y = 490)
metka5Y = Label(holst,font=20,text="-5")
metka5Y.place(x =725,y = 540)
#отрицательные метки X
metka1X = Label(holst,font=20,text="-1")
metka1X.place(x =692,y = 308)
metka2X = Label(holst,font=20,text="-2")
metka2X.place(x =642,y = 308)
metka3X = Label(holst,font=20,text="-3")
metka3X.place(x =592,y = 308)
metka4X = Label(holst,font=20,text="-4")
metka4X.place(x =542,y = 308)
metka5X = Label(holst,font=20,text="-5")
metka5X.place(x =492,y = 308)
metka6X = Label(holst,font=20,text="-6")
metka6X.place(x =442,y = 308)
metka7X = Label(holst,font=20,text="-7")
metka7X.place(x =392,y = 308)
metka8X = Label(holst,font=20,text="-8")
metka8X.place(x =342,y = 308)
metka9X = Label(holst,font=20,text="-9")
metka9X.place(x =292,y = 308)
metka10X = Label(holst,font=20,text="-10")
metka10X.place(x =242,y = 308)
metka11X = Label(holst,font=20,text="-11")
metka11X.place(x =192,y = 308)
metka12X = Label(holst,font=20,text="-12")
metka12X.place(x =142,y = 308)
metka13X = Label(holst,font=20,text="-13")
metka13X.place(x =92,y = 308)
metka14X = Label(holst,font=20,text="-14")
metka14X.place(x =42,y = 308)
for i in range(14):
    holst.create_line(0,50*i,1500,50*i,fill="black",width=1)
    holst.create_line(745,50*i,755,50*i,fill="black",width=3)
for i in range(30):
    holst.create_line(50*i,0,50*i,600,fill="black",width=1)
    holst.create_line(50*i,295,50*i,305,fill="black",width=3)
holst.place(x=0,y=0)
def najatie():
    global koordinatkax,koordinatkay
    koordinatkax=random.randint(-14,14)
    koordinatkay=random.randint(-6,6)
    metka = Label(okno,font=20,text="Привет всем! Найди точку с координатами x = " + str(koordinatkax) + ",  y = " + str(koordinatkay))
    metka.place(x = 0,y = 620)
knopka = Button(okno,width=20,height=1,bg="lightblue",text="Новое задание", command=najatie)
knopka.place(x = 50,y = 650)
def gdelevyklik(event):
    xo = koordinatkax*50+750
    yo = 300-koordinatkay*50
    if int(((event.x-xo)**2+(event.y-yo)**2)**0.5) < 5:
        okno.title("Молодец! Левая кнопка мыши нажата" + str(event.x) + " " + str(event.y))    
        holst.create_oval(event.x-3,event.y-3,event.x+3,event.y+3,fill="green")
    else:
        holst.create_oval(event.x-3,event.y-3,event.x+3,event.y+3,fill="red")
        okno.title("Не правильно! Левая кнопка мыши нажата" + str(event.x) + " " + str(event.y))    
holst.bind('<Button-1>', gdelevyklik)

Далее - несколько программ, которые могли бы быть объединены, но пока пусть будут отдельным и относительно небольшими.

Построения "циркулем" и "линейкой"

Серединный перпендикуляр "циркулем" и "линейкой"
from tkinter import *
import random
okno = Tk()
okno.geometry('1500x800+10+10')
okno.resizable(False,False)
holst = Canvas(okno,width = 1500,height=700, bg = "white")
holst.pack(expand='true')
tochki = [] #Массив точек
chislo_tochek = 0
rejim = 0
def rejim_otrezok():
  global chislo_tochek,rejim
  rejim = 1
  okno.title("Режим работы программы: ""Отрезок"" ")
  chislo_tochek = 0
  holst.bind('<Button-1>',shchyolk)
def rejim_okr():
  global chislo_tochek,rejim
  okno.title("Режим работы программы: ""Окружность"" ")
  rejim = 2
  chislo_tochek = 0
  holst.bind('<Button-1>',shchyolk2)
def shchyolk(event):
 global chislo_tochek,rejim
 global tochki
 tochki.append([event.x,event.y])
 print(tochki[chislo_tochek])
 holst.create_oval(event.x-3, event.y-3,event.x+3, event.y+3,fill="black")
 chislo_tochek = chislo_tochek + 1
 print(chislo_tochek)#для проверки
 print('rejim=',rejim)
 if (chislo_tochek == 2):
  holst.create_line(tochki[0][0],tochki[0][1],tochki[1][0],tochki[1][1])
  chislo_tochek = 0
  tochki = []
def shchyolk2(event):
 global chislo_tochek,rejim
 global tochki
 tochki.append([event.x,event.y])
 chislo_tochek = chislo_tochek + 1
 if chislo_tochek==1:
    holst.create_oval(event.x-2, event.y-2,event.x+2, event.y+2,fill="black")
 else: 
   R = ((tochki[0][0]-tochki[1][0])**2 + (tochki[0][1] - tochki[1][1])**2)**0.5
   holst.create_oval(tochki[0][0]-R, tochki[0][1]-R, tochki[0][0]+R,tochki[0][1]+R)
   chislo_tochek = 0
   tochki = []
knopka = Button(okno,width=12,height=1,bg="#f7a7cb",text="отрезок",command=rejim_otrezok)
knopka.pack(side = 'left')
knopka2 = Button(okno,width=12,height=1,bg="#a7f7c5",text="окружность",command=rejim_okr)
knopka2.pack(side = 'left')

Построение перпендикуляра

from tkinter import *
import random
okno = Tk()
okno.geometry('1500x800+10+10')
okno.resizable(False,False)
holst = Canvas(okno,width = 1500,height=700, bg = "white")
holst.pack(expand='true')
tochki = [] #Массив точек
chislo_tochek = 0
rejim = 0

def rejim_perp():
  global regim, chislo_tochek
  okno.title("Режим работы программы: ""Перпендикуляр"" ")
  rejim = 4
  chislo_tochek = 0
  tochki = []
  holst.bind('<Button-1>',perp)
def perp(event):
  global chislo_tochek
  global tochki
  tochki.append([event.x,event.y])
  chislo_tochek = chislo_tochek + 1
  holst.create_oval(event.x-3, event.y-3,event.x+3, event.y+3,fill="black")
  if (chislo_tochek == 2):
        holst.create_line(tochki[0][0],tochki[0][1],tochki[1][0],tochki[1][1])
  if (chislo_tochek == 3):        
    x = tochki[2][0]+50
    y = x*(tochki[0][0]-tochki[1][0])/(tochki[1][1]-tochki[0][1])-(tochki[2][0]*(tochki[0][0]-tochki[1][0])/(tochki[1][1]-tochki[0][1]))+tochki[2][1]
    holst.create_line(x,y,tochki[2][0],tochki[2][1])
    chislo_tochek = 0
    tochki = []
knopka_perp = Button(okno,width=12,height=1,bg="#a7f7c5",text="перпендикуляр",command=rejim_perp)
knopka_perp.pack(side = 'left')

Тригонометрическая окружность

А здесь планируется показать "эволюцию" программы. "Эволюционировать" программа будет в направлении использования переменных вместо констант, использования функций.

Она, родимая :)

"Неожиданно полезная" для старшеклассников программа. Пишем вместе с учащимися 10-11 классов, используем с ними же.

from tkinter import *
import math
import random
okno = Tk()
okno.geometry('1500x800+10+10')
okno.resizable(False,False)
holst = Canvas(okno,width = 1500,height=700, bg = "white")
#центр круга 750 350, радиус 200
ugol = math.radians(30) # угол пока задаётся прямо здесь (в коде)
holst.create_oval(750+200*math.cos(ugol)-5,350-200*math.sin(ugol)-5,750+200*math.cos(ugol)+5,350-200*math.sin(ugol)+5,fill="black")
holst.create_line(750,350,750+200*math.cos(ugol),350-200*math.sin(ugol))
holst.create_oval(550,150,950,550)
holst.create_line(450,350,1050,350, arrow = LAST)
holst.create_line(750,650,750,50,arrow = LAST)
holst.pack(expand='true')

Версия 2

Нескучные розовые кнопки :) Пока не работают отрицательные углы и углы, большие 2*pi

from tkinter import *
import math
import random
okno = Tk()
okno.geometry('1500x700+10+10')
okno.resizable(False,False)
holst = Canvas(okno,width = 1500,height=700, bg = "#aaaaaa")
#центр круга 750 350, радиус 200
stavni_entry = Entry(width = 5)
stavni_entry.place(x=100,y = 550)
metka = Label(text = "Введи сюда градусную меру угла")
metka.place(x = 100,y = 520)
def ula ():
    delta = random.randint(50,100)
    ugol = math.radians(int(stavni_entry.get()))# вводим угол в градусах берем из entry и преобразуем в радианы
    holst.create_oval(750+200*math.cos(ugol)-5,350-200*math.sin(ugol)-5,750+200*math.cos(ugol)+5,350-200*math.sin(ugol)+5,fill="red",tags='fear')
    holst.create_line(750,350,750+200*math.cos(ugol),350-200*math.sin(ugol), width = 3, fill = 'red', tags = 'del')
    xs = 750+(delta*math.cos(ugol))
    ys = 350-(delta*math.sin(ugol))
    holst.create_line(xs,ys,xs+10*math.cos(math.radians(int(stavni_entry.get())-45)),ys-10*math.sin(math.radians(int(stavni_entry.get())-45)),width = 2, tags = 'del')
    holst.create_line(xs,ys,xs+10*math.cos(math.radians(int(stavni_entry.get())-135)),ys-10*math.sin(math.radians(int(stavni_entry.get())-135)),width = 2, tags = 'del')
    #holst.create_oval(xs-5,ys-5,xs+5,ys+5,fill="red")
    holst.create_arc(750-delta,350-delta,750+delta,350+delta,start=0, extent=int(stavni_entry.get()), tags = 'del')
def sotri():
    holst.delete("del")
knopka2 = Button(okno,width=15,text="Удалить углы!",bg="pink",command=sotri)
knopka2.place(x=1100,y=600)
holst.create_oval(550,150,950,550)
knopka = Button(okno,width=15,text="Построй угол!",bg="pink",command=ula)
knopka.place(x=100,y=600)
holst.create_line(450,350,1050,350, arrow = LAST)
holst.create_line(750,650,750,50,arrow = LAST)
holst.pack(expand='true')

Касательная к графику

Математическая тема:"Касательная к графику функции" (10 класс).

Версия 1 ("детская")

from tkinter import *
from math import *
okno = Tk ()
okno.geometry('1000x600+100+100')
canv = Canvas(okno, width = 1000, height = 500, bg = "white")
canv.create_line(0, 250, 1000, 250, fill="black", width=2, arrow=LAST)
canv.create_line(500, 500, 500, 0, fill="black", width=2, arrow=LAST)
canv.place(x=0,y=0)
x_n = -3
x_k = 3
x1 = x_n
Mas = 50
while x1 < x_k:
    y1 = x1**2 - 1
    x2 = x1 + 0.1
    y2 = x2**2 - 1
    canv.create_line(x1*Mas + 500, 250 - y1*Mas, x2*Mas + 500, 250 - y2*Mas, fill="black", width=2)
    x1 = x2

Версия 2 (Вводим переменные)

Зачем нужны переменные

Версия 3 (Функция)

Задачи с параметром

Любите лы Вы задачи с параметром? А любят ли они вас? :) В смысле, получаются ли? Если не очень получаются, то, возможно, Вас "спасёт" следующая программа.

from tkinter import *
okno = Tk ()
okno.geometry('1500x900+10+10')
okno.configure(bg = "#dddddd")
centrx = 750
centry = 400
metka = Label(okno, text = str(centrx)+"   "+str(centry))
metka.place(x=10,y=800)
canv = Canvas(okno, width=centrx*2, height = centry*2, bg = "white")
canv.create_line(0,centry,centrx*2,centry,fill="black",width=2,arrow=LAST)
canv.create_line(centrx,centry*2,centrx,0,fill="black",width=2,arrow=LAST)
canv.create_line(900,0,900,800,fill="black",width=2)
canv.place(x=0,y=0)
metkay = Label(canv, text = "Y")
metkay.place(x=centrx+20,y=10)
metkax = Label(canv, text = "X")
metkax.place(x=centrx*2-20,y=centry+20)
#
mas = 50
xn = -10
xk = 10
x = xn
a = 1
while x < xk:
    y = 5/(x+2)
    x2 = x+0.1
    y2 = 5/(x2+2)
    canv.create_line(750+(x*mas),400-(y*mas),750+(x2*mas),400-(y2*mas),fill="green",width=3)
    x = x2
i=0
for i in range (-3,7):
 x = xn
 while x < xk:
    y = i
    x2 = x+0.1
    y2 = i
    canv.create_line(750+(x*mas),400-(y*mas),750+(x2*mas),400-(y2*mas),fill="red",width=3)
    x = x2
x=xn
while x < xk:
    y = x**2-2
    x2 = x+0.1
    y2 = x2**2-2
    canv.create_line(750+(x*mas),400-(y*mas),750+(x2*mas),400-(y2*mas),fill="blue",width=3)
    x = x2
okno.mainloop ()

Игры

Монетки

"Нестареющая классика". Взвешиваем монетки.

Первый этап

from tkinter import*
okno=Tk()
okno.geometry("1400x700+10+10")

sp = [1,1,1,1,0,1,1,0,1,1]
print(sp)
N1 = int(input("введите номер первой монеты, которую хотите взвесить"))
N2 = int(input("введите номер второй монеты, которую хотите взвесить"))
if sp[N1] > sp[N2]:
    print("первая монета перевесила")
elif sp[N1] < sp[N2]:
    print("вторая монета перевесила")
else:
    print("равновесие")

Игрушка с геометрическим смыслом

from tkinter import *
from math import *
center_x = 500
center_y = 200
radius = 150
okno = Tk()
okno.geometry('1000x500+10+10')
okno.resizable(False,False)
holst = Canvas(okno, width=center_x * 2, height=center_y * 2, bg='#F0F0F0')
holst.place(x=0,y=0)
mass = []
n = 3
def draw_the_line_bigger():
    global n
    n = n + 1
    metka1.config(text = 'Количество углов ' + str(n))
    holst.create_oval(center_x - radius,center_y - radius,center_x + radius,center_y + radius,fill="#3b4893")
    mass = []
    for i in range(n):
        mass.append(center_x +(radius*cos(2*i*pi/n)))
        mass.append(center_y -(radius*sin(2*i*pi/n)))
    holst.create_polygon(mass,fill="#e0ef1d")
    
def draw_the_line_smaller():
    global n
    if n > 3:
        n = n - 1
        metka1.config(text = 'Количество углов ' + str(n))
    holst.create_oval(center_x - radius,center_y - radius,center_x + radius,center_y + radius,fill="#3b4893")
    mass = []
    for i in range(n):
        mass.append(center_x +(radius*cos(2*i*pi/n)))
        mass.append(center_y -(radius*sin(2*i*pi/n)))
    holst.create_polygon(mass,fill="#e0ef1d")     
    
knopka1=Button(width=5,height=2,text="-", command = draw_the_line_smaller)
knopka1.place(x=round(center_x/4),y=center_y * 2 + 10)
knopka2=Button(width=5,height=2,text="+", command = draw_the_line_bigger)
knopka2.place(x=round((center_x*2)*3 / 4),y=center_y * 2 + 10)
metka1 = Label(text = 'Количество углов ' + str(n))
metka1.place(x = center_x - 70, y = center_y * 2 + 10)
holst.create_oval(center_x - radius,center_y - radius,center_x + radius,center_y + radius,fill="#3b4893")
for i in range(n):
    mass.append(center_x +(radius*cos(2*i*pi/n)))
    mass.append(center_y -(radius*sin(2*i*pi/n)))
holst.create_polygon(mass,fill="#e0ef1d")