Лабораторная работа 3. ОПЕРАТОР ПЕРЕКЛЮЧЕНИЯ ФУНКЦИЙ
ВВОДА-ВЫВОДА
Цель работы: освоение оператора переключения языка программирова-
ния MATLAB, реализация различных способов ввода данных с клавиатуры и вывода на экран.
Основные сведения
Оператор переключения. Оператор переключения позволяет реализовать алгоритмы с ветвлением, как и оператор IF, рассмотренный в лаб. раб. 2.
Конструкция проверки нескольких условий операторами IF, ELSEIF громоздка. В случае, когда в проверках нет операторов сравнения (только операторы равенства и неравенства), целесообразно использовать оператор переключения SWITCH. Форма записи оператора выглядит следующим образом:
SWITCH переменная_выбора CASE значение,
операторы
CASE {зн1, зн2, зн3,...}
операторы
...
OTHERWISE,
операторы по умолчанию
END
Принцип работы оператора переключения: если переменная выбора принимает одно из значений, указанных после ключевого слова CASE, выполняются операторы, следующие за данным фрагментом кода. Операторы выполняются до тех пор, пока в коде не встретится следующее ключевое слово CASE, либо OTHERWISE, либо END. Необязательное ключевое слово
OTHERWISE определяет операторы, выполняемые по умолчанию, – когда переменная выбора не равна ни одному из предложенных вариантов. Если одни и те же действия требуется выполнить для нескольких значений переменной, они объединяются после CASE в вектор ячеек. При одном прохож-
дении оператора SWITCH может выполниться не более одного блока операторов. После выполнения блока программа переходит на строку, следующую за словом END.
Переменная выбора может быть скаляром или символьной строкой.
Скалярная переменная выбора может быть вещественным числом (в отличие
21
от языка программирования С, где тип переменной строго ограничен сим-
вольным или целочисленным типом). Вместо переменной выбора и предлагаемого значения можно указать любое выражение, результатом которого становится скаляр или строка символов.
Примечание: хотя оператор SWITCH не допускает в качестве перемен-
ной вектора чисел, иногда это ограничение можно обойти с помощью явного преобразования вектора чисел в символы. При этом следует учитывать, что при попытке преобразования вещественных чисел в символы MATLAB автоматически приведет данные к целочисленному типу, при этом дробные ча-
сти чисел теряются. Кроме того, диапазон чисел, преобразуемых в строковый тип, ограничен. Попытки преобразовать к символу число вне диапазона мо-
жет дать неопределенный результат, отличающийся в различных версиях пакета MATLAB на различных платформах.
Функции ввода-вывода. Базовая функция для ввода данных с клавиатуры – INPUT. Форматы ее вызова следующие:
N = INPUT(‘PROMPT’) или Str = INPUT(‘PROMPT’, ‘s’).
Обязательный аргумент функции INPUT – символьная строка, отобража-
емая в командном окне перед передачей управления пользователю. Как правило, в ней указывают информацию о вводимых данных. Пользователь мо-
жет ввести с клавиатуры любое число, матрицу, строку – в соответствии с правилами языка программирования MATLAB – либо вызвать функцию.
Если функция INPUT имеет второй параметр ‘s’, данные, введенные с клавиатуры, воспринимаются как символы. Выходной переменной при этом является символьная строка.
Основной функцией для вывода данных является функция DISP(X).
Функция позволяет выводить на экран командного окна любые данные: матрицы чисел, текст, ячейки. Функция выводит содержимое X без указания имени переменной.
Иногда возникает необходимость ввести числовые данные в строковом формате и затем преобразовать их в числа. Справедлива и обратная задача – вывод на экран комбинации текста и значений переменных или констант че-
рез строку символов. Для этих целей удобно использовать функции форматного чтения и записи sscanf и sprintf.
Функция sscanf предназначена для считывания данных из символьной матрицы и имеет следующую форму вызова:
[A, COUNT, ERRMSG, NEXTINDEX] = SSCANF(S, FORMAT, SIZE)
22
Аргументами функции служат матрица символов S, формат считывае-
мых данных, строка FORMAT, а также размер матрицы данных A, в которой формируются считанные данные. Остальные выходные параметры – необяза-
тельные. Целое число COUNT возвращает число успешно считанных элемен-
тов; ERRMSG – строка с сообщением об ошибке либо пустая строка, если при считывании ошибок не возникло; NEXTINDEX – индекс следующего по-
сле последнего считанного символа в строке S.
Строка FORMAT определяет формат считываемых данных по аналогии с языком программирования С. Перечень форматных констант приведен в таб-
лице. Признаком считываемых данных служит символ %.
Формат %i по умолчанию соответствует целому десятичному числу, но если считываемое число начинается с 0x или 0, то оно интерпретируется в системе счисления с основанием 16 и 8 соответственно.
Формат %[ ] позволяет считывать символы, входящие в квадратные скоб-
ки, притом допускается задавать их в виде диапазона (0–9, a–z, A-Z). Считыва-
ние происходит до первого символа, не входящего в заданный шаблон.
Если в символьном параметре FORMAT указано несколько разных типов считываемых переменных, MATLAB автоматически приведет значения к числовому типу. Вместо символов в матрице данных A будут ASCII-коды этих символов.
Параметр SIZE (необязательный) определяет размер матрицы считанных данных A. Можно указать целое число – максимальное количество считыва-
емых элементов, можно указать inf для считывания всех возможных элемен-
тов из символьной матрицы S, либо явно задать размер n m матрицы A век-
тором [n m].
Функция sprintf предназначена для формирования символьной матрицы и имеет следующий вид вызова:
[STR, ERRMSG] = SPRINTF(FORMAT, A1, ..., AN)
Выходные параметры функции: символьная матрица STR и символьная строка, содержащая сообщение об ошибке, либо пустая, если ошибок при за-
писи не возникло. Аргументами функции является строка символов
FORMAT, определяющая вид матрицы STR, и переменные A1–AN, значения которых передаются в строку в соответствии с заданным форматом.
23
Формат |
Тип данных |
Примечание |
%d |
integer |
Десятичное целое число |
%i |
integer |
Целое число (система счисления определяется |
|
|
по контексту) |
%ld, %li |
long integer |
Длинное целое (64-разрядное) |
%u |
unsigned integer |
Десятичное целое число без знака |
%o |
octal integer |
Число в восьмеричной системе счисления без |
|
|
знака |
%x |
hexadecimal integer |
Число в шестнадцатеричной системе счисления |
|
|
без знака |
%lu, %lo, |
long unsigned |
Длинное целое число без знака (64-разрядное) |
%lx |
|
|
%f |
single, double |
Вещественное число, естественная форма записи |
%e |
single, double |
Вещественное число, нормализованная форма |
|
|
записи |
%g |
single, double |
Вещественное число, автоматически |
|
|
определяемая форма записи |
%s |
char |
Последовательность символов (до пробела) |
%c |
char |
Единичный символ (включая пробел) |
%[ … ] |
char |
Заданные в строке символы |
Формат служит ключевым параметром для функции sprintf. Он может содержать любой текст и специальные последовательности символов для пе-
редачи значений параметров. Структура такой последовательности имеет вид (параметры в квадратных скобках необязательны)
% [идентификатор$][флаги][ширина][.точность][подтип]тип.
Идентификатор выделяется символом $ и выбирает по номеру переменную из списка переменных, приведенных после строки FORMAT.
Флаги устанавливают дополнительные свойства. Флаг ‘+‘ указывает на явный вывод знака числа (+ или –) и выравнивает строку по правому краю,
флаг ‘–‘ форматирует строку с выравниванием по левому краю. Флаг ‘ ‘ добавляет пробел перед выводом значения, флаг ‘0’ заполняет нулями пустые места перед значением.
Ширина (поля) – число, указывающее на общее количество знаков, от-
водимых под вывод значения. Для вещественных чисел ширина поля включает также знак числа и символ десятичной точки.
Точность устанавливается только для вещественных чисел и указывает на количество знаков после запятой.
Подтип указывается строго перед типом, предназначен для вывода вещественных чисел в разных системах счисления: ‘b’ – вещественных чисел двойной точности; ‘t’ – вещественных чисел одинарной точности.
24
Символ типа данных является единственным обязательным параметром и определяет выводимое значение согласно вышеуказанной таблице. Для вещественных чисел можно дополнительно указывать %E и %G – при отобра-
жении числа в нормализованной форме символ порядка будет прописным (например, 3.14E+01).
Если символьная матрица не содержит сторонних символов, функции форматирования можно не применять. Вместо этого можно использовать функции конвертирования типов (STR2NUM, STR2DOUBLE и т. д.).
[N] = STR2NUM(STR) – функция конвертирования строковой матрицы
STR в матрицу чисел N. Каждое число, заданное в строковом формате, может содержать кроме цифр символы i и j, обозначающие мнимую единицу, знак десятичной точки, признаки числа в экспоненциальном формате e и d. Функция распознает в строковой матрице специальный символ разделителя строк,
знаки операций. Если в строке задано выражение вместо числа, функция STR2NUM вычислит значение выражения и запишет его в выходную пере-
менную (вычисление выражения обеспечивается внутренним вызовом функции EVAL). Если число или выражение задано некорректно, функция возвра-
щает пустую матрицу.
[N]= STR2DOUBLE(STR) – функция преобразования строковых матриц
ктипу double. В качестве параметра требуется указать матрицу, каждый элемент которой – строка, конвертируемая в число. Соответственно, в каждом строковом элементе могут присутствовать кроме чисел знак десятичной точки, мнимые единицы, унарные плюс и минус и признак экспоненциального формата (‘e’). Если аргумент невозможно преобразовать к числу, функция возвращает значение NaN.
Для обратного преобразования числовых данных в строковые матрицы можно использовать функции NUM2STR (вещественные числа) или INT2STR
(целые числа).
Методика выполнения работы
1. Изменить программу вычисления функции x t,T из табл. П2, доба-
вив ввод данных с клавиатуры и вывод значений функции на экран.
2.Составить блок-схемы алгоритмов эмулятора календаря и обработки строки символов (см. табл. П5) в соответствии с вариантом задания.
3.Написать и отладить программы в соответствии с алгоритмами.
25