练习 用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;
}