Рад, что у Вас от меня «балдеж». Я не знаю, как с Вами разговаривать, если Вы считаете, что ссылочная модель данных в языке программирования определяется некоей матрицей смежности. Почитайте в Интернет, что такое ссылочная модель данных, что ли…
Лет мне 69 без двух недель и 51 год из них я отдал вычислительной технике. Из нуля публикаций на Хабре следует лишь то, что я не вижу смысла тут что-то публиковать. Вот у Вас аж целых 19 публикаций — и что? «Программист», не понимающий что такое модель данных в ЯП. У меня только за последние два с половиной года опубликованы 4 интернет-книги по программированию с общим объемом более 1000 страниц и пятая на выходе, функционирует интерактивный обучающий курс весьма большого объема, видео и презентации с выступлений на коференциях и т.д. Так что продолжайте балдеть по поводу моих 0 публикаций на Хабре.
А в чем проблема-то? В PascalABС.NET отступы автоматически расставляются. А если что-то не так — есть кнопочка и HotKey для форматирования. про минусы Пайтона я сразу написал, что обосновано изложить их в комментариях не получится, да и не нужно это, потому что изложено не раз и только фанаты этого языка делают вид, что у Пайтона минусов нет.
Мне все окончательно стало понятно. Вы не отвечаете прямо на поставленные вопросы, а приводите какие-то фрагменты коды, якобы имеющие некое отношение к общей теме. Так обычно взрослые люди не поступают: это еще простительно для подростков. А во взрослом мире подобные попытки уйти в сторону свидетельствует о том, что человек, скажем так, не совсем в теме. Печально, что Вы считаете, будто «Другие обходы возможны, но пользы от них нет». Например, прямой обход дерева используется при сортировках, обратный — при динамическом программировании. Пользы от Вашего варианта построения дерева я не увидел. В нем и элементы сложно размещать для поиска (к примеру), и сам поиск производить. У Вас абстрактное дерево ради самого дерева, но не более того. И еще раз, указатели — это прошлый век. Современные языки программирования используют ссылочную модель данных.
Отлично, хочу список вещественного типа написать, это как будет? И сборщик мусора Вы как-то тихонько и аккуратно стороной обошли, видимо, чтобы не зацепило ))))
А еще, я не понял, где у Вас связь с предшественником? Вы как такое дерево собираетесь обходить, скажем, в ширину?
Возможно это было познавательно — ковыряться в подобном коде, а сейчас на PascalABC.NET это все занимает десяток строк и понимается очень легко.
procedure Ханой(Дисков, Откуда, Куда, Рабочий: integer);
begin
if Дисков = 0 then
exit;
Ханой(Дисков - 1, Откуда, Рабочий, Куда);
$'Переложить диск с {Откуда} на {Куда}'.Println;
Ханой(Дисков - 1, Рабочий, Куда, Откуда)
end;
begin
Ханой(4, 1, 3, 2) // четыре кольца с 1-го стержня на 3-й через 2-й
end.
И что следует из этого дельфийского кода? Бинарное дерево без хранения данных, состряпанное на указателях, как в книге у Н.Вирта в 1980 году? Приходите с таким кодом в .NET, Вас там сборщик мусора быстро поставит на надлежащее место ))
Можете не верить. НО… бывает и достаточно часто. Когда пишется код, в котором есть ввод/вывод текста с кириллицей. Люди просто забывают сменить регистр. Вот простой пример — смотрите этапы последовательного набора оператора:
Отсюда могу только сделать вывод, что либо Вам не доводилось заниматься обучением в массовой аудитории, либо, в противном случае, эта аудитория Вас тихо ненавидела.
Вы действительно не понимаете или делаете вид? Речь о первом/втором языке программирования для новичка, причем о языке для массового обучения, а не будущих победителей международных олимпиад. Речь о том, что понимание алгоритмов закладывается именно на этом этапе и от языка программирования зависит очень многое.
Одного человека, ну там группку небольшую энтузиастов можно с горшка учить писать код на С/С++, но для масс, которые нынче в девятом классе не знают таблицы умножения, вот для таких это не работает.
Это не глупые придирки, это реальная история новичка, который после школьного КУМир'а попытался освоить Пайтон. Речь-то о том, на чем учиться программированию, а не какой язык учить, чтобы стать профессиональным программистом и писать в production.
На мой взгляд, учебный язык должен быть регистронезависимым. Детям и так непросто, а тут еще регистры запоминать.
А это от цели зависит. Насчет «можно сделать» — так давно доказано, что три структуры — следование, выбор и повторение позволяют запрограммировать любой алгоритм. Что Вы подразумеваете под «учебником ООП» я не знаю. Язык изучают поэтапно. Особенно, если он мультипарадигменный. И в этом случае ООП — просто один из этапов изучения. Например, .NET-языки — они изначально ООП-ориентированные, в них любые типы данных — это классы. И запись 2.Sqrt эквивалентна записи Sqrt(2).
Проверка на этапе компиляции позволяет найти «сюрпризы», поскольку статическая типизация позволяет проверить операнды на совместимость. Как минимум, это существенно повышает надежность кода и страхует начинающего от грубых ошибок. Здесь же сразу будут выявлены ошибки в написании имен. Почему Вам надо объяснять такие азы?
Подключать библиотеки — это означает, что новичок должен изначально знать и помнить, что где хранится. С каких пор это считается достоинством первого изучаемого языка?
Неправильное имя метода в том же PascalABC.NET написать практически невозможно (по точке сразу же раскрывается контекстно-зависимое меню со списком полей и методов).
В целом Ваше «везде» — либо попытка замылить недостатки Пайтона, либо незнание возможностей того же PascalABC.NET. В последнем случае не нужно делать утверждения про это самое «везде», выглядит несерьезно.
P.S. А JS в качестве первого языка не критиковали только ленивые.
Прекрасный язык для обучения. В детстве, у бабушки в деревне, часто доставал тетрадку и писал программы на бейсике в ней (компьютера в деревне не было).
И в 90х на бейсике сдавал вступительный экзамен по информатике в ВУЗ (тоже на бумажке).
Из того, что когда-то ездили в карете, запряженной лошадьми, вовсе не следует что и сейчас удобно поступать так же.
Уфф… отработала. Значит, ошибок нет? Но не спешите так, это же не какой-нибудь плебейский паскаль, это крутой Python! И ошибки на самом деле есть. Две. Одна в той ветке, которая по else и куда можно попасть, введя значение 9 и больше. Там переменная а набрана кириллицей. Но об этом пользователь программы узнает лишь тогда, когда будет предпринята попытка эту строку выполнить. А пока это просто мина, ждущая своего часа. Вторая ошибка немного похитрее. Переменной b в этой ветке присваивается значение строки, содержащей буквы. Последний оператор программы вычисляет и выводит значение b/2, считая что b должно быть числом. Программа отработала лишь потому, что она пошла по первой ветке, где b получило значение 12 и действительно стало числового типа.
Вот что творит динамическая типизация в кривых ручонках! А у какого новичка в программировании они сразу прямые? Так что на Python пусть пишут любители работать на минном поле. Остальным, считающим что квесты и челленджи не нужно смешивать с уроками информатики, Python выбирать для обучения алгоритмизации не следует. Как второй язык – отличное решение.
Ах да, может вы думаете, что извлечь квадратный корень из числа в Python так же просто, как в каком-нибудь КуМир или Паскаль? Радостно написать одну строчку print(Sqrt(2)), еще раз подумав: «а эти, со своими дурацкими паскалями все еще begin … end пишут», и увидеть результат? Спешу разочаровать: получите сразу две ошибки. Во-первых, Python не знает, что такое Sqrt. Функция извлечения квадратного корня хранится у него в библиотеке Math, имя которой надо указать перед функцией и отделить от нее точкой. Значит, print(Math.Sqrt(2))? Снова не угадали: библиотеку сначала надо подключить оператором import:
import Math
print(Math.Sqrt(2))
Но нет! Нет, пишет такого модуля. И правда, его нет. Потому что Python – язык регистрозависимый и библиотеку зовут на самом деле math.
import math
print(math.Sqrt(2))
Третий акт мерлезонского балета тоже оказывается неуспешным:
print(math.Sqrt(2))
AttributeError: module 'math' has no attribute 'Sqrt'
В переводе на русский язык: модуль math не имеет атрибута Sqrt. Не будем выяснять, что это за атрибут такой и почему его модуль не имеет. На самом деле, в библиотеке math не нашлось Sqrt. Потому что там – sqrt! И что, вы сейчас подумали, если везде писать маленькие буквы, наступит полное счастье? Попытайтесь, конечно, если будете изучать Python.
Вот описание класса для бинарных деревьев, причем в обобщенном типе. В узле дерева данные хранятся в виде списка. На PascalABC.NET. Хотелось бы увидеть, как это выглядит на волшебном «живом» QBasic…
type
node<T> = class
private
left, right: node<T>;
up: node<T>;
lst: List<T>;
public
data: T;
constructor(p: T);
begin
left := nil;
right := nil;
up := nil;
lst := new List<T>;
data := p
end;
end;
Чего только люди не напишут… QBasic. Посмотрите лучше, какие вещи творят первоклассники из питерского DL Club на PascalABC.NET. В том числе, с графикой, потому что есть необходимые библиотеки. И все это напрямую под Windows, а не с костылями типа DOSBox.
Лет мне 69 без двух недель и 51 год из них я отдал вычислительной технике. Из нуля публикаций на Хабре следует лишь то, что я не вижу смысла тут что-то публиковать. Вот у Вас аж целых 19 публикаций — и что? «Программист», не понимающий что такое модель данных в ЯП. У меня только за последние два с половиной года опубликованы 4 интернет-книги по программированию с общим объемом более 1000 страниц и пятая на выходе, функционирует интерактивный обучающий курс весьма большого объема, видео и презентации с выступлений на коференциях и т.д. Так что продолжайте балдеть по поводу моих 0 публикаций на Хабре.
А еще, я не понял, где у Вас связь с предшественником? Вы как такое дерево собираетесь обходить, скажем, в ширину?
Введя имя переменной б, увидели ошибку, b поправили, но в спешке к а не вернулись и имя осталось на кириллице.
Одного человека, ну там группку небольшую энтузиастов можно с горшка учить писать код на С/С++, но для масс, которые нынче в девятом классе не знают таблицы умножения, вот для таких это не работает.
Это не глупые придирки, это реальная история новичка, который после школьного КУМир'а попытался освоить Пайтон. Речь-то о том, на чем учиться программированию, а не какой язык учить, чтобы стать профессиональным программистом и писать в production.
На мой взгляд, учебный язык должен быть регистронезависимым. Детям и так непросто, а тут еще регистры запоминать.
Подключать библиотеки — это означает, что новичок должен изначально знать и помнить, что где хранится. С каких пор это считается достоинством первого изучаемого языка?
Неправильное имя метода в том же PascalABC.NET написать практически невозможно (по точке сразу же раскрывается контекстно-зависимое меню со списком полей и методов).
В целом Ваше «везде» — либо попытка замылить недостатки Пайтона, либо незнание возможностей того же PascalABC.NET. В последнем случае не нужно делать утверждения про это самое «везде», выглядит несерьезно.
P.S. А JS в качестве первого языка не критиковали только ленивые.
Из того, что когда-то ездили в карете, запряженной лошадьми, вовсе не следует что и сейчас удобно поступать так же.
Есть ли в этой программе ошибки? Если есть, то какие и где?
Запускаем, вводим значение 5:
Уфф… отработала. Значит, ошибок нет? Но не спешите так, это же не какой-нибудь плебейский паскаль, это крутой Python! И ошибки на самом деле есть. Две. Одна в той ветке, которая по else и куда можно попасть, введя значение 9 и больше. Там переменная а набрана кириллицей. Но об этом пользователь программы узнает лишь тогда, когда будет предпринята попытка эту строку выполнить. А пока это просто мина, ждущая своего часа. Вторая ошибка немного похитрее. Переменной b в этой ветке присваивается значение строки, содержащей буквы. Последний оператор программы вычисляет и выводит значение b/2, считая что b должно быть числом. Программа отработала лишь потому, что она пошла по первой ветке, где b получило значение 12 и действительно стало числового типа.
Вот что творит динамическая типизация в кривых ручонках! А у какого новичка в программировании они сразу прямые? Так что на Python пусть пишут любители работать на минном поле. Остальным, считающим что квесты и челленджи не нужно смешивать с уроками информатики, Python выбирать для обучения алгоритмизации не следует. Как второй язык – отличное решение.
Ах да, может вы думаете, что извлечь квадратный корень из числа в Python так же просто, как в каком-нибудь КуМир или Паскаль? Радостно написать одну строчку print(Sqrt(2)), еще раз подумав: «а эти, со своими дурацкими паскалями все еще begin … end пишут», и увидеть результат? Спешу разочаровать: получите сразу две ошибки. Во-первых, Python не знает, что такое Sqrt. Функция извлечения квадратного корня хранится у него в библиотеке Math, имя которой надо указать перед функцией и отделить от нее точкой. Значит, print(Math.Sqrt(2))? Снова не угадали: библиотеку сначала надо подключить оператором import:
Но нет! Нет, пишет такого модуля. И правда, его нет. Потому что Python – язык регистрозависимый и библиотеку зовут на самом деле math.
Третий акт мерлезонского балета тоже оказывается неуспешным:
В переводе на русский язык: модуль math не имеет атрибута Sqrt. Не будем выяснять, что это за атрибут такой и почему его модуль не имеет. На самом деле, в библиотеке math не нашлось Sqrt. Потому что там – sqrt! И что, вы сейчас подумали, если везде писать маленькие буквы, наступит полное счастье? Попытайтесь, конечно, если будете изучать Python.
## uses GraphWPF // ну или GraphABC, если нужно старье