036.模拟社会关系

简介: 036.模拟社会关系
#include <stdio.h>
#define CHILDREN 5
struct person{
  char *name;/*名字符串指针*/
  char sex;/*性别:男用字符'M';女用字符'F'*/
  struct person *father;/*指向父亲*/
  struct person *mother;/*指向母亲*/
  struct person *mate;/*指向配偶*/
  struct person *children[CHILDREN];/*指向子女*/
};
/* [函数]newperson增加新人 */
struct person *newperson(char *name,char sex)
{
  struct person *p;
  int index;
  p=(struct person *)malloc(sizeof(struct person));
  p->name=(char *)malloc(strlen(name)+1);
  strcpy(p->name,name);
  p->sex=sex;
  p->father=NULL;
  p->mother=NULL;
  p->mate=NULL;
  for(index=0;index<CHILDREN;index++)
    p->children[index]=NULL;
  return p;
}
/* [函数]father_child建立父-子关系 */
father_child(struct person *father,struct person *child)
{
  int index;
  for(index=0;index<CHILDREN-1;index++)/*寻找一个空缺的子女指针*/
    if(father->children[index]==NULL)/*若没有空缺,则填在最后*/
      break;
  father->children[index]=child;/*建立父-子关系*/
  child->father=father;
}
/* [函数]mother_child建立母-子关系 */
mother_child(struct person *mother,struct person *child)
{
  int index;
  for(index=0;index<CHILDREN-1;index++)/*寻找一个空缺的子女指针*/
    if(mother->children[index]==NULL)/*若没有空缺,则填在最后*/
      break;
  mother->children[index]=child;/*建立母-子关系*/
}
/* [函数]mate 建立配偶关系 */
mate(struct person *h,struct person *w)
{
  h->mate=w;/*建立配偶关系*/
  w->mate=h;
}
/* [函数]brotherinlow 检查两人是否是堂兄妹 */
int brothersinlaw(struct person *p1,struct person *p2)
{
  struct person *f1,*f2;
  if(p1==NULL||p2==NULL||p1==p2) return 0;
  if(p1->sex==p2->sex) return 0;/*不可能是堂兄妹*/
  f1=p1->father;
  f2=p2->father;
  if(f1!=NULL&&f1==f2) return 0;/*是兄妹,不是堂兄妹*/
  while(f1!=NULL&&f2!=NULL&&f1!=f2)/*考虑远房情况*/
  {
    f1=f1->father;
    f2=f2->father;
    if(f1!=NULL&&f2!=NULL&&f1==f2) return 1;
  }
  return 0;
}
/* 函数print_relate用于输出人物p的姓名,性别和各种关系 */
void print_relate(struct person *p)
{
  int index,i;
  if(p->name==NULL)
    return;
  if(p->sex=='M')
    printf(" %s is male.",p->name);
  else
    printf(" %s is female.",p->name);
  if(p->father!=NULL)
    printf(" %s's father is %s.",p->name,p->father->name);
  if(p->mother!=NULL)
    printf(" %s's mother is %s.",p->name,p->mother->name);
  printf("\n");
  if(p->mate!=NULL)
    if(p->sex=='M')
      printf(" His wife is %s.",p->mate->name);
    else
      printf(" Her husband is %s.",p->mate->name);
  if(p->children!=NULL)
  { for(index=0;index<CHILDREN-1;index++)/*寻找一个空缺的子女指针*/
    if(p->children[index]==NULL)/*若没有空缺,index为子女个数 */
      break;
    if(index>0)
      printf(" Children are:");
    for(i=0;i<index;i++)
      printf(" %s",p->children[i]->name);
  }
  printf("\n");
}
main()
{
  char *name[8]={"John","Kate","Maggie","Herry","Jason","Peter","Marry","Jenny"};
  char male='M',female='F';
  struct person *pGrandfather,*pFather1,*pFather2,*pMother1,*pMother2,*pSon,*pDaughter,*pCousin;
  clrscr();
  pGrandfather = newperson(name[0],male);
  pFather1 = newperson(name[3],male);
  pFather2 = newperson(name[4],male);
  pMother1 = newperson(name[1],female);
  pMother2 = newperson(name[2],female);
  pSon = newperson(name[5],male);
  pDaughter = newperson(name[6],female);
  pCousin = newperson(name[7],female);
  father_child(pGrandfather,pFather1);
  father_child(pGrandfather,pFather2);
  father_child(pFather1,pSon);
  father_child(pFather1,pDaughter);
  father_child(pFather2,pCousin);
  mate(pFather1,pMother1);
  mate(pFather2,pMother2);
  mother_child(pMother1,pSon);
  mother_child(pMother1,pDaughter);
  mother_child(pMother2,pCousin);
  /* 输出各种关系 */
  print_relate(pGrandfather);
  print_relate(pFather1);
  print_relate(pFather2);
  print_relate(pMother1);
  print_relate(pMother2);
  print_relate(pSon);
  print_relate(pDaughter);
  print_relate(pCousin);
  if(!brothersinlaw(pDaughter,pCousin))
    printf("%s and %s are not brothers (sisters) in law.\n",pDaughter->name,pCousin->name);
  else
    printf("%s and %s are brothers (sisters) in law.\n",pDaughter->name,pCousin->name);
  if(!brothersinlaw(pSon,pCousin))
    printf("%s and %s are not brothers (sisters) in law.\n",pSon->name,pCousin->name);
  else
    printf("%s and %s are brothers (sisters) in law.\n",pSon->name,pCousin->name);
  if(!brothersinlaw(pSon,pDaughter))
    printf("%s and %s are not brothers (sisters) in law.\n",pSon->name,pDaughter->name);
  else
    printf("%s and %s are brothers (sisters) in law.\n",pSon->name,pDaughter->name);
  puts("\n Press any key to quit...");
  getch();
}
相关文章
|
前端开发
2023Web前端开发八股文&面试题(万字系列)——这篇就够了!
2023Web前端开发八股文&面试题(万字系列)——这篇就够了!
2496 2
|
6月前
|
数据挖掘 API 开发者
深度解析!淘宝商品详情 API 接口的高效调用与实战应用
淘宝商品详情API为开发者提供高效获取商品信息的途径,支持名称、价格、销量等详细数据的提取。接口通过GET/POST请求方式调用,需携带商品ID与授权信息(如AppKey)。其特点包括数据全面、实时性强及安全性高,满足电商应用、数据分析等需求。本文还提供了Python调用示例,涵盖签名生成、参数构建及请求发送全流程,助力开发者快速集成淘宝商品数据至自身系统中。
|
SQL 数据库 索引
Pandas之DataFrame,快速入门,迅速掌握(三)
Pandas之DataFrame,快速入门,迅速掌握(三)
234 0
|
Linux 开发者
在Linux中,有哪些性能调优工具?
在Linux中,有哪些性能调优工具?
|
API CDN
Electron Markdown编辑器实战:资源管理器实现
Electron Markdown编辑器实战:资源管理器实现
|
数据处理 Python
【Python】已解决:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFram
【Python】已解决:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFram
2254 1
|
存储 监控 数据库
什么是聚集索引和非聚集索引?
【8月更文挑战第3天】
7224 6
|
机器学习/深度学习 Python
【Python 机器学习专栏】堆叠(Stacking)集成策略详解
【4月更文挑战第30天】堆叠(Stacking)是机器学习中的集成学习策略,通过多层模型组合提升预测性能。该方法包含基础学习器和元学习器两个阶段:基础学习器使用多种模型(如决策树、SVM、神经网络)学习并产生预测;元学习器则利用这些预测结果作为新特征进行学习,生成最终预测。在Python中实现堆叠集成,需划分数据集、训练基础模型、构建新训练集、训练元学习器。堆叠集成的优势在于提高性能和灵活性,但可能增加计算复杂度和过拟合风险。
1653 0
|
移动开发 小程序 开发者
uniapp打包ios应用的证书获取方法和上架流程
uniapp目前支持多端开发,可以开发H5网页,也可以开发小程序应用,还可以开发APP。假如需要开发ios app,则需要一个打包的证书和证书profile文件,还需要将这个打包好的APP上架app store。uniapp官网的例子中,生成证书和上架都需要使用mac电脑,而且操作比较复杂,这里我们这篇文章将教会大家无mac电脑生成开发证书和上架的例子。
1604 0