Смекни!
smekni.com

Программирование и разработка приложений в Maple (стр. 106 из 135)

> readdata("C:/Temp/data", 1), readdata("C:/Temp/data", 2), readdata("C:/Temp/data", 3);

[59., 10., 42.], [[59., 59.], [10., 17.], [42., 47.]], [[59., 59., 39.], [10., 17., 44.], [42., 47., 67.]]

Детальнее с readdata-функцией можно ознакомиться по справке пакета, тогда как с рядом важных особенностей данной функции можно ознакомиться в нашей книге [12]. В то же время функции writedata и readdata имеют существенные ограничения по типам данных, обрабатываемых ими, а именно допускаются только типы { integer, float, string}.

writedata1 := proc(F::{string, symbol}, data::{list, Matrix, matrix, vector, listlist}) local k, Λ, , ,h f R; Λ := proc() local n m k j, , , , µ µ1, , st L, ;

assign(f = `if`(type(F, 'file'), F, pathtf(F))), assign(h = fopen(f, `if`(nargs = 2, 'APPEND', 'WRITE')));

assign(µ = convert [( 255], 'bytes'), µ1 = convert [( 254], 'bytes'), st = "")

; if type(args 1[ ], {'list', 'vector'}) then R := convert(args 1[ ], 'list'); for k to nops(R) do if type(R k[ ], 'string') then R k[ ] := cat(R k[ ], µ) elif type(R k[ ], 'symbol') then R k[ ] := cat(R k[ ], µ1) end if; null writeline( ,( h convert(R k[ ], 'string')))

end do else assign(R = convert(args 1[ ], 'Matrix')), assign(n = Pind(R)[1], m = Pind(R)[2], L = convert(R, 'listlist1')); for k to n do for j to m do

if type(L k[ ][ ]j , 'string') then L k[ ][ ]j := cat(L k[ ][ ]j , µ)

elif type(L k[ ][ ]j , 'symbol') then L k[ ][ ]j := cat(L k[ ][ ]j , µ1) else L k[ ][ ]j := convert(L k[ ][ ]j , 'string') end if; st := cat(st, L k[ ][ ]j , " ")

end do; null(writeline(h, st[1 .. -2]), assign(' 'st = "")) end do

end if

end proc ;

`if`(nargs = 3, Λ(data, 7), Λ(data)), close( )f ,

WARNING("data have been saved in datafile <%1>", f)

end proc

> M:= Matrix(3, 4, [[7, "2", C, sin(7)], [7, `14`, "G", `ln(7)`], ["AVZ", Art, "Kr", 5+14*I]]): > V:= vector([7, "C", `G`, "sin(14)", (a - b)/( c- d), a + b*I]): M, eval(V);

"AVZ"77 "2"Art14 "Kr""G"C 5sin + ln(7)(147)I, 7, "C", G, "sin(14)", acdb, a + b I

> writedata1("C:/Temp/TestData1.dat", V); writedata1("C:/Temp/TestData2.dat", M, 7);

Warning, data have been saved in datafile <c:&bsol;temp&bsol;testdata1.dat>

Warning, data have been saved in datafile <c:&bsol;temp&bsol;testdata2.dat>

> readdata1("C:/Temp/TestData1.dat", 1), readdata1("C:/Temp/TestData2.dat", 1 .. 4);

"sin(14)"aac + "C" − G7b Idb , "AVZ"77 "2"Art14 "Kr""G"C 5sin 7 + ln(7)(14)I

Стандартная процедура writedata(F, data) пишет данные из выражений типов {matrix, list, listlist, vector} в текстовый файл F. При этом, если данные находятся в матрице либо во вложенном списке, то они выводятся построчно с разделением в строках символом табуляции «&bsol;t». В остальных случаях данные выводятся построчно с каждым значением в отдельной строке. Как правило, данные должны иметь тип {integer, float}; при этом, для возможности использования нечисловых и комплексных значений требуется программирование специальных процедур. Стандартная процедура readdata является обратной к writedata, обеспечивая чтение числовых данных из файла, подготовленного первой, в текущий сеанс. Между тем, во многих случаях возникает необходимость сохранения в ASCII-файлах произвольных данных. В частности, данные могут содержать значения fraction-типа и/или произвольные Maple-выражения. Данная проблема легко решается вышепредставленной процедурой writedata1 и сопутствующей ей readdata1-процедурой [41,103,109]. Процедура writedata1(F, data) пишет произвольные данные из выражений типов {matrix, Matrix, list, listlist, vector} в текстовый файл F. Если данные представлены вектором либо списком значений, то значения выводятся в отдельной строке, в противном случае значения выводятся построчно с резделением их пробелом в строке. В общем случае в качестве данных могут выступать произвольные Maple-выражения, расширяя существенно сферу приложений данных средств при работе с файлами.

Наконец, для обеспечения форматированного доступа к файлам данных можно использовать рассмотренные выше пару функций {fprintf|fscanf}, обеспечивающих соответственно {запись|чтение} форматированных данных {в|из} файла{а}, а также функции вывода {print, lprint} форматированной информации на печать, которые можно использовать совместно с {writeto, appendto}-функциями для сохранения вывода в текстовых файлах. Детальнее на данных функциональных средствах останавливаться не будем, ибо они обсуждались в связи с форматированным выводом на печать, что легко переносится на случай вывода в файл с дополнительным первым СФ-аргументом [12].

