Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Zadania_na_2_semestr / Методическое пособие.pdf
Скачиваний:
377
Добавлен:
02.04.2015
Размер:
1.62 Mб
Скачать

Пример использования данной программы:

>> simpleDialog Главное меню

1.Разложить число на множители

2.Выход

> 3 Ошибка ввода, повторите ввод

Главное меню

1.Разложить число на множители

2.Выход

> 1 Введите целое положительно число: 90

Разложение введенного числа на множители 2 3 3 5

Главное меню

1.Разложить число на множители

2.Выход

> 1 Введите целое положительно число: 4.3

Ошибка, введены некорректные данные Главное меню

1.Разложить число на множители

2.Выход

> 2

Для простого вывод содержимого переменных удобно использовать функцию disp, однако для форматированного вывода она не подходит, поэтому далее рассмотрим функцию fprintf.

Функция fprintf

Данная функция представляет широкие возможности по форматированному выводу в командное окно. Функция fprintf имеет переменное число аргументов:

fprintf(форматированная_строка ,A1 ,..., An)

где форматированная_строка — обычна строка, состоящая из элементов двух типов. Первый тип это обычные символы, которые непосредственно выводятся в консоль. Второй тип это управляющие последовательности, которые определяют некоторые специальные символы или то каким образом будут отображаться следующие аргументы функции (A1 ,..., An). Все управляющие последовательности начинаются с символа \ или %. Поэтому непосредственно включить эти символы в выводимый текст не получится.

Сначала рассмотрим вывод некоторых специальных символов. Перечислим наиболее важные из них:

53

\n — перевод строки;

\\ — обратная косая черта;

%% - знак процента.

Продемонстрируем вывод этих символов и покажем отличие функции fprintf от

disp.

>>fprintf('30%% \\ 70%%\nEscape sequence\n'); 30% \ 70%

Escape sequence

>>disp('30%% \\ 70%%\nEscape sequence\n'); 30%% \\ 70%%\nEscape sequence\n

Как видно из примера функция disp выводит строку без изменения, в отличи от fprintf, которая заменять последовательность \n символом новой строки, последовательность \\ - \ и %% на %. Однако более интересным является управляющий символ %, задающий формат следующих аргументов в данном месте.

Общий формат управляющей последовательности начинающийся с символом % следующий:

%[номер_параметра][флаги][ширина][.точность] [подтип]спецификатор_преобразования

Например: «%3$0-12.5bu».

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

%d или %i — целое числа со знаком; %f — число с фиксированной запятой; %e — число в экспоненциальной форме; %s — строка.

Приведем пример использования данных спецификаторов:

>>fprintf('%s = %d\n', 'x', 10); x = 10

>>fprintf('%s = %e + %f\n', 'x', 105.15, 105.15); x = 1.051500e+02 + 105.150000

>>fprintf('%s = %d / %d', 'x', 1, 2);

x = 1 / 2>>

Как видно из данного примера аргументы, следующие после строки форматирования, должны следовать именно в тома порядке, в котором они используется в строке

54

форматирования. Т.е. например, если строка форматирования имеет вид '%s = %d\n', то первым аргументом после нее в функции fprintf должно быть строковое значение или совместимо с ним (MATLAB может выполнять неявные преобразования), которое будет подставлено вместо %s, аналогично последний аргумент будет подставлен на место %d.

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

Из последней строки примера видно, что функция fprintf в отличии от disp не производит автоматический перевод строки, поэтому желательно в конце строки форматирования ставить символ перевода на новую строку.

Рассмотрим далее на примере поля отвечающие за ширину и точность. Например управляющую последовательность %10.5f. Первое число указывает минимальную ширину поля для вывод (при выводе числа в ширине учитывается знак числа, точка, числа и прочее). Второе число указывает точность, т. е. число знаков после запятой.

Приведем примеры:

>> fprintf('|%12.5f|\n|%12.2f|\n|%12.8f|\n', 12.3, -3, 1/3);

|12.30000|

| -3.00|

|0.33333333|

>> fprintf('|%12.5e|\n|%12.2e|\n|%12.8e|\n', 12.3, -3, 1/3); | 1.23000e+01|

| -3.00e+00| |3.33333333e-01|

Более подробное описание функции fprintf можно найти в справочной документации MATLAB.

Организация диалога с пользователем и вывод таблицы с использованием форматированного вывод

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

Организовать диалог с пользователем для решения задачи составления таблиц со значениями следующих функций:

