- •1 Понятие алгоритма формы представления алгоритмов
- •2 Линейные и разветвляющиеся алгоритмы.
- •3 Циклические алгоритмы
- •4 Понятие прикладного и системного программирования
- •5 Структура программ на языке си
- •6 Арифметико-логические операции над переменными
- •Арифметические операции
- •Операции увеличения и уменьшения
- •Операции "увеличить на", "домножить на" и т.П.
- •Логические операции
- •Операции сравнения
- •Побитовые логические операции
- •7 Два вида оператора выбора Оператор if
- •8 Понятие цикла
- •1.4.6. Оператор break
- •1.4.7. Оператор for
- •1.4.8. Оператор while
- •1.4.9. Оператор do while
- •1.4.10. Оператор continue
- •1.4.11. Оператор return
- •9 Массив
- •12 Указатели
- •13 Адресная арифметика
- •14 Операции над указателями
- •15 Массивы указателей
- •16 Указатели на функции Указатели на функции
- •17 Структуры
- •18 Доступ к элементам структуры
- •19 Структуры как аргументы
- •6.2. Структуры и функции
- •20 Динамические структуры на массиве
- •21 Динамическое распределение памяти Функции динамического распределения
- •Динамическое выделение памяти для массивов
- •23 Организация доступа к файлам
- •Закрытие потока при помощи fclose
- •Чтение из потока при помощи fgetc
- •«Ловушка» eof
- •При помощи fgets
- •24 Форматированный ввод –вывод Функции форматированного ввода и вывода в си
- •Спецификатор типа
- •Спецификатор типа
- •25 Верификация тестирование отладка программ
- •Введение
- •26 Причины и последствия появления ошибок
- •27 Идея модульного программирования
- •28 Технология проектирования сверху-вниз
- •29 Итерация рекурсия
- •30 Методы сортировки
- •34 Способы защиты информации
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.
Локальные (автоматические) переменные определяются внутри функций. Эти переменные действительны только в ней, создаются в момент входа в функцию и уничтожаются при выходе из нее. Рассмотрим следующую таблицу:Переменные Область действия
(видимости)
Время жизни
Глобальные Программа Программа
Статические Модуль (отдельно откомпилированный файл)
Программа
Автоматические Функция Функция