ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем Массивы данных Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных.

Презентация:



Advertisements
Похожие презентации
Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных.
Advertisements

Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных.
Основы программирования на Бейсике Массивы. Задание: Найти все 3-хзначные числа, заканчивающихся на 2, 4, 8 и делящихся на 6. Ответ: CLS FOR I=100 TO.
ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем УКАЗАТЕЛИ Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем.
Автор: учитель информатики МКОУ Плесской средней общеобразовательной школы Юдин Андрей Борисович Часть 1.
ОСНОВЫ ПРОГРАММИРОВАНИЯ Раздел 2. Математические основы программирования Логические алгоритмы Старший преподаватель Кафедры ВС, к.т.н. Поляков Артем Юрьевич.
Двумерные массивы. Задачи обработки двумерных массивов.
Лекция 6 1. Обработка массивов. Объявление одномерного массива Синтаксис: [ ] Пример: int a[10]; Определяет массив a размера 10, т. е. блок из 10 последо-
Процедурный подход к программированию Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем Алгоритмы поиска Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных.
ПРОГРАММИРОВАНИЕ/ ЯЗЫКИ ПРОГРАММИРОВАНИЯ Лекция 4 Работа с бинарными файлами (весенний семестр 2012 г.) Доцент Кафедры вычислительных систем, к.т.н. Поляков.
Программирование на Basic МассивыПрограммирование на Basic Массивы.
Одномерные массивы Понятие массива, виды массивов Описание, заполнение и вывод одномерного массива Обработка одномерного массива.
Массивы Теоретические сведения. Примеры решения задач. Задания для самостоятельного выполнения.
1 Массивы 2 Опр. Массивом называется совокупность однотипных данных, связанных общим именем. Основные характеристики массива: 1. Имя массива 2. Тип компонентов.
Массивы Материалы к урокам по программированию. МАССИВ это УПОРЯДОЧЕННАЯ последовательность данных ОДНОГО ТИПА. Массивы относятся к структурированным.
Стрельникова Л.В.. План изучения нового материала 1.Понятие массива 2.Виды массивов 3.Описание массивов 4.Формирование массивов Стрельникова.
Двумерный массив Учитель информатики МБОУ «Марковская СОШ» Репникова С.А.
МАССИВЫ 4 Определение 4 Описание 4 Обращение к элементам массива 4 Связь массивов с указателями 4 Примеры программ.
Транксрипт:

ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем Массивы данных Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем ПРОГРАММИРОВАНИЕ ЯЗЫКИ ПРОГРАММИРОВАНИЯ

Задача сортировки (sorting problem) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 2 Дано: последовательность из n чисел a 1, a 2, a 3, …, a n Необходимо: переставить элементы последовательности так, чтобы для любых элементов новой последовательности a' 1, a' 2, a' 3, …, a' n выполнялось соотношение: a' 1 a' 2 a' 3 … a' n Пример: Входная последовательность:5, 3, 8, 9, 4 Выходная последовательность:3, 4, 5, 8, 9 Входные данные (последовательность), удовлетворяющие всем заданным ограничениям задачи, называется экземпляром задачи.

Проход 2. Второй по величине элемент занимает n–1 место Сортировка методом пузырька (пример) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» Проход 1. Наибольший элемент занимает n-е место Проход 3. Третий по величине элемент занимает n–2 место Проход 4. Третий по величине элемент занимает n–3 место

Сортировка методом пузырька (псевдокод) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 4 Входные данные: последовательность a из n элементов ввод a i 1 while i n do j 1 while j (n–i) do // На i-й итерации i правых эл-тов отсортированы if a j > a j+1 then t a j a j a j+1 a j+1 t j j + 1 i i + 1

Правила оформления псевдокода © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 5 1.Циклические конструкции обозначаются английскими словами (аналогично языку программирования СИ): while, do-while, for. 2.Конструкция ветвления обозначается ключевыми словами if-then-else. 3.Структура блоков указывается с помощью отступов. 4.Для описания комментариев используется '//' 5.Присваивание обозначается как '': x y для отличи от сравнения (обозначается как "=").

