Автор работы: Пользователь скрыл имя, 29 Мая 2013 в 23:57, контрольная работа
Задание 1.1 Выяснить взаимное расположение множеств D,E,F, если A,B,C – произвольные подмножества U. Указать расположение множеств на карте Карно. Записать минимальные нормальные формы для искомых множеств.
Задание 1.2 Проверить, что для любых множеств A,B,C выполнение включения влечет выполнение включения. Проверить другие возможные импликации.
Задание 1.3 Для произвольных множеств A,B,H проверить, является ли выполнение включения * необходимым и достаточным условием выполнения равенства *. Проверить другие возможные импликации.
Равенство не верно для произвольных 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)
R2(K2 C2)
R3(K1 K2)
R2(K3 C3)
R3(K2 K3)
Задание 4.
На любом языке процедурного программирования записать алгоритм нахождения кратчайшего пути в взвешенном ориентированном графе.
#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 |