Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Базовые средства матпакета Scilab

.pdf
Скачиваний:
55
Добавлен:
04.04.2023
Размер:
6.29 Mб
Скачать

значение T (True), если выражение «Истинно», и значение F (False) в противном случае – выражение «Ложно».

Операции отношения и соответствующие им функции служат для поэлементного сравнения скалярных величин, векторов и матриц. Список операций отношения приведен в Приложении 1.2, табл. 1.2.3-1.

Операции отношения выполняют поэлементное сравнение значений векторов или матриц одинакового размера и возвращают значение равное T, если имеет место полное совпадение, и значение Fв противном случае.

Операции <, <=, >, >= при комплексных операндах используются для сравнения только действительных частей операндов – мнимые отбрасываются. В то же время операции == и ~= ведут сравнения с учетом как действительной, так и мнимой части операндов.

Логические выражения обычно используются в операторах if, for, while, switch и служат для изменения последовательности выполнения операторов программы Scilab, а также при логической индексации матриц.

При вычислении выражений операции отношения имеют более низкий приоритет, чем арифметические операции, но более высокий, чем логические.

На рис. 1.2.3-1 приведены примеры вычисления логических выражений.

--> // Примеры логических выражений

--> --> // Пример1. Логическое умножение векторов

--> vF = [%T %F %F]; vK = [%T %T %F]; --> vF & vK

ans = T F F -->

--> // Пример2. Логическое сложение матриц

-->mA = [%F %T %F; %F %T %T;%T %T %F]; -->mB = [%T%T %F; %T %T %T;%T %T %F]; --> IL = mA | mB

IL =

T T F

TTT TTF -->

--> // Пример3. Умножение элементов вектора на константу

-->vF = [%T %F %F]; -->vF .* %F

ans =

0. 0. 0.

Рис. 1.2.3-1 Примеры логических выражений

Обратите внимание, что операнды операций отношения и логических операций должны иметь совместимые размеры.

31

Список логических операций и функций приведен в Приложении 1.2,

табл. 1.2.3-2.

1.2.4. Строки символов и форматирование данных

Строки символов

Строковая константа представляется в Scilab заключением символов в одинарные или двойные кавычки, а скалярная переменная (матрица 1×1) присвоением этой переменной значения символьной константы (рис.1.2.4-1).

--> // Создание данных строкового типа

--> --> // Создание символьных переменных

--> a = 'Система ', b = "Scilab"

a=

Система

b=

Scilab -->

--> // Создание символьной матрицы

--> mSt = ['Мы ' 'изучаем' 'Scilab' ' 6'] mSt =

!МыизучаемScilab6! -->size(mSt)

ans =

1.4.

--> length(mSt) ans =

3.7. 7. 2.

Рис. 1.2.4-1 Создание данных строкового типа

Для создания матрицы строк используется тот же синтаксис, что и для матриц арифметического типа. В примере, приведенном на рис.1.2.4-1, создана матрица строк размером 1×4 'Мы изучаем Scilab6'. Для того, чтобы вычислить ее размер, использована, как для обычных матриц, функция size, а для вычисления числа символов в каждом элементе матрицы – функция

length.

В оперативной памяти строка представляет собой последовательность кодов символов, из которых она образуется. Однако, после создания строки, она представляется для пользователя единым целым, поэтому без специальных функций при работе со строками невозможно использовать отдельные символы строки.

32

Следует помнить, что строки поддерживают лишь операцию конкатенации (объединения), которая обозначается символом плюс (+)

(рис.1.2.4-2).

--> // Объединение строк

-->

-->a = 'Система'; b = "Scilab"; --> c = a +' ' + b

c =

Система Scilab

Рис. 1.2.4-2. Выполнение над строками операции конкатенации

В системе Scilab имеется множество встроенных функций обработки строковых типов данных. Наиболее востребованными функциями, которые используются при работе со строками, являются функции string и strtod. Функция string позволяет преобразовать свой входной параметр из любого типа данных в строку символов, а функция strtod позволяет преобразовать свою входную строку цифровых символов в число (рис. 1.2.4-3).

