Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
vx = -vx или vy = -vy под условиями. Таких случаев будет 4 (не надо сокращать до двух:) ), и если рефлексы обучаемого правильно развиты, он захочет выделить эту физику в функцию. Реализовав ее, увидим, что шарик стоит на месте. Тут как раз очень удобно объяснить, что при вызове функции значения переменных скопируются и драматически проиграть эту ситуацию с листочками, на которых написаны значения — в конце «исполнения» листочки-копии с обновленными значениями торжественно разрываются и выбрасываются. Чтобы отменить копирование, надо передать не значение-копию, а информацию о месте, где лежит листочек-оригинал, т.е. его адрес. Далее см. объяснение выше. (Плюс есть еще пара аллегорий на тему копирования и указателей, которые придумались за время таких объяснений.)return (даже если он знает, что это такое), а передавать переменную по указателю. Часто это сочетается с неразборчивостью форм передачи переменной (проще говоря, он все начинает передавать по указателю, ему так проще, т.к. не надо тщательно продумывать о роли переменных) — далее это ведет к спутанности логики и неудачной архитектуре. Синтаксический сахар в виде ссылок здесь приводит к синтаксическому «диабету» и провоцирует эту спутанность, т.к. не надо думать даже о синтаксисе. Склонность некоторых паскалистов передавать параметры как var (через ссылки) имеет ту же природу.hypot не рассказываем). Если дети не знают теоремы Пифагора, то можно работать через txGetPixel, но тогда их потребуется несколько, чтобы учесть размеры объектов — это тоже мотивация для рефакторинга с выделением кода в функцию.return-ом). Кроме того, функции игры часто полезно возвращать значение {проиграл, выиграл, прервал игру, что-то еще} для какой-либо индикации или действий в главном меню (например, break из цикла или rerurn из main).return. Хотя в принципе, если группа сильная и уверенность в ней есть, можно return давать и после указателей. Главное, чтобы произошло не вытеснение одного метода передачи результата другим, а грамотная расстановка акцентов. В слабой группе это не всегда просто дается, и тогда я не рискую и разношу методы по времени. (Возможно, я выше был слишком категоричен в вопросе о последовательности.)#include <stdio.h> //включили (include) в программу модуль ввода-вывода
int main() //начало главного (main) фрагмента программы
{ //начало
printf("Hello, world!\n"); //напечатать (print) на экран строку
return 0; //вернуть количество ошибок - ошибок нет, возвращаем 0
} //конец
Нужна статическая типизация — это полностью укладывается в принцип «учить хорошему».
struct Rect {
int leftPos;
int topPos;
int width;
int height;
}
bool isInside(Rect rect, int x, int y)
{
bool xInside = (x >= rect.leftPos) && (x <= rect.leftPos + rect.width);
bool yInside = (y >= rect.topPos) && (y <= rect.topPos + rect.height);
return xInside && yInside;
}
(def rect {:leftPos 1
:topPos 2
:width 3
:height 4})
(defn inside? [rect x y]
(let [{:keys [leftPos topPos width height]} rect
x-inside? (<= leftPos x (+ leftPos width))
y-inside? (<= topPos y (+ topPos height))]
(and x-inside? y-inside?)))
(define (left-pos rect) (car rect))
(define (top-pos rect) (cadr rect))
(define (width rect) (caddr rect))
(define (height rect) (cadddr rect))
(define (in? x low hi)
(and (>= x low) (<= x hi)))
(define (inside? rect x y)
(and
(in? x (left-pos rect) (+ (left-pos rect) (width rect)))
(in? y (top-pos rect) (+ (top-pos rect) (height rect)))))
(inside? (list 0 0 30 40) 20 30)
(define (discriminant a b c)
(- (* b b) (* 4 a c)))
(define (solve a b c)
(let ((d (discriminant a b c)))
(cond ((< d 0) (error "уравнение не имеет действительных корней"))
((= d 0) (- (/ b (* 2 a))))
(else (list (/ (+ (- b) (sqrt d)) (* 2 a))
(/ (- (- b) (sqrt d)) (* 2 a)))))))
(solve 1 8 7)
Преподаватель должен обладать опытом практического программирования
но не учат намного более важному умению — применять их для решения возникающих на практике задач
в школе учат не решению проблем с помощью программирования, не разработке программ, а лишь языку программирования как таковому
Мне кажется, что наибольшего успеха можно достичь, начиная обучать учеников 8-9 класса — в дальнейшем обучаемость снижается.
его ученики уже в 9-11 классе пишут программы, по сложности соответствующие 3-4 курсу технического вуза (!) — компиляторы
Вот, почти сходу на его сайте нашлось: Платформа для машинно-независимого исполнения программного кода с возможностью JIT-компиляции
code source=pl2 name=example1
namespace start \ начальное знакомство с языком программирования PL2 \
{
}
/code
code source=pl2 name=example2
using user.OS.IO; // взаимодействие пользователя с компьютером средствами операционной системы
using pl2.translator.system; // взаимодействие с транслятором
namespace start \ начальное знакомство с языком программирования PL2 \
{
class Example2 \ класс для проверки работоспособности транслятора \
{
static void main \ программа для запуска средствами операционной системы \
(String arguments \параметры командной строки выполняемого файла\ [])
{
String string_for_out \ строка для вывода \
:= "Здравствуй, мир!";
Console.write_line(string_for_out);
}
}
}
/code
code source=text name=example_3_text
Пример выводимого текста:
Здравствуй, мир!
/code
code source=pl2 name=example3
using numbers;
using user.OS.IO;
namespace start
{
class Example3 \ третий пример начального уровня \
{
String example_text = source.example_3_text; // получаем строку исходников в переменную
static void main \ основная функция исполнения третьего примера начального уровня \
( String aruments \ одномерный массив строк после имени исполняемого файла при запуске программы \
[]
)
{
numbers.Integer counter \ индексатор для перечисления параметров \;
numbers.Integer parameters_count \ количество переданных параметров при вызове исполняемого файла \;
parameters_count = arguments.lenght();
Console.write_line(example_text);
if (parameters_count > 0)
for (counter := 0 ; counter < parameters_count ; ++counter)
Console.write_line(arguments[counter]);
}
}
}
/code
код метод=text имя=текст_примера_4
Пример выводимого текста:
Здравствуй, мир!
/код
код метод=pl2 имя=пример4
использовать числа;
использовать пользователь.ОС.ВВ;
пространство начало
{
класс Пример4 \ четвертый пример начального уровня \
{
Строка текст_примера := исходный.текст_примера_4; // получаем строку исходников в переменную
статичное пустое главное \ основная функция исполнения четвертого примера начального уровня \
( Строка аргументы \ одномерный массив строк после имени исполняемого файла при запуске программы \
[]
)
{
числа.Целое перечислитель \ индексатор для перечисления параметров \;
числа.Целое количество_параметров \ количество переданных параметров при вызове исполняемого файла \;
количество_параметров := аргументы.количество();
Терминал.вывести_строку(текст_примера);
если (количество_параметров > 0)
для (перечислитель := 0 ; перечислитель < количество_параметров ; ++ перечислитель )
Консоль.вывести_строку(аргументы[перечислитель]);
}
}
}
/код
loop [explicit] [метка]
{
for <[тип] переменная [ := инициализатор]>;
in <контейнер>;
while <условие, при котором цикл продолжает итерации>;
next <оператор итерации>;
where <условие выполнения тела цикла>
...
continue;
break [метка блока];
}
code source=pl2 name=example3
using user.OS.IO;
namespace start
{
class Example6
{
static void main( String aruments[])
{
Console.write_line("Hallo, world!");
loop{
for argument;
in arguments;
Console.write_line(argument);
}
}
}
}
/code
1. В чем смысл обрамления code /code?Предлагаю, что в этом же файле могут храниться другие ресурсы: комментарии, SQL, HTML, BNF для описания компилятора, многострочный текст и т.д. Каждый раздел может проверять отдельный анализатор. Импорт текста в строчную переменную программы продемонстрирован в примерах 3 и 4.
2. В чем смысл source и name?source задает режим проверки данного раздела.
3. using — ладно, пусть будет. Хотя иерархия настораживает.Необходимые ссылки можно передавать компилятору через настройки в командной строке.
4. namespace — для простых задач совершенно не нужен.можно ввести ключевое слово program для простейших программ из одного класса
5. class — ага, у нас все классы. То есть чтобы обучать детей нужно сначала объяснить что такое класс?Для использования Console.write_line что то объяснять придется
6. статический метод. Так класс тут, оказывается не нужен — он просто контейнер статического метода. Что мешаешь отказаться от класса в данном случае вообще?да, при использовании program эту часть можно убрать.
7. В чем смысл слова loop?это единственный оператор цикла
Почему слова for и прочие считаются подчиненными относительно loop?для указания конкретных параметров цикла. Используются только те параметры, которые необходимы из вышеприведенного описания оператора цикла. Все параметры цикла описываются в его начале.
Почему тело цикла отнесено на один уровень с for… in ...?это не операторы, это объявления для цикла loop
Почему конструкция for… in… разбита на две строки, разделенные точкой с запятой, как будто это независимые конструкции?Они и независимы, за исключением того, что с ключевым словом in не может использоваться ключевое слово next. Конкретные разрешенные сочетания надо будет выделить в отдельные блоки описания языка
Почему после in стоит точка с запятой, как будто это независимая конструкция, относительно тела цикла?А чего их все в одну строку пихать? А читать, на мой взгляд, будет легче.
print 'Hello, world!'С какой целью разрабатывается этот учебный язык?Одно из положений — Компилятор языка использует стандартные ключевые слова на английском языке, но включает опцию расширения для каскадированного включения в таблицу лексем синонимов на национальных языках народов России. В результате, дети могут писать программы на своем естественном языке, а переводом занимается компилятор. При этом преподаватель может проверить листинг на любом из промежуточных языков (русский, английский) ( pl2-rainbow.livejournal.com/301.html).
Если не начинать обучение на нем (а в этом мало смысла — конструкции слишком громоздкие и излишне академические), то какой в нем смысл далее?Попробую еще уменьшить размер примера сверху:
code source=pl2 name=example6
program( String aruments[] )
{
Console.write_line("Hallo, world!");
loop
{
for integer argument_number := 0;
while argument_number < arguments.length()
next ++argument_number;
Console.write_line(arguments[argument_number]);
}
}
/codeЕсли дети освоили программирование на Си или Паскале, то смогут дальше перейти на другой язык при необходимости.Да, императивные языки так изучили миллионы.
Какое место должен будет занять ваш язык в системе обучения?Ознакомить с основными возможными способами программирования.
Пока у меня складывается ощущение что вы пытаетесь сделать язык «все в одном»: функциональное программирование, логическое, аспектное и т.д.Да, именно на это я и целюсь (правда, медленно)
ИМХО, это плохая идея, учебный язык должен быть простым и сосредоточенным на цели именно обучения, даже в ущерб строгости синтаксиса.На мой взгляд, это должен быть больше язык для чтения чужих программ. Но желательно, чтобы он плохо, но решал типичные примеры из каждого вида программирования.
Опыт обучения школьников программированию