Главная > Уроки > Одномерные массивы

Записывайся на этот курс на Stepike!

Одномерные массивы

Массив – это простейший составной тип данных. Когда мы обсуждали переменные, у нас была хорошая аналогия с коробкой. Вернёмся к ней. Если переменная – это один ящик, то массив – это несколько пронумерованных одинаковых ящиков, которые имеют одно и то же имя, а различаются между собой только порядковым номером.

Переменные и массивы. Аналогия с коробками.

Рис.1 Переменные и массивы. Аналогия с коробками.

На картинке выше изображено три массива:

  • целочисленный массив из 8 элементов с именем arr_int
  • вещественный массив из 11 элементов с именем arr_float
  • символьный массив из 6 элементов с именем arr_char

У массива, как и у переменной, имеются свои имя и тип данных. Кроме того, у массива ещё есть одна дополнительная характеристика – размер массива. Размер массива – количество элементов, которые могут в нём храниться. В нашей аналогии с коробочками это количество коробок.

Обратите внимание!

Нумерация элементов массива начинается с нуля, а не с единицы.

Объявление и инициализация массива

Объявление массива очень похоже на объявление переменной. Отличие лишь в том, что следует дополнительно указать размер массива в квадратных скобках. Вот несколько примеров:

Листинг 1.

int arr_int[8];
double arr_float[11]; 
float number[2000];

На имя массива накладываются ограничения, аналогичные тем, которые накладываются на имя переменной.

Правило именования массивов

Имя массива – любая последовательность символов, цифр и знака нижнего подчеркивания «_», которая начинается с буквы. Регистр букв важен.

Вот ещё несколько примеров объявления массивов:

Листинг 2.

int grades[50], order[10];
double prices[500];

Массиву, как и любой переменной, можно присвоить начальные значения при объявлении. Если элементам массива не присвоить никакого значения, то в них будет храниться мусор, как и в обычных переменных.

Листинг 3.

int arr_int[5] = {2, 5, 5, 3, 4};
double arr_float[11] = {1.2, -2.3, 4.5, 3.83, 0.01, -0.12, 44.2, 123.7, 23.44, -3.7, 7};

Если нужно присвоить нулевые значения всем элементам массива, то можно сделать вот так:

Листинг 4.

double arr[50] = {0};

Работа с отдельными элементами массива

Чтобы обратиться к отдельному элементу массива, необходимо написать его имя и порядковый номер в квадратных скобках. Не забывайте, что нумерация начинается с нуля, а не с единицы.

Давайте, например, выведем элементы массива из пяти элементов на экран.

Листинг 5.

#include <stdio.h>

int main(void){
  int arr[5] = {2, 4, 3, 5, 5};
  
  printf("%d %d %d %d %d\n",arr[0], arr[1], arr[2], arr[3], arr[4]);

  return(0);
}

Конечно, если массив будет очень большой, то выводить его поэлементно подобным образом то ещё удовольствие. Да и с маленькими массивами так никто не делает. Лучше и правильнее использовать циклы. Например:

Листинг 6.

#include <stdio.h>

int main(void){
  int arr[100] = {0};
  
  for(int i = 0; i < 100; i = i + 1){
    arr[i] = 2*i;
  }

  for(int i = 0; i < 100; i = i + 1){
    printf("%d\t",arr[i]);
  }

  return(0);
}

Программа в первом цикле сохраняет в массив первую сотню чётных чисел, а во втором цикле выводит их на экран.

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

Листинг 7.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {  
  srand(time(NULL));
  int count[3] = {0};
  int rand_number;
  
  for (int i = 0; i < 100000; i = i + 1){
    rand_number = rand()%3;
    count[rand_number] = count[rand_number] + 1;
  }

  for(int i = 0; i < 3; i = i + 1){
    printf("%d - %d\n", i, count[i]);
  }

  return 0;
}

Обратите внимание на приём, который используется в этой программе.
В нулевом элементе массива хранится количество выпадений числа 0, в первом элементе – количество выпадений числа 1, во втором элементе – числа 2. То есть само сгенерированное число позволяет определить, к какому элементу массива необходимо добавить единичку. Поэтому необходимость в операторе выбора switch отпадает. Удобно, не так ли?

Сохрани в закладки или поддержи проект.

Практика

Решите предложенные задачи:

Для удобства работы сразу переходите в полноэкранный режим

Дополнительные материалы

  1. пока нет

Оставить комментарий

