Контрольная работа по "Математике". 22

Вариант №39

 

Задание 1.1

Выяснить взаимное расположение множеств D,E,F, если A,B,C – произвольные подмножества U. Указать расположение множеств на карте Карно. Записать минимальные нормальные формы для искомых множеств.

 

ᴗᴖ

 

 

 

Перейдем от множеств к логическим высказываниям:

 

 

 

 

 

 

a

b

c

     

0

0

0

1

1

1

0

0

1

1

1

1

0

1

0

1

1

0

0

1

1

1

1

0

1

0

0

0

0

0

1

0

1

0

1

1

1

1

0

0

0

0

1

1

1

0

1

0


 

 

ДНФ:

 

 

 

Карта Карно:

c                   ab

00

01

11

10

0

*

   

1

*

   

*


 

 

Минимизированная форма:

 

 

 

a

b

c

     

0

0

0

1

1

1

0

0

1

0

0

0

0

1

0

1

1

1

0

1

1

0

0

1

1

0

0

1

1

1

1

0

1

0

1

1

1

1

0

1

1

1

1

1

1

0

1

1


 

ДНФ:

 

 

Карта Карно:

c                   ab

00

01

11

10

0

*

*

*

*

1

 

*

*

*


 

Минимизированная форма:

 

 

 

a

b

c

   

0

0

0

1

1

0

0

1

1

1

0

1

0

0

0

0

1

1

0

0

1

0

0

1

1

1

0

1

1

1

1

1

0

0

1

1

1

1

0

1


 

ДНФ:

 

 

Карта Карно:

c                   ab

00

01

11

10

0

*

 

*

*

1

*

 

*

*


 

Минимизированная  форма:

 

 

Из карт Карно получаем, что:

 

 

 

 

 

 

Задание 1.2

Проверить, что для любых множеств A,B,C выполнение включения влечет выполнение включения .Проверить другие возможные импликации.

 

 

 

Перейдем от множеств к логическим высказываниям:

 

 

 

 

a

b

c

   

0

0

0

0

1

0

0

1

0

1

0

1

0

1

1

0

1

1

0

1

1

0

0

0

0

1

0

1

0

0

1

1

0

1

1

1

1

1

0

0


 

 

a

b

c

         

0

0

0

0

0

0

0

1

0

0

1

0

0

0

0

1

0

1

0

0

1

1

1

0

0

1

1

0

0

0

0

1

1

0

0

1

0

0

0

1

1

0

1

1

0

0

0

1

1

1

0

0

1

0

1

1

1

1

1

0

0

0

0

1


 

       

1

1

1

1

1

1

1

1

1

0

0

1

1

1

1

1

0

1

1

0

0

1

1

0

1

1

1

1

0

1

1

0


 

Из  не следует

Из  не следует

 

Задание 1.3

Для произвольных множеств A,B,H проверить, является ли выполнение включения * необходимым и достаточным условием выполнения равенства *. Проверить другие возможные импликации.

 

 

 

 

Перейдем от множеств к логическим высказываниям:

 

 

 

 

 

a

b

h

   

0

0

0

0

1

0

0

1

0

1

0

1

0

0

1

0

1

1

1

1

1

0

0

0

0

1

0

1

0

0

1

1

0

0

0

1

1

1

1

1


 

 

 

 

 

 

a

b

h

           

0

0

0

0

0

0

0

0

1

0

0

1

0

0

0

0

0

1

0

1

0

1

0

0

0

0

0

0

1

1

1

1

1

0

1

1

1

0

0

0

0

0

1

1

1

1

0

1

0

0

0

0

0

1

1

1

0

0

0

0

1

1

1

1

1

1

0

1

0

0

0

1


 

 

       

1

1

1

1

1

1

1

1

1

0

0

1

1

1

1

1

0

1

1

0

0

1

1

0

0

1

1

0

1

1

1

1


Из  не следует

Из  не следует

 

 

Задание 1.4

Выяснить, верно  ли равенство для произвольных A,B,C.

 

 

 

 

Перейдем от множеств к логическим высказываниям:

 

 

 

 

 

a b c

         

 

0 0 0

0

0

0

0

0

0

0 0 1

0

0

0

0

0

0

0 1 0

0

0

0

0

0

0

0 1 1

0

0

0

0

0

0

1 0 0

0

0

0

1

0

0

1 0 1

0

0

1

1

1

1

1 1 0

1

0

0

0

0

0

1 1 1

1

1

1

0

0

0


 

Равенство не верно для произвольных A,B,C.

 

Задание 2.

На любом языке процедурного программирования записать алгоритм нахождения для заданного множества:

1)всех множеств

