Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №4.doc
Скачиваний:
8
Добавлен:
11.09.2019
Размер:
129.02 Кб
Скачать

Передача данных по адресу

По адресу в функцию всегда передаются массивы (рассмотрим это в следующих темах). Для массива это вообще единственный способ передачи данных в языках С/С++. Так же по адресу можно передать те простые объекты, которые являются выходными данными (или входными и выходными одновременно).

В случае передачи данных по адресу фактический параметр может быть только переменной.

Вернёмся к предыдущему примеру. Даны два числа, хранящиеся в переменных a и b. Используя подпрограмму, выполнить обмен содержимого ячеек этих переменных.

Данные передадим по адресу. Они будут в этой задаче и входными, и выходными данными. Для контроля изменения содержимого ячеек памяти будем выводить на экран монитора промежуточные данные.

Возможный вариант реализации программы:

#include <iostream>

using namespace std;

void Obmen(double *x, double *y);

int main()

{

   double a = 2.5, b = 3.1;

   cout << "Do Obmen: a=" << a << " b=" << b << endl;

   Obmen(&a, &b);

   cout << "Posle Obmen: a=" << a << " b=" << b << endl;

   return 0;

}

void Obmen(double *x, double *y)

{

   double c;

   cout << "Function Obmen start:\n *x=" << *x << " *y=" << *y << endl;

   c = *x;

   *x = *y;

   *y = c;

   cout << "Function Obmen end:\n *x=" << *x << " *y=" << *y << endl;

}

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

Do Obmen: a=2.5 b=3.1

Function Obmen start:

*x=2.5 *y=3.1

Function Obmen end:

*x=3.1 *y=2.5

Posle Obmen: a=3.1 b=2.5

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

Ниже приведен пример, в котором создана функция, переводящая температуру из шкалы по Фаренгейту в градусы Цельсия.

#include <iostream.h>

float Convert(float); // прототип функции

void main()

{

float TempFar;

float TempCel;

cout<< "Enter the Tamperature in Fahrenheit: "; cin >> TempFar;

TempCel = Convert (TempFar);

cout << "\nThe Temperature in Celsius is: ";

cout << TempCel << endl;

}

float Convert(float Fer) // заголовок функции.

{

float Cel;

Cel = ((Fer - 32) * 5)/9; // операторы тела функции

return Cel;

}

Возврат значения из функции осуществляется оператором return. Функция может содержать несколько операторов return. Например:

int Doubler (int origin)

{

if (origin <= 1000)

return origin*2;

else

return -1;

}

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

Рекурсия бывает двух видов: прямая, когда функция вызывает сама себя, и косвенная, когда функция вызывает другую функцию, которая вызывает затем первую функцию).

Рассмотрим в качестве примера ряд Фибоначчи: 1, 1, 2, 3, 5, 8, 13, 21 ,34 … и т.д. Первые два числа ряда равны единице. Каждый последующий член ряда является суммой двух предыдущих. Воспользуемся рекурсией для вычисления очередного члена ряда Фибоначчи:

#include <iostream.h> // пример рекурсии

int fib(int n); // прототип функции вычисления члена ряда Фибоначчи по его номеру

void main()

{

int n, answer;

cout<< "Enter number to find: ";

cin >> n;

cout << "\n\n";

answer = fib(n);

cout<< answer<< " is the " <<n <<"-th member of Fibonacci series\n";

}

int fib(int n) // заголовок функции вычисления члена ряда Фибоначчи

{

if(n<3)

return 1; // операторы тела функции

else

return( fib(n-2) + fib(n-1));

}

В программе вводится порядковый номер ряда Фибоначчи, и программа находит его значение.

Задание на лабораторную работу: разработать программу, содержащую функцию main(), в которой объявлены переменные и производится ввод-вывод данных, а также функции для расчета величин согласно варианту задания. Эти функции необходимо вызвать из главной функции программы main(). Обмен данными между функциями осуществить через параметры и возвращаемое значение функции.

Варианты заданий

Вариант №1

