LINUX.ORG.RU

Книжка о Free Pascal и Lazarus под открытой лицензией

 , , ,


1

1

23 декабря на сайте компании «Альт Линукс» появилась новость о выходе книги «Free Pascal и Lazarus: Учебник по программированию» под лицензией GNU FDL.

Стиль изложения материала весьма неплох, что располагает к использованию этой книги в качестве пособия для обучения школьников программированию.

Страница с ссылкой на книгу.

>>> Подробности



Проверено: anonymous_incognito ()
Последнее исправление: post-factum (всего исправлений: 3)

Ответ на: комментарий от morbo

>Пусть будет примитивный курс программирования на Паскале. Пусть ученик после него напишет для себя хоть напоминалку какую-нибудь

очередной непереносимый кривой велосипед? Оно отлично пишется на шелле(cmd как вариант) с использованием системного планировщика(cron/at/etc).

или домашнюю бухгалтерию

получится неполноценный стопицотый никому (даже автору, потому что его задолбают глюки и он в итоге возьмет готовую программу) не нужный высер

Я, как человек, несколько лет жизни убивший на велосипеды (после примитивного курса программирования на паскале, ага) всячески предостерёг бы детей от подобного «творчества». Уж лучше бы я «знал о функциональном программировании, абстрактных типах данных и адресной арифметике.» Ну и глупо считать, что человек с подобными знаниями менее способен на написание программ, чем «паскалист».

lazyklimm ★★★★★
()
Ответ на: комментарий от baverman

И еще, в очередной раз порадовало, отсутствие функции возведения в степень в языке для *обучения*, и как авторы пытаются обойти этот скользкий момент.

не в «языке для обучения» а в стандартной библиотеке. и не отсутствует а присутствует.

unit math
function power(base: float; exponent: float): float

а вот например в СИ stdlib нет функции возведения в произвольную степень.

но это и хорошо - ученикам придётся лучше освоить экспоненту и натуральный логарифм для прикладной задачи возведения в значения в произвольную степень.

vyv ★★★
()
Ответ на: комментарий от Amuser

И быстро будет пИсать программы :(

anonymous
()
Ответ на: комментарий от su

>Насколько я понял, фундаментальная проблема Пасквиля для прикладного программирования осталась неизменной со времен Турбо-Пасквиля: размерность типа string всё так же 255 символов.

ну ты даёшь. зачем так позорится не ознакомившись с предметом?

256 символьные строки - это в режиме совместимости с TurboPascal для совместимости.

в режиме objfpc юникодные строки произвольного размера. есть поддержка и строк аля СИ - массив char-ов с \0 в конце.

vyv ★★★
()
Ответ на: комментарий от ladserg

> отдельной и независимой от языка С библиотеки

Вот здесь ошибка. Эта библиотека — часть стандарта языка. Соответственно, во всех реализациях, соответствующих стандарту, данная функция будет существовать.

Или ты считаешь функции - встроенными операторами?

Не считаю. Но по большому счёту, оператор и функция — одно и то же. Разница между x^y и pow(x,y) лишь в форме записи.

sjinks ★★★
()
Ответ на: комментарий от vyv

не в «языке для обучения» а в стандартной библиотеке. и не отсутствует а присутствует.

Посмотрел я на неё, реализована через <*censored*>, впрочем в хелпе так и написано об этом.

Кубический корень из отрицательного числа с её помощью не вычислить, взять степень, например 2/3, от отрицательного числа, так же нельзя.

Уж не знаю что лучше, пояснять «детям» узкие моменты использования данной функции, или научить вычислять степень через экспоненту.

П.С. в C для возведения в произвольную степень используетс функция pow:

#include <math.h>

     double pow (      double base,      double exponent );
long double pow ( long double base, long double exponent );
      float pow (       float base,       float exponent );
     double pow (      double base,         int exponent );
long double pow ( long double base,         int exponent );
ladserg
()
Ответ на: комментарий от sjinks

>Но по большому счёту, оператор и функция — одно и то же.

Нет. Марш в школу.

Led ★★★☆☆
()
Ответ на: комментарий от Macil

> Процедурное программирование _кончилось_.

Соглашаясь с вами в главном, по вопросу нужности паскаля всё уже давно сказано, не соглашусь в «_кончилось_». Судя по этому «кончилось» вы ява-кодер? Вы в курсе как реализованы большинство кодеков a/v, или системные утилиты. Именно процедурно-ориентированно. ;-) Да, иной раз бесит, но факт.

