Массивы

Иногда в программе приходится работать не с парой чисел, а с несколькими тысячами или даже миллионами чисел. Например, обычная картинка хранит в себе значения цвета в каждом пикселе, для примера, в картинке в FullHD 1920×1080 = 2073600 пикселей. Раньше для каждого числа мы заводили свою переменную, называя её int a или float x и т.п. Но отдельно объявлять и придумывать переменную под каждое из 2073600 чисел - слишком затратно. Поэтому для таких больших наборов данных придумываются различные способы их объявления, хранения, обработки и передачи. Один из них - массив.

В языке C все элементы одного массива могут иметь только один общий тип данных, который определяется, как и у обычной одиночной переменной - в начале программы.

Массив из ста элементов типа int объявляется в программе так:

int A[100];

Число элементов массива указывается при объявлении в квадратных скобках.
В этом случае мы выделили в памяти место сразу под 100 переменных всего одной строчкой. По умолчанию, как и в случае одиночной переменной, в выделенной памяти может лежать какие-то данные(мусор). Чтобы выполнять операции с элементами массива, к ним обращаются следующим образом : a[1], где в скобках пишется номер элемента, к которому вы хотите обратиться. То есть у нас есть 100 переменных с именами: a[0], a[1], a[2], . . . , a[99] - с которыми обращаются так же как и с обычными переменными. Важно, что нумерация начинается с нуля! Если забыть об этом - это может привести к ошибке.

Почти всегда для выполнения операций с массивами используют циклы, и чаще всего самый простой - for.

Ввод и вывод массива

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
	int A[10];  // выделяем в памяти массив из 10 элементов типа int
	int N, i;
	scanf("%i", &N);
	for (i = 0; i < N; i++) {  // вводим N элементов и записываем их в массив   
		scanf("%i", &A[i]);
	}
	for (i = 0; i < N; i++) {  // выводим N элементов массива
		printf("%i ", A[i]);
	}
	return 0;
}


Замечание

Самая частая ошибка при использовании массивов - выход за его пределы. Дело в том, что объявляя массив, например, из 10 элементов, нам выделяется память ровно под 10 переменных: a[0], a[1], . . . , a[9]. Однако, в программе мы можем случайно обратится к элементу с неразрешенным номером, скажем, к a[10]. При этом, при компиляции программы она не сообщит об ошибке и нормально запустится. Но в момент обращения к этому запрещенному элементу a[10] или в конце выполнения программы появится следующее сообщение:


В таком случае нужно нажать "Прервать"и искать ошибку в коде.

Пример 1

Очень часто в массиве нужно найти максимальный или минимальный элемент.
Задача: дан массив из 10 целых чисел(вводятся с консоли через пробел), найти наибольшее число из них.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
	int A[10], i, max;
	for (i = 0; i < 10; i++) {
		scanf("%i", &A[i]);
	}
	max = A[0];  // стартовое значение
	for (i = 0; i < 10; i++) {
		if (A[i] > max) { 
			max = A[i];   
		}
	}
	printf("%i", max);
	return 0;
}

Пример 2

Задача: Дан массив из N ≤ 100 элементов, нужно вывести массив, в котором каждый элемент увеличен 10.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
	int A[100], i, N;
	scanf("%i", &N);
	for (i = 0; i < N; i++) {  // ввод массива
		scanf("%i", &A[i]);
	}
	for (i = 0; i < N; i++) {
		A[i] = A[i] + 10;  // к каждому элементу прибавляем 10
	}
	for (i = 0; i < N; i++) {  // вывод массив
		printf("%i ", A[i]);
	}
	return 0;
}

Пример 3

Задача: Дан массив из N ≤ 100 элементов, нужно передвинуть все элементы массива на один вправо, а последний элемент должен встать на первое место.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
	int A[100], i, N, buf;
	scanf("%i", &N);
	for (i = 0; i < N; i++) { // ввод массива
		scanf("%i", &A[i]);
	}
	buf = A[N - 1]; // сохраняем последний элемент в буфер
	for (i = N - 1; i > 0; i--) {
		A[i] = A[i - 1]; // передвигаем направо все элементы
	}
	A[0] = buf; // присваиваем к первому элементу последний(он сохранен в переменной buf)
	for (i = 0; i < N; i++) { // вывод массива
		printf("%i ", A[i]);
	}
	return 0;
}

Результат выполнения программы:

Чтобы закрепить материал, можете прорешать 1 уровень задач по массивам.

Code.C © Copyright Павел Калашников 2021
обратная связь code.c04@mail.ru