Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
приблудова рулит.doc
Скачиваний:
39
Добавлен:
27.09.2019
Размер:
403.46 Кб
Скачать

9 Массив

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

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

тип имя[предел №1][предел №2]...[предел №N];

Примеры:     int a[10];     double b[5];

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

Поэтому, в массиве a обращение к первому элементу будет иметь вид: a[0], а к последнему – a[9]. На практике наиболее часто используются только:

   одномерные массивы (векторы);    двумерные массивы (матрицы).

Объявление одномерного массива в си (далее просто массив) имеет следующий синтаксис: тип имя[размер];

В качестве размера массива может указываться любое положительное целочисленное значение. В стандарте С89 значение могло являться только константой. В стандарте С99 было введено понятие динамического массива. Динамический массив - массив, при создании которого в качестве размера указывается значение некоторого выражения, в которое входят переменные, объявленные и инициализированные ранее (выражение должно иметь положительный целочисленный результат).

Например:     int n;     printf("Введите размер массива: ”);     scanf("%d”,&n);     double x[n]; 

При объявлении статических массивов допускается производить инициализацию элементов массива. Синтаксис такого объявления: тип имя[размер] = {значение №1, ... значение №N};

Примеры:     int a[5] = {1,2,3,4,5}, b[5] = {1,2};     double x[10] = {0.0};     int c[] = {1,2,3,4,5};     char d[] = {’a’,’b’,’c’};     int e[5] = {1,2,,4,5}; //Неправильно - ошибка Объявление константных массивов (значения их элементов изменить нельзя) начинается с ключевого слова const, за которым следует объявление массива с инициализацией. Примеры:     const int array[] = {1,2,3,4,5};     const double vector[5] = {1.0,2.0,3.0};

Обращение к элементу массива осуществляется путем указания имени массива, а после имени в квадратных скобках индекса элемента: имя[индекс]

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

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

    int a[10];     for(int i=0;i<10;i++) scanf("%d”,&a[i]);     ...     for(int i=0;i<10;i++) printf("%d\t”,a[i]); Присвоение массива массиву также осуществляется поэлементно. Например, необходимо присвоить вещественный массив x вещественному массиву y. Фрагмент программы:

    double x[15], y[15];     ...     for(int i=0;i<15;i++) y[i] = x[i];     ... В языке С во время выполнения программы не производится контроль за допустимыми значениями индексов элементов. Поэтому, если индекс элемента выходит за рамки массива, то в программе возможно появление ошибок. Ошибки могут быть:     ростыми (например «случайное» изменение переменных);     критическими (выход за пределы пространства памяти, отведенной для программы). Например:     int a[10];     for(int i=0;i<=10;i++) a[i] = i;

10-11 функци

2.8. Функции

В виде функции оформляются вычисления, преобразования, другие действия, которые затем могут быть выполнены неоднократно с различными аргументами. С помощью функции большие вычислительные задачи подразделяют на более мелкие. Они позволяют воспользоваться тем, что уже сделано другими разработчиками, а не начинать создание программы каждый раз "с нуля". Язык

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

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

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

эти модули к своей программе.

Объявление, определение и вызов функций

Определение функции имеет следующий вид:

тип_возвращаемого_значения имя(список_формальных_параметров)

{

последовательность_операторов;

}

Определение функции задает: 1) тип возвращаемого функцией значения;

2) имя функции; 3) список формальных параметров; 4) последовательность

операторов. Тело функции, заключенное в фигурные скобки, содержит объяв-

ления автоматических переменных и операторы, определяющие действия, вы-

полняемые функцией.

Прототип функции имеет следующий вид:

тип_возвращаемого_значения имя(список_формальных_параметров);

Вызов функции имеет следующий вид:

имя(список_фактических_параметров );

Пример с использованием прототипа, вызова и определения функции.

/* Прототип функции */

int volume(int a, int b, int c);

13

int main(void)

{

int x=5, y=6, v;

v=volume(x,y,8); /* Вызов функции */

return 0;

}

/* Определение функции */

int volume(int a, int b, int c)

{

return a*b*c;

}

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

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

метров оставляют пустым. Важно, что типы фактических параметров при вызове функции должны

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

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

указанного выражения возвращается в точку вызова функции в качестве результата.

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

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

Область действия переменных и время жизни Программа на языке Си обычно оперирует с множеством внешних объек-

тов: переменных и функций. Глобальные переменные объявляются вне функций и доступны для лю-

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

только текущим модулем. В этом случае переменная определяется как статическая с помощью модификатора static.

Локальные (автоматические) переменные определяются внутри функций. Эти переменные действительны только в ней, создаются в момент входа в функцию и уничтожаются при выходе из нее. Рассмотрим следующую таблицу:Переменные Область действия

(видимости)

Время жизни

Глобальные Программа Программа

Статические Модуль (отдельно откомпилированный файл)

Программа

Автоматические Функция Функция