Заполнение массива
До сих пор вы записывали все элементы в фигурных скобках. Но часто программа сама вычисляет значения. Тогда создайте массив нужного размера без значений и заполните его в цикле:
int squares[5];
int count = sizeof(squares) / sizeof(squares[0]);
for (int i = 0; i < count; i++) {
squares[i] = i * i;
}
for (int i = 0; i < count; i++) {
printf("%d ", squares[i]);
}
printf("\n");Это выведет:
0 1 4 9 16int squares[5]; создаёт массив из пяти элементов, у которых пока нет значений. sizeof работает и сейчас, потому что размер массива фиксирован с самого начала. Первый цикл задаёт каждому элементу значение — квадрат его индекса: squares[0] получает 0, squares[1] получает 1, squares[2] получает 4 и так далее. Второй цикл их выводит.
Не читайте элемент, пока у него нет значения: C не гарантирует, что в нём лежит. Для отдельной переменной без значения этот сайт сообщает об ошибке, а для элемента массива — нет, так что избегать этой ошибки нужно самим.
Если хотите, чтобы все элементы начинались с нуля, напишите = {0}. Это удобно для счётчиков. Здесь каждый элемент считает голоса за одного из четырёх кандидатов:
int votes[4] = {0};
votes[2]++;
votes[2]++;
votes[0]++;
int count = sizeof(votes) / sizeof(votes[0]);
for (int i = 0; i < count; i++) {
printf("%d ", votes[i]);
}
printf("\n");Это выведет:
1 0 2 0Если в фигурных скобках меньше значений, чем размер массива, C заполняет остальные элементы нулями. {0} задаёт первому элементу 0, а остальные тоже становятся 0. Осторожно: = {1} не заполняет массив единицами. Это задаёт 1 только первому элементу, а все остальные — 0.
Фигурные скобки работают только при создании массива. Позже заполнить весь массив разом нельзя: votes = {0, 0, 0, 0}; заканчивается ошибкой error: expected expression. Массив нельзя скопировать и с помощью =. Если copy и scores — два массива из пяти int, то copy = scores; не компилируется:
main.c:6:10: error: array type 'int[5]' is not assignableВ сообщении сказано, что массиву нельзя присвоить значение целиком. Чтобы скопировать массив, копируйте его по элементам в цикле:
int scores[] = {80, 92, 75, 60, 88};
int count = sizeof(scores) / sizeof(scores[0]);
int copy[5];
for (int i = 0; i < count; i++) {
copy[i] = scores[i];
}
printf("%d %d\n", copy[0], copy[4]);Это выведет:
80 88Копия должна быть не меньше оригинала. В меньшем массиве цикл вышел бы за его конец.
Задание
- 1
Под комментарием создайте массив
multiplesиз 10 целых чисел без значений. Затем заполните его в цикле таблицей умножения на 7:7,14,21и так далее до70. Элемент с индексомiполучает значение(i + 1) * 7. - 2
Во втором цикле выведите все элементы на одной строке через пробел:
7 14 21 28 35 42 49 56 63 70. - 3
Ниже создайте второй массив
copyиз 10 целых чисел и скопируйте в негоmultiplesв цикле. - 4
Наконец, выведите копию тоже на одной строке, поставив перед ней
Копия:. В выводе должна быть строкаКопия: 7 14 21 28 35 42 49 56 63 70.