КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Пример выполнения работы. Список индивидуальных данных
Список индивидуальных данных Общая постановка задачи Теоретическая часть Лабораторная работа №1. Операции на множествах Целью лабораторной работы является изучение операций на множествах и приобретение навыков программирования. Требования к содержанию, оформлению и порядку выполнения В содержательной части отчета по выполнению лабораторной работы требуется привести описание алгоритмов выполнения операций на множествах, и на основе данных алгоритмов разработать алгоритм для решения задачи согласно своему варианту. Разработанный алгоритм требуется реализовать на языке высокого уровня. Алгоритмы рекомендуется оформлять с помощью блок-схем. Теоретические сведения, необходимые для выполнения лабораторной работы, представлены в разд.1.1.1-1.1.2 Требуется разработать и реализовать на языке высокого уровня алгоритмы выполнения следующих операций на множествах: объединение, пересечение, разность, симметрическая разность. Для хранения множеств можно использовать статические целочисленные массивы, т.е допускается, что множества состоят из натуральных чисел и имеют ограниченную константой мощность. Элементы массива a, используемого для хранения множества A, могут содержать, как сами элементы A, так и формироваться по правилу: a[i]=1, если iÎA; a[i]=0, если iÏA. В первом случае для хранения множества A={5,2,4} будет использоваться массив a=5,2,4. Во втором случае для хранения того же множества будет использоваться массив a=01011. Реализацию каждой операции требуется оформить в виде процедуры, входом которой являются два массива, хранящие элементы исходных множеств, а выходом - массив, хранящий элементы множества, полученного в результате выполнения соответствующей операции. Разработанные процедуры должны использоваться для решения индивидуальной задачи согласно варианту. Разработайте программу, позволяющую вводить с клавиатуры множества A,B,C и вычисляющую элементы множеств F1 и F2. Элементы множеств F1 и F2 выведите на экран. Выполните тестирование программы на различных входных данных. Обоснуйте полученные результаты. 1. F1=AI(BUC), F2=(AIB)U(AIC) 2. F1=AU(BIC), F2=(AUB)I(AUC) 3. F1=(AUB)IA, F2=A 4. F1=A\(BUC), F2=(A\B)I(A\C) 5. F1=A\(BIC), F2=(A\B)U(A\C) 6. F1=A\(A\B), F2=AIB 7. F1=A\(AIB), F2=A\B 8. F1=AI(B\C), F2=(AIB)\(AIC) 9. F1=(A\B)\C, F2=(A\C)\(B\C) 10. F1=AU(B\A), F2=AUB 11. F1=(AUB)\C, F2=(A\C)U(B\C) 12. F1=A\(B\C), F2=(A\B)U(AIC) 13. F1=A\(BUC), F2=(A\B)\C 14. F1=A∆B, F2=(A∆B)U(B∆A) 15. F1=A∆B, F2=(AUB)\(AIB) 16. F1=A∆(B∆C), F2=(A∆B)∆C 17. F1=AI(B∆C), F2=(AIB)∆(AIC) 18. F1=A∆(A∆B), F2=B 19. F1=A∆B∆(AIB), F2=AUB 20. F1=A∆(AIB), F2=A\B 21. F1=(A∆B)U(AIB), F2=AUB 22. F1=(A\C)U(B\C), F2=(AUB)\C 23. F1=(A\B)U(AIC), F2=A\(B\C) 24. F1=(A\B)\C, F2=A\(BUC) 25. F1=(A\B)I(A\C), F2=A\(BUC) Разработаем программу, позволяющую вводить с клавиатуры множества A,B,C и вычисляющую элементы множества F1=((AUC)\B)I(A∆C). Элементы множеств F1 выведем на экран. Для множества F2 требуется выполнить аналогичные действия. Поэтому в данном примере они не рассматриваются. Для хранения множеств A, B, С будем использовать массивы a, b, c размера mm=10. Также будем считать, что в качестве элементов множеств можно использовать только целые числа от 0 до mm. Массив a формироваться по правилу: a [ i ]=1, если i Î A; a [ i ]=0, если i Ï A. Аналогичным образом формируются массивы B, C. При таком способе хранения множеств все операции имеют простую реализацию, которая сводится к выполнению логических операций над элементами соответствующих массивов. Если bool mn1[] - массив, хранящий первое множество (первый операнд), а bool mn2[] - массив, хранящий второе множество (второй операнд), то массив bool mn_rez[], хранящий множество, полученное в результате выполнения операции над множествами mn1 и mn2 формируется следующим образом:
Все операции реализуем в виде соответствующих функций. Эти функции будем использовать в основной функции для получения требуемого множества F1=((AUC)\B)I(A∆C). Для этого будем использовать рабочие массивы, т.е. массивы для хранения промежуточных результатов. В данном примере последовательность вычислений может быть следующей: r1=AUC; r2=r1\B; r3=A∆C; r1=r2Ir3=F1. Ввод элементов множеств будем осуществлять в консольном режиме. Полностью текст программы приведен ниже. Для подбора тестовых примеров и наглядного представления результатов рекомендуется нарисовать диаграммы, иллюстрирующие процесс вычисления требуемых множеств. Для рассматриваемого примера данные диаграммы представлены на рис. Л.1.
#include <stdio.h> #include <stdlib.h>
#define mm 10 // Максимальное число элементов в множествах typedef int bool;
// Используемые множества целых чисел от 0 до mm bool a[mm],b[mm],c[mm], r1[mm],r2[mm],r3[mm];
// Функция print_set(char st [], boolmn []) // Назначение: Печать элементов множества mn, // состоящего из целых чисел от 0 до mm-1 // Вход: char st[] - строка сообщения; // bool mn[] - множество. // Выход: нет // Возвращает: нет. void print_set (char st[], bool mn[]) { int i; printf ("%s{",st); for (i=0;i<mm;i++) if (mn[i]) printf ("%d ",i); printf ("}\n"); }
// Функция create_keybrd_set(char st[], bool mn[]) // Назначение: Ввод элементов множества mn с клавиатуры, // состоящего из целых чисел от 0 до mm-1 // Вход: char st[] - строка сообщения; // Выход: bool mn[] - множество. // Возвращает: нет. void create_keybrd_set (char st[], bool mn[]) { int i,el; printf ("Диапазон элементов: %d..%d; число вне диапазона - конец ввода элементов\n",0,mm-1); printf ("%s",st); for (i=0;i<mm;i++) mn[i]=0; scanf ("%d",&el); while (el>=0 && el<mm) {mn[el]=1; scanf ("%d",&el);} }
// Функция unite_sets(bool mn1[],bool mn2[],bool mn_rez[]) // Назначение: Объединение двух множеств, // состоящих из целых чисел от 0 до mm-1 // Вход: bool mn1[] - первое множество; // bool mn2[] - второе множество; // Выход: bool mn_rez[] - объединение множеств mn1 и mn2. // Возвращает: нет. void unite_sets (bool mn1[],bool mn2[],bool mn_rez[]) { int i; for (i=0;i<mm;i++) mn_rez[i]= mn1[i] || mn2[i]; }
// Функция intersect_sets(bool mn1[],bool mn2[],bool mn_rez[]) // Назначение: Пересечение двух множеств, состоящих из целых чисел от 0 до mm // Вход: bool mn1[] - первое множество; // bool mn2[] - второе множество. // Выход: bool mn_rez[] - пересечение множеств mn1 и mn2. // Возвращает: нет. void intersect_sets (bool mn1[],bool mn2[],bool mn_rez[]) { int i; for (i=0;i<mm;i++) mn_rez[i]= mn1[i] && mn2[i]; }
// Функция subtract_sets(bool mn1[],bool mn2[],bool mn_rez[]) // Назначение: Разность двух множеств, состоящих из целых чисел от 0 до mm-1 // Вход: bool mn1[] - первое множество; // bool mn2[] - второе множество. // Выход: bool mn_rez[] - разность множеств mn1 и mn2. // Возвращает: нет. void subtract_sets (bool mn1[],bool mn2[],bool mn_rez[]) { int i; for (i=0;i<mm;i++) mn_rez[i]= mn1[i] &&!mn2[i]; }
// Функция s_subtract_sets(bool mn1[],bool mn2[],bool mn_rez[]) // Назначение: Симметрическая разность двух множеств, //состоящих из целых чисел от 0 до mm-1 // Вход: bool mn1[] - первое множество; // bool mn2[] - второе множество. // Выход: bool mn_rez[] - симметрическая разность множеств mn1 и mn2. // Возвращает: нет. void s_subtract_sets (bool mn1[],bool mn2[],bool mn_rez[]) { int i; for (i=0;i<mm;i++) mn_rez[i]= (mn1[i] &&!mn2[i]) || (mn2[i] &&!mn1[i]); }
int main (void) { setbuf (stdout, NULL); // Отменить буферизацию стандартного // устройство вывода, т.е. консоли. create_keybrd_set("a=",a); create_keybrd_set("b=",b); create_keybrd_set("c=",c); printf ("Исходные данные:\n"); print_set(" a=",a); print_set(" b=",b); print_set(" c=",c); printf ("Результаты:\n"); unite_sets(a,c,r1); print_set(" r1=",r1); subtract_sets(r1,b,r2); print_set(" r2=",r2); s_subtract_sets(a,c,r3); print_set(" r3=",r3); intersect_sets(r2,r3,r1); print_set(" f1=",r1); printf ("Работа программы завершена.\n"); return EXIT_SUCCESS; }
Для разработки программ в данном лабораторном практикуме используется среда Wascana Eclipse C/C++ IDE for Windows Developers, с которой можно более детально ознакомиться на сайте (http://code.google.com/a/eclipselabs.org/p/wascana/). Рассмотренная программа и результаты ее работы в данной среде представлены на рис.Л2.
Контрольные вопросы к защите Список контрольных вопросов совпадает с вопросами для повторения темы 1.
Дата добавления: 2014-12-27; Просмотров: 597; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |