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

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

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

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

Для начала (некоторые примеры)

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

Программа, интересная и как тренажёр для учебной работы с координатами (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')

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

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

"Неожиданно полезная" для старшеклассников программа

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')

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

А здесь планируется показать "эволюцию" программы. Математическая тема:"Касательная к графику функции" (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 (Функция)