10.13 Массивы
- Хранение однотипных последовательностей
- Индексирование (доступ к элементу) последовательностей
⇒ Объём / скорость доступа к элементу
Для чего массивы хранятся в ячейках оперативной памяти непрерывно?
Подсказка: массив — это однотипная последовательность
Какой размер имеет целочисленный массив на 1000 элементов?
Одномерные массивы
Как и переменные, бывают глобальные, статические и локальные. Большие локальные массивы делать нехорошо.
Объявить, ввести, вывести в обратном порядке.
Ввести последовательность из 12 целых, вывести все элементы, превосходящие последний Linux: лайфхак с seq …| ./prog
Ввести массив из 10 элементов, вывести его. Ввести ещё одно число, вставить его в начало массива, а последний элемент отбросить; вывести 1 2 3 4 5 6 7 8 9 10 42
→42 1 2 3 4 5 6 7 8 9
Linux: лайфхак с {seq …; echo …; }| ./prog
В ALT ещё есть jot… TODO: А в образах его всё ещё нет, тыкнуть Артема
Вычислительная сложность операции вставки
Инициализация массива
Полная int n[5] = {10,20,30,40,50} частичная: int n[5] = {[4]=40,[1]=10,20,30}; // holds 0,10,20,30,40
- Массивы заводятся при компиляции прямо в программе, если инициализированы
cc -DWIDTH=размер o.c; strip a.out; ls -l a.out
Выход за границы массива
Написать функцию printA(m, n), которая для статического массива A[] = {1,2,3,4,5,6,7,8,9,10} выводит элементы A[m],…, A[n-1]. Написать программу, которая вводит m и n и вызывает printA(m, n) Повводить разные m и n (в т. ч. отрицательные). А! Каково?
Добавить объявление инициализированных переменных перед и после статического массива. Найти их с помощью m и n!
Добавить в ключи компиляции -fsanitize=bounds, проверить на разных m / n Заменить -fsanitize=bounds на -fsanitize=address
Многомерные массивы
Объявляются как массивы массивов: int Table[10][5]
Однако в действительности многомерный массив — это одномерный массив с другими правилами вычисления адреса элемента readelf -j.data a.out — секция данных исполняемого файла
Написать функцию вывода статического массива A размером 4×4. Ввести массив, вывести TODO Нам нужна ошибка начинающего программиста; надо делать 4х3
Ввести квадратную матрицу (например, 4х4), вывести, транспонировать на месте, вывести ещё раз
Ввести массив (матрицу) A размером 3×3. Рассчитать определитель A по формуле: $$D = a_{1,1}*a_{2,2}*a_{3,3}+a_{2,1}*a_{3,2}*a_{1,3}+a_{3,1}*a_{1,2}*a_{2,3} − (a_{1,3}*a_{2,2}*a_{3,1}+a_{2,3}*a_{3,2}*a_{1,1}+a_{3,3}*a_{1,2}⋅a_{2,1})$$
Д/З
EJudge: HistogramW 'Вертикальная гистограмма'
Input:Ввести массив из 8 неотрицательных вещественных чисел и целую положительную "ширину экрана" W. Вывести горизонтальную гистограмму из символов '*', в которой максимальному значению массива будет соответствовать строка из W звёздочек, а остальные строки будут пропорциональны по длине соответствующим элементам массива (число звездочек в i-й строке: целая часть сверху от W*a[i]/a_max).
Output:1 2 3 4 5 6 7 8 20
*** ***** ******** ********** ************* *************** ****************** ********************
EJudge: HistogramH 'Горизонтальная гистограмма'
Input:Ввести массив из 20 неотрицательных целых чисел и целую положительную "высоту экрана" H. Вывести гистограмму, в которой максимальному значению массива будет соответствовать столбик из H звёздочек, а остальные строки будут пропорциональны по длине соответствующим элементам массива (число звездочек в i-м столбце округляется в большую сторону до ближайшего целого).
Output:1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 20
* * * * ** ** ** ** *** *** *** *** **** **** **** **** ***** ***** ***** ***** ***** ***** ****** ****** ****** ****** ******* ******* ******* ******* ******** ******** ******** ******** ********* ********* ********* ********* ********* *********EJudge: ArrayShift 'Циклический сдвиг'
Input:Вести массив из 24 целых чисел, далее в цикле:
ввести n
циклически сдвинуть массив на n элементов «вперёд»: A₀…Aₙ…Aᵢ → Aₙ…A₂₃A₀…Aₙ₋₁ (поддерживать в т.ч. отрицательные и большие по модулю n)
- вывести полученный массив
Завершить цикл по вводу EOF
Output:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 1 -1 27 -51
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 1 2 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
EJudge: SymmetricMatrix 'Симметричная матрица'
Input:Ввести матрицу 10х10 из целых чисел. Для этой матрицы:
- вывести "YES", если она является симметричной, иначе вывести "NO"
- вывести "YES", если её элементы можно расположить в виде m, m+1, … q-1, q, q, q-1, … m+1, m (ступеньки_вверх + площадка + ступеньки_вниз), иначе вывести "NO"
Каждый из ответов выводить в отдельной строке
Output:0 1 2 3 4 5 6 7 8 9 1 0 1 2 3 4 5 6 7 8 2 1 0 1 2 3 4 5 6 7 3 2 1 0 1 2 3 4 5 6 4 3 2 1 0 1 2 3 4 5 5 4 3 2 1 0 1 2 3 4 6 5 4 3 2 1 0 1 2 3 7 6 5 4 3 2 1 0 1 2 8 7 6 5 4 3 2 1 0 1 9 8 7 6 5 4 3 2 1 0
YES NO
Пересдача контрольной
- МТ.1.30 A={0,1,2,3}. Считая непустое слово P записью числа в четверичной системе счисления, получить запись этого числа в двоичной системе. Лидирующие нули не удалять.
- НАМ.1.32 A={ | }. С Считая слово P записью числа в единичной системе счисления, получить запись этого числа в троичной системе. (Рекомендация: следует в цикле удалять из «единичного» числа по палочке и каждый раз прибавлять 1 к троичному числу, которое вначале положить равным 0.)
- РБНФ. оператор описания одной переменной Си числового типа (int, long int, double, long double и float) с необязательной инициализацией целым числом. Имя переменной для простоты всегда начинается на букву "a", за которой может следовать несколько цифр.
