OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 15:21

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 70 ]  На страницу Пред.  1, 2, 3, 4
Автор Сообщение
 Заголовок сообщения: Re: Массив
СообщениеДобавлено: Понедельник, 05 Ноябрь, 2018 16:40 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Валерий Лаптев писал(а):
Kemet писал(а):
Всё уже украдено до нас - в Модуле-3 можно писать так:
...
То есть любая секция BEGIN END может иметь предшествующую секцию VAR.

Ну, у нас не Модула-3, а ББ+КП.
Так если заниматься изобретением велосипедов и курощать компилятор, то вполне можно использовать конструкции, не рвущие синтаксис и логику. И в М3 именно такое решение - любой блок может начаться с секции определений. Всё понятно и привычно, а всякие отдельные VAR, в произвольном месте делают программу плохочитаемой и не понятно, как определять область видимости - в М3 всё интуитивно понятно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массив
СообщениеДобавлено: Понедельник, 05 Ноябрь, 2018 17:08 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Ну, М3 - не единственный язык, где все понятно.
Собственно в Семантике мы ужесточили указатели,
но ослабили объявления, разрешив их по мере необходимости.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массив
СообщениеДобавлено: Понедельник, 12 Ноябрь, 2018 21:03 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 473
Недавно рассматривал любопытный проект CPAL (Cyber-Physical Action Language):
https://www.designcps.com/

Это система разработки и имитационного моделирования для embedded, академический проект (с некоторой практикой), но фактически это развитие платформы от Westingshouse, переданной академическому сообществу. В основе для моделей Си-подобный язык (хотя с непривычки есть некая ломка мозга при виде объявлений как "const uint8: threshold = 30", где используется двоеточие, но порядок указания типов Си-шный (перед идентификатором переменной/константы) вместо привычного Pascal/ML-порядка в случае использования ":"). Как минимум соблюдается MISRA, а в целом платформа когда-то прошла процедуры сертификации по стандартам безопасности. Обращает на себя внимание декларирование переменных, что как раз отмечено выше в теме. Переменные вводятся по месту, как и в Си, но только в начале синтаксической области (внутри {}-блоков).

И чтобы два раза не вставать, дополню. Где-то здесь на форуме рассматривались и прочие языковые вопросы в контексте возможного развития/модификации Оберонов/КП, и в частности насчёт введения композитных операций сравнения вида "a < x < b". В CPAL имеются такие операции, но в отличие от Питон и пр. есть ограничения. Не допустимы:
0 != 1 == 1
0 < 1 == 1
0 >= -1 != 2

Такие операции крайне нежелательны (формируется warning, но фактически введён запрет, его не было изначально и warning выдается из-за совместимости):
0 < 3 > 2
0 >= -1 < 2
2 >= 2 < 4

Т.е. допускаются лишь однородные операции:
0 < 1 < 2
0 <= 0 < 1
3 < 2 <= 1
2 == 2 == 2
3 != 1 != 3

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массив
СообщениеДобавлено: Среда, 14 Ноябрь, 2018 09:59 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Валерий Лаптев писал(а):
...
Тем не менее, я сделаю диалект с возможностью объявления переменных по месту.
А там - посмотрим.

Сейчас только столкнулся с вредом объявления по месту в C#.
Был такого вида код:
Код:
SomeType Variable = SomeFunction();
... SomeCode...

Variable = SomeFunction();
... SomeCode...


Возникла необходимость добавить условия проверки параметров перед каждым из блоков:
Код:
if (Parameter1 == true)
{
  SomeType Variable = SomeFunction();
  ... SomeCode...
}

if (Parameter2 == true)
{
  Variable = SomeFunction();
  ... SomeCode...
}

И соответственно данная (казалось бы безобидная операция добавления условий) приводит к ошибке, что во втором блоке переменная не определена.
А если бы переменная была определена в начале функции, то проблемы бы не возникло:
Код:
SomeType Variable;

Variable = SomeFunction();
... SomeCode...

Variable = SomeFunction();
... SomeCode...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массив
СообщениеДобавлено: Среда, 14 Ноябрь, 2018 14:47 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Вроде бы, на пример вреда не тянет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массив
СообщениеДобавлено: Воскресенье, 26 Март, 2023 13:04 
Аватара пользователя

