LINUX.ORG.RU

Лекция Юрга Гуткнехта «Проект Оберон: 30 лет» в Москве

 , , gutknecht,


3

5

24 октября в Университете Дмитрия Пожарского пройдёт лекция швейцарского профессора Юрга Гуткнехта, соавтора языков Pascal и Oberon, коллеги легендарного Никлауса Вирта.

В программе — совместная лекция и дискуссия «Проект Оберон: 30 лет» Лекторы: Президент Швейцарского общества информатики, профессор ETH Zurich, д-р Юрг Гуткнехт и Ведущий научный сотрудник отдела теоретической физики ИЯИ РАН, координатор проекта «Информатика-21», д.ф.-м.н. Фёдор Васильевич Ткачёв.

17:30, ЦЭМИ РАН (Нахимовский проспект, 47), аудитория 520. Регистрация и пропуск не требуется.

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



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

Не важно, что какой писал Ритчи почти полвека назад. Более интересно, как меня раскритикует анон.

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

и кста если уж приседать в гамаке то

можно подобрать(а людЯм с вышкой по естественным наукам допушенным тада до не_дешёвых ЭВМ явно это было по силам - образованию) такую функцию взаимного отображения заданного наперёд отрезка целых чисел - и нужного в данном цикле типа данных тада

for i:=L to|downto R do begin
  ourValueOfourType := FromIntToOurType(i);
  work;
end;

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

т.е. это (распространения «абстракций» ооп) - примечательное «змеиное масло» удостоверяющее что образовательная_машина поехала в нету степь

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

для этого нужно Царя внести.

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

Да все это известно-понятно, for(;;) суть while-переросток с возможностью ограниченного им же continue/break (переросток без негативного оттенка).
И алгольные Low(), High() присутствуют. И сишные указатель как массив. И много еще чего.

Зачем-зачем, просто провоцирую ;) Любая задача имеет красивое, простое и понятное неправильное решение.

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

ну там интересней история

Вирт предложил ( вмести с БыстройСортировкаАвтор) проект Алгол2.0 - с записями и чем_то_ещё - но комитет сказал - мы же умные мы можем двойные грамматике ВанДерВардена(ну ла там другой чел - но грамматика явно укуреней брэйн эт самое )

а студентов - это закладка на будущее.

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

Это совсем не в ту степь ;) у счетчика цикла Integer декремент единичка. Для списка с заголовком (известно количество элементов) могло быть:

p:=list.head;
for i:=0 to list.count-1 do begin
  //...
  p:=p^.next;
end;

Но ограничений кучка и никакой пользы окромя вреда.

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

Ни один из этих примеров на паскалевский for-to не переводится.

А должен? В Паскале это цикл с фиксированным числом повторов, он не для этого. Для такой задачи есть while.

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

эээ «это НОРМА» иметь счётчик в каждом узле односвязного списка

ну ок чё теперь «увас»(брат аваса) добавление в список (ака пуш) стал вместо щ(1) щ(Count) - скажите что вы не настоящий преподователь pls

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

у вас реально какой то странный односвязный список - у которого в поле элемента есть его(хвост+тек_голова) длина. т.е у всякого узла есть такое поле - ок ок - вы подерживаете актуальность только у головного - прст щедро память транжирите.

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

крч. скучный вы содискурсант.

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

у вас реально какой то странный односвязный список - у которого в поле элемента есть его(хвост+тек_голова) длина. т.е у всякого узла есть такое поле - ок ок - вы подерживаете актуальность только у головного - прст щедро память транжирите.


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

крч. скучный вы содискурсант.

Сам надумал, сам опроверг, всё сам... А скучный я ;-)

type
  ...
  PNode = ^TNode;
  TNode = record
    next: PNode;
    data: TSomeShit;
  end;
  TListHead = record
    head: PNode;
    count: Integer;
  end;
var
  list: TListHead;
  p: PNode;
...
  // далее по тексту

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)
Ответ на: комментарий от iluha16

