Массивы
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Лекция 4 Массивы
При решении задач с большим количеством данных, имеющих одинаковый тип, трудно
работать с отдельными переменными. Для этого и существуют массивы. Массив — это
непрерывный участок памяти, содержащий последовательность одного типа и обозначается
одним именем. Массив разделен на элементы. Каждый элемент — это как отдельная
переменная типа. Весь же массив представляет уже другой тип данных, с которым
привычные действия могут работать не так, как вы себе представляете.
int mas[] = {1,2,3,4,5};
Легально:
mas[0] + mas[1]; //Сумма двух элементов
mas[0]++; //инкремент первого элемента
Неверно:
mas++; // И чего вы ожидаете от программы?
В массиве нумерация элементов начинается с нуля. Помните, я говорил о том, что циклы
лучше начинать с 0? Если вы послушали совета, то вас уже не смутит работа с массивами.
Сама переменная mas «указывает» на адрес в памяти. Вы позже поймете, что это значит,
пока мы не будем производить с ней никаких действий, считая, что и не должны этого делать.
Будем считать, что mas просто имя массива.
Следует выделить также понятие размера массива. Размер mas, как нетрудно догадаться,
равен 5. Т.е. пять элементов содержится в нем.
Задать размер массива - обязательное условие для объявления статического массива. В
будущем мы узнаем о динамических массивах, но сейчас мы работаем только со
статическими, значит размер нужно определить уже на этапе объявления переменной.
int mas[] = {1,2,3,4,5}; //Мы инициализировали массив 5-ю элементами, значит его размер 5.
int mas[5];
//Мы объявили массив размером 5 элементов
int mas[5] = {0,1}; //Частичная инициализация: размер 5 элементов, строго заданы первые 2
В языке Си есть проблема, дело в том, что он не как не сохраняет размер массива, что было
бы очень удобно. В действительности переменная mas не знает, что ее размер ограничен, и
ничего не мешает программисту написать mas[6]. Он даже получит какой-то результат, в
худшем случае программа вылетит с ошибкой Segmentation fault (иногда эта запись как-то
сокращается, в зависимости от компилятора/ос). Так что вам предстоит самостоятельно
следить за размером массива и выходом за границы. На самом деле, это не является
проблемой, иначе бы ее просто устранили, Си просто не тратит место, чтобы хранить размер
массива, и, заодно, не проверяет выход за границы диапазона, как некоторые другие языки.
Чем экономит уйму времени в сложных алгоритмах, которые часто дергает элементы
массива.
Мы научились создавать одномерные массивы. Их в математике называют вектора (не те
вектора, что в геометрии обозначаются стрелкой)
Но, как вам должно быть известно из курса алгебры, перемножение векторов дает матрицу,
т. е. двумерный массив.
Пример матрицы:
123
456
789
Матрицы часто используются в программировании, особенно в 3D. Но бывают и более
простые применения: допустим у вас есть 2D уровень в виде лабиринта, по нему должен
проходить персонаж до точки выхода. Как запомнить такой уровень? Ответ — матрица.
00000000000
11111011111
11101011111
00001000000
01111011111
В данном случае нули обозначают свободный проход, единицы - стену.
Объявление двумерных массивов мало чем отличается от объявления одномерных,
достаточно прибавить еще одну размерность:
int mas[5][5]; //Двумерный массив 5х5 элементов (всего 25)
printf(“%i”, mas[0][3]); // вывести 3-тий элемент 0-ой строки
Если вы хотите задать и вывести двумерный массив на экран, очевидно, что одним циклом
тут не обойтись, нужно использовать два.
int mas[3][3]={0};
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 3; ++j)
{
printf("%i ",mas[i][j]);
}
printf("\n");
}
Побитовые операции
Интересно, что само число можно считать массивом из нулей и единиц. И существуют даже
операции, которые выполняются над каждым битом. Они и называются побитовыми.
& - побитовое «и»
| - побитовое «или»
~ - побитовое «не»
^ - побитовое «исключающее или»
<< - сдвиг влево.
>> - сдвиг вправо.
Оператор & часто используется для обнуления некоторой группы разрядов. Например
n = n & 0177;
обнуляет в n все разряды, кроме младших семи.
Число 0177 записано в восьмеричной системе, в двоичной выглядит, как 0111 1111 для 8 бит.
Для 16 — еще 8 нулей добавить спереди. Таким образом, получается умножение битов
одного числа на биты другого.
10010 = 0110 01002
Тогда 100 & 7 = 4 (остаются только 3 младших бита)
По аналогии, оператор «или» можно применить для установки разрядов в единицу.
Например:
1010 = 10102
510 = 01012
Тогда, 10 | 5 = 15
В данном случае сработало, как сложение. Но результат будет отличным от сложения, если в
разряде первого числа и так уже единица.
15 | 5 = 15 // в четырех разрядах и так все единицы
Оператор «не» самый простой, он просто меняет биты на противоположные:
~15 = -16
~ 0000 1111 = 1111 0000
Оператор ^ (побитовое исключающее ИЛИ) в каждом разряде установит 1, если
соответствующие разряды операндов имеют различные значения, и 0, когда они совпадают.
1111 ^ 1111 = 0000
15 ^ 15 = 0
Сдвиг влево << сдвигает разряды влево на Х позиций, правые разряды после этого
заполняются нулями. Пример:
0000 0001 << 1 = 0000 0010 //единица сдвинулась на 1 разряд влево
Это эквивалентно умножению на 2.
Сдвиг вправо >> сдвигает разряды вправо на Х позиций:
0111 1111 >> 1 = 0011 1111
Это эквивалентно делению на 2.
Лабораторная работа №4
Задание 0.
Дан массив случайных чисел. Вывести все положительные числа, затем все отрицательные
числа.
Дан массив случайных чисел, посчитать в одном цикле сумму положительных и сумму
отрицательных чисел (по модулю) и вывести на экран.
Задание 1.
Осуществить удаление элемента из массива.
Пример, дан массив [1,2,3,4,5,6,7,8,9,10], нужно удалить 5-ый элемент.
Выходные данные: [1,2,3,4,6,7,8,9,10,0]
Программа должна удалять любое количество элементов из массива. Номера элементов
задаются с клавиатуры.
Нуль появляется при удалении элемента в конце массива.
Дополнительное задание: построить график функции на http://yotx.ru/
Расчетные данные для графика должна вычислить ваша программа.
Задание 2.
Создать игру лабиринт, сделать управление на клавиатуре.
Нулем можете обозначить свободный проход, единицей стены, тройкой точку входа,
четверкой точку выхода и пятеркой — самого игрока.