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

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

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

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

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

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

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

from tkinter import *
import random
okno = Tk()
okno.geometry('1500x700+0+0')
koordinatkax=random.randint(-15,15)
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=20,text="1")
metka1Y.place(x =725,y = 240)
#метка 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)
#отрицательные метки Y
metka1Y = Label(holst,font=20,text="-1")
metka1Y.place(x =725,y = 340)
#отрицательные метки X
metka1X = Label(holst,font=20,text="-1")
metka1X.place(x =692,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)
knopka = Button(okno)
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))    
    else:
        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')