-->

//

Использование строковых функций

 

--> x = [1 2 3 4 5]; // Вектор х

 

-->

 

 

 

--> //

Пример1. Преобразование х в строку

 

-->str

= string(x)

 

str

=

 

 

!1

2

3 4 5 !

 

-->

 

 

 

--> //

Пример2. Определение типа str

 

-->typeof(str)

 

ans

=

 

 

string

 

 

-->

 

 

 

--> //

Пример3. Str - матрица размером 1х5

 

--> size(str)

 

ans

=

 

1.

5.

 

-->

 

 

 

--> //

Пример4. Преобразование '10' в число

 

--> a = 2;

 

-->

c1

= a + strtod('10')

 

c1

=

 

 

 

12.

 

 

Рис. 1.2.4-3 Примеры использования строковых функций

В Примере1 вектор чисел х преобразован в массив строк str с использованием функции string,где каждая строка массива состоит из одного

33

символа. Затем, в Примере2 с использованием функции typeof проведена проверка того, что переменная str действительно является строкой, а в Примере3 использована функция typeof,выполнение которой показало, что переменная str является матрицей строк размером 1×5. В Примере4 показано преобразование строковой константы '10'в число 10.

Рассмотрим еще одну функцию, которая используется при работе со строками. Функция strcat объединяет свой первый входной аргумент с разделителем, определённым во втором входном аргументе (рис. 1.2.4-4). В приведенном примере функция strcat используется для получения новой строки.

--> // Использования функций strcat

-->

--> strcat(["1" "2" "3" "4" "5"]," + ") ans =

1 + 2 + 3 + 4 + 5

Рис. 1.2.4-4 Пример использования функций strcat

Форматирование строковых данных

При выводе данных в удобном для пользователя формате в Scilab имеется несколько функций, позволяющих выполнить преобразование произвольных типов данных в текстовые данные и производить управление их форматом:

mprintf – преобразует, форматирует и отображает данные в

командном окне;

mfprintf – преобразует, форматирует и записывает данные в файл;

msprintf – преобразует, форматирует и записывает данные в строку.

Форматирование в этих функциях (выравнивание, число значащих цифр и так далее) осуществляется с использованием определенных элементов нотаций (системой условных обозначений). Они аналогичны тем, которые

используются для форматирования строковых данных в языке C++. Например, формат %f преобразует значения с плавающей точкой к соответствующему строковому формату, а формат %.2f, представляют две цифр после десятичного знака, формат %12f представляет при выводе12символов, заполняя по мере необходимости незначащие символы пробелами. Кроме того, имеется возможность комбинировать элементы формата с обычным текстом и специальными непечатными управляющими символов escape-символами, такими, например, как символ новой строки\n.

34

Строка, содержащая элементы форматирования, может иметь шесть элементов. Справа налево эти элементы представляют: символ преобразования, подтип, точность, ширина поля, флаги и числовой идентификатор.

В общем виде функции форматирования данных имеют следующий

вид:

mprintf(Формат,СписокПеременных); mfprintf(Формат,СписокПеременных); msprintf(Формат,СписокПеременных).

Работу перечисленных выше функций рассмотрим на примере функции

mprintf:

Строка=mprintf(Формат,СписокПеременных),

где Строка– строковая переменная; Формат– параметр, который является строкой, содержащей символы преобразования (форматирования);

СписокПеременныхсписок переменных, значения которых необходимо отобразить в соответствующем формате.

Каждый Форматявляется строкой символов, который начинается с символа %, и сообщает всё о переменной, значение которой нужно подставить: её тип и модификаторы (ширина, точность, размер):

Формат='%ФлагиШирина.ТочностьРазмерТип'.

Ни один из перечисленных элементов не является обязательным, кроме элемента Тип, а часть элементов формата относятся только к некоторым типам данных. Например, ширина, точность и размер – относятся только к числам.

Обратите внимание на то, что в элементах формата не допускаются пробелы, причем символ преобразования является единственным обязательным полем, наряду с ведущим символом %.

Рассмотрим основные допустимые символы преобразования строки Форматподробнее.

В соответствии с синтаксисом, формат преобразования начинается с символа % и содержит следующие необязательные и обязательные элементы:

флаги (необязательно);

поля ширины и точности (опционные);

спецификатор подтипа (необязательно);

символ типа (преобразования) (обязательный).

35

Эти элементы задаются в порядке, показанном в примере на рис. 1.2.4-5

Рис. 1.2.4-5 Пример строки форматирования

Символы преобразования, указывающие нотацию (систему условных обозначений) для преобразования выходных данных, приведены в

Приложении 1.2, табл. 1.2.4-1.

Ширина и точность поля позволяют управлять шириной и точностью выходных данных (Приложение 1.2, табл. 1.2.4-2).

Например, если указать спецификатор формата %5d, то будет гарантировано, что вывод числа всегда занимает 5 символьных позиций (если нужно, то больше, но не меньше). Эта возможность очень полезна при печати таблиц, потому что и большие, и маленькие числа займут в строке одинаковое число позиций.

Следует иметь в виду, что результат вывода будет дополнен до необходимой указанной ширины слева. При этом большие числа, которые требуют для печати большее количество символов, будут выведены полностью.

Поле опции ширины должно быть указано таким, чтобы удовлетворять максимальному размеру ожидаемого выводимого числа. Например, если числа могут состоять из 1, 2 или максимум 3 цифр, то формат %3d подойдет. Опция ширины будет работать неправильно, если потребуется отобразить слишком большое число, которое не умещается в заданной ширине поля.

Числа с плавающей точкой (например, 3.1415) содержат точку, тогда как числа целого типа (например, 27) не имеют такой точки. Для печати чисел с плавающей точкой (double) флаги и правила работают точно так же, как и для целых чисел, но имеют несколько новых опций. Самая важная опция указывает, какое количество цифр может появиться после десятичной точки. Это количество цифр называется точностью (precision)числа.

В Приложении 1.2, табл. 1.2.4-3 приведены примеры возможных вариантов вывода числа e=2.718281828. Почему красным?

Обратите внимание, что если в качестве элементов формата указаны точка и число, то precision указывает, сколько десятичных знаков должно появиться после десятичной точки.

36

Если точка для %f не указана, то по умолчанию будет приведен формат %.6f (6 цифр после десятичной точки).

Если указано precision равное 0, то десятичная точка также исчезает. Для того чтобы ее вернуть, нужно после спецификатора формата %f указать ее в виде простого текста.

Можно в одном спецификаторе формата указать одновременно и ширину (width), и точность (precision). Например, 5.2 означает общую длину 5, с 2 цифрами после десятичной точки. Самая распространенная ошибка, когда считают, что это означает 5 цифр до точки и 2 цифры после точки.

Флаги позволяют управлять выравниванием выходных данных с помощью дополнительных флагов.

Ширину и точность с флагами можно комбинировать, чтобы указать левое выравнивание, дополнение слева нулями и применение знака +, - и т. д.

До или после операторов форматирования, перед знаком процента % или после преобразования, можно включать дополнительный текст. Причем этот текст может быть, как обычнымтекстом(текст для печати), так и текстом, состоящим из специальных символов, который нельзя вывести как обычный текст.

В Приложении1.2, табл.1.2.4-4 показаны допустимые специальные непечатные символы.

Рассмотрим несколько примеров форматирования, представленных на рис. 1.2.4-6.

-->// Примеры форматированного вывода

-->

--> // Пример1. Использование символов %s для вывода текста

--> t ='Текст';

--> mprintf('%s' ,t)

Текст

-->

-->// Пример2. Использование символов %f для вывода числа

--> x = 234.2;

--> mprintf('%6.2f', x) 234.20 -->

--> // Пример3.Вывод элементов матрицы в различных форматах

-->A = %pi * 1000 * ones(1,4) // ones(1,4) – создание матрицы из 1

A =

 

 

 

3141.5927

3141.5927

3141.5927

3141.5927

-->

