Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по программированию часть2.doc
Скачиваний:
134
Добавлен:
13.02.2016
Размер:
1.23 Mб
Скачать

Порядок выполнения работы

1. Изучить теоретические сведения.

2. Ответить на контрольные вопросы.

3. Выполнить задание.

Контрольные вопросы

1. Что такое рекурсивная функция?

2. Что такое прямая рекурсия?

3. Что такое косвенная рекурсия?

4. На каком-то шаге должен быть прекращен дальнейший вызов рекурсивной функции?

Задания для выполнения

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

1. Найти наименьшую цифру в десятичной записи заданного натурального числа.

2. Подсчитать количество цифр в заданном натуральном числе.

3. Вычислить наибольший общий делитель двух натуральных чисел.

4. Найти число, которое образуется из заданного натурального числа при записи его цифр в обратном порядке. Например, для числа 1234 получаем результат 4321.

5. Вычислить сумму: 1! + 2! + 3! + … +n! (n≤15).

6. Вычислить сумму: 2! + 4! + 6! +…+n! (n≤16, n – четное).

7. Логическая функция возвращает 1, если ее аргумент – простое число.

8. Вычислить функцию Аккермана для всех неотрицательных целых аргументов m и n:

9. Найти количество нечетных цифр в десятичной записи заданного натурального числа.

10. Найти количество цифр, кратных 3, в десятичной записи заданного натурального числа.

11. Вычислить значение (значение 0!=1).

12. Вычислить произведение четного количества n (n  2) сомножителей следующего вида:

y = .

13. Вычислить y = xn по следующему правилу: y = (xn/2 )2, если n четное и y = x yn–1, если n нечетное.

14. Вычислить значение y(n) = .

15. Вычислить значение x = , используя рекуррентную формулуxn = = , в качестве начального значения использоватьx0 = 0,5(1 + a).

Лабораторная работа № 24 передача одномерного массива в функцию

Цель работы: приобрести практические навыки по обработке одномерных массивов с использованием функций.

Краткие теоретические сведения

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

тип_результата имя_функции(тип_данных *, int);

При вызове функции параметры необходимо передавать следующим образом:

  • первый параметр – это имя массива;

  • второй параметр – это размер массива.

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

#include <stdio.h>

#include <conio.h>

void show_array (int v[], int b)

{

int i;

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

printf (“%d\n”, v[i]);

}

int Min (int v[], int b)

{

int i, m=v[0];

for (i=1; i<b; i++)

if (v[i]<m) m=v[i];

return m;

}

void main()

{ const n=10;

int i, min, a[n] ;

puts( “Введите массив “);

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

scanf (“%d”, &a[i]);

show_array(a, n); // Вызов 1-ой функции

min = Min (a, n); // Вызов 2-ой функции

printf (“min= %d\n”, min );

getch();

}

Порядок выполнения работы

1. Изучить теоретические сведения.

2. Выполнить задание.

Задания для выполнения

Выполнить задания из лабораторной работы № 13 часть 2, используя функции для обработки массивов.

ЛАБОРАТОРНАЯ РАБОТА № 25

ПЕРЕДАЧА МНОГОМЕРНОГО МАССИВА В ФУНКЦИЮ

Цель работы: приобрести практические навыки по обработке двумерных массивов с использованием функций

Краткие теоретические сведения

Если размеры известны на этапе компиляции, то

void f1(int m[3][4]) {

int i, j;

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

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

. . . // Обработка массива

}

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

void main(void)

{ int mas [3][3]={{1,2,3}, {4,5,6}};

fun (mas);

}

void fun( int m[ ][3]) {

}

Если же размеры двухмерного массива, например, вводятся с клавиатуры (неизвестны на этапе компиляции), то их значения следует передавать через дополнительные параметры, например:

void fun( int**, int, int);

void main()

{ int **mas, n, m;

...

fun (mas, n, m);

}

void fun( int **m, int n, int m) {

. . . // Обработка массива

}

Пример. В целочисленном двухмерном массиве (матрице) размером NМ найти сумму четных элементов и их количество. Ввод исходных данных и вывод результатов выполнить в основной функции. Решение поставленной задачи оформить в функции пользователя.

Текст программы может иметь следующий вид:

#include <stdio.h>

#include <conio.h>

// Описание прототипа функции

int Fun_Sum_Kol(int, int, int**, int*);

void main()

{ const n=3, m=4;

int **a, i, j, sum, kol;

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

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

{ printf ("\n a[%d][%d]=”, i+1, j+1);

scanf(“%d”,&a[i][j]);

}

puts(" Matrix A:");

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

{ for(j=0; j<m; j++)

printf( "%d\t", a[i][j]);

printf(“\n”);

}

// Обращение к функции с указанием фактических аргументов

sum = Fun_Sum_Kol(n, m, a, &kol);

printf("\n Kol-vo = %d \t Summa = %d\n", kol, sum);

getch();

}

/* Реализация (определение) описанной выше функции, в заголовке которой указаны формальные параметры, идентификаторы которых обрабатываются в ее коде */

int Fun_Sum_Kol(int a, int b, int **x, int *k)

{

int i, j, s = 0;

*k = 0;

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

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

if(x[i][j] % 2 ==0){

(*k)++; // Скобки обязательны

s += x[i][j];

}

return s;

}

Обратите внимание на то, что из функции мы должны получить два скалярных результата – посчитанные сумму и количество четных чисел. С помощью оператора return мы возвращаем первое значение (сумму), а второе значение мы передаем в точку вызова с помощью указателя (адреса): при обращении к функции в качестве четвертого параметра передаем адрес &kol, а в функции используем «значение, находящееся по указанному адресу» *k (* – операция разадресации).