Необходимо вырвать нужный аргумент

Форум пользователей пакета Maple

Модератор: Admin

sarmat
Сообщения: 10
Зарегистрирован: Ср окт 12, 2005 12:34 pm

Необходимо вырвать нужный аргумент

Сообщение sarmat » Пт апр 07, 2006 2:02 pm

Здравствуйте, господа!
У меня возникла такая проблема. На очередном этапе вычислений Марle синим цветом выдаёт мне такое выражение:

max(50,20+30*sin(eta)+40*cos(eta))-10

далее мне нужно вырвать из этого следующее выражение

20+30*sin(eta)+40*cos(eta)

,то есть второй аргумент функции mах и работать далее с этим выражением.

Подскажите, пожалуйста, реально ли это сделать? И, если реально, то как?

Irmantas
Сообщения: 589
Зарегистрирован: Ср апр 27, 2005 8:49 pm
Откуда: Литва, Каунас

Re: Необходимо вырвать нужный аргумент

Сообщение Irmantas » Пт апр 07, 2006 2:23 pm

s:=max(50,20+30*sin(eta)+40*cos(eta))-10;
op([1,2],s);

sarmat
Сообщения: 10
Зарегистрирован: Ср окт 12, 2005 12:34 pm

Сообщение sarmat » Сб апр 08, 2006 12:39 pm

Большое спасибо!!

Kronos
Сообщения: 25
Зарегистрирован: Вс мар 27, 2005 7:41 pm
Откуда: Ульяновск

Сообщение Kronos » Сб апр 08, 2006 9:19 pm

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

Irmantas
Сообщения: 589
Зарегистрирован: Ср апр 27, 2005 8:49 pm
Откуда: Литва, Каунас

Сообщение Irmantas » Сб апр 08, 2006 11:11 pm

Сматрите в Helpe ?convert,hex
sk:=convert(973456,hex);
cat("",sk)[1];
[seq(cat("",sk)[j],j=1..length(sk))];
convert(EDA90, decimal, hex);

martingal
Сообщения: 32
Зарегистрирован: Чт ноя 24, 2005 10:55 am

Сообщение martingal » Сб апр 08, 2006 11:17 pm

А как из строки текста 1:23.475, означающей 1 минута, 23 целых и 475 тысячных секунды, вырвать минуты и секунды (нужно все перевести в секунды - 1*60+23.475=83.475)?

Irmantas
Сообщения: 589
Зарегистрирован: Ср апр 27, 2005 8:49 pm
Откуда: Литва, Каунас

Сообщение Irmantas » Сб апр 08, 2006 11:46 pm

martingal писал(а):А как из строки текста 1:23.475, означающей 1 минута, 23 целых и 475 тысячных секунды, вырвать минуты и секунды (нужно все перевести в секунды - 1*60+23.475=83.475)?

tm:="1:23.475";
sek:=(st)->60*parse(st[1..searchtext(":",st)-1])+parse(st[searchtext(":",st)+1..-1]);
sek(tm);

Андрей М.
Сообщения: 239
Зарегистрирован: Чт апр 21, 2005 3:15 pm

Сообщение Андрей М. » Вс апр 09, 2006 12:01 am

Для Kronos (остальным также небесполезно). Вопрос не совсем корректен, поэтому привожу два решения: (1) вычисление требуемой цифры числа (процедура f)

f:= proc(x::numeric, n::posint) local a; try # х – число, n – позиция цифры
a:= convert(x,'string')[n]; if length(a) < n then x else parse(a) end if;
catch: return a
end try
end proc:

> f(2006,4), f(2006,8), f(123.456,4), f(-123,1), f(-123,9);

2006, 2006, 123.456, "-", -123

(2) вычисление первого бита бинарного представления символа, строки или числа (процедура f1):

f1:= (x::{symbol, string, numeric}) -> parse(convert(convert(op(convert(convert(x, 'string'), 'bytes')[1]), 'binary'), 'string')[1]):

> f1("Gf"), f1(456), f1(A), f1(123.456), f1(-345);

1, 1, 1, 1, 1

Отличные средства побитной обработки представлены в книге по программированию в Maple www.aladjev.narog.ru.

Андрей М.
Сообщения: 239
Зарегистрирован: Чт апр 21, 2005 3:15 pm

Сообщение Андрей М. » Вс апр 09, 2006 12:03 am

Андрей М. писал(а):Для Kronos (остальным также небесполезно). Вопрос не совсем корректен, поэтому привожу два решения: (1) вычисление требуемой цифры числа (процедура f)

f:= proc(x::numeric, n::posint) local a; try # х – число, n – позиция цифры
a:= convert(x,'string')[n]; if length(a) < n then x else parse(a) end if;
catch: return a
end try
end proc:

> f(2006,4), f(2006,8), f(123.456,4), f(-123,1), f(-123,9);

2006, 2006, 123.456, "-", -123

(2) вычисление первого бита бинарного представления символа, строки или числа (процедура f1):

f1:= (x::{symbol, string, numeric}) -> parse(convert(convert(op(convert(convert(x, 'string'), 'bytes')[1]), 'binary'), 'string')[1]):

> f1("Gf"), f1(456), f1(A), f1(123.456), f1(-345);

1, 1, 1, 1, 1

Отличные средства побитной обработки представлены в книге по программированию в Maple www.aladjev.narod.ru.

Kronos
Сообщения: 25
Зарегистрирован: Вс мар 27, 2005 7:41 pm
Откуда: Ульяновск

Сообщение Kronos » Вс апр 09, 2006 12:06 am

возможно я несовсем коректно выразился

Имеем:
x:=100000;
нужно получить
y:=1;

т.е. мне нужна одна из цифр данного числа (в данном случае первая)

Kronos
Сообщения: 25
Зарегистрирован: Вс мар 27, 2005 7:41 pm
Откуда: Ульяновск

Сообщение Kronos » Вс апр 09, 2006 12:19 am

Все, проблема решена. Мне нужна было привести тип integer к string, взять нужный символ, а для обратного приведения к числу использовать, ранее неизвестную мне функцию parse (нашел в примерах Андрея М. и Irmantas). Спасибо за помошь.

Андрей М.
Сообщения: 239
Зарегистрирован: Чт апр 21, 2005 3:15 pm

Сообщение Андрей М. » Вс апр 09, 2006 12:24 am

Тогда вам сюда

> f(100000,1), f(567,1);

1, 5

или для вашего простейшего случая можно и так:

> f2:=(x::posint) -> parse(convert(x,'string')[1]);

> f2(100000),f2(567);

1, 5

martingal
Сообщения: 32
Зарегистрирован: Чт ноя 24, 2005 10:55 am

Сообщение martingal » Пн апр 10, 2006 2:14 pm

Irmantas, спасибо. Все очень изящно.