--> mprintf('%f\n%9.2f\n%+12.5f\n%12.2f\n' ,A)

ans

=

 

 

!3141.592654

!

 

!

 

!

 

!

3141.59

!

 

 

 

 

 

 

 

 

 

37

!

!

! +3141.59265

!

!

!

!3141.59 !

Рис. 1.2.4-6 Примеры использования функции mprintf

В Примере1 для вывода строки (текста) использованы символы %s. В Примере2 для вывода значения числовой переменной использован символ %f. В Примере3 создается вектор А, состоящий из четырех элементов, а затем каждый элемент вектора выводится в своем числовом формате %f. Если формат содержит знак плюс (+), число выводится со знаком плюс, если использован формат %n.mf, то число при выводе состоит из n знаков, из которых m – число знаков после запятой. Использование управляющих символов \n позволяет вывести каждый элемент вектора с новой строки.

38

1.2.5. Списки, структуры и ячейки

Списки

Списки в Scilab – это типы структур данных, состоящих из множества элементов, которые могут иметь разные типы. Они могут быть созданы вручную или с помощью одной из следующих функций:

list – создает простой список, поля которого могут содержать

произвольный тип данных;

tlist – создать типизированный список;

mlist – создает матрично-ориентированный список.

Простой список list обычно используется, когда данные в нем обезличены. В остальных случаях удобно использовать типизированный список

(рис. 1.2.5-1).

--> // Пример создания простого списка и обращение к его элементам

-->

-->lt = list(complex(12, -6), [2312], [12; 34]); -->lt(1) // Обращение к 1-му элементу списка

12. - 6.i -->

-->lt(2) // Обращение ко 2-му элементу списка

2312. -->

-->lt(3) //Обращение к 3-му элементу списка

12.

34. -->

-->lt(1), lt(3) ($,$) // Обращение к 1-му, 3-му элементу списка и до конца ans =

12. +6.i ans =

34.

Рис.1.2.5-1 Пример создания простого списка и обращение к его элементам

Чтобы обратится к элементу списка, достаточно указать его индекс списка, например, к первому, второму и третьему элементу, а затем индекс элемента.

Над простым списком определены операции:

Доступ к элементам списка [x,y,z,...]=ИмяСписка(Vi),

где Vi – вектор индексов; [x,y,z,...]=L(:) извлекает все элементы.

Присвоение значения элементам списка по индексу iL(i)=a.

39

Добавление элемента в конец списка L($+1)=e.

Добавление элемента в начало списка L(0)=e(после этого операция e является элементом списка с индексом 1, а исходные элементы списка смещаются вправо).

Исключение элементов из спискаL (i)=null() удаляет i элемент списка L.

Объединение списковL3=lstcat(L1,L2).

 

Определение

числа

элементов

списка

либо ne=size(L),

 

либо ne=length(L).

 

 

 

 

 

Итерации

со

списком forj=L,...,end

цикл

с

 

числом итераций length(L),

переменная цикла j будет

равна L(i) на i-той

 

итерации.

 

 

 

 

 

Примеры некоторых операций над простыми списками и их элементами приведены на рис. 1.2.5-2.

-->// Примеры операции над простыми списками и их элементами

-->

--> L1 = list(5, ["М" "Т"]); // Простой список с двумя элементам

--> size(L1) // Размер 2 ans =

2. -->

--> // L1(0) - не существует! Выдается сообщение: Недопустимый индекс. --> L1(1) // Доступ к числу 5 с двойной точностью

ans = 5.

-->

--> L1(2) // Доступ к вектору строк ans =

!М Т !

-->

--> size(L1(2)) // Размер 1, 2 ans =

1.2.

--> L1(0) ="фу" // Вставка в начало списка

L1 =

L1(1)

фу

L1(2)

5.

L1(3)

!М Т !

-->

--> // L1(0) - не существует, "фу" записано в L1(1)

--> L1($+1) = "Привет"; // Вставка элемента в конец списка --> L1(2) = "Окно";// Переопределение 2-го элемента списка --> L1(3) = null(); // Удаление 3-го элемента списка

40