You are on page 1of 12

Львівський Національний університет імені Івана Франка

Факультет: електроніки і комп'ютерних технологій

ЛАБОРАТОРНА РОБОТА №3
«Комбінаторика»

Підготував
студент ФЕІ-11
Вовк Андрій
Перевірив
ас. Шмигельський Ярослав Антонович

Львів 2022
Звіт

Мета: Ознайомитися з основними правилами комбінаторики та її об’єктами,


а також навчитись генерувати перестановки та сполучення в лексографічному
порядку.

Частина 1
1. Створити нову бібліотеку Comb(Comb.h, Comb.cpp)

2. У Comb.cpp реалізувати функції для обчислення факторіалу,


кількості розміщень без повторень та з повтореннями, кількості
сполучень без повторень та з повтореннями, згідно формул. У
заголовному файлі Comb.h запрограмувати інтерфейси цих функцій.
3. Створити проект Lab_3, до якого підключити Comb.h. У функції main

проекту реалізувати обчислення кількості перестановок, розміщень


та сполучень з повтореннями та без них за заданими значеннями
параметрів n та k.
4. Відкомпілювати проект та запустити програму
Частина 2

1. У бібліотеці Comb.cpp реалізувати функцію GenPerm(A,n), яка за


даними вхідного масиву A довжиною n генерує наступну
лексикографічну перестановку його елементів і повертає їх у
цьому ж масиві A.

2. У функції main проекту реалізувати генерування всіх перестановок


елементів.

3. Згенерувати всі Pₙ = n! перестановок у лексикографічному порядку та


вивести результат на екран.
Частина 3

1. У бібліотеці Comb.cpp реалізувати функцію GenComb(A,n,k), яка за


даними вхідного масиву A довжиною k генерує лексикографічно
наступне сполучення з n-елементів по k і повертає їх у цьому ж
масиві A.
2. У головній функції main проекту Lab_3 реалізувати генерування всіх
сполучень з n по k множини натуральних чисел.

3. Згенерувати всі сполучення у лексикографічному порядку та вивести


результат на екран.
Текст програми
1) Lab_3
#include <iostream>
#include <windows.h>
#include "Comb.h"

using namespace std;

int main()
{
SetConsoleOutputCP(1251);

while (true)
{
int o;
cout << "Виберіть дію" << endl;
cout << "1. Обчислити кількості розміщень та сполучень" << endl;
cout << "2. Генерування перестановок" << endl;
cout << "3. Генерування сполучень" << endl;
cin >> o;
switch (o)

{
case 1:
int n, k;
cout << "Введіть n -> ";
cin >> n;
cout << "Введіть k ->";
cin >> k;

if (n < k)
{
cout << "Помилка! n повинне бути більшим за k";
return 0;
}

cout << "Кількість перестановок без повторень:";


cout << P(n);
cout << "\nКількість розміщень:";
cout << A(n, k);
cout << "\nКількість розміщень з повтореннями:";
cout << _A(n, k);
cout << "\nКількість сполучень:";
cout << C(n, k);
cout << "\nКількість сполучень з повтореннями:";
cout << _C(n, k);
case 2:
int* A;
cout << "\n N = ";
cin >> n;
A = new int[n];
for (int i = 0; i < n; i++)
A[i] = i + 1;
show(A, n);
while (GenPerm(A, n))
show(A, n);

case 3:
int m;
cout << "N = ";
cin >> n;
cout << "M = ";
cin >> m;
A = new int[n];
for (int i = 0; i < n; i++)
A [i] = i + 1;
show(A, m);
if (n >= m)
{
while (GenComb(A, n, m))
show(A, m);
}

default:
break;
}
}

2) Comb.h
#pragma once

int F(int n);


int A(int n, int k);
int _A(int n, int k);
int C(int n, int k);
int _C(int n, int k);
int P(int n);

bool GenPerm(int* A, int n);


bool GenComb(int* A, int n, int m);
void show(int* A, int n);
void swap(int* A, int i, int j);
int part3();
3) Comb.cpp
#include <iostream>
#include<cmath>
#include"Comb.h"

using namespace std;

int F(int n)
{
if (n == 1)
return 1;
else
return n * F(n - 1);
}

int A(int n, int k)


{
return (F(n) / F(n - k));

int _A(int n, int k)

{
return pow(n, k);
}

int C(int n, int k)


{
return (F(n) / (F(k) * F(n - k)));
}

int _C(int n, int k)


{
return (F(n+k-1)/(F(k)*F(n-1)));
}

int P(int n)
{
return F(n);
}

void show(int* A, int n)


{
static int num = 1;
cout.width(3);
cout << num++ << ": ";

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


cout << A[i] << " ";
cout << endl;
}

bool GenPerm(int *A, int n)


{
int j = n - 2;
while (j != -1 && A[j] >= A[j + 1]) j--;
if (j == -1)
return false;
int k = n - 1;
while (A[j] >= A[k]) k--;
swap(A, j, k);
int l = j + 1, r = n - 1;
while (l < r)
swap(A, l++, r--);
return true;
}

void swap(int* A, int i, int j)


{
int s = A[i];
A[i] = A[j];
A[j] = s;
}

bool GenComb(int* A, int n, int m)


{

for (int i = m - 1; i >= 0; --i)


if (A[i] < n - m + i + 1)
{
++A[i];
for (int j = i + 1; j < m; ++j)
A[j] = A[j - 1] + 1;
return true;
}
return false;
}

int part3()
{
int n, m, * A;
cout << "N = ";
cin >> n;
cout << "M = ";
cin >> m;
A = new int[n];
for (int i = 0; i < n; i++)
A[i] = i + 1;
show(A, m);
if (n >= m)
{
while (GenComb(A, n, m))
show(A, m);
}
return 0;
}

Висновок:
Під час виконання лабораторної роботи я ознайомився з
основними правилами комбінаторики та її об’єктами, а також
навчився генерувати перестановки та сполучення в
лексографічному порядку.

You might also like