Программная реализация алгоритма сортировки методом пузырька © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 6 Алгоритм поиска минимального значения в последовательности: достаточно однократной обработки элемента (сравнение с текущим минимумом-рекордом) Алгоритм сортировки методом пузырька: многократное обращение к элементам в процессе работы. Для реализации алгоритма сортировки методом пузырька требуется хранение всех элементов сортируемой последовательности в памяти программы.

Массивы © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 7 Массивы предназначены для хранения наборов однотипных данных в памяти программы. Доступ к конкретному элементу производится с использованием его целочисленного индекса. Индексы задают порядок следования элементов в массиве, поэтому его можно рассматривать как упорядоченное множество. Технически это последовательность однотипных переменных. В памяти элементы массива располагаются друг за другом непрерывно. Для каждого элемента справедливо, что между элементами с индексами i и i+1 не может находиться никаких ячеек данных.

Объявление массивов © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 8 При объявлении массива требуется следующая информация: 1.Тип данного составляющих его элементов. 2.Имя массива. 3.Количество элементов в массиве. 4.[Необязательно] начальное содержимое массива (инициализация). Например: массив с именем m из N элементов типа int объявляется так: int m[N];

Объявление массивов (инициализация) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 9 При объявлении массива требуется следующая информация: 1.Тип данного составляющих его элементов. 2.Имя массива. 3.Количество элементов в массиве. 4.[Необязательно] начальное содержимое массива (инициализация). Например: массив с именем mas из 5 элементов типа float, со значениями 1.1, 2.0, 3.5, 6.7, 8.1 объявляется так: int mas[5] = {1.1, 2.0, 3.5, 6.7, 8.1}; или int mas[] = {1.1, 2.0, 3.5, 6.7, 8.1};

Операция индексации © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 10 В языке СИ не предусмотрено операций над всем массивом. Основная часть операций производится поэлементно. Доступ к конкретному элементу производится с использованием операции индексации: [ ]. Например, для массива: доступ к элементу со значением 3.5, расположенному 3-ем в массиве осущесвляется следующим образом: x = mas[2]; Индексация элементов в языке СИ начинается с НУЛЯ! float mas[] = { }

Индексы © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» В качестве индекса может использоваться любое выражение, целого типа: char, short, int, long. Индексы элементов массива языка СИ начинаются с 0. Индексы могут быть: положительными, тогда обращение производится к ячейке, располагающейся после первой. отрицательными, тогда обращение производится к ячейке, располагающейся перед первой. N[-2]N[-1]N[0]N[1]N[2]

