练习 用C语言编写一个程序,解释高等数学中的映射、单射和一一映射,并表示为函数。

练习 用C语言编写一个程序,解释高等数学中的映射、单射和一一映射,并表示为函数。
映射的概念: 设f是从集合X到集合Y的映射,如果Y中任一元素y都是X中某元素的像,则称f为X到Y上的映射。
单射的概念:若对X中任意两个不同元素x1!=x2,它们的像f(x1)!=f(x2),则称f为X到Y的单射。
一一映射的概念:若映射f既是单射,又是满射,则称f为一一映射。

代码块:

#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int Status;
typedef int Elemtype;

typedef struct Set{
	Elemtype num;
	Set *next;
	int length;
}Set, *NumberSet;

void input(NumberSet set);
void output(NumberSet set);
Status Function(Elemtype &x, Elemtype &y);
Status Relationship1(NumberSet x, NumberSet y);
Status Relationship2(NumberSet x, NumberSet y);
Status Mapping(NumberSet x, NumberSet y, Status (*fun)(NumberSet x, NumberSet y));
Status Injection(NumberSet x, NumberSet y, Status (*fun)(NumberSet x, NumberSet y));
Status Bijection(NumberSet x, NumberSet y);

void input(NumberSet set){
	printf("Enter Set Length: ");
	int len, i;
	scanf_s("%d", &len);
	printf("Enter Set %d Numbers: ", len);
	Set *p = (Set*)malloc(sizeof(Set));
	set->length = 0;
	for(p = set, i = 0; i < len; i++, p = p->next){
		scanf_s("%d", &p->num);
		p->next = (Set*)malloc(sizeof(Set));
		set->length++;
		if(i == len - 1)
			break;
	}
	p->next = NULL;
}//input
void output(NumberSet set){
	printf("Set output: ");
	Set *p;
	for(p = set; p != NULL; p = p->next)
		printf("%d ", p->num);
	printf("\n");
	printf("Set Length: %d\n", set->length);
}//output
Status Function(Elemtype &x, Elemtype &y){
	if(y == 2*x)
		return TRUE;
	else
		return FALSE;
}//Function
Status Relationship1(NumberSet x, NumberSet y){
	Set *p, *q;
	int count;
	for(p = y, count = 0; p != NULL; p = p->next){
		for(q = x; q != NULL; q = q->next)
			if(Function(q->num, p->num)){
				count++;
				break;
			}
	}
	if(count == y->length)
		return TRUE;
	else
		return FALSE;
}//Relationship1
Status Relationship2(NumberSet x, NumberSet y){
	Set *p, *q;
	int count;
	for(p = x, count = 0; p != NULL; p = p->next){
		for(q = y; q !=	NULL; q = q->next)
			if(Function(p->num, q->num)){
				count++;
				break;
			}
	}
	if(count == x->length)
		return TRUE;
	else
		return FALSE;
}//Relationship2
Status Mapping(NumberSet x, NumberSet y, Status (*fun)(NumberSet x, NumberSet y)){
	fun = Relationship1;
	if(fun(x, y))
		return TRUE;
	else
		return FALSE;
}//Mapping
Status Injection(NumberSet x, NumberSet y, Status (*fun)(NumberSet x, NumberSet y)){
	fun = Relationship2;
	if(fun(x, y))
		return TRUE;
	else
		return FALSE;
}//Injection
Status Bijection(NumberSet x, NumberSet y){
	if(Mapping(x, y, Relationship1)&&Injection(x, y, Relationship2))
		return TRUE;
	else
		return FALSE;
}//Bijection

int main()
{
	system("color a");

	Set *numberset1 = (Set*)malloc(sizeof(Set));
	Set *numberset2 = (Set*)malloc(sizeof(Set));
	input(numberset1);
	input(numberset2);
	output(numberset1);
	output(numberset2);
	if(Mapping(numberset1, numberset2, Relationship1))
		printf("Set1 to Set2 is Mapping\n");
	if(Injection(numberset1, numberset2, Relationship2))
		printf("Set1 to Set2 is Injection\n");
	if(Bijection(numberset1, numberset2))
		printf("Set1 to Set2 is Bijection\n");
	free(numberset1);
	free(numberset2);

	system("pause");
	return 0;
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Navigator_Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值