f (x )=e x

 

1

 

x

y2

 

f (x )=

 

y=−∞e

2

dy

 

 

 

 

(2 π)

 

 

55

Для этих вычисления функций можно воспользоваться функций можно воспользоваться функциями MATALB exp и normcdf. Программа должна выводить информацию о данных функция в главном меню. Меню программы должно содержать следующие пункты:

задание интервал для построения таблицы;

построение таблицы;

выход.

Приведем пример программы, реализующая данный функционал (файл exmpleLab5.m):

function exampleLab5( )

%пример организации диалога с пользователем и форматированного вывода в

%данном примере будет приведена программа для расчета и вывода таблиц

%значений функций exp(x) и normcdf(x)

%инициализируем параметры для построения таблицы значениями по умолчанию

xMin = -1; dx = 0.1; xMax = 1;

%выбранный пункт меню

choiceMenu = 0;

% организация главного меню while choiceMenu~= 3

% выводим главном меню

fprintf('Построение таблиц для функций:\n'); fprintf('e^x\n');

fprintf('( 1 / (2 * pi)^0.5 ) * e^( - x^-2 / 2 )\n'); fprintf('Текущий диапазон: %8.2f : %8.2f : %8.2f\n', xMin, dx,

xMax);

fprintf('Меню:\n');

fprintf('1. Построить таблицу:\n'); fprintf('2. Изменить диапазон:\n'); fprintf('3. Выход:\n');

%получить выбор пользователя choiceMenu = input('> ');

%проверить корректность полученного значения

if ~isscalar(choiceMenu) || ~isreal(choiceMenu) || (choiceMenu ~= round(choiceMenu))

fprintf('Ошибка ввода, повторите ввод.\n'); elseif choiceMenu == 1

% печать таблицы

56

printTable(xMin, dx, xMax); elseif choiceMenu == 2

%получим значения для нового диапазона [codeRes, xMinNew, dxNew, xMaxNew] = getRange();

%если ошибок не произошло, то запомним новые значения if codeRes == 0

xMin= xMinNew; dx = dxNew; xMax = xMaxNew;

else

fprintf('Ошибка ввода.\n');

end

end

% пропустим строку, чтобы отделить предыдущие действия fprintf('\n');

end

end

function [codeRes, xMin, dx, xMax] = getRange()

%Получить от пользователя диапазон значений для построения таблицы.

%Выходные данные: codeRes - успешность получения данных от пользователя: 0

%- данные успешно введены 1 - пользователь прекратил ввод или произошла

%ошибка ввода (для упрощения программы, в случае если введены

%некорректные данные прекратим ввод и вернемся в главное меню) xMin : dx :

%xMax - значения х в таблице

%инициализация переменных

codeRes = 0; xMin = 0; dx = 1; xMax = 1;

% получим xMin

xMin = input('Введите минимальное значение: ');

%проверка корректности введенного значения if ~isscalar(xMin) || ~isreal(xMin)

codeRes = 1; return;

end

%получим dx

dx = input('Введите шаг: ');

% проверка корректности введенного значения

57

if ~isscalar(dx) || ~isreal(dx) codeRes = 1;

return;

end

% получим xMax

xMax = input('Введите максимальное значение: '); % проверка корректности введенного значения

if ~isscalar(xMax) || ~isreal(xMax) codeRes = 1;

return;

end end

function printTable(xMin, dx, xMax)

%Вывод таблицы для заданных функций в диапазоне xMin : dx : xMax

%вывод шапки таблицы

fprintf('/

--------------------------------- x |

exp(x) |

\\\n');

fprintf('|

normcdf(x) |\n');

fprintf('|------- ------------ ------------

|

|

|\n');

%вывод содержимого таблицы for x = xMin : dx : xMax

fprintf('|%7.3f|%12.4f|%12.4f|\n', x, exp(x), normcdf(x));

end

%закроем таблицу

fprintf('\\---------------------------------

/\n');

end

Пример работы с данной программой:

>> exampleLab5

Построение таблиц для функций: e^x

( 1 / (2 * pi)^0.5 ) * e^( - x^-2 / 2 )

Текущий диапазон: -1.00 : 0.10 : 1.00 Меню:

1.Построить таблицу:

2.Изменить диапазон:

3.Выход:

> 2 Введите минимальное значение: -4

Введите шаг: 0.5 Введите максимальное значение: 4

Построение таблиц для функций: e^x

58