Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы - Паскаль, Си, Java, PHP.doc
Скачиваний:
65
Добавлен:
04.06.2015
Размер:
5.29 Mб
Скачать

Пример оформления работы Задание 1.

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

1. Для вычисленияn!можно воспользоваться следующими соотношениями:

1! = 1

2! = 1•2 = 2•1!

3! = 1•2•3 = 3•2!

. . .

n! = n•(n-1)!

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

  1. Код программы

    1. На языке Паскаль:

Program Variant_0;

Uses WinCrt;

Var n: Word;

fact: LongInt;

Function Factorial(k:Word):LongInt;

Begin

If (k=1) Or (k=0)

Then Factorial:=1 {терминальная ветвь}

Else Factorial:=k*Factorial(k-1); {рекурсивная ветвь}

End; {Factorial}

Begin {головная программа}

WriteLn('Лабораторная работа №9_1');

WriteLn('Вариант №0');

WriteLn('ИС-11-1');

WriteLn('Пупкин Василий');

WriteLn;

Write('n=');

ReadLn(n);

fact:=Factorial(n);

WriteLn('factorial=', fact);

End.

    1. На языке Си:

#include <stdio.h>

#include <conio.h>

#include <math.h>

// прототип функции

unsigned long factorial(unsigned int n);

int main()

{

unsigned int k;

unsigned long fact;

printf("\nЛабораторная работа №9_1");

printf("\nВариант №0");

printf("\nПО-11-1");

printf("\nПупкин Василий\n");

printf("\nВведите натуральное число:");

scanf("%d", &k);

fact = factorial(k);

printf("\nФакториал числа %d равен %d\n", k, fact);

return 0;

}

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

unsigned long factorial(unsigned int n)

{

if (n <= 1)

return 1; // выход из рекурсии – терминальная ветвь

else return n * factorial(n-1);

}

4. Компиляция, отладка, тестирование и получение результата:

Задание 2.

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

1.Представим решение этой сложной задачи через решение более простой задачи посредством рекурсивного обращения. Чтобы подсчитать количество нужных нам элементов во всем векторе, содержащемnэлементов, необходимо сначала сделать это для вектора, содержащегоn–1элемент,n-2элемента, и так далее. Затем остается выполнить проверку последнего элемента, и добавить к результату единицу в том случае, если он окажется положительным.

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

  1. Код программы

3.1. На языке Паскаль:

Program Variant_0;

Uses WinCrt;

Const n = 10; {задание размера вектора именованной константой}

Type TVect=Array [1..n] Of Integer;{описание нового типа}

Var i, count : Word;

v_min, v_max: Integer;

vector : TVect;

Function Count_pol(k: Word; Var AA: TVect): Word;

Var m: Word;

Begin

If (k=0)

Then m:=0 {если в векторе уже нет элементов}

Else

Begin

m:=Count_pol(k-1, AA);

If (AA[k]>0)

Then m:=m+1;

End;

Count_pol:=m;

End; {функции Count_pol}

Begin {головная программа}

Randomize; {запуск генератора случайных чисел}

WriteLn('Лабораторная работа №9_2');

WriteLn('Вариант №0');

WriteLn('ИС-11-1');

WriteLn('Пупкин Василий');

WriteLn;

WriteLn('Задайте диапазон случайных чисел');

Write('v_min=');

ReadLn(v_min);

Write('v_max=');

ReadLn(v_max);

For i:=1 To n Do {заполнение вектора случайными числами}

vector[i]:=Random(v_max-v_min + 1) + v_min;

WriteLn;

WriteLn('Исходный вектор:');

For i:=1 To n Do {вывод на экран исходного вектора}

Write(vector[i]:5);

WriteLn;

count:=Count_pol(n, vector);

WriteLn;

WriteLn('count=', count);

End.

    1. На языке Си:

#include <stdio.h>

#include <conio.h>

#include <math.h>

#include <time.h>

// прототипы функций

void vorm_vector(int nn, int vect_max, int vect_min, int vect[nn]);

int count_pol(int nn, int vect[nn]);

int main()

{

int i, n, vector_min, vector_max, count;

printf("\nЛабораторная работа №9_2");

printf("\nВариант №0");

printf("\nПО-11-1");

printf("\nПупкин Василий\n");

printf("\nВведите нижнюю границу диапазона:");

scanf("%d", &vector_min);

printf("\nВведите верхнюю границу диапазона:");

scanf("%d", &vector_max);

printf("\nВведите размер вектора:");

scanf("%d", &n);

int vector[n];

printf("\nИсходный вектор:\n");

vorm_vector(n, vector_max, vector_min, vector);

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

printf("%5d", vector[i]);

printf("\n");

count = count_pol(n, vector);

printf("\nКоличество положительных элементов в векторе %d\n", count);

return 0;

}

//описание функций

// 1. формирование вектора

void vorm_vector(int nn, int vect_max, int vect_min, int vect[nn])

{

int i, m;

time_t t; // текущее время для инициализации

// генератора случайных чисел

srand((unsigned) time(&t)); // инициализация генератора

// случайных чисел

m = vect_max-vect_min + 1;

// получение случайного числа в диапазоне

// от vector_min до vector_max

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

vect[i]=rand()% m + vect_min;

}

// 2. рекурсивное определение количества положительных элементов в векторе

int count_pol(int nn, int vect[nn])

{

int m;

if (nn == 0)

m = 0; //в векторе уже нет элементов - терминальная ветвь

else

{

m = count_pol(nn-1, vect);

if (vect[nn] > 0)

m++;

}

return m;

}

  1. Компиляция, отладка, тестирование и получение результата: