Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Объявление и инициализация массивов
Ранее мы ввели типы данных, которые называются базовыми или встроенными. На основе этих типов язык Си позволяет строить другие более сложные типы данных и структуры данных. Массивом называется набор данных одного и того же типа, собранных под одним именем. Каждый элемент массива определяется именем массива и порядковым номером элемента, который называется индексом. Индекс всегда является целым числом. Основная форма объявления массива в программе: Тип < имя массива > [размер 1] [размер 2]….[размер n]; Чаще всего используются одномерные массивы: Тип < имя массива> [размер]; Тип – базовый тип элементов (int, float, char). Размер – количество элементов одномерного массива. В языке Си индекс всегда начинается с 0. Первый элемент - массива всегда имеет индекс 0. Например, если мы объявили массив int a [100], это значит массив содержит 100 элементов – от a [0] до a [99]. Для одномерного массива легко подсчитать, сколько байт в памяти будет занимать этот массив. N Килобайт = < размер базового типа > * < количество элементов >. Язык Си допускает двумерные массивы. Их можно назвать как: массив одномерных массивов. Двумерный массив int a[3][4] можно представить в виде таблички:
В памяти ЭВМ массив располагается непрерывно по строкам, т. е. a [0] [0], a [0] [1], ……. a [0] [3], a [1] [0], a [1] [1], …..a [2] [3]. Следует помнить, что память для всех массивов, которые определены как глобальные, отводится во время компиляции, и сохраняется всё время, пока работает программа. Часто двумерные массивы используются для работы с таблицами, содержащими текст.
Инициализацию массивов можно производить разными способами. Первый способ. float arr [6] = {1.1, 2.2, 3.3, 4.0, 5.0, 6}; // одномерный массив int a [3] [5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} Второй способ. a[0] [0] = 1; a [0] [1] = 2; a [0] [2] = 3; a [0] [3] = 4 a [0] [4] = 5; a [0] [5] = 6; a [0] [6] = 7; a [0] [7] = 8 и т. д. Многомерные массивы, в том числе и двумерные, можно инициализировать, рассматривая их как массив массивов. Инициализации: int a [3] [5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; и int a [3] [5] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15}}; эквиваленты. Количество инициализаторов не обязательно должно совпадать с количеством элементов массива. Если инициализаторов меньше, то оставшиеся элементы массива не определены. В тоже время инициализации: int a [3] [5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 20, 11}; и int a [3] [5] = {{1, 2, 3}, {4, 5, 6, 7, 8}, {9, 10, 11}}; различны. Соответствующие массивы будут заполнены следующим образом: В первом случае: Во втором случае:
В пустых клетках значения не определяются. Символьные массивы могут инициализироваться как обычные массивы char str [15] = {‘B’, ‘o’, ‘r’, ‘l’, ‘a’, ‘n’, ‘d’, ‘ ‘, ‘C’, ‘+’, ‘+’}; а могут как строка: сhаr str [15] = ‘Borland C + +’; Можно указывать массив без указания размера: int mas [ ] = {1, 2, 3, 4, 5, 1, 2}; char str [ ] = ”Это объявление и инициализация символов”; компилятор сам определит количество элементов массива. Символьные массивы в языке Си занимают особое место. Во многих языках есть специальный тип – строка символов. В языке Си этого нет, и работа со строками реализована как работа с одномерным массивом. Строка – это одномерный массив типа char, заканчивающийся нулевым байтом. Нулевой байт – это байт, каждый бит которого равен нулю. Например: char str [11]; Предполагается, что строка содержит 10 символов, а последний байт зарезервирован под нулевой байт. Есть два способа ввести строку с клавиатуры: 1) С помощью функции scanf() со спецификатором %s. Она вводит символы до первого пробельного символа. 2) С помощью библиотечной функции gefs(), которая вводит строки с пробелами. При объявлении многомерных массивов с неизвестным количеством элементов можно не указывать размер только в самых левых квадратных скобках, например: int arr[][3] = {1, 2, 3, 5, 6, 7, 8, 9, 0}; Пример 4.1.: Все числа из каждой строки массива a умножить на числа соответствующего столбца массива b и результат сложения записать в массив. / * Перемножение матриц */ # include < stdio.h> # include < conio.h> void main (void) { /* Инициализация двумерных массивов */ int a [3] [4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; int b [3] [2] = { {1, 2}, {3, 4}, {5, 6}, {7, 8} }; int c [3][2], i, j, k; // массив результатов и параметры цикла clrscr(); for (i = 0; i = 3; i + +) // проход по вертикали (строкам) { for (j = 0; j < 3; j + +) // проход по горизонтали (рядам) { с [i] [j] = 0; // обнуление for (k = 0; k< 4; k + +) c [i] [j] + = a [i] [k] * b [k] [j]; } } for (j = 0; j < 3; j + +) { for (j = 0; j < 2; j + +) printf (“%6d”, printf (“\ n”); } } // Результат прогона: Ручное вычисление // 50 60 c [0, 0] = 1*1 + 2*3 + 3*5 + 4*7 = 50 // 114 140 c [0, 1] = 1*2 + 2*4 + 3*6 + 4*8 = 60 // 178 220 c [1, 0] = 5*1 + 6*3 + 7*5 + 8*7 =114 c [1, 1] = 5*2 + 6*4 + 7*6 + 8*8 =140 c [2, 0] = 9*1 + 10*3 + 11*2 + 12*7 = 178 c [2, 1] = 9*2 + 10*4 + 11*6 + 12*8 = 220
|