2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1 ... 6, 7, 8, 9, 10  След.
 
 Re: О языках программирования для обучения
Сообщение08.02.2018, 19:08 


10/04/12
705
eugensk в сообщении #1290807 писал(а):
FreePascal IDE (fp.exe) не поддерживает кириллицу. Это факт. Да, можно было использовать Lazarus, но в нём, на мой вкус, для школы, слишком много отвлекающего.


В Linux поддерживает нормально. А Windows, я считаю, не так хороша в целях обучения.

Pphantom в сообщении #1290993 писал(а):
mustitz в сообщении #1290821 писал(а):
Лично я бы с удовольствием рассмотрел бы для обучения язык Ada, читай более строгий Pascal плюс сопрограммы, плюс пре-пост условия, плюс доказательство корректности. Стандарт Ada 2012 как по мне очень удачный.
Это было бы замечательно, но, к сожалению, очень высок стартовый уровень. Ученики разочаруются и разбегутся раньше, чем смогут написать первую программу.


А в чём сложность? Вот я только что за 10 минут в рабочей Ubuntu выполнил четыре команды и скомпилировал простую Ada программу:

код: [ скачать ] [ спрятать ]
Используется синтаксис Bash
$ sudo apt install gnat
... (skipped) ...

$ cat <<EOF >hello.adb
> with Ada.Text_IO;
> procedure Hello is
> begin
>     Ada.Text_IO.Put_Line("Hello, world!");
> end Hello;
> EOF

$ gnatmake hello.adb
gcc-4.9 -c hello.adb
gnatbind -x hello.ali
gnatlink hello.ali

$ ./hello
Hello, world!
 


-- 08.02.2018, 18:26 --

B@R5uk в сообщении #1291173 писал(а):
Позволю себе не согласиться. Не знаю, когда это у меня пошло, но у меня есть практика стараться делать объявление переменных в начале каждой процедуры (наверное, всё-таки со школы — когда на Паскале программировал). Всякие аргументы типа "до переменных в большой программе не добраться, если они не на месте" — весьма сомнительны, так как в таких случаях очевидно, что текст программы разросся чрезмерно, и её надо бы прорезать на функции/классы/отдельные файлы (особенно это касается профессионального программирования). В то время как при описанной практике смотришь на заголовочную часть — и сразу становится понятно, какие у процедуры входные параметры и какие вспомогательные переменные.


В Ada переменные можно объвлять в начале блока:

Используется синтаксис Delphi
declare
  Det: constant Long_Float := A11 * A22 - A12 * A21;
begin
  A := Det * Det;
  B := 2 * Det;
end;
 


В целом если переменная — константа внутри метода, но вычисляется на основании параметров, то её как-бы нет возможности объявить при таком подходе — нужна точка инициализации.

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение08.02.2018, 20:33 
Заслуженный участник


09/05/12
25179
mustitz в сообщении #1291233 писал(а):
А в чём сложность? Вот я только что за 10 минут в рабочей Ubuntu выполнил четыре команды и скомпилировал простую Ada программу:
Она уж совсем простая. :-) При необходимости что-то делать с типами начнутся сложности (правильные и на самом деле полезные для обучения, но пугающие учеников). В общем, это все-таки другая крайность.

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение08.02.2018, 22:07 


10/04/12
705
Pphantom в сообщении #1291251 писал(а):
Она уж совсем простая. :-) При необходимости что-то делать с типами начнутся сложности (правильные и на самом деле полезные для обучения, но пугающие учеников). В общем, это все-таки другая крайность.


Хм... мне представить, какие сложности могут начаться в Ada и не начаться в Pascal, C, C++... Вы можете намекнуть?

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение08.02.2018, 22:25 
Заслуженный участник


02/08/11
7003
Не стоит забывать и о таком факторе: если речь идёт не о самообразовании, то учитель должен знать ЯП, на котором он собирается обучать программировать. Язык Ада знают немногие, и в нём нельзя разобраться за пару дней.

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение08.02.2018, 23:29 
Аватара пользователя


20/03/12
267
СПб
Мне вот вспомнилось, как я ходил на олимпиаду по программированию. Это конец 80-х годов. Знал я тогда бейсик и калькулятор МК-61, но это всё было не важно, потому что задача была такая (одна из, но других я вообще не помню) : написать программу решения квадратного уравнения. Я и написал. И только потом понял, что тип работы совсем другой, чем на олимпиадах по математике или физике. На тех надо было хоть как-то получить результат, здесь надо было обеспечить устойчивость, надо было сделать так, чтобы при любых входных параметрах получился осмысленный ответ. Эта идея, как мне представляется, более важная вещь, чем конкретный язык программирования.

