Студенту >> Язык программирования Си


Массивы

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

Описание массива

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

           int a[100], ab[2*40];
           double c[200], speed[100];
           char name[20];

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

Имя массива с квадратными скобками, в которых записано индексное выражение целого типа, обозначает значение соответствующего элемента массива. В языке Си нумерация элементов массива начинается с нуля, то есть для массива d из пяти элементов допустимы следующие обозначения:

                d[0], d[1], d[2], d[3], d[4].

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

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

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

Язык Си не имеет встроенных средств для ввода-вывода массива целиком, поэтому массив вводят и выводят поэлементно с помощью циклов, как, например, в следующей программе:

     #include <stdio.h>

     void main(void)
     {
        double a[100]; int n, i;
        printf("Введите количество чисел n = ");
        scanf("%d", &n);
        if( n>(sizeof a)/sizeof(double) )
           { printf("Слишком много элементов\n"); return; }
        for(i=0; i<n; i++)
        {
           printf("a[%d] = ", i); scanf("%lf", &a[i]);
        }

        /* Операторы, обрабатывающие массив */

     }

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

     #include <stdio.h>

     void main(void)
     {
        double a[100], temp; int n, end;
        for(end=n=0; n<(sizeof a)/sizeof(double); n++)
        {
           printf("a[%d] = ", n); scanf("%lf", &temp);
           if( temp>=1.0e300 ) { end=1; break; }
           a[n] = temp;
        }
        if( end )
        {

            /* Операторы, обрабатывающие массив */

        }
        else
           printf("Переполнение массива\n");
     }

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

Следующий фрагмент программы выводит массив строками по 5 элементов. После вывода 120 элементов программа останавливается для просмотра выдачи. Очередные 120 элементов выводятся после нажатия на любую клавишу.

       for (i=0; i<n; i++)
       {
           printf("%10.3lf  ", a[i]);
           if( (i+6) % 5 == 0 ) printf("\n");
           if( (i+121) % 120 == 0 ) { getch(); clrscr(); }
       }

Здесь стандартная функция clrscr() очищает экран.

Инициализация массива

Инициализация - присвоение значений вместе с описанием данных. Ранее была рассмотрена инициализация простых переменных, например:

                      int a = 5;

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

       int a[4]     =    { 15, 21, 1, 304 };
       индексы элементов -> 0   1  2   3

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

       int c[] = { 1, 15, 18, 11, 20 };

транслятор выделит 10 байт для хранения массива из 5 двухбайтовых целых чисел.

Частный случай инициализации массива - инициализация строк. Массив символов может быть проинициализирован стандартным образом:

       char s[] = { 'A', 'B', 'C', 'D' };

Строка символов дополнительно должна завершаться нуль-символом.

       char s[] = { 'A', 'B', 'C', 'D', '\0' };

В связи с тем, что инициализацию строк приходится организовывать довольно часто, язык Си предусматривает для этого упрощенную форму записи:

       char s[] = "ABCD";

В этом случае нуль-символ автоматически дописывается в конец строки. Два последних примера инициализации строки совершенно эквивалентны.

Программа вычисления длины строки символов

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

     #include <stdio.h>

     void main (void)
     {
        int len;
        char str[81];
        printf("Введите строку: "); scanf("%s", str);
        for(len=0; str[len]; len++);
        printf("Длина строки = %d\n", len);
     }

В этой программе используется цикл for с пустым оператором тела цикла. Цикл будет выполняться до тех пор, пока в строке не встретится нуль-символ, то есть пока выражение str[len] будет отлично от нуля. После окончания цикла переменная len станет равной количеству символов строки str, исключая нуль-символ.

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

     int StrLen (char str[])
     {
        int len;
        for(len=0; str[len]; len++);
        return len;
     }

При наличии функции StrLen два последних оператора предыдущей программы можно заменить одним

        printf("Длина строки = %d\n", StrLen(str));
НАВЕРХ