1. 程式人生 > >集合的交 並 差 補 運算

集合的交 並 差 補 運算

這是離散數學上的一個實驗題,讓用程式設計實現集合的交 並 差 補的運算。我這是借鑑的同學的。我自己水平還達不到啊。

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