Основы информатики Лекция. Функции Заикин Олег Сергеевич

advertisement
Основы информатики
Лекция.
Функции
Заикин Олег Сергеевич
http://sat.isa.ru/pdsat/files/teaching/
zaikin.icc@gmail.com
Функции
Функция — это проименованная часть программы,
которая может вызываться из других частей
программы столько раз, сколько необходимо. Функция,
в отличие от процедуры, обязательно возвращает
значение.
Функция - «строительный блок» C++ программы.
Функция – подпрограмма, которая содержит одну или
несколько инструкций C++ и выполняет одну или
несколько задач.
Общий формат функции
тип имя (спецификации параметров)
{
// тело функции
}
Пример
int mul(int x, int y)
{
return x * y; // результат – произведение 2 чисел
}
тип: int
имя: mul
спецификации параметров: int x, int y
тело функции: return x * y;
Виды функций
Пользовательские функции - написанные
программистом.
Стандартные функции - из стандартной
библиотеки.
Например, sin() или sqrt().
Тип функций
Тип функции — это тип возвращаемого функцией
результата. Если функция не возвращает никакого
результата, то для нее указывается тип void (аналог
процедуры).
Функции могут иметь любой тип.
// у функции mul тип int
int mul(int x, int y)
{
return x * y; // результат – произведение 2 чисел
}
Имя функции
Имя функции — идентификатор, задаваемый
программистом (исключение – функция main).
Функциям можно дать любые имена:
• начинающиеся с буквы латинского алфавита либо с
символа _
• состоять из символов латинского алфавита, цифр,
символов _
• не совпадающие с зарезервированными.
main, sqrt – недопустимые имена (зарезервированы)
func, fun45c, sum_int_numbers – допустимые имена
84abc, $bv – недопустимые имена.
Спецификации параметров
Спецификации параметров — это либо «пусто», либо
список имен формальных параметров функции с
указанием типа для каждого из них.
В списке спецификации разделены запятой.
Пример
int mul(int x, int y)
{
return x * y; // результат – произведение 2 чисел
}
int x – первый параметр
int y – второй параметр
Значения функций
Функция завершается после выполнения return
Может быть несколько return (например, в условном
операторе).
// функция для вычисления модуля целого числа
int abs_int(int x)
{
if ( x >= 0 )
return x;
else
return (-x);
}
Как записать тело функции с одним return?
Значения функций
// вычисление модуля целого числа
int abs_int(int x) { return x >= 0 ? x : -x; } // блок с 1 return
Пример использования
Преимущества функций:
1. Можно использовать один и тот же исходный код
для многих входных значений. Следствие –
сокращение объема исходного кода.
2. Улучшение читаемости кода – программа
разбивается на связанные блоки.
3. Уменьшение вероятности ошибиться – если есть
ошибка, то она в функции и она однотипная для
всех входных значений.
Пример использования
// расстояние между 2 точками на плоскости
double dist(double x1, y1, x2, y2){
return(sqrt(sqr(x1-x2)+sqr(y1-y2)));
}
// в программе нужно посчитать 3 расстояния
main(){
cout << dist(1,2,2,5);
cout << dist(3,2,7,8);
cout << dist(6,4,5,8);
}
// разные значения подаются на вход одной и той же
// функции
Прототипы
В исходном коде функция должна быть объявлена
выше инструкции в которой она вызывается.
Прототип объявляет функцию до ее первого
использования.
Прототип позволяет компилятору узнать тип функции,
количество параметров и их типы.
Прототипы
#include <iostream>
using namespace std;
int square(int a); // прототип 1
void main()
{
cout << square(3);
}
int square (int a) {return a*a};
Вывод: 9
Функция main()
main() – первая функция, которая вызывается
при выполнении программы.
Программа начинается с выполнения функции
main() независимо от того, где она
расположена.
Обычно main() размещают первой, чтобы ее
было проще найти.
Функция main() не требует прототипа.
Параметры функции main()
Параметры задаются после имени
программы в командной строке.
int argc – количество аргументов
Имя программы тоже учитывается, поэтому
если аргументов нет, argc равен 1.
char **argv – указатель на массив
символьных указателей
Каждый указатель argv ссылается на строку,
содержащую аргумент командной строки.
argv[0] – имя программы.
Числовые аргументы main()
Можно использовать функции
atoi(), atol(), atof() для преобразования строк в
числа.
Пример.
void main( int argc, char **argv )
{
if (argc > 1)
int a = atoi(argv[1]); // 1-ый параметр
}
mypog.exe 35 467
Локальные и глобальные
переменные
Локальная переменная известна только функции, в
которой она определена.
Int MyFunc()
{
int i; // локальная переменная
}
Глобальная переменная известна всей программе.
int MyVar; // глобальная переменная
int main()
…
Распространенные ошибки

