Урок 3. Часть1: Язык Си массивы

На занятии рассматривается тема «Язык Си массивы». Разбираются примеры работы с массивами и даются задания

Определение массива в Си

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

У каждого элемента в массиве есть свое положение — индекс элемента, т.е. его порядковый номер. Индекс элемента массива не имеет никакого отношения к присвоенному ему значению.

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

  

int имя_массива [макс_кол-во_элементов];

Пример:

int f [10];

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

Если определен массив, имеющий 10 элементов, значит максимальным возможным индексом является число 9.

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

int f [10] = {2,4,-3,-6,-1,4,7,5,10,13};

Работа с массивами в Си

Пример: Вычислить и распечатать первые 10 чисел Фибоначчи
1
2
3
4
5
6
7
8
9
10
11
12
main()
{
int f[9];
int i;
f[0]=1;
f[1]=1;
for(i=2;i<=10;i++)
 {
  f[i]=f[i-1]+f[i-2];
  printf("%d\t",f[i]);
 }
}
Задача 3_1: Даны 5 целых чисел. Найти количество отрицательных и вывести на экран. Выполнить задачу с использованием массива.

Заполнение случайными числами

Заполнение случайными числами в диапазоне [a;b]

1
A[i] = a + rand()% (b - a + 1);

Создание пользовательской функции для заполнения случайными числами:

Описание функции до main{}

1
2
3
4
int irand ( int a, int b )
{
  return a + rand()% (b - a + 1);
}

Заполнение массива (псевдо)случайными целыми числами в диапазоне от 20 до 100:

1
2
3
4
5
for ( i = 0; i < N; i++ ) 
  {
  A[i] = irand ( 20, 100 );
  cout << A[i] << " ";
  }
Пример: Дан массив из 10 чисел. Определить есть ли в массиве число, введенное пользователем
Показать решение:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
main()
{
int f[10]={2,4,-3,-6,-1,4,7,5,10,13};
int i,c,flag;
flag=0;
printf("vvedite obrazec");
scanf("%d",c);
for(i=0;i<10;i++)
{
If (f[i]= =c)
{     printf("naiden");
flag=1;
break;
}	}
if (flag= =0) printf("net");
}
Показать аналог в Pascal

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var f: array[1..10] of integer;
i,c,flag:integer;
begin
f[1]:=2;
f[2]:=4;
f[3]:=-3;
f[4]:=-6;
f[5]:=-1;
f[6]:=4;
f[7]:=7;
f[8]:=5;
f[9]:=10;
f[10]:=13;
flag:=0;
writeln('vvedite obrazec');
readln(c);
for i:=1 to 10 do begin
    If f[i]=c then begin
     writeln('naiden');
flag:=1;
break;
end; end;
if flag= 0 then writeln('net');
end.
Пример: Дан массив размера N. Вставить элемент с нулевым значением перед минимальным и после максимального элемента массива.

* Из задачника М. Э. Абрамян (Array103)

Показать решение:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
int main(void)
{
    int a[11];
    int n;
    printf("N: ");
    scanf("%i",&n);
 
    int i;
    for (i=1; i<=n; ++i){
        printf("a[%i] : ",i);
        scanf("%i",&a[i]);
    }
 
    int amin=1,amax=1;
    for (i=1; i<=n; ++i){
        if (a[amin]>a[i]) {
            amin=i;
        }
        if  (a[amax]<a[i]){
            amax=i;
        }
    }
    if (amax>amin) amax++;
 
    n++;
    for (i=n; i>=amin; --i) a[i]=a[i-1];
    a[amin]=0;
 
    n++;
    for (i=n; i>amax+1; --i) a[i]=a[i-1];
    a[amax+1]=0;
 
    for (i=1; i<=n; ++i) printf("  %i: %i\n",i,a[i]);
    return 0;
}
Пример: Дан целочисленный массив размера N. Удалить из массива все нечетные числа и вывести размер полученного массива и его содержимое.

* Из задачника М. Э. Абрамян (Array92)

