русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Массивы структур и массивы ячеек


Дата добавления: 2015-07-09; просмотров: 2393; Нарушение авторских прав


Массивы MatLab могут состоять не только из чисел или символов, но содержать и более сложно организованную информацию. Пусть необходимо хранить и обрабатывать информацию о группе из пяти студентов. Информация о каждом студенте включает в себя:

§ фамилию;

§ имя;

§ год рождения;

§ экзаменационные оценки по четырем предметам.

Структура данных, относящихся к каждому из студентов, одинакова (имеет одинаковые поля), а содержание структуры (значения полей структуры) индивидуально для каждого из студентов. Для хранения в MatLab такой однотипно организованной информации предназначен массив структур. Назовем массив структур GR521, а его поля: Fam, Name, Year и Marks.

Обращение к структурам массива производится при помощи индексации, например: GR521(4) — четвертая структура массива GR521. Названия полей отделяется от структуры при помощи точки. Скажем, для получения имени второго студента, следует воспользоваться обращением GR251(2).Name. Заметьте, что поля Fam и Name содержат строки, поле Year — число, а Marks — вектор длины четыре (поскольку записаны оценки по четырем предметам). Создайте файл-программу fillinfo для заполнения массива структур GR251 (см. листинг 8.1).

После запуска fillinfo в рабочей среде образовался массив структур GR521. Функция size позволяет получить его размеры, в данном случае один на пять[1]. Длину одномерного массива структур возвращает функция length. Введите имя массива в командную строку и нажмите <Enter> — содержимое каждой структуры не отображается, выводятся только сведения о размере массива и названия полей. Для отображения в командном окне содержимого каждой структуры следует обратиться непосредственно к ней, например: GR521(2) или disp(GR521(2)).

Листинг 8.1. Файл-программа fillinfo для заполнения массива структур



GR521(1).Fam='Алексеев'; GR521(1).Name='Иван';

GR521(1).Year=1982; GR521(1).Marks=[4 5 5 4];

GR521(2).Fam='Иванов'; GR521(2).Name='Сергей';

GR521(2).Year=1981; GR521(2).Marks=[3 4 4 5];

GR521(3).Fam='Николаев'; GR521(3).Name='Олег';

GR521(3).Year=1981; GR521(3).Marks=[5 5 5 5];

GR521(4).Fam='Петрова'; GR521(4).Name='Анна';

GR521(4).Year=1982; GR521(4).Marks=[5 5 5 4];

GR521(5).Fam='Федорова'; GR521(5).Name='Елена';

GR521(5).Year=1982; GR521(5).Marks=[3 3 3 4];

При работе с массивами структур требуется производить некоторые операции либо над структурами, либо с их содержимым. Элемент массива структур всегда можно выделить в отдельную структуру и наоборот, заменить его на другую структуру (с аналогичным набором полей). Например, для перестановки первых двух структур в массиве GR521 достаточно использовать вспомогательную структуру help:

» help=GR521(2);

» GR521(2)=GR521(1);

» GR521(1)=help;

Доступ к данным структур осуществляется при помощи полей, причем обязательно учитывать, что именно содержит поле: строку, число или массив. Предположим, что требуется по заданной структуре вида GR521 сформировать массив строк с фамилиями и именами каждого из студентов. Файл-функция namesgroup, приведенная на листинге 8.2, решает поставленную задачу. Предполагается, что входной аргумент GR является структурой вида GR521. Сначала в строковые переменные f и n выделяются фамилия и имя первого студента, из которых формируется строка N. Затем в цикле из каждой структуры массива GR извлекаются фамилия и имя текущего студента, они объединяются в строку str, которая добавляется в массив строк при помощи функции char.

Листинг 8.2. Файл-функция, формирующая массив строк с фамилиями и именами

function N=namesgroup(GR)

f=GR(1).Fam;

n=GR(1).Name;

N=[f, ' ', n];

for k=2:length(GR)

f=GR(k).Fam;

n=GR(k).Name;

str=[f, ' ', n];

N=char(N, str);

end

Проверьте работу файл-функции namesgroup, вызвав ее от массива GR521 с выходным аргументом NAMES, а затем отобразите содержимое NAMES в командное окно при помощи функции disp:

» NAMES=namesgroup(GR521);

» disp(NAMES)

NAMES =

Алексеев Иван

Иванов Сергей

Николаев Олег

Петрова Анна

Федорова Елена

Структуры массива можно дополнить новым полем, для чего следует присвоить значение этому полю в какой-нибудь структуре массива, например, первой. Добавьте в массив GR521 поле NBook, предназначенное для хранения номера зачетной книжки студента:

» GR521(1).NBook=599001;