Объявление новой функции внутри функции
main()
Функции нужно объявлять отдельно друг от
друга.

Для каждого варианта набора входных
значений сделана отдельная функция
Если действия над входными данными
одни и те же, должна быть одна функция.

Действия с локальной переменной как с
глобальной
Причина - использование локальной и
глобальной переменных с одинаковым
именем.
Локальные и глобальные
переменные. Пример
#include <iostream>
using namespace std;
char c=‘\t’;
Глобальные
short int s=1;
переменные
int i;
Long long int l;
int main()
{ char c; // имя как у глобальной
Локальные
float f;
переменные
double d;
long double D;
}
Вывод: 1 2 4 8 4 8 10
cout << sizeof(c) << ' ';
cout << sizeof(s) << ' ';
cout << sizeof(i) << ' ';
cout << sizeof(l) << ' ';
cout << sizeof(f) << ' ';
cout << sizeof(d) << ' ';
cout << sizeof(D) << '\n';
с = ‘a’;
MyFunc();
return 0;
Программа с 2 функциями
#include <iostream>
using namespace std;
void myfunc( int a; float b ); // прототип функции
Int main()
{
cout << "В функции main() ";
myfunc(3, 5); // вызов функции
cout << "Снова в функции main() ";
return 0;
}
void myfunc( int a; float b ) {
cout << "В функции myfunc() ";
}
Аргументы функций
Аргумент – конкретное значение, передаваемое
функции при вызове.
Параметр – переменная, которая принимает
передаваемый функции аргумент.
Функции можно передать несколько аргументов.
void mul(int x, int y) {
cout << x * y;
}
…
int a = 10;
mul(5, 10); // аргументы – числа 5 и 10
mul(5, a); // аргументы – число 5 и значение
переменной a (равное 10)
Передача аргументов функции
Вариант 1. Функции передается значение аргумента.
Значение аргумента копируется в параметр функции.
В блоке, в котором произошел вызов функции, значение
аргумента не меняется.
Пример.
int MyFunc( int x ) {
x = 10;
}
…
x = 5;
MyFunc( x );
cout << x; // вывод: 5
… // после вызова MyFunc() значение x равно 5
Передача аргументов функции
Вариант 2. Функции передается адрес аргумента (при
вызове по ссылке).
В параметр копируется адрес аргумента. Поэтому
изменения параметра окажут влияние и на аргумент.
Пример.
Int MyFunc( int &x ) {
x = 10;
}
x = 5;
MyFunc( x );
… // после вызова MyFunc() x равно 10
Передача указателей в качестве
аргументов функции
Вариант 1. Функции передается значение указателя.
Значение указателя копируется в параметр функции.
Пример.
int MyFunc( int *arr ) {
arr[0] = 10;
arr[1] = 20;
arr++;
}
…
int *arr = new int[2];
MyFunc( arr );
… // после вызова MyFunc() arr как и прежде указывает на
// начало массива
Передача указателей в качестве
аргументов функции
Вариант 2. Функции передается ссылка на указатель.
В параметр копируется адрес указателя.
Пример.
int MyFunc( int *&arr ) {
arr[0] = 10;
arr[1] = 20;
arr++;
}
…
int *arr = new int[2];
MyFunc( arr );
… // после вызова MyFunc() arr указывает на последний
// элемент массива
Передача указателей в качестве
аргументов функции
Вариант 1.
int MyFunc( int *&arr ) {
arr[0] = 10;
arr++;
}
Вариант 2.
int MyFunc( int *arr ) {
arr[0] = 10;
arr++;
}
В обоих вариантах значения массива после вызова
функций поменяются.
Почему?
Аргументы по умолчанию
Можно придать параметру значение, на
случай если функция вызывается без
аргумента, который соответствует этому
параметру.
void myfunc(double num = 0.0);
void main() {
myfunc(10.3); // значение передается явно
myfunc(); // значение по умолчанию
}
Перегрузка функций
Позволяет двум функциям с разными
параметрами иметь одинаковые имена.
По типу аргументов и их количеству
компилятор определяет какую именно версию
функции вызвать.
В языке C есть 3 разные функции для
определения модуля числа: abs(), labs() и
fabs() – для int, long int и float.
В С++ функция abs() одна, но перегружаемая.
Перегрузка функций
Пример.
void f(int a) {
cout << a << ‘ ‘;
}
void f(int a, float b) {
cout << a << ‘ ‘ << b << ‘ ‘;
}
main {
f(4);
f(3, 2.5);
f(a,b); // a – int, b – float;
}
Перегрузка функций
Допускается задавать версиям функции
произвольные действия.
Но правильнее, чтобы они были
«родственными».
Download