Чтобы код красиво отображался на странице заключайте его в теги [code] здесь писать код [/code]

Комментарии

Алекс
>> вещественный массив из 11 элементов с именем arr_double
arr_float же XD
KaDeaT
Так точно! Поправил. Спасибо! )
JJJ
Очень не хватает примеров задач, никак не могу понять, как можно решить даже самую первую задачу
#include <stdio.h>
int main() {
int i,a,b,s,d,c,;
scanf("%d%d%d%d%d%d", &i,&a,&b,&s,&d,&c);
int arr[i] = { a,b,s,d,c };/считается недопустимым а как с помощью циклов я понять не могу
printf("%d %d %d %d %d", c, d, s, b, a);
return 0;
}
KaDeaT
0. Создать массив из 100 элементов. Например, с именем arr. 100 -- 'то максимальный размер массива, который может быть в задачах.

1. Считать в целочисленную переменную, например, с именем N, количество чисел в массиве (длину массива).

2. Далее запустить цикл for от 0 до N. В теле цикла считывать число в очередной элемент массива, например, scanf("%d", &arr[i]);

Всё. Теперь все данные, которые поступали на вход у вас хранятся в массиве.
не_робот
Примеров мало, вообще не понятно с какой стороны подступиться к первой же задаче.
В вашем комментарии "1. Считать в целочисленную переменную, например, с именем N, количество чисел в массиве (длину массива)." всё здорово, кроме примера которого нет, для наглядности можно было его показать
Анатолий
По листингу 6 - "Программа в первом цикле сохраняет в массив первую сотню чётных чисел, а во втором цикле выводит их на экран."
На самом деле сохраняет первые две сотни четных чисел
Элай
Не понимаю как работает код в листинге 7
Алеша
Не бро, не похвалю твои уроки, новички не очень поймут , какой то ты странный и задачи странные, лучше уж видеоуроки на ютубе или Udemy
KaDeaT
Задачи -- топ! =)
Но у каждого свой путь, конечно!
Руслан
Листинг 6. 2*0 == 0 - это особенность Си?
Valeriy
Задача проверку палиндромного массива. Не понимаю, почему не принимается ответ. Тестирую в визуал студио
Работает как в условии вроде

 
#include <stdio.h>

int main(void)
{
int size;
int count = 0;
int out = 0;
scanf("%d", &size);
int array[size - 1];
while (count < size)
{
scanf("%d", &array[count]);
count++;
}
count = 0;

while (count < size / 2)
{
if (array[count] == array[size - 1 - count])
{
out = 1;
}
else
{
out = 0;
break;
}
count++;
}
if (out == 1)
printf("YES");
else
printf("NO");

return 0;
}
Valeriy
Разделить массив на две части, поместив в первую элементы, большие среднего арифметического массива, а во вторую — меньшие.

задача решается, но не принимается системой


#include <stdio.h>

main(void)
{
int size=0, count = 0;
float average = 0,sum=0;
scanf("%d", &size);
int array[size];
int res[size];
int begin_count;
int end_count;

while (count < size)
{
scanf("%d", &array[count]);
count++;
}
count = 0;
while (count < size)
{
sum += array[count];
count++;
}
average = sum / size;
// printf("AverAGE: %.2f n", average );

count = 0;
begin_count=0;
end_count=(size/2);
while (count <= size-1)
{
if (array[count] > average )
{
res[begin_count] = array[count];
// printf("Begin Count - %d! Adding there %dn", begin_count, array[count]);
begin_count++;
}
else
{
res[end_count] = array[count];
// printf("End Count - %d! Adding there %dn", end_count, array[count]);
end_count++;
}

count++;
}

count = 0;
while (count < size)
{
printf("%d ", res[count]);
count++;
}
return 0;
}
Valeriy
В заданном массиве поменять местами наибольший и наименьший элементы.

задача решается, но не принимается системой


#include <stdio.h>

main(void)
{
int size, count;
int temp, min,max;
int min_position =0, max_position=0;
scanf("%d", &size);
int array[size];


min = array[0];max = array[0];count =0;
while (count < size)
{
scanf("%d", &array[count]);

if (array[count] < min)
{
min = array[count];

min_position= count;
}
if (array[count] > max)
{ max = array[count];
max_position = count ;
}
count++;
}

temp = array[min_position];
array[min_position] = array[max_position];
array[max_position] = temp;
count = 0;

while (count < size)
{
printf("%d ", array[count]);
count++;
}
return 0;
}