твой пример нетипичный

зато CVE типичные...
Talk is cheap, show the code. Лекция Юрга Гуткнехта «Проект Оберон: 30 лет» в Москве (комментарий)

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

зато CVE типичные...

что такое CVE?

Talk is cheap, show the code.

ты вроде как не платишь поэтому и в ответ получаешь то что cheap.

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

Это точно. Даже простой код не понимаешь.

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

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

Теперь ровно с тем же интерфейсом напишем на Си ту же тривиальную задачу — обработать (напечатать) числа от a до b (беззнаковые), порядок следования не задан: f(3,5); // 3 4 5 5 4 3; f(5,3); // 5 4 3 3 4 5

Чую дух.

Я такие задачи в старших классах на КуВасике решал. Хоть бы мне потом чего из этого пригодилось, а нет. Лучше бы в то время Кнута, сортировку и поиск, так настойчиво в голову вкладывали.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Хоть бы мне потом чего из этого пригодилось

А знания по биологии там или по химии хоть раз пригодились?

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

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

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

зато CVE типичные...

Будто в си более типичных CVE нет. :)

Самое главное, что нужно помнить программисту при работе с unsigned типами, - для них поведение железно определено стандартом, в отличие от signed, которые implementation-defined.

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

Код:

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char ** argv)
{
	if (argc != 3)
		return 1;

	unsigned long a = strtoul(argv[1], NULL, 0);
	unsigned long b = strtoul(argv[2], NULL, 0);

	unsigned long d = (a < b) ? 1 : -1; /* <- вот эта строка */

	unsigned long i;

	i = a - d;

	do {
		i += d;
		printf("%lu ", i);
	} while (i != b);

	i += d;

	do {
		i -= d;
		printf("%lu ", i);
	} while (i != a);

	printf("\n");

	return 0;
}

Здесь нет ни undefined, ни implementation-defined behaviour, но чтобы в этом убедиться, пришлось перелистать спефикацию языка. Ответ был в пункте 2 в разделе 6.3.1.3. До его прочтения я не был уверен, является результат этой строки кода implementation-defined или нет:

6.3.1.3, Conversions - Arithmetic operands - Signed and unsigned integers:

1.

When a value with integer type is converted to another integer type other than _Bool, if the value can be represented by the new type, it is unchanged.

2.

Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or subtracting one more than the maximum value that can be represented in the new type until the value is in the range of the new type. (The rules describe arithmetic on the mathematical value, not the value of a given type of expression.)

3.

Otherwise, the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised.

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

Deleted
()

А вообще кто нибудь пользуется обероном на лоре? Видел в интернетах кодят Stm32 на нём, правда вопрос - зачем?

AUX ★★★★
()
Последнее исправление: AUX (всего исправлений: 1)
Ответ на: комментарий от anonymous

Sorry за не прошенный message.

Что касается «знаний» по географии, то хорошо запомнил только одно -
учительницу дразнили «жирафа» /«и это пожалуй все»/

Хуже всего у меня в школе обстояли дела с русской литературой.
«Не лезла» мне в голову «классика».
Мама /Царствие ей Небесное/ и плакала и заставляла «учить», но
орешек был упертый.
И вот как-то учительница задала всем написать сочинение на тему что-то вроде патриотизма ... /не помню точно/.
И вот моя сестра /Царствие ей Небесное/ говорит, а ты возьми газету «Правда» и
«Комсомольская правда» /а это были объемные газеты/ и выбери из них цитат.
И дело пошло.
Мой «труд» участвовал на олимпиаде и занял третье место в районе.
Грамоту дали.

Видно это у меня от отца /Царствие ему Небесное/.
Вот что он мне рассказал.
Когда он учился в институте, то по политэкономии часто нужно было писать рефераты /а он не любил ее/.
И говорит как-то в текст реферата поместил поэму Пушкина /думал, что реферат все равно ни кто читать не будет/.
Но преподаватель был «идейным» на все 100.
Так отец говорит, что нагоняй ему за это был не малый ...