alx_me ★★☆
()
Ответ на: комментарий от ladserg

>Почему костыли? Я, признаться, не испытывал проблем при вынесении классов в отдельные модули и даже в библиотеки, да и на уровне кода паскалевская модульность не особо отличается от реализаций С/С++, просто в паскале объявления классов, функций и процедур включено в юнит, а в С/С++ оно хранится отдельно в файле заголовков.

Просто в заголовок обязательно что-нибудь из реализации обязательно пролезет, поэтому настоящей инкапсуляции в Си++ нет. Нельзя объявить, допустим, в заголовочном файле «struct my_struct;» и объявить функции, работающие с этой структурой, а уже в файле cpp дать полное описание полей и описать реализацию функций.

Сюда же можно причислить жонглирование с #ifndef #define, чтобы исключить повторное подключение модуля. Отсутствие толковых областей видимости: если заголовочный файл был хоть раз подключен в одном из других заголовочных файлов, то первый заголовочный файл будет целиком доступен во всех модулях, использующих второй заголовочный файл. Например:
1. объявляем в модуле A функцию funca и тип typea,
2. используем в модуле B тип typea из модуля A,
3. подключаем в программе C модуль B, используем typea, объявляем свою функцию funca.

Тут же возникнет конфликт - функция funca уже объявлена в модуле A, поэтому мы не можем создать функцию funca, хотя непосредственно модуль A мы не используем, а используем только модуль B, в котором такой функции нет.

В Паскале такого не бывает. Можно подключить модули A и B, они не будут конфликтовать из-за наличия в них обоих типа typea, поскольку он объявлен только в одном из модулей. Но для использования typea можно не подключать модуль A, а достаточно подключить только B, при этом всё не нужное из модуля A не попадёт в основную программу автоматически через модуль B.

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

morbo
()
Ответ на: комментарий от Macil

>А про твоего инкассатора я могу сказать очень много и очень долго. И очень ненормативно.

Это не «мой» инкассатор, это персонаж из комедийного фильма.

morbo
()
Ответ на: комментарий от sjinks

[quote]

отдельной и независимой от языка С библиотеки

Вот здесь ошибка. Эта библиотека — часть стандарта языка. Соответственно, во всех реализациях, соответствующих стандарту, данная функция будет существовать. [/quote]

Спокуха, не будем писать необдуманные посты. Есть стандарт на язык, а есть стандартная библиотека C/C++. Это разные вещи.

Причём сам язык C/C++ может спокойно существовать без LibC. Впрочем и функции библиотеки LibC можно вызвать из иных ЯП, например из программ на ассемблере.

А вот оператор for, тип int,или операцию ++ из языка С/С++ не выкинуть.

ladserg
()
Ответ на: комментарий от baverman

Марьивановна, почему writeln 1/2*2 выводит ноль?

Вообще, эта конструкция выводит 1.0 (одна целая ноль десятых). И оператор деления «/» в паскале на выходе имеет тип «вещественное» (Real) вне зависимости от того, поданы ли ему на вход int+int, int+real или real+int. Поэтому 1 / 2 = 0.5 (вещественное). А вот в C и C++ как раз и надо будет объяснять почему 1/2 будет 0, а не 0.5 как в простом и строгом Паскале.

no-dashi ★★★★★
()
Ответ на: комментарий от morbo

> Нельзя объявить,допустим, в заголовочном файле «struct my_struct;» и объявить функции, работающие с этой структурой, а уже в файле cpp дать полное описание полей и описать реализацию функций.

Вы чего, с дуба рухнули? Это где было нельзя. Может вы VC5.0 используете. Про какой стандарт, ISO-93? в 99-2003 можно. я вообще не помню чтобы было нельзя. Это @ в objectpascalr использовать нельзя - так и было написано в вашем умном учебнике.

struct A;

static void F(A&); на здроровье int F1(A* ); на здоровье

void F3( A& a ) {a.b=1;} нельзя

alx_me ★★☆
()
Ответ на: комментарий от no-dashi