Зарегистрирован: Понедельник, 20 Март, 2023 12:22
Сообщения: 22
Не могу решить. Дан массив с элементами
1 2 3 0 0 0 4 4 0 0 5 5 0 0 0 0 0 0 0 9 9 0
Как его привести к виду
1 2 3 4 4 5 5 9 9


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массив
СообщениеДобавлено: Воскресенье, 26 Март, 2023 23:54 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 597
sadkouski писал(а):
Не могу решить. Дан массив с элементами
1 2 3 0 0 0 4 4 0 0 5 5 0 0 0 0 0 0 0 9 9 0
Как его привести к виду
1 2 3 4 4 5 5 9 9

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массив
СообщениеДобавлено: Понедельник, 27 Март, 2023 09:47 
Аватара пользователя

Зарегистрирован: Понедельник, 20 Март, 2023 12:22
Сообщения: 22
Я, если задача не идёт, ищу в нэте решение на Паскале, и привожу к КП виду.Этот раз мне этот способ не спасает. Уже дней 10 по по 2 часа.Буду благодарен за код. Спасибо!
(* Дан массив размера N . Удалить из
массива элемент с нулевым значением
*)
MODULE Array;
IMPORT L := StdLog, In;
PROCEDURE P*;
VAR k, N, i : INTEGER;
mas: ARRAY 20 OF INTEGER;
BEGIN
In.Open; L.Clear; In.Int(N );
FOR i := 0 TO N -1 DO In.Int(mas[i] ); END; L.Ln;
FOR i :=0 TO N - 1 DO L.Int(mas[i]); END; L.Ln;


(*результатом хотелось бы иметь возможность дальше пользоваться, не только вывести в журнал*)

END P;
END Array.
Array90.P 20 1 2 3 0 0 0 4 4 0 0 5 5 0 0 0 0 0 0 0 9 9 0


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массив
СообщениеДобавлено: Понедельник, 27 Март, 2023 13:15 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Вот так можете попробовать

Код:
MODULE Array;

IMPORT L := StdLog, In;

PROCEDURE RemoveZeros(IN m: ARRAY OF INTEGER): POINTER TO ARRAY OF INTEGER;
VAR n, k, size: INTEGER; r: POINTER TO ARRAY OF INTEGER;
BEGIN
   n := 0; size := 0;
   WHILE n < LEN(m) DO
      IF m[n] # 0 THEN INC(size) END;
      INC(n);
   END;
   IF size > 0 THEN
      NEW(r, size);
      n := 0; k := 0;
      WHILE n < LEN(m) DO
         IF m[n] # 0 THEN r[k] := m[n]; INC(k) END;
         INC(n);
      END;
   END;
   RETURN r
END RemoveZeros;

PROCEDURE P*;
   VAR k, N, i : INTEGER; mas, res: POINTER TO ARRAY OF INTEGER;
BEGIN
   In.Open; In.Int(N);
   IF (N > 0) & (N < 100000) THEN
      NEW(mas, N);
      i := 0;
      REPEAT
         In.Int(mas[i]);
         INC(i);
      UNTIL (i = N) OR ~In.Done;
      res := RemoveZeros(mas);
      IF res # NIL THEN
         FOR i :=0 TO LEN(res) - 1 DO L.Int(res[i]); END; L.Ln;
      END;
   END
END P;

END Array.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массив
СообщениеДобавлено: Понедельник, 27 Март, 2023 19:43 
Аватара пользователя

Зарегистрирован: Понедельник, 20 Март, 2023 12:22
Сообщения: 22
Иван Денисов спасибо Вам за решение! Работает.
Изучаю.Заношу в свой решебник.
MODULE Arra;
IMPORT L := StdLog, In;
PROCEDURE P*;
VAR N, i : INTEGER;
ar: ARRAY 20 OF INTEGER;
BEGIN
In.Open; L.Clear; In.Int(N );

FOR i := 0 TO N- 1 DO In.Int(ar[i]); END;
FOR i := 0 TO N- 1 DO L.Int(ar[i]); END;L.Ln;
FOR i := 0 TO N -1 DO
IF ar[i] > 0 THEN L.Int(ar[i]); END;
END;

END P;
END Arra .
Arra.P 20 1 2 3 0 0 0 4 4 0 0 5 5 0 0 0 0 0 0 0 9
Это максимум чего я добился
В журнал даёт результат, а в действительности его нет


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 70 ]  На страницу Пред.  1, 2, 3, 4

Часовой пояс: UTC + 3 часа


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

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


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB