Лабораторная работа №2. Лабораторная работа №2_Элементы программирования на Матлаб. Элементыпрограммированияцель работы
Скачать 175.98 Kb.
|
ЛАБОРАТОРНАЯ РАБОТА № 2. ЭЛЕМЕНТЫ ПРОГРАММИРОВАНИЯ Цель работы – изучение средств системы по формированию массивов структур, интерактивному вводу информации, записи информации на диск, созданию М-файлов и приобретение практических навыков их использования. 1. КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ Массивы структур Обычные массивы удобны при работе с однородными данными – числами или строками. Если данные неоднородные, то для их хранения удобно использовать массив структур, каждый элемент которого является структурой с одинаковым набором полей, содержащих соответствующее значение. Такая информация может быть представлена в виде таблицы с полями, содержащими однотипные элементы. Например, информация о студентах может быть заключена в структуре со следующими полями: − Фамилия (family), содержит строку с фамилией; − Год рождения (year), содержит число; − Оценки (marks), содержит массив из пяти элементов с оценками. При использовании массивов структур необходимо помнить следущее: − Доступ к структурам, входящим в массив, осуществляется при помощи индексации; − Поле отделяется от имени структуры при помощи точки. Допускается два способа заполнения массива структур – операторами присваивания для всех полей каждой структуры массива или функцией strict. Операторы присваивания, заполняющие массив структур данными о студентах, приведены ниже. % заполнение первой структуры массива: >> Student(1).Family = 'Иванов С.И.'; >> Student(1).Year = 1980; >> Student(1).Marks = [5 4 4 3 4]; % заполнение второй структуры массива >> Student(2).Family = 'Петров В.В.'; >> Student(2).Year = 1983; >> Student(2).Marks = [5 4 4 5 4]; Просмотр содержимого полей каждой структуры требует задания ее индекса: >> Student(2) ans = Family: 'Петров В.В.' Year: 1983 Marks: [5 4 4 5 4] Указание поля структуры позволяет получить доступ к его значению. >> Student(2).Year ans = 1983 Альтернативным вариантом формирования структуры является применение функции struct, выходным аргументом которой является структура, подлежащая заполнению, а входными аргументами этой функции являются пары, содержащие имя поля и соответствующее значение. Синтаксис S = struct('<имя_поля1>', <значение_поля1>, '<имя_поля2>', <значение_поля2>, ...) Задание 1. Создать третью запись в массиве структур Student: >> Student(3) = struct('Family','Орлова Л.А.','Year',1984,'Marks',[5 5 4 5 5]); Просмотреть содержимое поля. >> Student(3) Задание'>Интерактивный ввод информации Для ввода числовой и символьной информации используется функция input. Синтаксис x = input('<приглашение> ') Задание 2. Ввести матрицу с клавиатуры, для ввода матрицы A задать следующую команду: >> A = input('Введите матрицу 3 × 3 ') Результат выполнения команды: Введите матрицу 3*3 [1 2 3;4 5 6;7 8 9] A = 1 2 3 4 5 6 7 8 9 Операторы цикла Для программирования многократно выполняющихся действий с различными данными используются операторы цикла. 1. Синтаксис оператора цикла с фиксированным числом повторений: for <счетчик > = <нач. значение> : <приращ. счетчика> : <кон. значение> <операторы MatLab> end Приращение счетчика определяет, насколько будет меняться значение счетчика после выполнения тела цикла. Если приращение счетчика равно единице, то его можно опустить. Задание 3. Составить вектор из шести элементов геометрической прогрессии. Элементы геометрической прогрессии рассчитываются по формуле P n = P 1 *q n–1 . Пусть P 1 = 3, q = 2, n = 6. >>P(1) = 3; q = 2; % подготовка к циклу >> for i = 1:6 P(i+1) = P(i)*q^i; end; >> P P = 3 6 24 192 3072 98304 6291456 Задание 4. Сформировать структуру, содержащую матрицу размерностью 3 × 3 и ввести две матрицы с клавиатуры; после ввода содержимое массивов структуры вывести на экран. >> mas = struct('h',zeros(3)); >> for i = 1:2 mas(i).h = input('введи матрицу '); end введи матрицу [1 2 3;5 6 7;8 9 0]; введи матрицу [3 5 9;1 1 2;9 5 5]; >> mas(1).h ans = 1 2 3 5 6 7 8 9 0 >> mas(2).h ans = 3 5 9 1 1 2 9 5 5 2. Синтаксис оператора цикла с предусловием: while <условие цикла> <операторы MatLab> end Повтор операторов выполняется, пока выполняется условие цикла. Найти максимальное значение матрицы случайных чисел v: >> v = rand(3) v = 0.9501 0.4860 0.4565 0.2311 0.8913 0.0185 0.6068 0.7621 0.8214 >> f = v; >> while length(f) = 1 f = max(f) end f = 0.9501 0.8913 0.8214 f = 0.9501 Оператор if Оператор if может применяться в простом виде для выполнения блока команд при выполнении некоторого условия или в конструкции if–elseif–else для написания разветвляющего алгоритма: Синтаксис if <условие> <операторы MatLab> end Для ветвления: if <условие> <операторы MatLab> elseif <условие> <операторы MatLab> elseif <условие> <операторы MatLab> else <операторы MatLab> end В зависимости от выполнения того или иного условия работает соответствующая ветвь программы; если все условия неверны, то выполняются команды, размещенные после else. Задание сложных условий производится с применением логических операторов. Логические операторы и примеры их использования приведены в табл. 2.1. Таблица 2.1 Логические операторы Оператор Условие Запись в MatLab Эквивалентная запись Логическое "и" x < 3 и k = 4 and (x < 3, k == 4) (x <3) & (k == 4) Логическое "или" x = 1, 2 or (x == 1, x == 2)) (x == 1) | (x == 2) Отрицание "не" а ≠ 1,9 not (a == 1,9) (a == 1,9) Задание 5. Организовать цикл для введения вектор-строки из трех целых чисел. При этом, если введенное значение текущего элемента вектора отрицательно, оно возводится в квадрат, если положительно – в куб. >>t = 'yes'; % подготовка к циклу >>while t = 'no' % пока t не равно символьной константе 'no', выполняется тело цикла B = input('input vector(1*3) ') if length(B) = 3 er = 'Введено не три элемента в вектор' else for i = 1:3 if B(i)<0 B(i) = B(i)^2 Пример открытия текстового файла 'zzz.txt' на диске С для записи: >>[F, mes] = fopen ('С:\zzz.txt', 'wt'); Форматный вывод в текстовой файл Синтаксис fprintf(<идентификатор_файла>,<формат> ,<список переменных>) Пример, fprintf(F,%7.4f%11.8f',x,y) здесь: − Идентификатор файла F определяется в операторе открытия файла; − Аргумент <формат> задает формат выводимых данных: знак % указывает на начало формата; первая цифра – общее количество цифр под переменную; цифра после точки – точность отображения; спецификатор f указывает на то, что следует вывести число в формате с плавающей точкой. Число форматов, начинающихся со знака %, должно равняться количеству элементов в списке вывода. Завершение строки с форматом символом ‘\n’ приводит к последующему выводу данных с новой строки. В строке форматов допустим текст. Задание 7. Записать матрицу случайных чисел в файл с названием rand.txt на диск (столбцы в матрице будут отделяться друг от друга вертикальными линиями). [F,mes] = fopen('rand.txt','w'); R = rand(3) fprintf(F,'| %7.4f | %7.4f | %7.4f |\n', R') fclose (F); Закрытие файла Синтаксис fclose (<идентификатор_файла>); По окончании работы необходимо закрыть файл командой fclose. Задание 8. Ввести с клавиатуры в массив структур mas две матрицы 3 × 3 и записать введенные матрицы в файлы c названиями f1.txt и f2.txt на диск C. for i = 1:2 mas(i).h = input('введи матрицу '); end введи матрицу [1 2 3;5 6 7;8 9 0]; введи матрицу [3 5 9;1 1 2;9 5 5]; % Запись матриц в файл: >> for i = 1:2 ch = int2str (i); % функция переводит числовое значение i в строковое ch1 = 'c:\f'; ch2 = '.txt'; str = strcat (ch1, ch, ch2); % функция объединения строковых значений [F,mes] = fopen(str,'wt'); fprintf(F,'%d %d %d \n', mas(i).h); fclose (F); end М -файлы Последовательность операторов можно записать в файл с расширением .m, так называемый М-файл, с помощью редактора М-файлов. Открыть новый М-файл можно командой меню: File/New/M-file ( пиктограмма ). Сохранить созданный файл можно командой меню: File/Save as (пиктограмма ). Запустить все или только выделенные операторы на выполнение из редактора М-файлов можно командой меню редактора: Debug/Run (пиктограмма ). Открыть существующий файл можно командой меню: File/Open (пиктограмма ). М-файлы могут содержать файл-функции (Function M-Files), в которых описываются функции, определяемые пользователем, и файл-программы – скрипты (Script M–Files), содержащие последовательность операндов. Типы М-файлов Файл-функции производят необходимые действия с входными аргументами и возвращают результаты в выходных аргументах. Первая строка в файл- функции является заголовком функции, в котором размещено имя функции и списки входных и выходных аргументов: function [<список выходных аргументов >] = <имя_функции>(< списoк входных аргументов) Пример заголовка: function f = myfun (x) Слово function определяет, что данный файл содержит файл-функцию, имя функции – myfun, определен один входной аргумент x и один выходной – f. После заголовка следует тело функции, где и вычисляется ее значение. Вычисленное значение записывается в f. При сохранении файла система запоминает его под названием функции при выполнении команды: File/save или File/Save as. Созданную функцию можно использовать, как и другие встроенные функции (sin(), cos() и т. п.), например, из командной строки. >> y = myfun(1.3) Если список выходных аргументов пуст, то заголовок выглядит так: function myfun(x) или function [] = myfun(x) В этом случае файл-функция не будет возвращать никаких значений. Файл-программы. Выполнение операторов, содержащихся в файл- программе, осуществляется двумя способами: − Из редактора М-файлов так, как описано выше; − Из Окна Команд системы или из другой файл-программы, при этом в качестве оператора используется имя вызываемой файл-программы. Организация меню программы в М-файле Для организации меню можно использовать функцию menu, которая выводит диалоговое окно с набором кнопок для выбора нужного варианта. Входными аргументами являются строковые переменные. Первый входной аргумент определяет заголовок окна, а остальные – названия кнопок. Синтаксис p = menu('<Название окна>','< Название 1 кнопки>','< Название 2 кнопки >',…); По нажатию на кнопку в переменную р заносится номер кнопки и закрывается окно. Задание 9. Создать файл-программу формирования гистограммы распределения случайных чисел. Закон распределения плотностей вероятности случайных чисел выбирается нажатием соответствующей кнопки: y = 1; while y = = 1 M = menu('ВЫВОД ГИСТОГРАММЫ СЛУЧАЙНЫХ ЧИСЕЛ',... 'НОРМАЛЬНОЕ РАСПРЕДЕЛЕНИЕ','РАВНОМЕРНОЕ РАСПРЕДЕЛЕНИЕ'); if M = = 1 x = randn(1,2000); figure,hist(x) title('НОРМАЛЬНОЕ РАСПРЕДЕЛЕНИЕ') end if M = = 2 x = rand(1,2000); figure,hist2; title('РАВНОМЕРНОЕ РАСПРЕДЕЛЕНИЕ') end y = input('Продолжить работу (1–да) – '); end 2. ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО РЕШЕНИЯ 1. В структуру, содержащую матрицы размерностью 3 × 3, в цикле – ввести с клавиатуры три матрицы: − − − − 1 1 1 1 2 1 1 1 1 ; − − − − 1 1 1 1 4 1 1 1 1 ; − − − − 1 1 1 1 2 1 1 1 1 Необходимо: вывести введенное содержимое матриц на экран, найти сумму элементов матрицы (если сумма меньше нуля, присвоить ей значение ноль), результат вывести на экран. 2. Сгенерировать матрицу случайных чисел размерностью 5 × 5. Найти сумму всех ее элементов. В зависимости от значения найденной суммы вывести на экран сообщение: 'Результат положителен' или 'Результат отрицателен'. 3. Организовать цикл для повторного выполнения следующих действий: ввести с клавиатуры целое число в диапазоне от единицы до трех; в зависимости от введенного числа генерировать матрицу размерностью 3 × 3: для единицы – единичную матрицу, для двойки – нулевую, для тройки – случайных чисел, распределенных по нормальному закону. При вводе других чисел выдать сообщение об ошибке. Полученную матрицу записать на диск. Окончание цикла по введению числа с клавиатуры предусмотреть введением символьной константы ' no', при входе в цикл символьную константу задать равной 'yes'. 3. ВОПРОСЫ 1. Каким образом можно создать структуру? 2. Какой оператор производит ввод информации с клавиатуры? 3. Как выполняется оператор цикла с фиксированным числом повторений? 4. Какова причина окончания оператора цикла с предусловием? 5. Как выполняется оператор if, switch? 6. Перечислите логические операторы и приведите примеры их использования. 7. Какие команды требуются, чтобы записать информацию в файл? 8. Для чего используются М-файлы? 9. Какие бывают типы М-файлов? Чем они отличаются друг от друга? |
Ниже приведен результат выполнения команд в цикле: input vector(1*3) [2 –3 2] % приглашение для ввода вектора из трех элементов
B =
2 –3 2
B =
8 –3 2
B =
8 9 2
B =
8 9 8
Продолжить цикл по вводу вектора? (yes/no) 'no'
>>
Оператор
switch
Оператор switch позволяет сделать выбор из произвольного числа имеющихся вариантов:
Синтаксис
switch <ключ>
case <значение_ключа–1>
<операторы MatLab>
case <значение_ключа–2>
<операторы MatLab>
…
otherwise
<операторы MatLab>
end
Переход на определенную ветвь оператора switch выполняется тогда, когда переменная <ключ> принимает значение, указанное после case (значения ключа должны быть целыми). Если подходящего значения для переменной не нашлось, то выполняется ветвь программы, соответствующая otherwise.
Задание
6. Ввести с клавиатуры вектор из трех нечетных целых чисел, входящих в диапазон от 5 до 9. В зависимости от значения вводимого элемента должна сгенерироваться матрица размерностью 3
×
3 со значениями элементов, равными значению вводимого элемента. Если в векторе значение элемента не принадлежит к заданному диапазону, выдается сообщение об ошибке.
>> P = input('Введи вектор из трех нечетных элементов от 5 до 9 ');
Введи вектор из трех нечетных элементов от 5 до 9 [5 7 9]
>> for i = 1:3 switch P(i)
'значение элемента не входит в заданный диапазон' end end
Ниже приведен результат выполнения команд: ans =
5 5 5 5 5 5 5 5 5 ans =
9 9 9 9 9 9 9 9 9 ans =
7 7 7 7 7 7 7 7 7
Запись
информации в файл
Открытие файла
Синтаксис
[F , mes] = fopen(<имя_файла>,permission)
Функция fopen выполняет открытие файла с именем <имя_файла>; в переменную F заносится идентификатор файла, который используется для указания на файл в других низкоуровенных функциях. Если файл не может быть открыт, то F = –1, в mes – соответствующее сообщение. Аргумент permission означает способ доступа к файлу:
•
'r+' – открытие двоичного файла для чтения и записи;
•
'r' – только для чтения;
•
'w+'
– открытие нового двоичного файла для чтения и записи
(если файл с таким именем существует, то содержимое будет удалено);
•
'w' – только для записи (если файл стаким именем существует, то содержимое будет удалено);
•
'a+' – создание нового файла или добавление в конец существующего файла для чтения и записи;
•
'a' – только для чтения;
•
'rt+','wt+','at+' – аналогично предыдущему, только для текстового файла.