Дана целочисленная квадратная матрица. Определить:

  • произведение элементов в тех строках, которые содержат хотя бы один отрицательный элемент;

  • максимальное значение на главной диагонали, и заменить нулями строку, в которой это значение расположено.

Каждый пункт задания оформить в виде отдельной функции.

________________________________________________________________

Вариант №2

Вычислить приближенное значение интеграла по формуле прямоугольников для заданного целого n > 39. Формула прямоугольников:

Вычисление одного слагаемого и общей суммы оформить в виде функций.

________________________________________________________________

Вариант №3

Дана целочисленная квадратная матрица. Определить:

  • количество строк, среднее арифметическое элементов которых меньше заданной величины;

  • сумму элементов, расположенных выше главной диагонали.

Каждый пункт задания оформить в виде отдельной функции.

________________________________________________________________

Вариант №4

Дана целочисленная квадратная матрица. Определить:

  • номер первой из строк, содержащих хотя бы один положительный элемент;

  • упорядочить по возрастанию столбец, сумма элементов которого минимальна.

Каждый пункт задания оформить в виде отдельной функции.

________________________________________________________________

Вариант №5

Дана целочисленная квадратная матрица. Определить:

  • номер последнего из столбцов, не содержащих ни одного отрицательного элемента.

  • количество отрицательных элементов в тех строках, которые не содержат нулевых элементов.

Каждый пункт задания оформить в виде отдельной функции.

________________________________________________________________

Вариант №6

Вычислить приближенное значение интеграла по формуле прямоугольников для заданного целого n > 100. Формула прямоугольников:

Вычисление одного слагаемого и общей суммы оформить в виде функций.

________________________________________________________________

Вариант №7

Дана целочисленная квадратная матрица. Определить:

  • минимум среди сумм элементов диагоналей;

  • номер столбца, который не содержит ни одного элемента, большего заданного числа.

Каждый пункт задания оформить в виде отдельной функции.

________________________________________________________________

Вариант №8

Дана целочисленная квадратная матрица. Определить:

  • номер строки, в которой содержится более одного заданного числа;

  • максимальный элемент матрицы и поменять местами строку в которой он находится, с последней строкой.

Каждый пункт задания оформить в виде отдельной функции.

________________________________________________________________

Вариант №9

Для заданного значения x > 0.5 и =0,00001 вычислить с точностью до сумму членов бесконечного ряда: где n=1,2,3,…. Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше . Напечатать полученное значение суммы и значение ln(x). Вычисление одного слагаемого и общей суммы оформить в виде функций, возведение в степень осуществлять в цикле.

________________________________________________________________

Вариант №10

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  • номер максимального элемента;

  • произведение элементов массива, расположенных между первым и вторым нулевыми элементами;

  • преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в нечётных позициях, во второй – элементы, стоявшие в чётных позициях.

Каждый пункт задания оформить в виде отдельной функции.

________________________________________________________________

Вариант №11

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  • номер минимального элемента массива;

  • сумму элементов массива, расположенных между первым и вторым отрицательными элементами;

  • преобразовать массив таким образом, чтобы в первой его половине располагались элементы, модуль которых не превышает 1, потом все остальные.

Каждый пункт задания оформить в виде отдельной функции.

________________________________________________________________

Вариант №12

Дана целочисленная квадратная матрица. Определить:

  • произведение элементов в тех строках, которые не содержат отрицательных элементов;

  • максимум среди сумм элементов диагоналей матрицы.

Каждый пункт задания оформить в виде отдельной функции.

________________________________________________________________

Вариант№13

Дана целочисленная квадратная матрица. Определить:

  • сумму элементов в тех столбцах, которые не содержат отрицательных элементов;

  • минимум среди сумм элементов диагоналей матрицы.

Каждый пункт задания оформить в виде отдельной функции.

________________________________________________________________

Вариант№14

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

Вариант №15

Дана целочисленная квадратная матрица. Определить:

  • сумму элементов в тех столбцах, которые содержат хотя бы один отрицательный элемент;

  • номера той строки, в которой сумма положительных элементов максимальна.

Каждый пункт задания оформить в виде отдельной функции.