Показать решение:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
int main(void)
{
    int a[11];
    int n,k=0;
    printf("N: ");
    scanf("%i",&n);
 
    int i;
    for (i=1; i<=n; ++i){
        printf("a[%i] : ",i);
        scanf("%i",&a[i]);
    }
 
    for (i=1; i<=n; ++i){
        if (a[i]%2==0){
            ++k;
            a[k]=a[i];
        }
    }
 
    printf("A - %i\n",k);
    for (i=1; i<=k; ++i) printf("  %i: %i\n",i,a[i]);
    return 0;
}
Задача 3_2: Дан массив размера N, все элементы которого, кроме последнего, упорядочены по возрастанию. Сделать массив упорядоченным, переместив последний элемент на новую позицию.

* Из задачника М. Э. Абрамян (Array88)

Задача 3_3: Дан массив размера N и целое число K (1≤K≤N). Удалить из массива элемент с порядковым номером K.

* Из задачника М. Э. Абрамян (Array90)

Вопросы для самоконтроля:

  • Что такое массив?
  • Может ли массив содержать переменные нескольких типов?
  • Как правильно определять на языке Си массивы?
  • Есть ли взаимосвязь между значением индекса и значением элемента массива и какова она, если есть?
  • 3 комментария для “Урок 3. Часть1: Язык Си массивы”

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

      Но есть, конечно, и недочёты. Например, я думаю, лучше сразу приучать начинающих программистов к грамотному, читабельному оформлению кода, потому что иногда в примерах хрен разберёшь что к чему относится. А переучиваться, как известно, сложнее, чем учиться с нуля.

      Сами фрагменты кода написаны не везде корректно. Не всё работает (может и я что-то не так сделал, хотя как только ни пытался со всей мощностью гугла).

      В некоторых примерах для решения нужны дополнительные знания (например, функция sizeof() в использовании для вычисления размера массива была бы очень удобна).

      Пример: Дан массив размера N. Вставить элемент с нулевым значением перед минимальным и после максимального элемента массива.
      * Из задачника М. Э. Абрамян (Array103)

      В этом примере, считаю, есть лишние операции в той версии решения, которая предложена на сайте. Например в строке 4 задаётся размер массива — 11. А что если пользователь захочет ввести не 11, а, скажем, 25?
      Это просто бессмысленная операция, так как двумя строками ниже программа всё равно попросит пользователя ввести размер массива.

      И для тестовых примеров удобнее использовать показанную в предыдущих уроках функцию для рандомного задания значений.
      Ниже моя версия реализации программы.

      #include

      int iRand(int a, int b)
      {
      return a + rand() % (b — a + 1);
      }

      int main(int argc, char **argv)
      {
      // Задание размера массива
      int n;
      printf(«Enter array’s size: «);
      scanf(«%d», &n);

      // Формирование массива
      int a = -100, b = 100;
      int mass[n];
      for (int i = 0; i <= n; i++)
      {
      mass[i] = iRand(a, b);
      printf("%d ", mass[i]);
      }
      printf("\n");
      int iMin = 0, iMax = 0;
      int min = mass[iMin];
      int max = mass[iMax];

      // Поиск индекса минимального и максимального значения массива
      for (int i = 1; i <= n; i++)
      {
      if (mass[i] mass[iMax])
      iMax = i;
      }
      printf(«\nMax = %d. iMax = %d.\nMin = %d. iMin = %d.\n\n», mass[iMax], iMax, mass[iMin], iMin);

      // Замена на нули с проверкой на вхождение индекса в диапазон массива
      if (iMin >= 0)
      mass[iMin — 1] = 0;
      if (iMax <= n)
      mass[iMax + 1] = 0;

      for (int i = 0; i <= n; i++)
      printf("%d ", mass[i]);
      puts("\n");

      return 0;
      }

      ____________________________________________________
      А в целом, конечно, огромный респект создателям этого сайта!

      1. спасибо за конструктивные замечания) Постараемся учесть

    2. А если регистрацию сделаете, я буду первейшим вашим пользователем)

    Обсуждение закрыто.