Ввод массива © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 12 В функции scanf не предусмотрено спецификатора для ввода массива как единого целого. Это сделано из соображений универсальности и сохранения относительной простоты использования. Для ввода массива необходимо выполнить чтение каждого из его элементов. При решении данной задачи удобно использовать циклы. int mas[10], i; for(i=0;i

Обработка массива © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 13 К массиву как единому целому может быть применена только операция индексации [ ] и оператор sizeof. Любые другие действия требуют поэлементной обработки! Например, не предусмотрено операции присваивания массивов. Для достижения желаемого эффекта необходимо поэлементно присвоить каждому элементу изменяемого массива значение соответствующего элемента исходного: int mas1[10] = {...}, mas2[10], i; for(i=0;i

Обработка массива (2) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 14 К массиву как единому целому может быть применена только операция индексации. Любые другие действия требуют поэлементной обработки! Например, программа вычисления суммы элементов массива выглядит следующим образом: int mas[10], i, sum = 0; // ввод массива с клавиатуры (слайд 12) for(i=0;i

Перебор индексов массива © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 15 В задачах, рассмотренных выше, обработка массива сводилась к последовательному перебору его индексов и обработке соответствующего элемента согласно условиям задачи. В связи с тем, что индексация массивов начинается с 0, в условии продолжения цикла используют строгое неравенство:... for(i = 0; i < 10; i++) {... }... i: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Особенности инициализации массива © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 16 Статические массивы можно объявлять с инициализацией, перечисляя значения их элементов в {} через запятую. Если задано меньше элементов, чем длина массива остальные элементы считаются нулями: int a[10] = { 1, 2, 3, 4 }; /* и 6 нулей */ Если при описании массива с инициализацией не указать его размер, он будет подсчитан компилятором: int b[] = { 1, 2, 3 };

Особенности реализации массивов в языке СИ © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 17 «Си инструмент, острый, как бритва: с его помощью можно создать и элегантную программу, и кровавое месиво», Б. Керниган. В связи со сравнительно низким уровнем языка многие случаи неправильного использования опасных элементов не обнаруживаются и не могут быть обнаружены ни при компиляции, ни во время исполнения. В Си не предусмотрено средств проверки индексов массивов (проверки выхода за границы массива). Например, возможна запись в шестой элемент массива из пяти элементов, что, естественно, приведёт к непредсказуемым результатам.

Выход за границы массива © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 18 int i, a[4] = {1,2,3,4}, b[4] = {5,6,7,8}; for(i=0; i

Демонстрация выхода за границы массива © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 19 #include int main() { int i, a[4] = {1,2,3,4}, b[] = {5,6,7,8}; for(i=0;i

Применение GDB © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 20 (gdb) b main (gdb) r... (gdb) watch a[0] Hardware watchpoint 5: a[0] (gdb) c Continuing. Hardware watchpoint 5: a[0] Old value = New value = 25 main () at array_borders.c:6 5 for(i=0;i

Многомерные массивы © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 21 в языке СИ определены только одномерные массивы; элементом массива в свою очередь может быть массив. Правила 1 и 2 позволяют определять многомерные массивы следующим образом: int m1[2][5], m2[4][10][10]; float m3[9][9][9][9]; Для обращения к элементу массива необходимо зафиксировать индекс каждого измерения, например: m1[1][3] = 8; m1[1][5] = 10; m[2][4] = 1; m3[5][4][2][6] = 1.6;

Логическое и физическое размещение многомерных массивов © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 22 [0][0][0][0][0][1][0][1][0][2][0][2][1][0][1][0][1][1][1][1][1][2][1][2][2][0][2][0][2][1][2][1][2][2][2][2] Физическое расположение элементов массива в памяти Логическое расположение элементов массива в памяти N[0][0]N[0][0]N[0][1]N[0][1]N[0][2]N[0][2] N[1][0]N[1][0]N[1][1]N[1][1]N[1][2]N[1][2] N[2][0]N[2][0]N[2][1]N[2][1]N[2][2]N[2][2] Строки 0 12 Столбцы

Адресация двумерных массивов © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 23 Физическое расположение элементов массива в памяти int A[3][3]; Задача определения смещения элемента в физическом представлении: Дано: индексы (i, j) элемента двумерного массива A[N][M]. Найти: функцию смещения t(i, j) элемента A[i][j] в физическом представлении A относительно первого элемента A[0][0]. Решение: t(i, j) = i·M + j [0][0][0][0][0][1][0][1][0][2][0][2][1][0][1][0][1][1][1][1][1][2][1][2][2][0][2][0][2][1][2][1][2][2][2][2]

Адресация трехмерных массивов © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 24 Физическое расположение элементов массива в памяти int A[3][3][3]; Задача определения смещения элемента в физическом представлении: Дано: индексы (i, j, k) элемента массива A[N][M][K]. Найти: функцию смещения t(i, j, k) элемента A[i][j][k] в физическом представлении A относительно первого элемента A[0][0][0]. Решение: ? ?

Адресация трехмерных массивов © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 25 Физическое расположение элементов массива в памяти int A[3][3][3]; Задача определения смещения элемента в физическом представлении: Дано: индексы (i, j, k) элемента массива A[N][M][K]. Найти: функцию смещения t(i, j, k) элемента A[i][j][k] в физическом представлении A относительно первого элемента A[0][0][0]. Решение: t(i, j, k) = i·M·K + j·K + k

Обработка двумерного массива © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 26 Элемент двумерного массива описывается двумя индексами. Обработка массива предусматривает просмотр/изменение каждого элемента. Последовательность обработки элементов определяется задачей. Для перебора индексов массива обычно используют вложенные циклы, каждый цикл отвечает за изменение своего индекса. N[0][0]N[0][0]N[0][1]N[0][1]N[0][2]N[0][2] N[1][0]N[1][0]N[1][1]N[1][1]N[1][2]N[1][2] N[2][0]N[2][0]N[2][1]N[2][1]N[2][2]N[2][2] Строки 0 12 Столбцы

Построчный просмотр элементов © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 27 int a[5][5] = {{1},{4},{2},{3},{8}}; int i, j; for(i = 0; i < 5; i++){ for(j = 0; j < 5; j++) printf("%d ", a[i][j]); }

Просмотр элементов по столбцам © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 28 int a[5][5] = {{1},{4},{2},{3},{8}}; int i, j; for(j = 0; j < 5; j++){ for(i = 0; i < 5; i++) printf("%d ", a[i][j]); }

Произведение матриц © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 29

Порядок обработки элементов © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 30 i=0i= j= j= j= j= j= j= j= j= j=2 i=1i=1 i=2 AB

Программа вычисления c ij © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 31 k 0 c ij 0 while k < n do c ij = c ij + a ikb kj k k + 1

Программа вычисления строки c i = (c i1, c i2, c i3, … c in ) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 32 i j= j= j=2 j 0 while j < n do k 0 c ij 0 while k < n do c ij = c ij + a ikb kj k k + 1 j j + 1

Программа вычисления всей матрицы С © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 33 i 0 while i < n do j 0 while j < n do k 0 c ij 0 while k < n do c ij = c ij + a ikb kj k k + 1 j j + 1 i i + 1

Инициализация двумерных массивов © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 34 Для инициализации статических многомерных массивов необходимо инициализировать каждый вложенный массив, являющийся элементом внешнего: int a[2][3] = { {1, 2, 3}, {4, 5, 6} }; Строки 0 12 Столбцы

Инициализация двумерных массивов (2) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 35 Если задано меньше элементов, чем длина массива остальные элементы заполняются нулями: int a[2][3] = { {1}, {2} }; int b[3][3]={ {1}, {2} }, c[2][3]={ 0 };

Сечение многомерных массивов © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 36 b[n 1 ][n 2 ][n 3 ]...[n k ] Фиксация (обязательно слева направо) l первых индексов массива b приведет к формированию сечения массива. Сечение массива представляет собой массив b' меньшей (по сравнению с b) размерности, элементы которого образуются по следующему правилу: b'[i 1 ][i 2 ]…[i (k-l) ] = b[c 1 ][c 2 ]…[c l ] [i 1 ][i 2 ]…[i (k-l) ], где c 1, … c l – зафиксированные индексы, а i 1, i 2, …i (k-l) – свободные индексы. Обращение к элементу – частный случай сечения

Сечение двумерных массивов © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» int b[3][3]={ {1,2,3},{4,5,6},{7,8,9} } 123 b[0] 456 b[1] 789 b[2]

Расположение двумерных массивов в памяти программы © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 38 Физическое расположение элементов массива в памяти int A[3][3]; Задача определения смещения элемента в физическом представлении: Дано: индексы (i, j) элемента двумерного массива A[N][M]. Найти: функцию смещения t(i, j) элемента A[i][j] в физическом представлении A относительно первого элемента A[0][0]. Решение: t(i, j) = i·M + j [0][0][0][0][0][1][0][1][0][2][0][2][1][0][1][0][1][1][1][1][1][2][1][2][2][0][2][0][2][1][2][1][2][2][2][2]

Сечение трехмерных массивов © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 39 int b[3][3][3]; b[1]

Оператор sizeof © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 40 // z y x int a[5][5][5]; int size, xysize, xsize, elemsize; int cnt, xcnt, ycnt, zcnt; size = sizeof(a); xysize = sizeof(a[0]); xsize = sizeof(a[0][0]); elemsize = sizeof(a[0][0][0])); cnt = sizeof(a)/sizeof(a[0][0][0]); zcnt = sizeof(a)/sizeof(a[0]); ycnt = sizeof(a[0])/sizeof(a[0][0]); xcnt = sizeof(a[0][0])/sizeof(a[0][0][0]);

41 © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» СПАСИБО ЗА ВНИМАНИЕ!