Ещё одно. У меня тогда была книжка, которую мне дала учительница по информатике. В книжке описывался самодельный компилятор С сделанный на том же С, с исходным текстом в конце книжки. Но это не так важно, хотел про другое сказать. Про предисловие. Там было сказано, что учебник для языка программирования в каком-то смысле тот же букварь. Задача букваря не в том, чтобы объяснить ребёнку, что такое "мама", а чтобы научить его изображать другим способом то, что он и так уже знает. Тогда это было так. Сейчас уже информационная область далеко ушла от такого простого и здравого подхода.

Всё-таки, для чего людям программирование? Например, данные обрабатывать. Что тут в голову приходит в первую очередь? Кому что, мне ROOT и R. Ни с тем ни с другим я не знаком как следует, потому что поздно про них узнал. Ещё Geant4. Чтобы это использовать хорошо бы знать C/С++.

В своё время в CERN был cernlib, а в Дубне jinrlib. Когда ещё фортран был. Вместо Root был Paw. В ЦЕРНе был minuit для того чтобы данные под формулы подгонять, а у нас fumili. Потом в ЦЕРНе из этого всего получился ROOT, а у нас не знаю чего.

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

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение08.02.2018, 23:34 
Заслуженный участник


09/05/12
25179
mustitz в сообщении #1291270 писал(а):
Хм... мне представить, какие сложности могут начаться в Ada и не начаться в Pascal, C, C++... Вы можете намекнуть?
Можно и не намекнуть, а просто сказать. В Ada требуется явно описывать преобразования типов. Практически всех и всегда, за очень редкими исключениями. Ну и объяснять, почему константа, равная 100, не запихивается туда, куда должен попадать операнд типа Integer, придется довольно долго.

Тут, кстати, можно сравнить подход с пресловутым Паскалем. В последнем система типов тоже достаточно строгая и аккуратная, однако же некоторые автоматические преобразования все же допустимы. Именно потому, что это для начинающего очень сложное место.
warlock66613 в сообщении #1291274 писал(а):
Не стоит забывать и о таком факторе: если речь идёт не о самообразовании, то учитель должен знать ЯП, на котором он собирается обучать программировать. Язык Ада знают немногие, и в нём нельзя разобраться за пару дней.
Это как раз не такая уж большая проблема. Никто же не требует начинать учить детей такому-то языку завтра, время на подготовку обычно есть.

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение09.02.2018, 15:03 


10/04/12
705
Pphantom в сообщении #1291291 писал(а):
Можно и не намекнуть, а просто сказать. В Ada требуется явно описывать преобразования типов. Практически всех и всегда, за очень редкими исключениями.


Я бы не сказал, что в Ada действительно уж такие драконовские ограничения. Если использовать Positive и Integer, то конверсия туда-сюда происходит автоматически. И вообще присвоить типу значения подтипа не сложно. А вот наоборот может пройти выход за пределы диапазона... Но глядя на исходники это не настолько большая проблема. Не говоря о том, что смешивание signed и unsigned приводит к варнингу даже в C.

Да, тут Sum3 не скоппилируется

код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
procedure Hello is

    function Sum1(X, Y: Integer) return Integer is
        Z: Positive;
    begin
        Z := 10;
        return X + Y + Z;
    end Sum1;
   
    function Sum2(X, Y: Positive) return Positive is
        Z: Integer;
    begin
        Z := -100;
        return X + Y + Z;
    end Sum2;
   
    function Sum3(X, Y: Integer_16) return Integer_16 is
        Z: Unsigned_8;
    begin
        Z := 10;
        return X + Y + Z;
    end Sum3;
begin
    Ada.Integer_Text_IO.Put(Sum1(5,10));
    Ada.Integer_Text_IO.Put(Sum2(5,10));
    Ada.Integer_Text_IO.Put(Integer(Sum3(5,10)));
    Ada.Text_IO.Put_Line(" Hello, world!");
end Hello;
 


Но об этом честно пояснят:

  1. hello.adb:25:22: invalid operand types for operator "+" 
  2. hello.adb:25:22: left operand has type "Interfaces.Integer_16" 
  3. hello.adb:25:22: right operand has type "Interfaces.Unsigned_8" 

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение09.02.2018, 15:23 
Заслуженный участник


09/05/12
25179
mustitz в сообщении #1291391 писал(а):
Я бы не сказал, что в Ada действительно уж такие драконовские ограничения.
Но обычно новичков (даже имеющих некоторый опыт программирования) они вводят в ступор. Хотя, конечно, идейно это правильно и разобраться в происходящем даже полезно.

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение09.02.2018, 15:53 
Аватара пользователя


14/12/17
1516
деревня Инет-Кельмында
Мне представляется, язык Ада никогда не попадёт в школу из-за названия, чтоб не прогневить богов.

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение19.02.2018, 11:45 


27/08/16
10195
Мне кажется, обсуждение вопроса о лучшем ЯП для обучения нужно начинать с выяснения того, каким именно аспектам программирования вы хотите научить этого ученика при помощи этого языка, и какова конечная цель этого обучения? Алгоритмам и структурам данных? Миганию светодиодом на Ардуине? Или чему-то ещё?

Поэтому, например, крайне строгая типизация Ada может быть как минусом, так и плюсом. В любом случае, люди, хорошо умеющие программировать, знают много ЯП. Так что, нет смысла выбирать один единственный язык для обучения программированию тех, кому это занятие интересно.

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение19.02.2018, 18:54 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Довольно очевидно, что сама постановка вопроса "о языке программирования для обучения программированию" подразумевает самые ранние стадии этого обучения. Поскольку потом для ученика не проблема освоить другой язык, демонстрирующий тот или иной изучаемый аспект Computer Science. Например, курс "Алгоритмы и структуры данных" вузовского уровня - уже подразумевает свободное владение чем-нибудь типа Pascal, C/C++.

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение19.02.2018, 19:00 
Аватара пользователя


11/12/16
13849
уездный город Н
mustitz в сообщении #1291391 писал(а):
Не говоря о том, что смешивание signed и unsigned приводит к варнингу даже в C.


Классика жанра (наступил недавно на такие грабли ардуиной):

Используется синтаксис C
double freq = 10000000;
uint32_t multi = 10000;
int encCount;

//...

// И вот тут при небольших отрицательных EncCount переменная freq переполняется
freq = freq + EncCount*multi;

// И даже тут (хотя все переменные знаковые)!!!
freq = freq + encCount*10000;

 

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение19.02.2018, 21:22 
Заслуженный участник


28/04/09
1933
EUgeneUS в сообщении #1293269 писал(а):
Классика жанра (наступил недавно на такие грабли ардуиной):

Используется синтаксис C
//...

// И вот тут при небольших отрицательных EncCount переменная freq переполняется
freq = freq + EncCount*multi;

//...
Переполняется все-таки не переменная freq. Просто если у арифметической операции один из операндов — signed, а другой — unsigned, при этом их размеры равны, то signed неявно приводится к unsigned, и операция выполняется уже с операндами одинакового типа (и в результате также получится тот же самый unsigned тип). Т.е. уже результат выполнения умножения encCount*multi в данном случае будет некорректным, а переменная freq впитает его в себя таким. Но сама она переполниться не может, поскольку может и бесконечные значения принимать. "Переполниться" у числа с плавающей точкой может лишь мантисса (если присвоить ему целочисленное значение, большее $2^{24}$ для float и $2^{53}$ для double, но это приведет лишь к потере точности, что для чисел с плавающей точкой, в общем-то, обыденность).
EUgeneUS в сообщении #1293269 писал(а):
Используется синтаксис C
//...

// И даже тут (хотя все переменные знаковые)!!!
freq = freq + encCount*10000;

//...
Имеется в виду, что переполнение будет, если значение encCounter достаточно велико?

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение20.02.2018, 11:17 


27/08/16
10195
EUgeneUS в сообщении #1293269 писал(а):
Классика жанра (наступил недавно на такие грабли ардуиной):
Неявное приведение типа signed -> unsigned к понятию "переполнение" отношения не имеет.

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение20.02.2018, 11:56 
Аватара пользователя


11/12/16
13849
уездный город Н
EtCetera в сообщении #1293310 писал(а):
Имеется в виду, что переполнение будет, если значение encCount достаточно велико?

Имеется в виду, что мало по модулю и отрицательное.

Что касается "переполнения". Что мне дебаг поёт, то и повторяю:

Используется синтаксис C
...
Serial.print("freq= ");
Serial.println(freq);
 


При возникновении небольшого отрицательного значения encCount, получаем:

Код:
freq= ovf


Может какие-то особенности ардуиновского компилятора, не знаю. Прописал явное преобразование типов и всё заработало.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 142 ]  На страницу Пред.  1 ... 6, 7, 8, 9, 10  След.

Модераторы: Модераторы, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group