Слово простом как раз к месту. не даром судьбы пасквилянтов давно уже в анекдотах отражены. Ещё бы зачем знать что переменные где-то хранятся, и как то кодируются. Кодерам оно не надо. Именно по этому с появлением ява паскать и отдал концы. Ява ещё проще и ещё логичнее для молодых истеричек. Они ещё удивляются что bool a=1;a+=1; даёт 1. :-\

alx_me ★★☆
()
Ответ на: комментарий от no-dashi

Если попытаться вам разъяснить, то подумайте вот о чём. У меня должна быть возможность сделать как 0 так и 0.5 в данном случае. Это должно быть прозрачно реализуемо средствами языка абсолютно одинаково. В С++ есть специализации и шаблоны. Что есть у паскаля?

alx_me ★★☆
()

в школах нужен паскаль. Они же только начинают программировать. книга только для школ, до вуз не дотягивает ( не хватает раздела про динам. память)

tim91
()
Ответ на: комментарий от lazyklimm

>Я, как человек, несколько лет жизни убивший на велосипеды (после примитивного курса программирования на паскале, ага) всячески предостерёг бы детей от подобного «творчества».

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

Уж лучше бы я «знал о функциональном программировании, абстрактных типах данных и адресной арифметике.»


И с этим знанием, полученным в школе, пошёл бы учиться в гуманитарный или экономический университет? А толку тогда от этого знания?

Ну и глупо считать, что человек с подобными знаниями менее способен на написание программ, чем «паскалист».


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

В школе нужно дать возможность человеку «распробовать» предмет, понять что это вообще такое, чтобы потом выбрать то, к чему лежит душа и углублять знания в выбранном. Остальные знания при этом должны быть 1. настолько примитивными, чтобы большинство школьников их смогло освоить, 2. настолько полезными, чтобы без углублённого изучения ими можно было воспользоваться.

В школе не учат играть на музыкальном инструменте и не обучают игре по нотам с листа. Как же так! Да без этого же невозможно учиться в консерватории! А все ли собираются в консерваторию? Вот и программистами не все собираются становиться. Научиться бренчать аккорды на гитаре и петь хором в школе - достаточно. Научиться писать бумажки в текстовом процессоре и писать программы на паскале - достаточно.

morbo
()
Ответ на: комментарий от alx_me

C++ ISO 14882-2003 сильно отстал от передовой мысли. А о паскале и речь даже не идёт. Однако в -std=c++0x уже всё на уровне и готово к стандарту 2011 года, а в паскале?

alx_me ★★☆
()

Не понял в чём новость? Эта книжка доступна для скачивания как минимум с середины ноября. Я её уже в УМК внёс для студентов.

Vudod ★★★★★
()
Ответ на: комментарий от alx_me

У меня должна быть возможность сделать как 0 так и 0.5 в данном случае

А кто у вас отобрал такую возможность? В описании языка явно задекларировано - результатом оператора / является вещественное число. Для целочисленного деления предназначен оператор div. У вас проблемы с пониманием простейших синтаксических конструкций?

no-dashi ★★★★★
()
Ответ на: комментарий от tim91

> в школах нужен паскаль.

ну не надо. Ну давайте лучше ява сразу, а?(ирония)

Ну пуская детишки немного поймут как байтики пересылаются, а? Ну пусть это будет C, ну пожалуйста! Надо ведь учить основам. А C ближе к основам чем паскаль, как ни крути.

alx_me ★★☆
()

Ребята молодцы, но вот только Lazarus-у там посвящено очень даже мало, на таком страшном быдло-формо-тыкании что даже жуть. Как увидел эти не выровненные элементы форм, без какого либо описания как их заставить растягиваться - это жуть. Я конечно понимаю что это не Qt где всё намного проще реализуется, но ...

AlexVR ★★★★★
()
Ответ на: комментарий от alx_me

>Про какой стандарт, ISO-93? в 99-2003 можно.

Ну ладно, это для 1999 года - достижение. А с остальным как?

morbo
()
Ответ на: комментарий от alx_me

Это должно быть прозрачно реализуемо средствами языка абсолютно одинаково.

Алгебраическое деление и целочисленное деление это формально разные операции, и попытку использовать для них один оператор иначе как клиническим случаем не назовешь.

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

> задекларировано - результатом оператора / является вещественное число.

Вот это и есть ошибка. Тип результата это моё дело. И если нет возможности его запрограммировать нафиг такой язык. Я вам пытался объяснить - без толку. Главное что при этом у Вас проблем с пониманием нет. Даже пытаться тяжело, верно? И ваша судьба станет примером. Тоже «ах я устал от програмимрования пора заняться чем-то ещё» - коронная фраза большинства пасквилянтов.

