OberonCore https://forum.oberoncore.ru/ |
|
Массив https://forum.oberoncore.ru/viewtopic.php?f=35&t=5991 |
Страница 4 из 4 |
Автор: | Kemet [ Понедельник, 05 Ноябрь, 2018 16:40 ] |
Заголовок сообщения: | Re: Массив |
Валерий Лаптев писал(а): Kemet писал(а): Всё уже украдено до нас - в Модуле-3 можно писать так: ... То есть любая секция BEGIN END может иметь предшествующую секцию VAR. Ну, у нас не Модула-3, а ББ+КП. |
Автор: | Валерий Лаптев [ Понедельник, 05 Ноябрь, 2018 17:08 ] |
Заголовок сообщения: | Re: Массив |
Ну, М3 - не единственный язык, где все понятно. Собственно в Семантике мы ужесточили указатели, но ослабили объявления, разрешив их по мере необходимости. |
Автор: | PSV100 [ Понедельник, 12 Ноябрь, 2018 21:03 ] |
Заголовок сообщения: | Re: Массив |
Недавно рассматривал любопытный проект 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, как раз с математическом направлением, не уделяют внимание подобной эргономике и безопасности). |
Автор: | Rifat [ Среда, 14 Ноябрь, 2018 09:59 ] |
Заголовок сообщения: | Re: Массив |
Валерий Лаптев писал(а): ... Тем не менее, я сделаю диалект с возможностью объявления переменных по месту. А там - посмотрим. Сейчас только столкнулся с вредом объявления по месту в 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... |
Автор: | Comdiv [ Среда, 14 Ноябрь, 2018 14:47 ] |
Заголовок сообщения: | Re: Массив |
Вроде бы, на пример вреда не тянет. |
Автор: | sadkouski [ Воскресенье, 26 Март, 2023 13:04 ] |
Заголовок сообщения: | Re: Массив |
Не могу решить. Дан массив с элементами 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 |
Автор: | Artyemov [ Воскресенье, 26 Март, 2023 23:54 ] |
Заголовок сообщения: | Re: Массив |
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 В цикле по всем элементам исходного массива проверяется "ненулёвость" элементов, и каждый не нулевой сохраняется в результирующий массив: будут выброшены все нолики. |
Автор: | sadkouski [ Понедельник, 27 Март, 2023 09:47 ] |
Заголовок сообщения: | Re: Массив |
Я, если задача не идёт, ищу в нэте решение на Паскале, и привожу к КП виду.Этот раз мне этот способ не спасает. Уже дней 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 |
Автор: | Иван Денисов [ Понедельник, 27 Март, 2023 13:15 ] |
Заголовок сообщения: | Re: Массив |
Вот так можете попробовать Код: 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. |
Автор: | sadkouski [ Понедельник, 27 Март, 2023 19:43 ] |
Заголовок сообщения: | Re: Массив |
Иван Денисов спасибо Вам за решение! Работает. Изучаю.Заношу в свой решебник. 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 Это максимум чего я добился В журнал даёт результат, а в действительности его нет |
Страница 4 из 4 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |