Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБ_ПРОГР.doc
Скачиваний:
8
Добавлен:
12.11.2019
Размер:
1.67 Mб
Скачать

Задача 2. Параметры функции

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

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

  • по значению

  • по адресу.

Передача по значению

Синтаксис при вызове имя_ф(имя_фактичекого_параметра);

при определении и объявлении тип имя_ф(тип имя_формального_параметра);

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

Передача по адресу

Используется 2 синтаксиса

1. с помощью ссылки.

при вызове имя_ф(имя факт. парам);

при определении и объявлении тип имя_ф(тип &имя форм параметра);

2. с помощью указателя

при вызове имя_ф(&имя факт. парам);

при определении и объявлении тип имя_ф(тип *имя форм параметра);

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

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

#include <iostream.h>

void f(int , int* . int& ):

int main(){

int i = 1. j = 2, k= 3;

cout <<"i j k\n":

cout << i <<' '<< j <<' '<< k <<'\n'; //1 2 3

f(i, &j, k);

cout << i <<' '<< j <<' '<< k <<'\n'; //1 3 4

return 0;}

void f(int i. int* j. int& k){

i++; (*j)++; k++;}

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

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

Для вычисления последующего члена ряда использовать рекуррентную формулу(пример нахождения рекуррентной формулы смотри ниже)

1.

2

3

4

5

6

7

8

9

10

Пример нахождения рекуррентной формулы

Необходимо найти такой множитель, что зная предыдущее значение можно найти последующее,

т.е an=T*an-1

Т.к.

то

Действительно, из формулы видим a0=1

Находим а1(n=1):

Находим а2(n=2):

Лабораторная работа № 12

Тема: «Обработка массивов с использованием указателей. Передача одномерных массивов в функции. Шаблоны функций»

  1. Цель работы

    1. Получение навыков в написании программ с использованием указателей.

    2. Изучение динамических массивов.

    3. Изучение механизма передачи массива в функцию и передачи параметров по ссылке.

    4. Изучение способов использования шаблонов функций.

  2. Техническое обеспечение

    1. Персональная ЭВМ IBM PC/286 и более поздних моделей.

    2. Клавиатура.

    3. Дисплей.

    4. Печатающее устройство.

  3. Программное обеспечение

    1. Операционная система Windows

    2. Система программирования Visual C++ версия 6.0 или Borland C++ версия 3.1 и более поздние версии.

  4. Постановка задачи

Дано несколько массивов чисел (типы массивов различны). Длины массивов вводятся пользователем. Требуется для каждого массива выполнить заданные действия.

  1. Содержание отчета

5.1. Тема и цель работы.

5.2. Схема алгоритма решения задачи.

5.3. Текст программы.

5.4. Результаты выполнения программы.

  1. Общие сведения

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

#include <iostream.h>

#include <time.h>

#include <stdlib.h>

void display (float *, int );

float minim (float *, int );

int main (void)

{

float t[10];

int i;

srand(time(NULL));

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

t[i] = 20.*rand()/RAND_MAX-10;

display (t,10);

cout<<"min="<<minim(t,10)<<endl;

return 0;

}

//функция вывода на экран массива

void display (float *a, int k)

{

int j;

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

cout<< a[j]<<'\t';

cout<<endl;

}

//функция поиска минимального элемента массива

float minim (float *a, int k)

{

int i;

float min=a[0];

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

{

if(a[i]<min)

min=a[i];

}

return min;

}

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

Поэтому в предыдущей задаче ввод элементов массива можно оформить также в отдельной функции, например

//функция ввода элементов массива

void input (float *a, int k)

{

int j;

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

cin>> a[j];

}

Методические указания

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

Все результаты данных функций выводятся в основной функции.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]