alx_me ★★☆
()
Ответ на: комментарий от alx_me

>Ну пуская детишки немного поймут как байтики пересылаются, а? Ну пусть это будет C, ну пожалуйста! Надо ведь учить основам. А C ближе к основам чем паскаль, как ни крути.

Лучше уж тогда какой-нибудь ассемблер. Вот от него действительно появляется понимание, как работает компьютер. А между Си и Паскалем особой разницы нет.

morbo
()
Ответ на: комментарий от alx_me

>«ах я устал от програмимрования пора заняться чем-то ещё» - коронная фраза большинства пасквилянтов.

Разностороннее развитие и рост масштабов задач - это хорошо. Другие так и будут всю жизнь копошиться с байтиками.

morbo
()
Ответ на: комментарий от morbo

Тут же возникнет конфликт - функция funca уже объявлена в модуле A, поэтому мы не можем создать функцию funca, хотя непосредственно модуль A мы не используем, а используем только модуль B, в котором такой функции нет. ... ...

Мне кажется у нас разное понимание модулей прежде всего хочу пояснить что модули в С/С++ и файл заголовков несут разные функции, в модулях описывается - реализация, в файлах заголовков - объявления.

что касаемо вашей ситуации, да есть такая фигня, что объявление функции является глобальным, однако и это не проблема для С++, можно использовать пространства имён, вот простой пример из трёх файлов:

файл a.cpp:

#include <stdio.h>

namespace a {
    void a(void)
    {
        printf ("A in module A.\n");
    };
};

файл b.cpp:

#include <stdio.h>

namespace b {
    void a(void)
    {
        printf ("A in module B.\n");
    };
};

файл main.cpp:

namespace a {
    void a(void);
};

namespace b {
    void a(void);
};

int main (void)
{
    a::a();
    b::a();
    return 0;
};

Компилируем и запускаем:

$ g++ main.cpp a.cpp b.cpp -o primer
./primer

В итоге имеем:

A in module A.
A in module B.

Если проанализировать паскалевский код, то скорее всего функция А в модуле А занесена в пространство имён, например А, а функция А в модуле Б занесена в пространство имён, например Б.

ladserg
()
Ответ на: комментарий от alx_me

Беганье от своих-же костылей это достижение div и / как мы читаем? деление и деление? Так нафига их разделять? А потому что механизма разрешения типов нормального нет. «нет у нас самый лучший, нам этого не надо»(анонимный пасквилянт).

alx_me ★★☆
()
Ответ на: комментарий от morbo

> будут всю жизнь копошиться с байтиками.

Вот вот. Я же говорил. Что может тот работает кто не может учит и руководит. - классика, не находите?

alx_me ★★☆
()
Ответ на: комментарий от alx_me

>Беганье от своих-же костылей это достижение div и / как мы читаем? деление и деление? Так нафига их разделять?

