LINUX.ORG.RU

Переиздание книг Столярова по программированию

 


9

4

Скандально известный на ЛОРе Андрей Викторович Столяров выпустил новое издание своего учебного пособия «Программирование: введение в профессию» и обновил PDF-версии:
«Азы программирования»
«Системы и сети»
«Парадигмы»
В новом издании 4-томник стал 3-томником.

Как и предыдущее издание, новое использует странную кодировку текста, но если вы не пользуетесь преимуществами электронных книг, разницы не заметите. Книга будет полезна начинающим изучать программирование.

>>> Сайт автора

★★★★★

Проверено: Shaman007 ()
Последнее исправление: Zhbert (всего исправлений: 3)
Ответ на: комментарий от bormant

Да речь-то о том, что синтаксис должен быть читабелен сам по себе, без подпорок в виде алиасов.

А любой код на Object Pascal, если мне не изменяет память, состоит из таких подпорок.

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

Я не знаю паскаль, если уж на меня намёк.

Я его когда-то изучал(1й курс) и что-то запомнил - мне этого хватает что бы подправить в Дельфи запрос в MSSQL и отрисовать «по образу и подобию» дополнительный график в древней проге.

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

любой код на Object Pascal, если мне не изменяет память, состоит из таких подпорок

Либо «любой код» — это библиотеки, либо что-то не то читаете ;-)

Умение сформулировать необходимые структуры данных под задачу — не самый плохой навык.

На самом деле единственное место, где без алиаса совсем не обойтись — это невозможность поставить несколько «^» перед идентификатором при объявлении указательного типа (но не при разыменовании).

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

когда железка подключится к интернетам и свяжется с Центром

Если могёт в тырнет вообще. Или же обновы по тырнету возможны, но надо залить кастом…

Задача стояла обновить сотню «кофеварок» - каких именно - не указано. Потому и начал допрашивать, что бы узнать возможности по времени/бюджету и т.п.

Для каких-то кофеварок хватит регистрации на сайте производителя и само прилетит, для других - паяльник+хитрый_прогер+платная_прога_программатор(наверняка платная на кол-во прошивок)+покупка_прошивки_залоченной_на_заводской_и_возможно_на_старт_чип_первой_чашки_кофе(привет принтерам самсунг и ксерокс)

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

Мне попадался такой пример, но я его не проверял

real, dimension(5) :: a = [ 2, 4, 6, 8, 10 ]
integer, dimension(2) :: i = [ 2, 4 ]

print *, a(i)   ! prints 4. 8
grem ★★★★★
()
Ответ на: комментарий от mimico

Менее двусмысленно было бы

Вкусовщина чистой воды.
Встречный вопрос: а разыменовывать указатель как будете?
В существующем варианте всё вполне симметрично:

var p: ^Integer;
...
  p^:=x;

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

Какой ещё зачёт? До сессии ещё далеко.

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

что это за алгоритмы, где не нужны указатели в паскале, но нужны в сишке.

Я ж с этого начал: уже в организации диалогового режима, для считывания данных, вводимых с клавиатуры.

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

невозможность поставить несколько «^» перед идентификатором при объявлении указательного типа

WTF уровня PHP с его getSomeArray()[2] -> Parse error: syntax error, unexpected '['

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

Быть может, шаман упустил ценного специалиста. И всё из-за своих стереотипов.

Вон недавно в Бостоне или где искали программиста на подоле.

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

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

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

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

Не покажу. Мне надоело одно и то же повторять тем, кто не осилил прочитать прошлые посты.

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

Мне попадался такой пример

Понятно. Нет, таких встроенных возможностей по трансформации массивов в синтаксисе Паскаля нет. Насколько понимаю, a(i) — это срез, аналогичный, например, a(3:4).

Эквивалент примера (по выполнению)

const
  a: array [0..4] of Real = (2, 4, 6, 8, 10);
  i: array [0..1] of Integer = (2, 4);
var
  e: Integer;

  for e in i do Write(' ',a[e]);

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

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

