Язык C Функции урок N 8.pptx
- Количество слайдов: 27
Введение в функции
Функция — специальная конструкция, с помощью которой какой-либо фрагмент кода повторяющийся в программе два или более раз выносится за тело программы. Этот фрагмент получает собственное имя и, в дальнейшем, для того, чтобы воспользоваться вынесенным кодом, необходимо будет указать это имя. Функция — это самостоятельная единица программы, которая спроектирована для реализации конкретной подзадачи. Функция является подпрограммой, которая может содержаться в основной программе, а может быть создана отдельно (в библиотеке). Каждая функция выполняет в программе определенные действия. Сигнатура функции определяет правила использования функции. Обычно сигнатура представляет собой описание функции, включающее имя функции, перечень формальных параметров с их типами и тип возвращаемого значения. Тип. Возвращаемого. Значения Имя. Функции(Список. Формальных. Аргументов) float function_name(float x, float z)
Существует два способа объявления функции: 1) Функция объявляется до функции main. 2) Функция объявляется с помощью прототипа, а после функции main, описывается тело объявленной функции. Общий синтаксис объявления функции: возвращаемое_значение имя_функции (формальные параметры) { блок_повторяющегося_кода (тело); } Если функция ничего не возвращает, на место возвращаемого значения подставляется void(пусто) Нельзя создавать одну функцию внутри другой. Нельзя вызвать функцию до ее объявления.
Синтаксис вызова функции Вызов функции является предписанием операционной системе начать выполнение фрагмента кода, который содержится в теле функции. По завершении выполнения функции, программа должна продолжить работу в основном коде с того же места, где была вызвана функция. Вызов функции состоит из указания имени функции, передачи аргументов (если таковые имеются) и получения возвращаемого значения ( если есть необходимость его получать). Общий вид вызова функции: переменная = Имя. Функции(Список. Фактических. Аргументов); или если функция ничего не возвращает: Имя. Функции(Список. Фактических. Аргументов);
1. Типы данных значений должны соответствовать типам данных аргументов в определении функции. Исключением являются случаи, когда передаваемое значение может быть с легкостью преобразовано к нужному типу. 2. При вызове функции всегда необходимо указывать такое количество параметров, какое было определено при объявлении. 3. Тип переменной, в которую запишется возвращаемое значение, должен совпадать с тем типом, который функция возвращает.
Фактический аргумент — это величина, которая присваивается формальному аргументу при вызове функции. Таким образом, формальный аргумент — это переменная в вызываемой функции, а фактический аргумент — это конкретное значение, присвоенное этой переменной вызывающей функцией. Фактический аргумент может быть константой, переменной или выражением. Если фактический аргумент представлен в виде выражения, то его значение сначала вычисляется, а затем передается в вызываемую функцию. Если в функцию требуется передать несколько значений, то они записываются через запятую. При этом формальные параметры заменяются значениями фактических параметров в порядке их следования в сигнатуре функции.
Ключевое слово return Для возвращения Значения из функции в программу на то место, из которого была вызвана эта функция, используется оператор return. Синтаксис возврата таков: return значение; Если функция не возвращает никаких значений, то оператор return можно использовать просто для остановки функции, для этого просто пишем: return; Важные моменты обращения с return: 1. Операторов возврата может быть несколько (в зависимости от ситуации), но отработает только один из них. 2. Если сработал return (вне зависимости от формы), все что расположено в функции ниже него уже не отработает. 3. Если тип возвращаемый функцией не void, то необходимо ВСЕГДА использовать форму: return значение
Пример: using namespace std; int sum(int x, int y)" src="https://present5.com/presentation/31836151_439357067/image-8.jpg" alt="#include "stdafx. h" #include
using namespace std; int sum(int" src="https://present5.com/presentation/31836151_439357067/image-9.jpg" alt="Пример с прототипом функции: #include "stdafx. h" #include
Для чего нужен именно прототип? Почему нельзя ограничиться использованием одного описания функции? Прототип стал необходим после того, как стандарты языка С изменились таким образом, что перед вызовом функции в файле необходимо каким либо образом ее описать. Проблема состоит в том, что имя функции имеет глобальную область видимости (если ее описание находится вне всяких локальных областей). Допустим, что описание функции находится в отдельном исходном файле. Также допустим, что необходимо осуществить вызов этой же функции в нескольких других исходных файлах. Если нет прототипа, то в каждый такой исходный файл необходимо включить полное описание функции. Компилятор будет интерпретировать это как переопределение. Если же мы используем прототип, то мы можем включать этот прототип в столько исходных файлов, сколько нам необходимо. Как лучше всего использовать прототип функции. Лучше всего описание функции включить в отдельный исходный файл. После этого надо скомпилировать этот файл и получить объектный файл. Прототип следует помесить в заголовочный файл и включать его директивой #include в те исходные файлы, в которых присутствует вызов функции.
using namespaсe" src="https://present5.com/presentation/31836151_439357067/image-11.jpg" alt="Пример функции , которая ничего не возвращает. #include "stdafx. h“ #include
Передача аргументов в функции. 1) Передача аргументов по значению Формальные аргументы ( аргументы указываемые при определении функции, )создаются в момент вызова функции в оперативной памяти. При выходе из функции такие параметры будут уничтожены. Поэтому, если в другой функции программы будут параметры с тем же именем, то конфликта не будет. int sum(int x, int y) \OK int mult(int x, int y) \OK
using namespace std; //" src="https://present5.com/presentation/31836151_439357067/image-13.jpg" alt="Пример передачи аргументов по значению #include "stdafx. h" #include
1. При передачи аргументов в функцию передаются не a и b, а их точные копии!!! 2. Все изменения происходят с копиями (One и Two), при этом сами a и b остаются неизменными. 3. При выходе из функции временные копии уничтожаются. Исходя из вышеописанного — пока будьте внимательны при обработке значений внутри функции. В последствие, мы научимся решать данную проблему. Примечание: Кстати, с массивами такого не случается. Все изменения происходящие с массивом в функции — сохраняются при выходе из неё.
Имя массива при передачи его в качестве аргумента в функцию преобразуется к указателю на его первый элемент, т. е. при передаче массива происходит передача указателя. По этой причине вызываемая функция не может отличить, относится ли передаваемый ей указатель к началу массива или к одному единственному объекту. При передаче одномерного массива достаточно просто указать пустые квадратные скобки: int summa (int array[ ], int size){ int res=0; for (int i = 0; i < size; i++) res += array[i]; return res; }
Если в функцию передаётся двумерный массив, то описание соответствующего аргумента функции должно содержать количество столбцов; количество строк — несущественно, поскольку, как говорилось ранее в функцию фактически передаётся указатель. int summa (int array[ ][5], int size_row, int size_col
using namespace std; int summa(int array[], int size){ int" src="https://present5.com/presentation/31836151_439357067/image-17.jpg" alt="#include "stdafx. h" #include
В языке C++ адрес переменной можно передать функции автоматически. Это реализуется с помощью параметрассылки. При использовании параметра-ссылки функции передаётся адрес аргумента, и функция работает с аргументом, а не с копией. Чтобы создать параметр-ссылку необходимо перед его именем поставить символ "амперсанда" (&). Внутри ф. этот параметр можно использовать обычным образом, не прибегая к оператору "звёздочка" (*), например. void swap (int &x, int &y) { int temp; temp = x; x = y; y = temp; }
Область видимости. Глобальные и локальные Переменные. Любые фигурные скобки в программном коде образуют, так называемую область видимости, это означает, что переменные, объявленные внутри этих скобок будут видны только внутри этих скобок. int a=5; if(a==5) { int b=3; } cout<
Согласно правилам области видимости — переменные делятся на два вида — локальные и глобальные. Локальные переменные создаются внутри какого нибудь отрезка кода. Глобальные переменные создаются вне всяких областей видимости. Преимущественно до функции main(). Такая переменная видна в любом месте программы. По умолчанию глобальные переменные в отличии от локальных инициализируются 0. Изменения, которые происходят с глобальной переменной внутри функции, при выходе из последней сохраняются. int a=23; void main() { int a=7 cout<
Аргументы (параметры) функции по умолчанию Формальному параметру функции может быть задан аргумент по умолчанию. Это означает, что в данный аргумент значение при вызове можно не передавать. В этом случае будет использовано значение по умолчанию. Общий синтаксис для реализации такого подхода имеет следующий вид: тип_возвр_знач имя_функ (тип_арг имя_арг=знач_по_умолч) Значение_по_умолчанию и есть значение, присваиваемое аргументу, если он опущен при вызове. Разумеется, аргументов по умолчанию может быть несколько: тип_возвращаемого_значения имя_функции(арг 1=значение, арг 2=значение)
Аргументами по умолчанию могут быть аргументы, начиная с правого конца списка параметров функции и далее последовательно слева направо без перерывов. void foot (int i, int j = 7) ; //допустимо void foot (int i, int j = 2, int k) ; //недопустимо void foot (int i, int j = 3, int k = 7) ; //допустимо void foot (int i = 1, int j = 2, int k = 3); //допустимо void foot (int i=- 3, int j); //недопустимо
#include
1) 2) 3) 4) 5) 6) Work. Shop Написать функцию возведения в степень (pow) Функцию вычисления факториала Написать функцию перевода десятичного числе в двоичное функция подсчета числа цифр в числе функция сумма цифр в числе 2 d Функция суммирующая элементы массива Есть число abc в n-ой с. с. мы его должны сначало перевести в N= a*n^2+b*n^1+c*n^0 а потом чтобы перевести в нужную нам с. с допустим q мы должны N разделить на q (нужную нам систему счисления) и остатки записать как число
//#include
Степень int Pow(int base, int power){ int p = 1; for (int i = 0; i < power; ++i) p *= base; return p; } Факториал unsigned long fact(int n) { unsigned long total = 1; for (int i = 2; i <= n; i++) total *= i; return total; } Число цифр в числе int get. Counts. Of. Digits(long number) { int count = (number == 0) ? 1 : 0; while (number != 0) { count++; number /= 10; } return count; } Сумма цифр в числе int sum_of_digits(unsigned long x) { int sum = 0; while (x != 0) { sum += x % 10; x /= 10; } return sum; }
int summa (int array[ ][5], int size_row, int size_col) { int res=0; for (int i = 0; i < size_row; i++) for (int j = 0; j < size_col; j++) res += array[i][j]; return res; } Определение размера массива: int array[] = {1, 3, 5, 7, 4, 6, 7, 8, 13, 34}; int result = sizeof(array)/sizeof(int);