//нахождение всех  подмножеств

#include <stdio.h>

#include <math.h>

 

int main(void)

{

    int n; //количество элементов в множестве

    printf("Enter the number of elements in set\n");

    scanf("%d",&n); //ввод количества элементов в множестве

    int m[n]; //массив с элементами множества

    int i,j;

    printf("Enter elements of set\n");

    for(i=0;i<n;i++) //ввод множества

        scanf("%d",&m[i]);

 

    for(i=0;i<pow(2,n);i++) //цикл по всем элементам

    {

        for(j=0;j<n;j++) //цикл по всем битам маски

        {

            if(i&(1<<j)) //если побитовое умножение маски и j-го бита равно //единице...

            {

        printf("%d",m[j]); //…выводим j элемент

            }

         }

         printf("\n");

    }

    return 0;

}


 

 

 

 

 

 

Тесты:

Количество элементов:

Элементы:

Подмножества:

4

1 2 3 4

{1} {2} {1,2} {3} {1 3} {2 3} {1 2 3} {4} {1 4} {2 4} {1 2 4} {3 4} {1 3 4} {2 3 4} {1 2 3 4}

3

5 7 3

{5} {7} {5 7} {3} {5 3} {7 3} {5 7 3}


 

2) всех подмножеств с заданным  количество элементов

//нахождение всех  подмножеств c заданным числом  элементов

#include <stdio.h>

#include <math.h>

 

 

int main(void)

{

    int n; //количество элементов в множестве

    int k; //количество элементов в подмножестве

    int l,t,f,i,j; //счетчики

    printf("Enter the number of elements in set\n");

    scanf("%d",&n); //ввод количества элементов в множестве

    printf("Enter the number of elements in subset\n");

    scanf("%d",&k);

    int m[n]; //массив с элементами множества

    int d[k]; //массив с элементами подмножества

    printf("Enter elements of set\n");

    for(i=0;i<n;i++) //ввод множества

        scanf("%d",&m[i]);

 

    for(i=0;i<pow(2,n);i++) //цикл по всем элементам

    {

        for(t=0;t<k;t++) //обнуление

            d[t]=0;

 

        l=0;

        for(j=0;j<n;j++) //цикл по всем битам маски

        {

            if(i&(1<<j)) //если побитовое умножение маски и j-го бита равно //единице...

            {

                d[l]=m[j]; //…добавляем j элемент в массив подмножества

                l++;

            }

        }

        if(l==k) //если количество элементов в массиве совпадает и заданным //…числом

        {

            for(f=0;f<t;f++)

            {

                printf("%d ",d[f]); //…выводим массив

            }

            printf("\n");

        }

    }

    return 0;

}


 

Тесты:

Количество элементов:

Количество элементов в подмножестве:

Элементы:

Подмножества

3

2

1 2 3

{1 2} {1 3} {2 3}

4

2

4 8 15 16

{4 8} {4 15} {8 15} {4 16} {8 16} {15 16}


 

3) всех разбиений множества

#include <stdio.h>

 

int n; // количество элементов в множестве

int a[100]; // элементы множества

int p[100];

int i;

 

void print() //функция вывода

{

  int i, j, imax;

  imax = 1; // определяем количество блоков в разбиении

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

    if (p[i] > imax)

      imax = p[i];

 

  for (i = 1; i <= imax; i++) // цикл по блокам

  {

    printf("{");

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

      if (p[j] == i)

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

    printf(" }"); // блок напечатан

  }

  printf("\n");

}

 

void partition(int i, int j)//функция разбиения

{

  int l;

  if (i == n)

    print(); // печатаем текущее разбиение

  else

    for (l = 1; l <= j; l++) // ставим элемент множества в разные блоки

    {

      p[i] = l;

      if (l == j)

        partition(i + 1, j + 1);

      else

        partition(i + 1, j);

    }

}

 

int main(void)

{

  printf("Enter the number of elements in set: ");

  scanf("%d", &n);

 

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

  {

    a[i] = i + 1;

    p[i] = 0;

  }

  partition(0, 1);

  return 0;

}


Тесты:

Количество элементов:

Подмножества

3

{1 2 3}

{1 2} {3}

{1 3} {2}

{1} {2 3}

{1} {2} {3}

4

{1 2 3 4}

{1 2 3} {4}

{1 2 4} {3}

{1 2} {3 4}

{1 2}{3}{4}

{1 3 4} {2}

{1 3}{2 4}

{1 3}{2}{4}

{1 4}{2 3}

{1}{2 3 4}

{1}{2 3}{4}

{1 4}{2}{4}

{1}{2 4}{3}

{1}{2}{3 4}

