Передача параметров функции main
Перегрузка функций
Рекурсия
Рекурсия – это способность функции вызывать саму себя.
Прямая рекурсия – когда функция вызывает сама себя непосредственно.
Косвенная рекурсия – когда функция вызывает себя через другую функцию.
Для нормального завершения любая рекурсивная функция должна содержать хотя бы одну нерекурсивную ветвь, заканчивающуюся оператором возврата.
Классический пример рекурсии – функция вычисления факториала.
Пример программы с функцией вычисления факториала:
#include <iostream.h>
#include <conio.h>
long int factorial(int n)
{
if (n==0 || n==1) return 1;
else return n*factorial(n-1);
}
void main()
{
int x;
clrscr();
cout<<"Ввести число x=";
cin>>x;
cout<<"Факториал x!="<<factorial(x)<<endl;
}
Перегрузка функций – использование нескольких функций с одним и тем же именем, но с различными типами параметров.
Используют перегрузку функций в том случае, когда для разных типов данных применяется один и тот же алгоритм.
Пример
#include <iostream.h>
#include <string.h>
int max(int x, int y)
{ if (x>y) return x;
else return y;
}
double max(double x, double y)
{ if (x>y) return x;
else return y;
}
char *max(char *x, char *y)
{
if (strlen(x)>strlen(y)) return x;
else return y;
}
void main()
{
int a=6, b=8;
double z=12.4, w=45.5678;
char *c="abcd";
char *d="zxcvbnm";
cout<<"Наибольшее целое="<<max(a,b)<<endl;
cout<<"Наибольшее вещественное="<<max(z,w)<<endl;
cout<<"Наибольшая строка="<<max(c,d)<<endl;
}
В данном примере функция max используется для определения наибольшего целого числа, наибольшего вещественного числа и определения самой длинной строки.
При обращении к функции компилятор с помощью фактических параметров определяет, какой вариант функции необходимо вызвать в данном случае. Этот процесс называется разрешением перегрузки. Смысл механизма разрешения – использовать функцию с наиболее подходящими аргументами. Если точного соответствия не найдено, выполняются преобразования типов в соответствии с общими правилами (char в int, float в double и т.д.) Далее могут выполняться преобразования пользовательских типов и т.д. Если соответствие типов может быть получено более чем одним способом, возникает неопределенность и компилятор выдает сообщение об ошибке.
Например, вызов функции max(12.4,10) приводит к ошибке, так как есть неопределенность с числом 10 – отнести его к типу int или к типу double.
Главная функция программы main может быть определена с параметрами, которые передаются из внешнего окружения (параметры командной строки, системные переменные). Все эти данные представляются в виде строк. Для передачи этих строк используются параметры: argc, argv[], argp[].
Параметр argc имеет тип int, его значение равно количеству слов в командной строке, включая само имя вызываемой программы.
Параметр argv[] – это массив указателей на строки, каждая из которых содержит одно слово из командной строки. При этом строка с номером 0 содержит полное имя вызываемой программы.
Примечание – Каждое слово командной строки – это последовательность символов, не содержащая пробелов (пробелы используются для разделения слов). Если необходимо, чтобы слово содержало пробел, его нужно брать в кавычки.
Параметр argp[] – массив указателей на строки, которые содержат значения системных переменных (переменные окружения операционной системы).
Пример: Если командная строка при вызове программы имеет вид:
c:progs est print –x a2
То параметры argc и argv[] будут иметь значения:
argc=3
argv[0]=”c:progs est.exe
argv[1]=”print
argv[2]=”-x
argv[3]=”a2
Пример программы, которая выводит на экран параметры, переданные из командной строки, а также параметры операционной системы:
#include <iostream.h>
#include <conio.h>
void main(int argc, char *argv[],char *argp[])
{ int i;
clrscr();
cout<<"Список аргументов программы"<<endl;
cout<<"Имя программы:"<<argv[0]<<endl;
for (i=1;i<argc;i++)
cout<<i<<"_й параметр="<<argv[i]<<endl;
cout<<"Параметры операционной системы"<<endl;
while (*argp)
{ cout<<*argp<<endl;
argp++;
}
}