Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С_глава2.doc
Скачиваний:
1
Добавлен:
16.12.2018
Размер:
167.94 Кб
Скачать

Аргументы и параметры функции

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

Примеры вызова функций

double a; a=Summer(3.5, 1.8, -6.95);

printm(0);

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

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

тип имя_функции (список_параметров, …);

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

# include <stdio.h>

int summ(int k, ...);

void main()

{

printf("1+2+3+4+5 = %d\n", summ(5, 1, 2, 3, 4, 5));

printf("6+5 = %d\n", summ(2, 6, 5));

printf("4+3+9 = %d\n", summ(3, 4, 3, 9));

}

int summ(int k, ...)

{

int *p = &k;

int s = 0;

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

s += *(++p);

return s;

}

Фактические параметры хранятся в памяти в соседних ячейках, поэтому объявлен

Рекурсивные функции

В С++ имеется возможность вызова функции из самой себя. Классический пример: функция вычисления факториала.

int fact(int k)

{

if (k == 0)

return 1;

else

return k*fact(k-1);

}

Математические функции

С++ унаследовал из С стандартные математические функции, описание которых находится в заголовочном файле <math.h>. Они позволяют получить абсолютное значение (abs, fabs), квадратный корень (sqrt), степень (pow), значения тригонометрических функций (sin, cos, tan). Их прототипы:

int abs(int x); double fabs(double x);

double sqrt(double x);

double pow(double x, double y); (вычисляет значение x в степени y)

double sin(doublex); double cos(double x); double tan(double x);

Пример 1. Ввести с клавиатуры два целых числа, вычислить их произведение, вывести на экран результат. Вычисление произведения оформить в виде функции.

#include <stdio.h>

int main()

{

int x, y, z;

int Product(int a, int b); // Прототип функции Product

printf(“Введите через пробел два целых числа: “);

scanf(“ %d %d”,&x, &y);

z= Product(x,y); // Вызов функции Product

printf(“%d*%d=%d\n”,x,y,z);

return 0;

}

int Product(int a, int b) // Определение функции Product

{

return a*b;

}

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

#include <stdio.h>

#include <stdlib.h> // В stdlib.h содержится описание датчика случайных чисел

// int random(int n) – возвращает целое число между 0 и n-1

int main()

{

int n, i; // Размерность массива задается именованной константой n

float *pa;

void move(int , float*); // Прототип функции

printf(“n=”);

scanf(“%d”, &n);

pa = new float[n];

randomize(); // Подготовка к работе датчика случайных чисел:

// randomize() инициализирует датчик случайных чисел

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

{

*(pa+i)=(random(500)-1000)/500.0; // Число в диапозоне от –1 до 1

printf(“ *(pa+%d)=%f”, i, *(pa+i));

}

printf(“\n”);

move(n, pa);

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

printf(“ *(pa+%d)=%f”, i, *(pa+i));

return 0;

}

void move(int n, float*pa)

{

int i; float s[1000];

for (i=0; i<n; i++) s[i]= *(pa+n-1-i);

for (i=0; i<n; i++) *(pa+i)=s[i];

}

Пример 3. Описать структуру типа PRICE, содержащую следующие поля:

tovar – название товара;

mag - название магазина;

stoim – стоимость товара в рублях.

Ввести с клавиатуры данные в структуру типа Price_List. Вывести на экран содержимое полей структуры. Вывод информации оформить в виде функции.

#include <stdio.h>

struct Price_List{

char mag[50];

char tovar[50];

float stoim;

} price;

int main()

{

void print_struct(Price_List);

puts(“Введите название магазина (<50 символов)”);

gets(price.mag);

puts(“Введите название товара (<50 символов)”);

gets(price.tovar);

puts(“Введите стоимость товара”);

scanf(“%f”,&price.stoim);

print_struct(price);

return 0;

}

void print_struct(Price_List p)

{

puts(“Печать элементов структуры типа Price_List”);

puts(p.mag);

puts(p.tovar);

printf(“Стоимость %f рублей\n”,p.stoim);

}

Пример 4. Ввести с клавиатуры числа типа int и float, найти их абсолютные величины. Вычисление абсолютной величины оформить в виде функции. Использовать перегрузку функций.

#include <stdio.h>

int ABS(int); // Прототипы функций ABS

float ABS(float);

int main()

{

int i; float a;

printf(“Введите целое число: “); scanf(“ %d”,&i);

printf(“Введите вещественное число: “); scanf(“ %f”,&a);

printf(“abs(%d)=%d; abs(%f)=%f \n”,i,ABS(i),a,ABS(a));

return 0;

}

int ABS(int a) // Определение функции int ABS()

{

if (a>=0) return a;

else return –a;

}

float ABS(float a) // Определение функции float ABS()

{

if (a>=0.) return a;

else return –a;

}