Учёбу алгоритмам надо закреплять практикой, закреплять можно на чём угодно, хоть на Лого, хоть на Scrath`е, хоть на Бейсике с Паскалем и тут Си ничем не хуже.

Нельзя. Лого или Scrath слишком «слабы», Бейсик – это смерть программиста.

Нет смысла спорить об очевидном: порог вхождения в Паскаль много-много ниже, чем в Си.

Нет смысла свергать авторитет Николаса Вирта, создавшего Паскаль в 1970 году, когда уже год как началась разработка Си.

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

Простейший проход по списку/дереву станет невозможно читать (да и писать его станет тем еще удовольствием):

  while p<>nil do begin
    Write(p^.data^.fld1:8, p^.data^.fld2:8, ...);
    p:=p^.next;
  end;

  while p<>nil do begin
    Write(deref p.deref data.fld1:8, deref p.deref data.fld2:8, ...);
    p:=deref p.next;
  end;

Не сказал бы, что второе читать/писать проще.

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

Вот только на начальном этапе для обучения, как тут утверждают «АЛГОРИТМАМ» хватит и простых объяснений вроде:

Вот именно: простых и на начальном этапе. Вывод графиков функций – это уже не простой и не начальный этап.

Начальный этап: считать 2 числа с клавы и вывести их в реверсивном порядке. Считать 2 числа и поделить первое на второе, если деление возможно. Считывать с клавиатуры числа, пока не введут нуль и вывести количество введённых чисел и их сумму.

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

«магию инклюдов»

Это религиозное что-то?

Инклуд — это, вашу мать, физический инклуд строк из одного файла в другой. Какая там магия?

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

«магию указателей»

Опять девочки с «информатики в экономике» в чем-то провинились, что вы их пытаете языками с указателями?

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

можно, вместо того что бы объяснять что такое Program laba_1 объяснить что #include <stdio.h>

Не-а. Для начала потребуется объяснить, что программа начинается с функции main() (а не со слова "программа по_имени, а дальше begin) и вот тут вы запаритесь объяснять, а что такое функция в Си, почему у неё должен быть тип и как сделать окончание проги корректным с т.з. ОС.

Да, я о том, что «правильнее» int main() {...; return 0;}, нежели ‘void main()’.

Или вы можете сказать «это такая необходимая магия, пишите это заклинание, смысл его поймёте (может быть) позже».

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

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

Я уже показывал, что «магию» инклюда и -lm (что в древнем TC-2.01 не надо - всё пальчикамиделается, а для BC(уже_с_плюсами)3.11 ещё и мышой) можно легко обойти «кратким объяснением что и почему», так же как uses Crt.

Более того, студент-программист будет в будущем изучать Си «углублённо», но он буде уже иметь его АЗЫ, которые, на самом деле, могут в в корне отличаться от того что ему преподавали ранее.

Пример - первый курс - адрес в памяти линеен, арифметика запрещена(обходится, но то не для первого курса). Начинаем изучать Си - - адрес в памяти линеен, арифметика разрешена (ШОК, А КАК ТАК!!!), Изучаем АСМ86 - снова ШОК""" - память не линейна и может перекрываться (сегмент-смещение)… следом идёт СПО с АСМ386 и дескрипторами - снова слом мозга - (физичиская/адресуемая/логическая память), оказывается, что адрес - это вовсе не ячейка в памяти, оказывается что это структура, даже нет - запрос к процу предоставить данные по адресу 0x12121212…

Зачем там часто «ломать голову» студенту. Сразу объяснить в терминах Си, что указатель - особый тип данных, и он может быть чем угодно, НО над ним разрешен ограниченное подмножество операций…

В будущем за одну-две лекции сэкономите намного больше часов.

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

К тому времени, когда человек начинает изучать Си, он уже знает, что такое программы и как они запускаются; знает, что каждая программа возвращает числовой код завершения; что программа принимает аргументы через командную строку; что программы могут читать переменные окружения, унаследованные от родительского процесса.

Си с его точкой входа main() сюда ложится логичным образом.

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

потребуется объяснить, что программа начинается с функции main() (а не со слова "программа по_имени, а дальше begin)

Какой злющий синдром утёнка вас преследует.

Я вот сижу и пытаюсь понять, почему же программа должна начинаться со слова "программа по_имени, а дальше begin". С какого перепуга?

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

можно легко обойти «кратким объяснением что и почему», так же как uses Crt.

Так не нужен в Паскале этот uses Crt на первых порах вообще. А когда понадобится, тогда уже и Паскаль не нужен.

Зачем там часто «ломать голову» студенту. Сразу объяснить в терминах Си, что указатель - особый тип данных, и он может быть чем угодно, НО над ним разрешен ограниченное подмножество операций…

Затем, что это вообще не надо объяснять в начале.

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

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

Я, кстати, встречал мнение, что программистов надо начинать учить с Лиспа.

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

в Си и Си++ нумерация массива от 0, а в паскале от 1?

Как вам уже показали (да вы, несомненно, знали это и раньше, просто забыли) — в Паскале индексы можно сделать достаточно произвольными, как и в Си. И на этих произвольных индексах учиться тому, что массив — ни что иное, как область в памяти, на которую может указывать какая-то переменная, и индекс массива — просто смещение от этой произвольной переменной. И делать это можно безопасно. Хотя на самом деле в Паскале, как здесь тоже показали, всё ещё более гибко, даже слишком гибко, имхо, как для учебных, так и для практических целей. Но по-прежнему безопасно.

То же и в Си. Например, я могу легко создать массив с отрицательными индексами:

#include <stdio.h>

int a[10];
int *p = &a[5];

int main()
{
  int i;
  for(i=-5; i<5; ++i)
    p[i]=i;
  for(i=0; i<10; ++i)
    printf("%i ", a[i]);
  putchar('\n');
  return 0;
}

Только в Си в этом месте легко споткнуться и испортить память, а в Паскале всё просто и безопасно.

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

К тому времени, когда человек начинает изучать Си, он уже знает,

Так про то и речь: Си для тех, кто УЖЕ ЗНАЕТ. Но мы НЕ МОЖЕМ рассчитывать, что ВСЕ пришедшие студенты УЖЕ ЗНАЮТ, что, например, каждая программа возвращает числовой код завершения; что программа принимает аргументы через командную строку;.

Для виндозника, которого обучали в школе «программированию» на питоне, встроенном в OpenOffce, это всё не самоочевидные вещи, даже если он писал что-то для Майнкрафта на Джаве.

что программы могут читать переменные окружения, унаследованные от родительского процесса.

Вот реально интересно, сколько первокурсников вытаращат глаза на произнёсшего такое на первой лекции?

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

Именно поэтому у нас выпускники после получения образования почти ни на что не пригодны без долгого дообучения

Знаешь, несколько лет назад мне пришлось пообщаться с одним старшекурсником на тот момент, которому сначала преподавали относительно новую и модную Яву, а потом как-то галопом по европам Си. И он вообще не врубался, что такое список. Т. е. он знал, что это такая штука, с помощью которой можно прыгать от одного элемента к другому. Но как оно работает внутри, совершенно не мог понять. Очень хочу надеяться, что мои долгие объяснения его просветлили в этом вопросе, но утверждать это наверняка не готов. А это был старательный и умный парень, закончивший потом ВУЗ с красным дипломом и устроившийся ява-джуниором в какую-то контору.

А ведь ему давали и яву, и си, а не какое-то старомодное легаси.

Это я к тому, что ответ на свой вопрос ты ищешь не в той плоскости.

Он не будет уметь отлаживать их без стерильного компилятора.

Т. е. одновременно с азами программирования надо изучать ещё и gdb? А не много ли для начинающего, который до этого кода в глаза не видел? Я это не к тому, что отладчик ненужен. Нет, он очень нужен. Но всё надо делать последовательно, а не наскоком.

В питоне строгая типизация.

Я не питонист, но вот смотрю туториал по питону https://pythonchik.ru/osnovy/tipy-dannyh-v-python:

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

И это строгая типизация?

Сначала мне говорят, что маллок - это страшно. Теперь говорят, что памятью надо управлять.

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

Многие алгоритмы из-за отсутствия ссылок невозможно реализовать

Ты точно знаешь питон?

Нет. А я и не говорил, что знаю. Но вот смотрю всё тот же туториал и вижу:

По одной из классификаций все типы данных в Python делятся на атомарные и ссылочные. Атомарные: числа; строки; Ссылочные: списки; кортежи; словари; функции; классы;

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

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

chcp 37

Мне кажется, что это что-то из той же области, что и koi7.

внутреннее представление цифры или буквы побитово совпадает с состоянием сегментов 8-сегментного индикатора. Или обладает какими-то нужными математическими свойствами. Или, наоборот, совсем простые, в которых 0 == ‘0’

Согласен. В совсем простеньком эмбеддеде такое возможно.

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

Я вот сижу и пытаюсь понять, почему же программа должна начинаться со слова «программа по_имени, а дальше begin». С какого перепуга?

Формально говоря, в программе может не быть переменных.

program Kill; begin writeln("Умри, жестокий мир"); end.

Хотя FreePascal, как я помню, разрешает не указывать вообще имя программы.

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

Я не знаю, что там нынче в школе. А меня обучали на курсах УПК, например. Программированию под DOS-ом.

А потом на подготовительных к поступлению в ВУЗ мы еще архитектуру этого самого DOS-а учили отдельно полгода.

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

профильным специальностям «мёртвые инструменты», в частности Паскаль программистам - теряются учебные часы.

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

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

Хотя FreePascal, как я помню, разрешает не указывать вообще имя программы.

Оно еще во времена Turbo Pascal стало необязательным...

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

Так не нужен в Паскале этот uses Crt на первых порах вообще. А когда понадобится, тогда уже и Паскаль не нужен.

пройдись тут по поиском по словам «gnuplot» и «uses crt» - найдёшь ответ, после которого Reset в powerdown ушёл.

Затем, что это вообще не надо объяснять в начале.

Согласен, кратко, минимум подробностей… как тут называют «магию указателей в Си» - там там полсеместра надо, и только после того, как они изучат адресацию процессоров i86 и т.п. (т.е. будут знать, что «шина адреса» это не только «набор проводов»).

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

Я и пытаюсь доказать, что всё это реально просто сделать без «мертвечины» в виде Паскаля. Для профильных ВУЗов будет лучше начать с Си, возможно с Питона(тут я сомневаюсь), но не с языков, которые будут «висеть в мозгах». Сэкономятся человекочасы на учёбу (как студентов, так и преподов)

Я, кстати, встречал мнение, что программистов надо начинать учить с Лиспа.

Слава богу он сюда не сунулся - точно бы «разорвали на куски», а идея глупая. Однокурсник умудрился на проце Z80 внутри мыльницы(настоящей мыльницы для обычного мыла) сделать стековую лисп-машину - сам паял, сам прошивал, сам программировал базу лиспа. Как удалось? - «Так там всего пять операций, главное стек пожирнее сделать…» - это был один из «вундеркиндов», знаниям, которых я завидовал…

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

во втором — том 3, стр.68

Прочитал. Интересно, но кое с чем несогласен.

[в] Си [skip] процедур тоже нет. [skip] функции, имеющие void в качестве возвращаемого значения. [skip] как мы сами воспринимаем программу, когда пишем её.

А почему нельзя воспринимать функции void как процедуры? Ты же несколькими абзацами ранее сам совершенно правильно написал, что разницы между фигурными скобками и словами begin и end нет, как и между амперсандом и and, и всё это выучивается за пару часов (тут я не соглашусь, но за пару дней точно выучивается). Почему же тогда слово void так принципиально отличается от слова procedure? Если так не нравится это слово, создай макрос #define procedure void и получишь процедуры в языке си. :-)

её вызов есть по прежнему частный случай арифметического выражения

Ничего подобного:

int x=0;

void f()
{
 x++;
}

int main()
{
 f() + f();
 return 0;
}
~$ gcc void.c
void.c: In function ‘main’:
void.c:10:2: error: void value not ignored as it ought to be
  f() + f();
  ^~~
void.c:10:8: error: void value not ignored as it ought to be
  f() + f();
        ^~~

То же самое будет, если попытаться подставить f() в логическое или ещё какое выражение. Потому что f() — по сути своей процедура, и компилятор это знает.

В Си вообще любое действие оказывается побочным эффектом

И это не так. Можно даже небольшую программку написать вообще без каких-то побочных эффектов:

int pow2(int x)
{
  return x*x;
}

int sum(int x, int y)
{
  return x+y;
}

int sumofsquares(int x, int y)
{
  return sum(pow2(x), pow2(y));
}

int main()
{
  return sumofsquares(3, 4)+sumofsquares(5, 6);
}

А что-то менее тривиальное и на Паскале без побочных эффектов написать не получится.

while(*src) {
    *dest = *src;
    src++;
    dest++;
}
*dest = 0;

А можно ещё так написать то же самое:

int i=0;
while(src[i]) {
    dest[i] = src[i];
    ++i;
}
dest[i] = 0;

Конечно, тут тоже есть побочные эффекты. Но и на Паскале получится примерно так же.

while(~wait(NULL));

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

Когда «процедуре», написанной на Си, есть что сообщить вызывающему — хотя бы просто отчитаться об успешности или неуспешности своей работы — это практически всегда делается через возвращаемое значение функции. Семантическая нелепость этого подхода становится ясна, как только из подпрограммы требуется получить больше одного значения; [skip] придётся переписать всю стандартную библиотеку, включая обёртки системных вызовов; [skip] отделить процедуры от функций не получается никак.

С этим согласен. Но всё-таки замечу, что если сильно извратиться, то можно. Например, для функций, модифицирующих errno, можно эту errno перед вызовом всегда сбрасывать, а после — проверять, без проверки кода возврата на 0/не 0. А если функция возвращает номер ошибки, не трогая errno, то написать обёртку в виде void-функции, в которой этот код возвращается в параметре, переданном по ссылке. Хотя, конечно, это огромный труд, в результате которого появится новая нестандартная библиотека.

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

А зачем нужен «теоретик», даже если он на бумажке в «блоках» решит задачу, когда не сможет чего-либо реализовать?

Сорри - я забыл, У Вас же не программисты, а математики… Речь то идёт о другой специальности…

З.Ы. Вы слышали о вакансии «1С-программист»? Они востребованы, оплачиваемы, халтур много… Что о них скажете? Вроде как тоже «программисты»…

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

А зачем нужен «теоретик», даже если он на бумажке в «блоках» решит задачу, когда не сможет чего-либо реализовать?

Ты читать совсем разучился? Чтобы что-то реализовать не на бумажке в качестве инструмента используется язык программирования. После того как основы выучат и научатся программировать, выучат другой язык, это не проблема и никакой «потери времени» тут нет.

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

З.Ы. Вы слышали о вакансии «1С-программист»? Они востребованы, оплачиваемы, халтур много… Что о них скажете? Вроде как тоже «программисты»…

За этим в ВУЗ идти не надо. Мало ли что востребовано. Сегодня одно востребовано, а завтра другое. В конце 90х начале 200х были востребованы так называемые «экономисты» и «юристы», но большинство из них сейчас либо полы метут либо телефонами в Евросети торгуют либо переквалифицировались во что-то другое.

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

И это строгая типизация?

Строгая/сильная vs слабая типизация это не то же самое, что и статическая vs динамическая.

А как свой список на низком уровне приготовить?

class Item:
    def __init__(self):
        self.prev = None
        self.next = None

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

На, изучай: https://habr.com/ru/post/161205/

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

Блин, ну чё вы спорите.

Если уж учить Си - то опираемся на стандарты C89, C99 и оттуда пляшем. Саму программу обучения надо строить на этих стандартах:

  1. До сих пор востребованы
  2. Редко меняются - можно отточить программу обучения до идеала
  3. Хоть и медленно, но компиляторы всё-таки приходят к мнению «стандарта» (спасибо gcc и clang)

Только не вздумайте в качестве курса читать «стандарт». ;))))

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

Грамматика Паскаля изначально была заточена на однопроходную компиляцию, поэтому к моменту ссылки на тип, он должен быть объявлен полностью.
Да, можно было потребовать, чтобы сделать исключение и для указателя, раз уж возможность объявить тип указателя на несуществующий тип все равно добавлена (тип1 = ^тип2), чтобы позволить аналогичное:

  element = record
    stroka: array [0..299] of Char;
    next: ^element;  { тут element определен ещё не полностью, 
                       его пока нет в таблице идентификаторов }
  end;

Но увы и ах, имеем что имеем.
Тем не менее, если во втором случае необходимость дополнительного прохода транслятора полностью исключена, то в первом — под вопросом.

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

пройдись тут по поиском по словам «gnuplot» и «uses crt» - найдёшь ответ, после которого Reset в powerdown ушёл.

С чего бы это? Я тебе объяснил, что это нахрен не нужно и в настоящем промышленном коде за который ты вроде как топишь никто так не делает, а вызывают внешние тулзы на сгенерированных счетной программой файлах. Да в том же экселе можно csv файл открыть и график нарисовать. Эксель это, внезапно, школьная программа и входит в ЕГЭ, каждый должен его знать.

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

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

Я уже высказывал своё мнение о вашем месте преподавания: «как преподаёте - так и плывут».

За этим в ВУЗ идти не надо

Как раз таки и надо. 1Сочником, будь ты хоть программистом/математиком_прикладником от бога ты стать вряд ли сможешь. Там нужны существа, вроде бухгалтеров/юристов/кадровиков, помешанных на программировании.

Язык 1С (если вы его видели) проще вами любимого паскаля. Но есть одно НО - что бы что-то сделать в 1С ТиС - нужно уже быть товароведом,что-то сделать в 1С ЗиК - нужно быть и кадровиком и бухгалтером. А так - как я уже говорил «для Бухгалтеров первым языком программирования должен быть встроенный в 1С язык»

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

А почему нельзя воспринимать функции void как процедуры?

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

Можно, замечу, и не-войдовые функции воспринимать как процедуры. У меня там даже есть на эту тему подробное руководство, в первом издании оно было прямо в этом параграфе, во втором уехало в часть, посвящённую Си (второй том) и раздулись там до параграфов 4.8.3 и 4.8.4. Только, опять же, для этого надо понимать, что вообще-то есть такая сущность «процедура». Сишность головного мозга такое понимание исключает полностью, причём не в последнюю очередь за счёт использования термина «функция» для обозначения всех подпрограмм оптом.

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