Передача параметров функции 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++;

}

}