这是离散数学上的一个实验题,让用编程实现集合的交 并 差 补的运算。我这是借鉴的同学的。我自己水平还达不到啊。
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