Да и мне пришлось за политэкономию пострадать.
Не любил эту чушь /на семинары не ходил, .../
И преподаватель отомстил мне.
Два раза перездавал экзамен.
Поставил он мне четыре, а на мое суждение, что и в предыдущие разы отвечал ни хуже, он сказал «Да. Но ты на семинары мои не ходил».

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

Sorry за воспоминания.

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

2. а как актуально сравнивают вместо как вы выразились устаревшего " x=-x;if x<0 " - а константу minint выставлять на целевой машине кто и когда будет если разработка идёт на хосте, и компилирует на разные платформы с одного сырца в зависимости каким компилятором(т.е его профилем состояний)?

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

ой в си же небыло констант до ... года

Вроде к 80-м появились enum-ы? Не знаю точно.

да и макросы не врождённые

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

3.покажите pls не рекурсивный вариант с (если вам так жалко память и время на стековые вызовы) с иным трейдофом память-процинструкции - а уж если и по памяти и числом операций будет меньше то неплохо бы и так же по очевидности шоб было не хуже.

Обычное решение - писать число в массив на стеке, а потом печатать байты в обратном порядке.

Как и обещал, вот говнокод. Блин, он умеет только unsigned int, оказывается. :D Да и сделано всё через ж...

Был уверен, что найду код из игрушечного ЯП, который когда-то делал. Но нашел только еще более старый код из типа операционной системы (DOS-подобная мелочь).

inline UINT8 get_alpha(UINT8 i){if (i < 10) return '0' + i; else return 'a' + i - 10;}

VOID STDCALL putnumber(UINT num, UINT base, UINT pad){

 UINT8 str[32];
 INT i = 0;

 if (num == 0) {
  str[i++] = '0';
 }
 else {
  while (num){
   str[i++] = get_alpha(num % base);
   num = num / base;
  }
 }

 INT j = pad - i;
 while (j-- > 0) putchar('0');

 while (i-- > 0) putchar(str[i]);
}
Deleted
()
Ответ на: комментарий от iluha16

ты вроде как не платишь

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

поэтому и в ответ получаешь то что cheap

Нет так нет.

Шах расписался в полном неумении
Вот тут его возьми и замени...
(q) ВСВ

Но не поэтому. Причина примерно та же, почему девять женщин не родят одного ребенка за месяц.

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

Вот только в жизни бывает обычно по другому...
Эти тривиальные вопросы — они были не совсем просто так.
В паскалях программист во всех случаях, когда необходимо пройти по [a; b] (знаковых, беззнаковых) на автомате пишет примерно один и тот же код:

for i:=a to b do {...} ;

Для примера выше (доверять пользовательскому вводу нельзя, но не суть)
var
  a, b, t: LongWord;
  i: Integer;
begin
  if ParamCount<2 then Halt(1);
  Val(a,ParamStr(1),i); if i<>0 then Halt(2);
  Val(b,ParamStr(2),i); if i<>0 then Halt(3);
  if a>b then begin
    t:=a; a:=b; b:=t;
  end;
  for t:=a to b do Write(' ',t);
  for t:=b to a do Write(' ',t);
  WriteLn;
end.


В Си для знаковых просто и удобно когда пределы константы:
for (int i=0; i<10; ++i)
  printf(" %d",i);
for (int i=9; i>=0; --i)
  printf(" %d",i);

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

Вот такая вот провокация от языка ;-) Не смертельно, но неприятно, принцип наименьшего удивления никто не отменял.

К слову сказать, и для граничных значений, и для беззнаковых for(;;) тоже вполне применим, правда выглядит это несколько «нестандартно»:
for (unsigned i = a-1; a++ != b;) printf(" %u",i);
for (unsigned i = a+1; a-- != b;) printf(" %u",i);

Небольшой тест:
#include <stdio.h>

