Блог о программном обеспечении

Зачем оно нужно?
Публиковать для себя разные вещи, чтобы потом не искать их у себя по разным папкам.
И, конечно, - делиться открытой информацией с другими.
Коротко по темам Caelinux - самый инженерный дистрибутив линукс;
CalculiX - мощная программа для расчетов по МКЭ;
OpenOffice Basic - то что легче выучить и затем эффективно использовать
Maxima - символьная математика от Вильяма Шеллтера, профессора Остинского университета. Все прочее - понемногу.

Рекурсия в OpenOffice

Самый наверное простой пример - с вычислением факториала
Вот - простая пользовательская функция в несколько строчек

 Function factori(n) 
 If n=0 Then factori=1 
 If n=1 Then factori=1 
 If n>1 Then factori=factori(n-1)*n 
 End Function

Тут следовало бы добавить условие n<=170, потому как на 171 уже вылетает ошибка, в связи с лимитом максимальной величины. Вообще каждую функцию по возможности следует обрамлять обработчиком ошибок, чего тут не сделано.
Другой пример - функция массива, которая в процессе выполнения генерирует другую функцию, а затем вычисляет значение по ней. В данном случае делается это для того, чтобы программа "понимала" формулу, введенную как текстовая строка, как формулу.


 Function TableOfResults( formula As String , LowerPoint As Double, UpperPoint As Double, NumOfValues As Integer)
'Create UserFunction in the New Module
   oBLibs = BasicLibraries
   oBL =  oBLibs.getByName("Standard")

'Text of new Function
Dim TextOfFunction As String

TextOfFunction = "Function results_by_formula(x)" & CHR(10) & "results_by_formula="& Str(formula) & CHR(10) & "End Function" & CHR(10)  

'Write the test of new function into the new module

If oBL.hasByName("New_Module") Then oBL.removeByName("New_Module")

oBL.insertByName("New_Module", TextOfFunction)

Dim ResArray(1 To NumOfValues+1 , 1 To 2) As Double



For i=1 To NumOfValues+1
ResArray(i,1)=LowerPoint+(i-1)*(UpperPoint-LowerPoint)/(NumOfValues)
ResArray(i,2)=results_by_formula(ResArray(i,1))
Next i

TableOfResults=ResArray
End Function 


Функция массива означает то, что при вводе нужно пользоваться сочетанием клавиш CTRL+SHIFT+ENTER. А при последующей правке следует выделить весь диапазон, занятый вычисленными значениями.
Вообще функции массива - это замечательное преимущество OpenOffice Basic перед VBA. Но удобно пользоваться ими далеко не всегда.
<Скачать пример тут>

No comments:

Post a Comment