集合的交 並 差 補 運算
阿新 • • 發佈:2019-02-11
這是離散數學上的一個實驗題,讓用程式設計實現集合的交 並 差 補的運算。我這是借鑑的同學的。我自己水平還達不到啊。
mian.c
#include <stdio.h>
#include "funcs.h"
int
main (int argc, char *argv[]) {
set_buf ();
get_input ();
printf ("********************\n");
printf ("集合a 和b 的並集為:\n");
do_or (a, a_l, b, b_l);
print_ans ();
printf ("集合a 和b 的交集為:\n");
do_and (a, a_l, b, b_l);
print_ans ();
printf ("集合a 的補集為:\n");
do_not (a, a_l);
print_ans ();
printf ("集合b 的補集為:\n");
do_not (b, b_l);
print_ans ();
printf ("集合a 與集合b 之差為:\n");
do_dec (a, a_l, b, b_l);
print_ans ();
printf ("集合b 與集合a 之差為:\n");
do_dec (b, b_l, a, a_l);
print_ans ();
return 0;
}
**********************************************************
fun.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "bool.h" #define BUF_LEN (10) typedef int buf[BUF_LEN]; buf u, a, b; int ans[BUF_LEN*2]; int u_l, a_l, b_l, ans_l; void set_buf () { u_l = 0; a_l = 0; b_l = 0; ans_l = 0; } bool has_find (int _buf[], int item, int len) { int i = 0; for (; i < len+1; ++i) if (item == _buf[i]) return true; return false; } void get_buf (buf _buf, int *len) { for (*len = 0; *len < BUF_LEN; ++*len) { char *str = malloc (16+1); printf ("<%d>:\t", *len+1); fgets (str, 16, stdin); str[strlen (str)] = 0; _buf[*len] = atoi (str); if ('q' == *str) return; fflush (stdin); /* 下面是互斥的兩個事件 */ if ((_buf != &*u) && !has_find (u, _buf[*len], u_l)) { --*len; } if (has_find (_buf, _buf[*len], *len-1)) { --*len; } } } void get_input () { printf ("**注意:實驗用的資料為整形,不要為難程式 = =b\n"); printf ("輸入不合法會預設重新輸入上一個資料,不發出警告 = =b\n\n"); printf ("輸入全集,輸入q 退出:\n"); get_buf (u, &u_l); printf ("輸入子集a,輸入q 退出:\n"); get_buf (a, &a_l); printf ("輸入子集b,輸入q 退出:\n"); get_buf (b, &b_l); } void do_or (buf _a, int _a_l, buf _b, int _b_l) { int i, j; ans_l = 0; for (i = 0; i < _a_l; ++i) for (j = 0; j < _b_l; ++j) if (_a[i] == _b[j]) ans[ans_l++] = _a[i]; } void do_and (buf _a, int _a_l, buf _b, int _b_l) { int i, j; ans_l = 0; for (i = 0; i < _a_l; ++i) ans[ans_l++] = _a[i]; for (j = 0; j < _b_l; ++j) if (!has_find (ans, _b[j], ans_l)) ans[ans_l++] = _b[j]; } void do_not (buf _a, int _a_l) { int i; ans_l = 0; for (i = 0; i < u_l; ++i) if (!has_find (_a, u[i], _a_l)) ans[ans_l++] = u[i]; } void do_dec (buf _a, int _a_l, buf _b, int _b_l) { int i; ans_l = 0; for (i = 0; i < _a_l; ++i) if (!has_find (_b, _a[i], _b_l)) ans[ans_l++] = _a[i]; } void print_ans () { int i; if (!ans_l) { printf (" 空集 \n"); return; } printf ("{"); for (i = 0; i < ans_l; ++i) printf ("%5d%c", ans[i], i==ans_l-1 ? ' ' : ','); printf ("}\n"); }
***************
bool.h
#ifndef BOOL_H
#define BOOL_H
typedef int bool;
#define true (1);
#define false (0);
#endif
**********
funcs.h
#ifndef FUNCS_H #define FUNCS_H #include "bool.h" #define BUF_LEN (10) typedef int buf[BUF_LEN]; extern buf u, a, b; extern size_t u_l, a_l, b_l; extern void set_buf (); extern void get_input (); extern void do_or (buf _a, int _a_l, buf _b, int _b_l); extern void do_and (buf _a, int _a_l, buf _b, int _b_l); extern void do_not (buf _a, int _a_l); extern void do_dec (buf _a, int _a_l, buf _b, int _b_l); extern void print_ans (); #endif