int main(int argc, char* argv[])
{
  unsigned int a, b;

  a=0; b=1;
  for (unsigned int i = a-1; a++ != b;) printf(" %u"); printf("\n");

  a=1; b=0;
  for (unsigned int i = a+1; a-- != b;) printf(" %u"); printf("\n");

  a=0xfffffffe; b=0xffffffff;
  for (unsigned int i = a-1; a++ != b;) printf(" %u"); printf("\n");

  a=0xffffffff; b=0xfffffffe;
  for (unsigned int i = a+1; a-- != b;) printf(" %u"); printf("\n");
}

Часто вы такие циклы в живом коде видите или сами пишете ;-) ?

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

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

Вам часто UINT_MAX попадается в качестве валидного граничного значения диапазона?

Часто вы такие циклов в живом коде видите или сами пишете ;-) ?

Если мне потребуется часто писать такие циклы, я скорее всего за-#define-ю FOR_INCLUSIVE(i, from, to) и буду им пользоваться.

Для примера выше

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

Паскалисты, ё-моё.

(доверять пользовательскому вводу нельзя, но не суть)

Чему именно вы тут не доверяете?

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

Оберон был королём Амбера, а внук его Мерлин, стал программистом. Очевидно же.

А отражение милорда Корвина правило в Венгрии.

Ты все десять книг прочел?

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

принцип наименьшего удивления никто не отменял.

Достаточно открыть страницу http://wiki.freepascal.org/For и проникнуться всей болью, надеждами и отчаянием, которые сочатся из неё. Такой вот принцип.

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

Напротив, можно лишь восторгаться продуманностью конструкций for и for in, в отличие от for(;;)

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

В чем затруднения-то?

А давайте вы решите задачу, которую предложил bormant, на паскале? Хочется уже посмотреть на всю мощь продуманности, но кода-то нет.

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

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

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

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

или сомневаетесь что эту задачу можно решить на Паскале?

Я вижу у ней три решения: кривое, очень кривое и без использования for. Вы какое предпочитаете?

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

Да, а что?

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

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

обработать (напечатать) числа от a до b (беззнаковые), порядок следования не задан:

f(3,5); // 3 4 5 5 4 3

f(5,3); // 5 4 3 3 4 5

Видимо, автор хотел сказать «напечатать от a до b, а потом обратно от b до a». Во всяком случае, так следует из этого примера.

Мой код: Лекция Юрга Гуткнехта «Проект Оберон: 30 лет» в Москве (комментарий)

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

У вас в программе 2 фатальных ошибки компиляции

Хоть кто-то внимательно читает ;) Это в Val, отвлекли.

  Val(ParamStr(1),a,i);
  Val(ParamStr(2),b,i);

Чему именно вы тут не доверяете?

$ ./tst 2 x


Считать ошибочное значение за 0? Хорошо. (Почему тогда отсутствующее значение не считать за 0?)

решает не ту задачу, что была заявлена вами выше.

Пусть будет та:

var
  a, b, t: LongWord;
  i: Integer;
begin
  if ParamCount<2 then Halt(1);
  Val(ParamStr(1),a,i);
  Val(ParamStr(2),b,i);
  for t:=a to     b do Write(' ',t);
  for t:=b downto a do Write(' ',t);
  if a<>b then begin
    for t:=a downto b do Write(' ',t);
    for t:=b to     a do Write(' ',t);
  end;
  WriteLn;
end.

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

ну два цикла прямой счет и обратный или надо в один?

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

Ну и пусть будет эквивалент:

var
  a, b, t: LongWord;
  d: Integer;
begin
  if ParamCount<2 then Halt(1);
  Val(ParamStr(1),a,d);
  Val(ParamStr(2),b,d);
  t:=a; d:=2*Ord(a<b)-1;
  Dec(t,d); repeat Inc(t,d); Write(' ',t); until t=b;
  Inc(t,d); repeat Dec(t,d); Write(' ',t); until t=a;
  WriteLn;
end.
или, если так привычнее
var
  a, b, t: LongWord;
  d: Integer;
