Параметры со значениями по умолчанию



Для параметров в объявлении подпрограмм можно задавать параметры по умолчанию. Значение по умолчанию – это значение параметра, которое используется при вызове подпрограммы, если в нее не передано фактическое значение. Использование параметров по умолчанию равносильно разрешению указывать в вызове подпрограммы не все необходимые параметры.

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

// param_umolch.cpp :

#include "stdafx.h"

#include "stdio.h"

#include "conio.h"

 

float siltjas(float a=4,float b=5,float c=6,

         float ro=7.8,float g=9.81);

int _tmain(int argc, _TCHAR* argv[])

{ float a,b,c,ro,g,p1,p2,p3,p4;

printf("wwedite gabariti, plotnost, uskorenie swobodnogo padenija\n");

scanf("%f%f%f%f%f",&a,&b,&c,&ro,&g);

p1=siltjas(a,b,c,ro,g);

p2=siltjas(); //или p2:=st; 

p3=siltjas(a,b,c,ro);

p4=siltjas(a,b,c);

printf("\np1=%6.2f  p2=%6.1f p3=%6.2f p4=%6.2f",

p1,p2,p3,p4);

getch();

return 0;

}

 

float siltjas(float a,float b,float c,

         float ro,float g)

 { float st=a*b*c*ro*g;

return st;

 }

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

Аргументы по умолчанию должны быть самыми правыми (последними) в списке параметров подпрограммы, при передаче параметров действует правило: если пропущенный параметр не является последним, то и все параметры, стоящие справа от пропущенного тоже пропускаются. Принимая это правило во внимание, следует сделать вывод о том, что последними в списке параметров по умолчанию надо указывать те параметры, которые чаще всего остаются равными заданным по умолчанию значениям. Пропускать при вызове можно только несколько последних параметров по умолчанию. Нельзя вызвать функцию следующим образом: p1= siltjas(a,,c,ro,g). Значения по умолчанию могут задаваться не всем, а только некоторым параметрам подпрограммы. При этом они должны располагаться в конце списка параметров, так как действует правило: если какой-то параметр имеет значение по умолчанию, то и все последующие параметры должны иметь значения по умолчанию.

Функции с переменным числом параметров

Язык C позволяет создавать функции с переменным числом параметров. Если список формальных параметров функции заканчивается многоточием (три точки), это означает, что при вызове такой функции помимо указанного в заголовке функции количества параметров можно передать еще любое количество параметров. Проверка типов для этих параметров не выполняется. Значения типов short и char передаются как int, а значения типа  float – как  double. Примерами функций с переменным числом параметров являются функции ввода scanf() и вывода printf().

Для организации функции с переменным числом параметров необходимо использовать макросы va_arg, va_start, va_end, они становятся доступными при подключении заголовочного файла <stdarg.h>. Функция с переменным числом параметров должна иметь хотя бы один известный параметр (по-другому такие параметры называют обязательными), указываемый до переменного списка параметров (необязательных параметров). Наличие обязательного параметра позволяет определять адреса, по которым хранятся необязательные параметры. Последний (самый правый) известный параметр называется  last_parm.

В теле функции с переменным числом параметров необходимо объявить указатель (назовем его argptr) типа va_list. Этот тип определен также в файле <stdarg.h>. Для получения доступа к необязательным параметрам прежде всего необходимо инициализировать указатель-аргумент argptr. Инициализация производится с помощью макроса va_start. Его заголовок void va_start(va_list argptr, last_param), где первый параметр является указателем, а второй параметр представляет собой имя последнего обязательного параметра. Для получения очередного необязательного параметра необходимо использовать макрос va_arg. Его заголовок type(va_arg(va_list argptr, type), где type – тип получаемого необязательного параметра. После получения значений всех необязательных параметров до возвращения из функции необходимо обратиться к макросу va_end() для корректного восстановления стека. Заголовок макроса void va_end(va_list argptr):

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

// функция с переменным числом параметров

#include "stdafx.h"

#include <stdarg.h>

#include "stdio.h"

#include "conio.h"

#include "stdlib.h"

double fun(int k,...);

int _tmain(int argc, _TCHAR* argv[])

{ float a,b,c,d ;double s;

//int a,b,c,d;

printf ("wwedite snachenija chetirex peremennix\n");

scanf("%f%f%f%f",&a,&b,&c,&d);

printf("\n isxodnie dannie\n");

printf("a=%5.2f b=%5.2f c=%5.2f d=%5.2f",a,b,c,d);

s=fun(4,a,b,c,d);

printf("\ns=%6.2f",s);

s=fun(2,c,d);

printf("\ns=%6.2f",s);

getch();

return 0;

}

double fun(int k,...)

{ double t,s=0;

int i;

va_list argptr;

va_start(argptr,k);

for (i=0;i<k;i++)

{t=va_arg(argptr,double);

s+=t;

}

va_end(argptr);

return s;

}

 

Шаблоны функций

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

В языке C++ есть удобное средство программирования – шаблоны функций. С помощью шаблона функции можно запрограммировать алгоритм, который будет применяться к данным разных типов, а конкретный тип данных передается в функцию в виде параметра на этапе компиляции. Компилятор генерирует код, соответствующий переданному типу данных. Формат простейшей функции-шаблона выглядит следующим образом

Template <class Type> заголовок функции

{

/* тело функции */

}

Вместо слова Type может использоваться произвольное имя, например, TD. Шаблон функции может содержать несколько параметров, каждый из которых может быть типом или переменной. Приведем пример программы с функцией, осуществляющей сортировку элементов массива методом пузырька.

// пример использование шаблона функции

#include "stdafx.h"

#include "stdio.h"

#include "conio.h"

#include <math.h>

template <class TD>

void sortmin( int n,TD *a)

{int i,j,k;

 bool flag;

 TD b; //переменная b будет иметь тот же тип, что и второй фактичкский

  // параметр, передаваемый в функцию   

 k=0;

do

{k++;

flag=false;

for (i=0;i<n-k;i++)

if (a[i]>a[i+1])

 { b=a[i];

  a[i]=a[i+1];

a[i+1]=b;

flag=true;

 }

}while (flag);

}

int _tmain(int argc, _TCHAR* argv[])

{ const int nn=20;

int n,i;

float a[nn];

char ch[nn];

printf("Wwedite kol-wo elementow\n");

scanf("%d",&n);

printf("\nWwedite elementi\n");

for (i=0;i<n;i++)

scanf("%f",&a[i]);

printf("\n massiw elementow\n");

for (i=0;i<n;i++)

printf("%5.2f ",a[i]);

sortmin(n,a);

printf("\n otsortirowannij massiw elementow\n");

for (i=0;i<n;i++)

printf("%5.2f ",a[i]);

getch();

 

printf("\n Simwoli Wwedite kol-wo elementow\n");

scanf("%d",&n);

printf("\n Wwedite elementi\n");

//считывает символ 10 перевод влево курсора

i=0;

do

{scanf("%c",&ch[i]);

 if (ch[i]!=10) i+=1;

}while(i<n);

printf("\nmassiw elementow\n");

for (i=0;i<n;i++)

printf("%c ",ch[i]);

sortmin(n,ch);

printf("\n Otsortirowannij massiw elementow\n");

for (i=0;i<n;i++)

printf("%c ",ch[i]);

getch();

return 0;

}

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


Дата добавления: 2018-10-27; просмотров: 331; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!