Созданное поле, разумеется, образуется во всех структурах массива, но только в первой из них будет содержать заданное значение (проверьте!). Поле NBook остальных структур массива следует заполнить отдельно. Обратная операция — удаление поля из всех структур массива — осуществляется при помощи функции rmfield. Входными аргументами rmfield являются имя массива структур и название поля, а выходным — имя массива, в который следует записать обновленный массив структур:

» g251=rmfield(GR521,'Year');

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

» field2='Fam';

» fam1=getfield(GR521(1),field2);

Заметьте, что к аналогичному результату приводит fam1=GR512(1).Fam. Для изменения значения поля по строке с его названием служит функция setfield. Во входных аргументах setfield задаются: структура, строка с названием поля и его новое значение, а в выходном — возвращается измененная структура:

» field3='Year';

» GR521(1)=setfield(GR521(1),field3,1981);

На том же самом принципе основана функция struct, которая заполняет структуру по строкам с названием полей. Входными ее аргументами являются пары 'название поля'‑значение, а выходным — структура:

» GR521(6)=struct('Fam','Котов','Name','Петр','Year',1980,...

'Marks',[3 5 4 4],'NBook',59908)

Определение названий полей в заданном массиве структур или структуре производится при помощи функции fieldnames. Ее входным аргументом является массив структур или структура, а выходным — названия полей, записанные в массив ячеек. Про массив ячеек сказано ниже, приведем здесь только примеры, демонстрирующие получение названий полей с использованием fieldnames:

» Fields=fieldnames(GR521);

» field3=Fields(3)

field3 =

'Year'

Массив ячеек является самым универсальным способом хранения разнородных данных. Его элементами могут быть числа, числовые массивы, строки, структуры и массивы строк и структур. Присваивание значений ячейкам массива требует заключения индексов в фигурные скобки, а при обращении к ячейкам можно использовать как фигурные, так и круглые скобки. Листинг 8.3 содержит пример заполнения двумерного массива ячеек CMAS размера два на два. Ячейка с номером {1,1} содержит матрицу, {1,2} — строку, {2,1} — массив строк, {2,2} — структуру с полями Data и Time.

Листинг 8.3. Заполнение массива ячеек

clear CMAS

CMAS{1,1}=[-2.2 0.9; 5.6 -8.3];

CMAS{1,2}='This is a string';

CMAS{2,1}=char('first string','second string');

CMAS{2,2}.Data=[3.981 9.765 4.442 0.003];

CMAS{2,2}.Time=[0.11 0.12 0.13 0.14];

Обратите внимание, что перед заполнением массива ячеек целесообразно использовать команду clear CMAS для удаления (возможно существующей в рабочей среде) переменной CMAS. Дело в том, что при наличии, к примеру, числовой переменной CMAS, последующее заполнение ее как массива ячеек приведет к сообщению об ошибке. Другие типы переменных не требуют вызова clear — последовательность присваиваний s=1, s='string' допустима в MatLab.

Для отображения данных, хранящихся в массиве ячеек, MatLab предлагает две функции: celldisp, которая выводит в командное окно содержимое каждой ячейки, и cellplot, предназначенная для визуализации содержимого массива в графическом окне. Программная обработка разнородных данных значительно облегчается благодаря ряду функций, которые позволяют установить тип содержимого ячейки[2]. Перечисленные ниже функции возвращают логическую единицу или ноль в зависимости от типа входного аргумента:

§ ischar(a) — равно 1, если a является строкой или массивом строк;

§ isnumeric(a) — равно 1, если a является числом или числовым массивом;

§ isstruct(a) — равно 1, если a является структурой или массивом структур.

Задания для самостоятельной работы

Задан массив структур с информацией о группе студентов. Написать файл-функцию для решения следующей задачи.

Варианты

1. Подсчитать средний балл каждого студента и вывести столбцевую диаграмму успеваемости.

2. Найти фамилию наиболее успевающего студента.

3. Сформировать матрицу, строки которой содержат оценки каждого из студентов.

4. Определить, есть ли в группе студент с заданной фамилией.

5. Расположить структуры массива в соответствии с успеваемостью студентов.

Задания для самостоятельной работы

Задан одномерный массив ячеек, который может содержать данные различных типов. Написать файл-функцию для решения следующей задачи.

Варианты

1. Определить количество ячеек, содержащих числа или числовые массивы.

2. Найти номера ячеек, которые содержат только числа, но не массивы.

3. Объединить в один массив все строки и массивы строк, входящие в массив ячеек.

4. Отобразить столбцевыми диаграммами все данные, являющиеся векторами.

5. Выделить в массив структур все структуры, входящие в массив ячеек (предполагается, что поля всех структур одинаковы).

 


[1] Массив структур может быть и двумерным, тогда для его заполнения и обращения к его элементам следует применять два индекса (как для матриц).

[2] Разумеется, при помощи данных функций можно определить тип любой переменной, а не только ячейки массива.



<== предыдущая лекция | следующая лекция ==>
Многомерные массивы. | Массивы


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.054 сек.