begin
  if ParamCount<2 then Halt(1);
  Val(ParamStr(1),a,d);
  Val(ParamStr(2),b,d);
  t:=a; d:=2*Ord(a<b)-1;
  t-=d; repeat t+=d; Write(' ',t); until t=b;
  t+=d; repeat t-=d; Write(' ',t); until t=a;
  WriteLn;
end.

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

Считать ошибочное значение за 0?

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

Пусть будет та:

Прекрасно: в два раза больше кода, чтобы решить тривиальную задачу. Принцип DRY оказался несовместим с паскалем? Хотя какой к черту DRY, в этом языке даже метки требуют forward declaration.

Это как раз то решение, которое я назвал «очень кривое».

Посмотрим теперь на «просто кривое»:

program foo;
uses math;
var
  a, b, l, h, t: LongWord;
  i: Integer;
label count_up, count_down, out;
begin
  if ParamCount<2 then Halt(1);
  Val(ParamStr(1),a,i);
  Val(ParamStr(2),b,i);

  l := min(a, b);
  h := max(a, b);

  if a < b then goto count_up;

  count_down:
  for t := h downto l do Write(' ',t);
  if a < b then goto out;

  count_up:
  for t := l to h do Write(' ',t);
  if a < b then goto count_down;

  out:

  WriteLn;
end.

Читабельность куда-то делась. То ли еще будет - впереди переписывание на repeat until.

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

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

У вас ошибочное значение было принято за 0, сделал то же самое.

Прекрасно: в два раза больше кода, чтобы решить тривиальную задачу

Нет, только чтобы показать некоторые из положительных особенностей паскалевого for.

Посмотрим теперь на «просто кривое»

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

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)
Ответ на: комментарий от Deleted

Читабельность куда-то делась.

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

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

Нет, только чтобы показать некоторые из положительных особенностей паскалевого for.

Вроде это была особенность редактора, а не языка. Ctrl+C, Ctrl+V.

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

Э, нет. Мы тут рассматриваем преимущества великолепного оператора for, которым остается лишь любоваться, а не какого-то жалкого си. У вас есть еще задачи на тему считать туда и обратно? Будем жестить по-крупному! Как насчёт goto-стейт-машины состояний этак на 30-50?

t+=d;

Штоа?! Богомерзкий += в НЕПОГРЕШИМОМ СВЯТОМ ПАСКАЛЕ?! ВИРТ ПРИДИ ПОКАРАЙ ГРЕШНИКОВ!!111!«№;%:*@#$%^&&!!!

Это всё Borland Inc виновата. Сволочи, я так и знал, что они тайные сишники в душе, и только претворяются.

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

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

Тут как не пиши, а либо repeat until, либо говнокод.

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

Это всё Borland Inc виновата

Это было все-таки несколько позже. От Borland только Inc() и Dec().

Как насчёт goto-стейт-машины состояний этак на 30-50?

Предпочитаете подобное писать руками? Однако...

это была особенность редактора, а не языка. Ctrl+C, Ctrl+V

Туплю, не уловил идеи.

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

Ну это вроде амбаркадеро постаралась, ну и фрипаскаль.

Кстати, там еще так можно...

var p, p1, p2: PInteger;
begin
 p[15]:=12;
 p:=p + (p2-p1);
anonymous
()
Ответ на: комментарий от Deleted

Читабельность куда-то делась.

Чем так, уж лучше «монстра»:

procedure CountUp(a, b: LongWord);
begin
  for a:=a     to b do Write(' ',a);
end;

procedure CountDn(a, b: LongWord);
begin
  for a:=a downto b do Write(' ',a);
end;

var
  a, b: LongWord; d: Integer;
begin
  if ParamCount<2 then Halt(1);
  Val(ParamStr(1),a,d);
  Val(ParamStr(2),b,d);
  if a<b then begin
    CountUp(a,b); CountDn(b,a);
  end else begin
    CountDn(a,b); CountUp(b,a);
  end; WriteLn;
end.

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.