Возврат в вызывающую функцию

      Комментарии к записи Возврат в вызывающую функцию отключены

Массив

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

Массив характеризуется следующими основными понятиями:

Элемент массива (значение элемента массива) – значение, хранящееся в определенной ячейке памяти, расположенной в пределах массива, а также адрес этой ячейки памяти.

Каждый элемент массива характеризуется тремя величинами:

  • адресом элемента — адресом начальной ячейки памяти, в которой расположен этот элемент;
  • индексом элемента (порядковым номером элемента в массиве);
  • значением элемента.

Адрес массива – адрес начального(нулевого) элемента массива.
Имя массива – идентификатор, используемый для обращения к элементам массива.
Размер массива – количество элементов массива
Размер элемента – количество байт, занимаемых одним элементом массива.

Графически расположение массива в памяти компьютера можно представить в виде непрерывной ленты адресов.

Представленный на рисунке массив содержит q элементов с индексами от 0 до q-1. Каждый элемент занимает в памяти компьютера k байт, причем расположение элементов в памяти последовательное.

Адреса i-го элемента массива имеет значение

n+k·i

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

Длина массива – количество байт, отводимое в памяти для хранения всех элементов массива.

ДлинаМассива = РазмерЭлемента * КоличествоЭлементов

Для определения размера элемента массива может использоваться функция

int sizeof(тип);

Например,

sizeof(char) = 1; sizeof(int) = 4; sizeof(float) = 4; sizeof(double) = 8;

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

Для объявления массива в языке Си используется следующий синтаксис:

тип имя[размерность] = {инициализация};

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

int a[10] = {0,1, 2, 3, 4, 5, 6, 7, 8, 9}; // массив a из 10 целых чисел

или int a [0]=0, a[1]=1, …, a[10]=9;

int a[10] = {0}; // массив a из 10 элементов, инициализированных 0

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

int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

При обращении к элементам массива индекс требуемого элемента указывается в квадратных скобках [].

Пример

int main()