{1}{2}{3}{4}


 

4)Алгоритм нахождения всех перестановок

#include <stdio.h>

 

int x[100]; //элементы множества

int n;

 

void Swap(int a,int b) //перестановка

{

    int t=x[a];

    x[a]=x[b];

    x[b]=t;

}

void Generate(int k) //генерация

{

    int i,j;

    if (k==n)

    {

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

            printf("%d ",x[i]);

        printf("\n");

    }

    else

    {

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

        {

            Swap(k,j);

            Generate(k+1);

            Swap(k,j);

        }

    }

}

 

int main()

{

    printf("Enter the number of elements in set\n");

    scanf("%d",&n); //ввод количества элементов

   

    int i;

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

        x[i]=i+1;

 

    Generate(0);

 

    return 0;

}


Тесты:

Количество элементов:

Подмножества

3

{1 2 3} {1 3 2} {2 1 3} {2 3 1} {3 2 1} {3 1 2}

4

{1 2 3 4}{1 2 4 3}{1 3 2 4}{1 3 4 2}{1 4 3 2}{1 4 2 3}{2 1 3 4}{2 1 4 3}{2 3 1 4}{2 3 4 1}{2 4 3 1}{2 4 1 3}{3 2 1 4}{3 2 4 1}{3 1 2 4}{3 1 4 2}{3 4 1 2}{3 4 2 1}{4 2 3 1}{4 2 1 3]{4 3 2 1}{4 3 1 2}{4 1 3 2}{4 1 2 3}


 

Задание 3.

Добавить сущности(от 1 до 3) к двум заданным в таблице сущностям. Создать ER-модель предметной области. По ER-модели предметной области построить схему реляционной базы данных.

 

Сущности: Ведущий, Телеигра, Телеканал, Зарплата, Телевизор.

 

 

 

 

Ведущий

Телеигра

Телеканал

Зарплата

Номер ведущего *K1

Название *K2

Частота *K3

Номер зарплаты *K4

ФИО

Жанр

Название

Размер

Стаж работы

Целевая аудитория

Время эфира

Налоги

Телекомпания

Время эфира

Тип телеканала

Надбавки


 

 

 

 

 

 

ER-модель базы данных:

 

Ведущий

Телеканал

Телеигра

Зарплата

Получает

Ведет

В эфире на

МС

МС

1

1

НС

ОС

О

Н

ОС

Н

МС

МС


 

Схема реляционной  базы данных:


K1      C1      K4

K4      C4

K3      C3

K2      C2

K1  K2

K2  K3

a

b

c


R1(K1 C1 K4)

R2(K4 C4)

 

  1. R1(K1 C1)

R2(K2 C2)

R3(K1 K2)

 

  1. R1(K2 C2)

R2(K3 C3)

R3(K2 K3)

 

 

Задание 4.

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

 

  1. Код на языке C++

 

#include <iostream>

using namespace std;

 

int w[100][100]; //массив вершин

bool used[100]; //массив использованных вершин

int d[100]; //массив длин

int inf=100000;//бесконечность

 

 

int main()

{

    int n,m,v1,v2;

    int x=0, y=0, z=0;

cout << "Enter the number of edges, number of arcs, starting edge and ending  edge" << endl;

    cin >> n >> m >> v1 >> v2;

 

    v1--;

    v2--;

 

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

    {

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

        {

            w[i][j]=0;  //заполняем нулями

        }

        d[i]=inf;  //заполняем бесконечностями

        used[i]=false; //непосещены

    }

 

    cout << "Enter from what edge to what edge you need and length" << endl;

    for (int i=0;i<m;i++) //ввод длинн

    {

        cin >> x >> y >> z;

        w[x-1][y-1]=z;

        w[y-1][x-1]=z;

    }

 

    d[v1]=0;

 

//алгоритм Дейкстры

while (true)

{

     int from, zfrom=inf;

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

                     if ((zfrom>d[i]) && !(used[i]))

                       {

                         from=i;

                         zfrom=d[i];

                        }

                       if(zfrom>=inf)

                          break;

                      

            used[from]=true;

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

            if (w[from][to]!=0)

                if ((!used[to]) && (d[to]>d[from]+w[from][to]))

                     d[to]=d[from]+w[from][to];

        }

    if (d[v2]<inf)

        cout<<d[v2];

    else cout<<"-1";

    return 0;

}


Тесты:

Количество вершин

Количество дуг

Длины

Начало

Конец

Вывод

3

3

1->2   6

1->3   5

2->3   7

1

3

5

3

3

1->2   6

1->3   20

2->3   7

1

3

13



Контрольная работа по "Математике". 22