При этом, следует иметь в виду, что по fprintf-функции файл данных открывается как текстовый файл STREAM-вида в WRITE-режиме доступа и остается открытым, обеспечивая возможность обновления файла в APPEND-режиме. В последующем файл, созданный по fprintf-функции, может читаться как непосредственно соответствующей ему функцией fscanf, так и рядом других рассмотренных в настоящей главе функций доступа к файлам. Механизм форматирования, поддерживаемый fprintf-функцией, достаточно детально рассматривался в [12] и применение пары функций {fprintf, fscanf} для обеспечения форматированного доступа к файлам не составляет труда, принимая также во внимание то обстоятельство, что перед выводов в файл отформатированную запись можно легко визуально верифицировать на экране монитора.

Еще на одном моменте следует акцентировать внимание. Выше уже отмечалось то обстоятельство, что при кодировании спецификатора файла в различных представлениях (например, использование одинаковых букв на разных регистрах или разных разделителей каталогов) появляется возможность открытия одного и того же файла не только на разных логических каналах, но и для разных режимов доступа. Естественно, предоставляемой возможностью следует пользоваться весьма осмотрительно, однако и выгоды она имеет немалые. В качестве примера ниже приводится процедура utfile(F, S), обеспечивающая обновление «на месте» текстового файла F на основе системы подстановок S. Обе части которых имеют одинаковые длины. Подстановки S задаются списком уравнений, чьи левые части по длине идентичны правым. Подстановки производятся во все строки текстового файла F. Успешный вызов процедуры возвращает NULL- значение с выводом соответствующего сообщения. Читателю рекомендуется рассмотреть организацию процедуры.

utfile := proc(F::file, S::list(equation )) local a b c d k, , , , ; seq `if`( (length lhs( )( k ) = length rhs( )( k ), NULL, ERROR( "substitutions should have parts of identical length, but have received <%1>", k)), k = S);

assign(a = fopen(F, 'READ'), c = op(convert("" || F[1], 'bytes')));

`if`(90 < c, assign(b = cat(convert [( c − 32], 'bytes'), "" || F[2 .. -1])), assign(b = cat(convert [( c + 32], 'bytes'), "" || F[2 .. -1]))); while not Fend(a) do d := filepos(a); filepos(b d, ); writeline(b, SUB_S(S, readline(a) ))

end do;

close(a b, ), WARNING "datafile <%1> had been updated insitu",( F)

end proc

> utfile("c:/temp/test.txt", ["xyz"="aaa", mnp=350, "thu"="ccc"]); Warning, datafile <c:/temp/test.txt> had been updated insitu

> utfile("c:/temp/test.txt", ["xyz"="aaa", "mnp"="bbb", "t"=5]); Error, (in utfile) substitutions should have parts of identical length, but have received <t = 5>

В настоящем разделе и главе в целом рассматривались достаточно развернутые элементы программирования и использования функциональных средств доступа к внешним файлам Maple, составляющим ядро прикладного программирования в среде Maple-языка задач, связанных с обработкой данных, находящихся на внешних носителях. При этом, следует отметить, что искушенный пользователь вполне может ограничиться рассмотренными средствами доступа, сочетая их с иными функциональными средствами языка для создания собственных более развитых средств доступа. Для целого ряда приложений данная задача является достаточно актуальной, ибо существующая система доступа к внешним файлам, на наш взгляд, – одно из наиболее слабых мест Maple, требующее существенной доработки и развития в ряде направлений. Не взирая на вполне достаточный уровень представления средств доступа к внешним файлам, за более детальной информацией следует обращаться к книгам и Библиотеке [9-14,29-33,39,41-43,46,103,109], посвященным детальной проработке широкого круга аспектов данной проблематики.

Там же можно ознакомиться с целым рядом специальных вопросов системы в/в Maple.

Глава 7. Графические средства Maple-языка пакета

Учитывая роль визуальной информации при решении различного рода задач как прикладного, так и теоретического характера, каждое ПС рассматривается с точки зрения наличия у него графических средств отображения информации. В этом отношении пакет Maple имеет целый ряд положительных аспектов, рассматриваемых ниже. Язык пакета располагает развитым набором функций различных уровней, обеспечивающих формирование графических структур данных и вывод соответствующих им графических объектов (ГО) как в двух, так и в трех измерениях, а также в широком диапазоне систем координат. Каждая графическая функция допускает использование большого числа опций, управляющих как режимом вывода ГО, так и его оформлением. В настоящей главе рассматриваются базовые графические средства Maple-языка с акцентом на некоторых особенностях их применения и средствах, расширяющих стандартные функции. Ниже для удобства условимся графические средства называть «функциями», хотя по природе своей они являются процедурами, в чем легко убедится посредством нашей процедуры ParProc [41,103]. Между тем, это не является столь принципиальным и вполне допустимо как аксиоматикой пакета Maple, так и сутью функционирования данных средств.