{

int a[5] = {0,1, 2, 3, 4};

int i;

for( i=0;i

printf(a[%d]=%d\t , i,a[i]);

return 0;

}

Однако часто требуется задавать значения элементов массива в процессе выполнения программы. При этом используется объявление массива без инициализации. В таком случае указание количества элементов в квадратных скобках !обязательно.!

int a[10];

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

#include
int main()
{
int i,a[5]; // объявлен массив a из 5 элементов

// Ввод элементов массива
for (i = 0; i{
printf(a[%d] = , i);
scanf(%d, a[i]); // a[i] — адрес i-го элемента массива
}
// Вывод элементов массива
for (i = 0; iprintf(%d , a[i]); // пробел в формате печати обязателен
return 0;
}

Результат выполнения программы

2.

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

#include

/* подсчет цифр, символов-разделителей и прочих символов */

int main()

{

int c,i,nwhite, other;

int ndigit[10];

nwhite = other = 0;

for (i = 0; i10; ++i)

ndigit[i]= 0;

while ((c = getchar()) != ‘EOF’)

if ( c= ‘0’c

++ndigit[c — ‘0’];// есть числовое значение цифры, в кодировке они по порядку

else if (c == ‘ ‘ || c == ‘\n’ || c == ‘\t’)

++nwhite;

else

++other;

printf(digits =);

for (i = 0; i10; ++i)

printf(%d, ndigit[i]);

printf(, white space =%d, other =%d\n, nwhite, other);

return 0;

}

Дз1.Ввести координаты трёх вершин треугольника. Вывести его площадь. Считаем, что ввод корректный.

Функция pow() возвращает значение base, возведенное в степень ехр, т. е. baseexp. Переполнение вызывает ошибку области значений. Также может возникнуть ошибка области определения. Версия этой функции для данных типа long double называется powl().

Параметры:

  • basis Значение с плавающей точкой — основание.
  • exponent Значение с плавающей точкой — степень.

Функции в языке Си

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

Функция — это самостоятельная единица программы, которая спроектирована для реализации конкретной подзадачи.
Функция является подпрограммой, которая может содержаться в основной программе, а может быть создана отдельно (в библиотеке). Каждая функция выполняет в программе определенные действия.

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

Семантика функции определяет способ реализации функции. Обычно представляет собой тело функции.

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

Каждая функция в языке Си должна быть определена, то есть должны быть указаны:

Oтип возвращаемого значения;

Oимя функции;

Oинформация о формальных аргументах;

Oтело функции.

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

ТипВозвращаемогоЗначенияИмяФункции(СписокФормальныхАргументов) //параметры
{
ТелоФункции;//объявления и инструкции

return ВозвращаемоеЗначение;// return(ВозвращаемоеЗначение);
}

Пример: Функция сложения двух вещественных чисел

float sum(float x, float z)
{
float y;
y = x+z;
return y;//return (y);
}

В указанном примере возвращаемое значение имеет тип float. В качестве возвращаемого значения в вызывающую функцию передается значение переменной y. Формальными аргументами являются значения переменных x и z.

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

Различают системные (в составе систем программирования) и собственные функции.

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

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

Разбиение программ на функции дает следующие преимущества:

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

OОдну и ту же функцию можно использовать в разных программах.

OФункции повышают уровень модульности программы и облегчают ее проектирование.

OИспользование функций облегчает чтение и понимание программы и ускоряет поиск и исправление ошибок.

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

Вызов функции

Общий вид вызова функции

Переменная = ИмяФункции(СписокФактическихАргументов);

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

Возврат в вызывающую функцию

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

return(ВозвращаемоеЗначение);

return ВозвращаемоеЗначение;

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

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

Функции могут и не возвращать значения, а просто выполнять некоторые вычисления. В этом случае указывается пустой тип возвращаемого значения void, а оператор return может либо отсутствовать, либо не возвращать никакого значения:

return;

Пример: Посчитать сумму двух чисел.

#include
// Функция вычисления суммы двух чисел
int sum(int x, int y) // в функцию передаются два целых числа
{
int k = x + y; // вычисляем сумму чисел и сохраняем в k
return k; // возвращаем значение k
}
int main()
{
int a, s; // описание двух целых переменных
printf(a= );
scanf(%d, a); // вводим a

printf(b= );
scanf(%d, b);
s = sum(a, b); // вызов функции: x=a, y=b
printf(%d +%d = %d, a,b, s); // вывод: a + b = s
return 0;
}

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

В языке Си нельзя определять одну функцию внутри другой.

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

Oтип возвращаемого значения;

Oимя функции;

Oтипы формальных аргументов в порядке их следования.

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

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

#include
int sum(int, int); // сигнатура-прототип
int main()
{
int a, r;
printf(a= );
scanf(%d, a);
r = sum(a, 5); // вызов функции: x=a, y=5
printf(%d + 5 = %d, a, r);
return 0;
}
int sum(int x, int y) // семантика
{
int k;
k = x + y;
return(k);
}

дз2.Напишите простой калькулятор на Си

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

дз3.Реализовать функцию void swap(int,int) с массивом

дз4.Заполняем числами массив из 10 элементов. Нужно поменять местами наибольший и начальный элементы массива. Используем функцию для поиска максимального элемента и обмена

Статьи к прочтению:

Информатика. Передача массива в функцию и возврат из функции в Си. Центр онлайн-обучения «Фоксфорд»


Похожие статьи:

  • Передача массивов в функцию

    Лабораторная работа №8. Функции Цель и порядок работы Цель работы – изучить возможности языка по организации функций, получить практические навыки в…

  • Примеры объявления функций

    Описание функции Функция описывается заголовком и телом. Заголовок содержит: класс памяти; имя функции; тип возвращаемого результата; имена и типы…