Вашими устами говорит глупость и/или необразованность :(

Led ★★★☆☆
()
Ответ на: комментарий от Led

> Вашими устами говорит глупость и/или необразованность :(

Ага. А вашими уже дремучая закостенелость и неспособность понять систему контроля и вывода типов.

alx_me ★★☆
()
Ответ на: комментарий от Amuser

> Если ученик толковый, то он в универе (или сам), изучив в школе основы

программирования, бымтро освоит любой другой ЯП.


При этом, заранее привыкнув строго работать с форматами данных, что немаловажно.

AS ★★★★★
()
Ответ на: комментарий от tim91

> давайте, только не все рождаются программистами...

Я вас удивлю, но никто ими не рождается. Просто некоторые учаться всю жизнь, а другие считают что они уже и так умные.

alx_me ★★☆
()
Ответ на: комментарий от Macil

> А про твоего инкассатора я могу сказать очень много и очень долго. И очень ненормативно.

математики, по-твоему, это самые достойные и важные люди, а остальные - шлак для урановых рудников, я правильно понял твою мысль?

boo32
()
Ответ на: комментарий от baverman

> И еще, в очередной раз порадовало, отсутствие функции возведения в степень в языке

для *обучения*, и как авторы пытаются обойти этот скользкий момент.


x=exp(b*ln(a))

Функцию сам напишешь ? :-) Там ещё не забудь про отрицательную степень, это надо отдельно обработать.

AS ★★★★★
()
Ответ на: комментарий от ladserg

> Есть стандарт на язык, а есть стандартная библиотека C/C++. Это разные вещи.

Сюрприз! Для C стандарт на язык и на библиотеку один и тот же! Более того, определение strictly conforming program предполагает наличие стандартной библиотеки, и компилятор волен использовать стандартные функции при генерации кода по своему усмотрению.

Причём сам язык C/C++ может спокойно существовать без LibC.

Без стандартной библиотеки это уже не стандартный C как таковой.

А вот оператор for, тип int,или операцию ++ из языка С/С++ не выкинуть.

Возвращаясь к самому началу разговора, это повод не использовать pow()? Или что? При каких обстоятельствах школьник столкнётся с отсутствием pow() в стандартном C?

sjinks ★★★
()
Ответ на: комментарий от tim91

Кстати вы подняли очень сложную проблему. Для всего западного, как это по-русски, «постиндустриального общества» специфична проблема нехватки не то что технических специалистов, а даже проблема нежелания понимать и учиться понимать. Разрушена сама идея. Нужны потребители. И всё. Одновременно с этим процессом идёт процесс соревнования чьё быдло глупее и успешнее пропъёт будущее своей страны во имя святой глобализации. Так вот я заинтересован тобы наше 95% было хоть чуть-чуть умнее их 95%. А для этого нужны _технические_ знания. Да из технарей потребитель никакой, однако стабильность и приятство общения перевешивают. Так-что с малых лет чем больше информации об безусловном устройстве мира, тем лучше. И бесплатно. Кто не в курсе, в мире тенденция к увеличению доли бесплатного высшего образования, а у нас наоборот. Привет фурсенке!

alx_me ★★☆
()
Ответ на: комментарий от alx_me

>Вы в курсе как реализованы большинство кодеков a/v, или системные утилиты.

В курсе. Вот только есть одно «но». Системные утилиты, многие из них, имеют ооочень почтенный возраст. И являются родственниками еще более почтенных утилит.

С кодеками тоже очень интересно. Да _сами_ кодеки реализованы по схеме процедурного программирования. Но они ориентированы на работу как можно ближе к железу: из него нужно выжимать все что можно... А там - ассемблер. А в ассемблере процедуры - единственный по сути дела доступный способ абстрагирования.

А представь, что вместо ассемблера используется форт. Ну например, в разработке, подобной GA144 компании GreenArrays. И сразу появляются дополнительные абстракции, не все из которых являются чисто процедурными. CSP, например.

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

Macil ★★★★★
()
Ответ на: комментарий от alx_me

> Ага. А вашими уже дремучая закостенелость и неспособность понять систему контроля и вывода типов.

в паскле замечательная система контроля типов на этапе компиляции.

это у тебя закостенелость.

результатом деления в большинстве случает является дробное число что и отражено в языке. Наличие / и div это полезная фича.

Собственно что толку спорить с идиотом который даже основы синтаксиса языка не знает но уже лезет со своими претензиями аки в Си по другому.

anonymous
()
Ответ на: комментарий от Jayrome

>А ты садист! :)

А тебя мне реально жаль. Ты даже не представляешь насколько это все просто и естественно.

Macil ★★★★★
()
Ответ на: комментарий от Macil

Сколько слов! Достаточно просто: «я ошибся, прошу прощения, есть у каждой парадигмы область применения.»

А то за одной маленькой глупостью тянется побольше. Я это про «почтенный возраст». coreutils тому пример. А так да. Чем выше по иерархии, тем более в сложности преобладают связи между объектами, а не сложность самих объектов, именно поэтому и ООП здесь к месту.

alx_me ★★☆
()
Ответ на: комментарий от alx_me

Тип результата это моё дело

Вы про математику слышали вообще? Результат деление двух вещественных чисел принадлежит множеству вещественных.

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

И если нет возможности его запрограммировать

Вам нужно переопределение операторов? Его в паскале нет. Оно вам нужно? Идите в те языки, где оно есть. Только советую помнить, что в них может так случиться, что при указании «x/y» у вас будет 0,1,3 и 5, в зависимости от контекста (от того, с какими типами задекларированы X и Y).

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

no-dashi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.