family.cpp

/***********************************************************
*版权所有(C)2017,
*
*文件名称:family.cpp
*文件标识:无
*内容摘要:该部分代码用于自定义函数说明
*其它说明:无
*当前版本:V1.0
*作 者:于子淇
*完成日期:2017.12.21
*
*版本号:V1.0
**********************************************************/
#include "head.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <conio.h>
void display0();
using namespace std;
/*********************************************************
*功能描述:容错保障
*输入参数:x
*输出参数:无
*返回值:x-成功/其他-失败
*其它说明:消息字段之间用分号(;)分隔
throw抛出异常,即检测是否产生异常,如果在try语句块的程序段中(包括在其中调用的函数)发现了异常,且抛弃了该异常,则这个异常就可以被try语句块后的某个catch语句所捕获并处理,捕获和处理的条件是被抛弃的异常类型与catch语句的异常类型相匹配。
***********************************************************/
template<class T>//模板
T fun(T x)
{if(x!=2)throw x;elsereturn x;
}
treenode *root; //root是指向结构体treenode的指针
/*********************************************************
*功能描述:遍历家谱树各个结点返回指向所要查找的成员结点指针(或没找到返回NULL)
*输入参数: *p 头指针用来指向头结点(*root)or递归过程的其他结点(兄弟结点或孩子结点)
ch[]用来储存姓名(所查找的成员姓名)
*输出参数:无
*返回值:*q or NULL
*其它说明:消息字段之间用分号(;)分隔通过递归函数在兄弟、孩子中查找
***********************************************************/
treenode *search(treenode *p,char ch[]) // 搜索指针函数,搜索需要修改和获得的结点,输入头指针,姓名
{treenode *q;if(p==NULL) return NULL;//没有家谱,头指针下为空if(strcmpi(p->l.name,ch)==0)//比较姓名,看是否重名或是否存在return p;//家谱不为空,头指针下有这个人if(p->brother){//递归过程q=search(p->brother,ch);//在兄弟中找if(q)return q;//找到}if(p->child){q=search(p->child,ch);//在孩子中找if(q!=NULL)return q; //找到则返回指针q}return NULL;//没有找到
}/*********************************************************
*功能描述:获得搜索到的成员的第几代并返回其代的数据信息
*输入参数: *p 头指针用来指向头结点(*root)or递归过程的其他结点(兄弟结点或孩子结点)
ch[]用来储存姓名
*输出参数:被查找人的代的数据信息
*返回值:q->l.generation or 0
*其它说明:消息字段之间用分号(;)分隔通过递归在兄弟、孩子中查找
***********************************************************/
int generation(treenode *p,char ch[]) //获得搜索到的成员的代的返回值
{treenode *q;if(p==NULL)return 0;if(strcmpi(p->l.name,ch)==0) //比较姓名,看是否重名或是否存在return p->l.generation;//家谱不为空,头指针下有这个人if(p->brother){q=search(p->brother,ch);//在兄弟中找if(q)return q->l.generation;//找到}if(p->child){q=search(p->child,ch);//在孩子中找if(q!=NULL)return q->l.generation; //找到}return 0;
}
/*********************************************************
*功能描述:建立家谱孩子结点,创建结点并对l赋值保存
*输入参数: *p 头指针用来指向结点 b[] 孩子名字 c 性别
*输出参数:无
*返回值:无
*其它说明:消息字段之间用分号(;)分隔
***********************************************************/
void children(treenode *p,char b[],char c,int d)//建立家谱孩子结点,创建结点并对l赋值保存
{int i;for(i=0;i<MAX;i++)p->l.name[i]=b[i];p->l.sex=c;p->l.generation=d;
}
/*********************************************************
*功能描述:输出成员信息
*输入参数: *n 结点,是之前search()函数返回的指向所查找的成员的指针,在此作为输入
*输出参数:l.name 姓名 l.sex 性别 l.generation 第几代
以及该查找成员的兄弟(父母未实现)
*返回值:无
*其它说明:消息字段之间用分号(;)分隔***********************************************************/
void output(treenode *n) //搜索到数据的输出
{treenode *t=NULL;printf("此人姓名:%s 性别%c 为第%d代\n",n->l.name,n->l.sex,n->l.generation);printf("\n");printf("此人的子女:"); //子女输出if(n->child==NULL)//当该结点的孩子指针域为空时,代表此人没有孩子{printf("此人无子女!");}else//有孩子{if(n->child->brother==NULL)//孩子无兄弟{printf("姓名:%s 性别:%c\t",n->child->l.name,n->child->l.sex);//就只输出孩子的数据信息}else//当孩子有兄弟时(原父辈不止一个孩子){printf("姓名:%s 性别:%c\t",n->child->l.name,n->child->l.sex);//输出完第一个孩子后再将指针n->child->brother赋给指针tt=n->child->brother;while(t!=NULL)//当t指针存在时(直到输出完最后一个孩子){printf("姓名:%s 性别:%c\t",t->l.name,t->l.sex);//输出其他孩子的姓名t=t->brother;//将指针再指向兄弟的兄弟}}}printf("\n");printf("此人的同辈成员:"); //同辈输出if(n->brother==NULL){printf("此人无同辈成员!");}else{if(n->brother->brother==NULL){printf("姓名:%s 性别:%c\t",n->brother->l.name,n->brother->l.sex);}else{printf("姓名:%s 性别:%c\t",n->brother->l.name,n->brother->l.sex);t=n->brother->brother;while(t!=NULL){printf("姓名:%s 性别:%c\t",t->l.name,t->l.sex);t=t->brother;}}}
}
/*********************************************************
*功能描述:初始化家谱
*输入参数: 输入始祖姓名、性别
并记录始祖的generation为第1代
*输出参数:无
*其它说明:消息字段之间用分号(;)分隔
先释放root内存空间,再为root创建内存空间储存结点
***********************************************************/
void InitTree() //初始化(创建)
{system("cls");//system("color 4f");cout<<endl<<endl<<endl<<endl;cout<<"                   ********************************************"<<endl;cout<<"                   *                                          *"<<endl;cout<<"                   *           现在开始初始化家族族谱         *"<<endl;cout<<"                   *                                          *"<<endl;cout<<"                   ********************************************"<<endl;cout<<endl<<endl<<endl;int a;char b[MAX],c;printf(" 请输入始祖的姓名性别:");free(root);//释放root (ft)空间root=(treenode *)malloc(sizeof(treenode)); // 创建一个treenode结构体大小的空间//然后强制转换为treenode *类型的指针然后赋值给rootscanf("%s %c",&b,&c);//输入姓名,性别while(c!='m'&&c!='f'){try{fun(c);}catch(...){cout<<"输入性别有误!请重新输入!(女士f男士m):"<<endl;}scanf("%s %c",&b,&c);//输入姓名,性别}a=1;//定义该祖先为第一代人root->child=NULL; //清空左右孩子root->brother=NULL;children(root,b,c,a);//存入结构printf("家谱初始化成功!\n");/*printf("\n按任意键返回主菜单..\n");getchar();*/system("pause");system("cls");display0();
}
/*********************************************************
*功能描述:添加成员信息
*输入参数:成员的数据信息 b[]子辈姓名 c 性别 d[] 父辈姓名
*返回值:无
*其它说明:消息字段之间用分号(;)分隔通过查找上一辈家长的位置添加其子女的信息(符合显示中添加子女信息的需求)对于家谱中是否存在此人用上面代码中search()判断容错包括:重名容错与性别容错
***********************************************************/
void Add() //添加
{system("cls");//system("color 4f");int a;cout<<endl<<endl<<endl<<endl;cout<<"                   ********************************************"<<endl;cout<<"                   *                                          *"<<endl;cout<<"                   *          现在开始添加家庭成员操作        *"<<endl;cout<<"                   *                                          *"<<endl;cout<<"                   ********************************************"<<endl;cout<<endl<<endl<<endl;treenode *n,*m,*t=NULL;char b[MAX],c,d[MAX];printf("请输入要添加子女的上一辈的姓名:");scanf("%s",&d);n=search(root,d);a=generation(root,d);while(n==NULL) //判断是否有重名{printf("此人不在家谱内,请重新输入姓名:");scanf("%s",&d);n=search(root,d);}if(n->child==NULL)//孩子信息添加,当满足该父辈无子女时,进入条件判断{printf(" 请输入所添加家庭成员的姓名与性别(注意不能重名):");scanf("%s %c",&b,&c);while(c!='m'&&c!='f'){try{fun(c);}catch(...){cout<<"输入性别有误!请重新输入!(女士f男士m):"<<endl;}scanf("%s %c",&b,&c);//输入姓名,性别}a++;//此处a代表孩子的辈分m=search(root,b);//搜索族谱之中是否有与新添加成员重名的人,若有则添加失败if(m!=NULL){printf("出现重名,添加失败!\n");}else{n->child=(treenode *)malloc(sizeof(treenode));n->child->brother=NULL;n->child->child=NULL;children(n->child,b,c,a);printf("添加成功!\n");}}else//当该父辈之前已经有子女的时候,则此新添加的成员为添加的前一个孩子的兄弟{n=n->child;while(n->brother!=NULL) //添加另一个孩子n=n->brother;printf("请输入所添加家庭成员的姓名与性别(注意不能重名):");scanf("%s %c",&b,&c);while(c!='m'&&c!='f'){try{fun(c);}catch(...){cout<<"输入性别有误!请重新输入!(女士f男士m):"<<endl;}scanf("%s %c",&b,&c);//输入姓名,性别}a++;m=search(root,b);if(m!=NULL)printf("出现重名,添加失败!\n");else{t=(treenode *)malloc(sizeof(treenode));children(t,b,c,a);t->brother=NULL;t->child=NULL;n->brother=t;printf("添加成功!\n");}}printf("\n按任意键返回主菜单..\n");getch();system("cls");display0();}
/*********************************************************
*功能描述:查找功能的实现
*输入参数:d[] 姓名
*返回值:无
*输出参数:输出被查找人的信息
*其它说明:消息字段之间用分号(;)分隔该函数与search()函数和output()函数共同构成查询模块
***********************************************************/
void Search() //查找
{treenode *n;char d[MAX];printf("输入姓名,查找相关信息:");scanf("%s",&d);n=search(root,d);while(n==NULL){printf("此人不存在,请再次输入:");scanf("%s",&d);n=search(root,d);}output(n);printf("\n");printf("\n按任意键返回主菜单..\n");getch();system("cls");display0();
}
/*********************************************************
*功能描述:修改成员信息
*输入参数: 要修改人的姓名(判断此人是否存在)
*输出参数:存在则输出此人的数据信息,不存在则重新输入
*返回值:无
*其它说明:消息字段之间用分号(;)分隔
修改成员函数中同样做了性别容错,修改的过程只是将其数据进行覆盖的过程,并不会影响该结点的孩子结点与兄弟结点的指向。***********************************************************/
void Change() //修改
{char a[MAX],r[MAX],c;treenode *n;int i;printf("请输入要修改人的姓名:");scanf("%s",&a);n=search(root,a);while(n==NULL){printf("此人不存在,请重新输入姓名:");scanf("%s",&a);n=search(root,a);}printf("此人存在,请输入新信息:");scanf("%s %c",&r,&c);while(c!='m'&&c!='f')//性别容错{try{fun(c);}catch(...){cout<<"输入性别有误!请重新输入!(女士f男士m):"<<endl;}scanf("%s %c",&r,&c);//输入姓名,性别}for(i=0;i<MAX;i++)n->l.name[i]=r[i];n->l.sex=c;printf("修改成功!\n");printf("\n按任意键返回主菜单..\n");getch();system("cls");display0();
}
/*********************************************************
*功能描述:显示模块
*输入参数:数字选项
*输出参数:跳转其他操作界面
*其它说明:消息字段之间用分号(;)分隔
数字选项输入容错保障
***********************************************************/
void display0()//最初显示界面
{system("cls");//system("color 4f");cout<<endl;cout<<"        **     **   *********    **          **              ***      "<<endl;cout<<"        **     **   *********    **          **            **   **    "<<endl;cout<<"        **     **   **           **          **           **     **   "<<endl;cout<<"        **     **   **           **          **          **       **  "<<endl;cout<<"        *********   *********    **          **          **       **  "<<endl;cout<<"        *********   *********    **          **          **       **  "<<endl;cout<<"        **     **   **           **          **          **       **  "<<endl;cout<<"        **     **   **           **          **           **     **   "<<endl;cout<<"        **     **   *********    *********   *********     **   **    "<<endl;cout<<"        **     **   *********    *********   *********       ***      "<<endl;cout<<endl;cout<<"                     **************************************"<<endl;cout<<"                     *                                    *"<<endl;cout<<"                     *         欢迎进入家谱管理系统       *"<<endl;cout<<"                     *                                    *"<<endl;cout<<"                     **************************************"<<endl;cout<<endl<<endl;cout<<"                                   1 添加成员"<<endl<<endl;cout<<"                                   2 查询个人信息"<<endl<<endl;cout<<"                                   3 修改信息"<<endl<<endl;cout<<"                                   4 创建族谱"<<endl<<endl;cout<<"                                   5 退出"<<endl<<endl;cout<<endl;int a;cout<<"                                 请输入数字:";cin>>a;while(!cin){cout<<"                                 输入错误,请重新输入:";cin.sync();cin.clear();cin>>a;}while(a<1||a>6){try{fun(a);}catch(...){cout<<"                                 输入错误,请重新输入:";}cin>>a;}switch(a){case 1:Add();system("pause");break;case 2:Search();system("pause");break;case 3:Change();case 4:InitTree();system("pause");break;case 5:exit(0);break;}
}

family.h

/***********************************************************
*版权所有(C)2017,
*
*文件名称:family.h
*文件标识:无
*内容摘要:定义树结构体并声明函数
*其它说明:无
*当前版本:V1.0
*作 者:于子淇
*完成日期:2017.12.21
*
*版本号:V1.0
**********************************************************/
#ifndef FAMILY_H_INCLUDED
#define FAMILY_H_INCLUDED
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
#define MAX 10
typedef struct info//定义data存储结构,存放个人信息
{       char name[MAX]; //姓名char sex;//性别int generation;//代
}info;
typedef info ElemType;//将ElemType定义成结构体类型
typedef struct treenode//创建结构体
{ElemType l; struct treenode *brother;//用来指向兄弟struct treenode *child;//用来指向孩子
}treenode;treenode *search(treenode *p,char ch[]); // 搜索指针函数,搜索需要修改和获得的结点,输入头指针,姓名int generation(treenode *p,char ch[]); //获得搜索到的成员的代的返回值void children(treenode *p,char b[],char c,int d);//建立家谱孩子结点,创建结点并对l赋值保存void output(treenode *n); //搜索到数据的输出void InitTree(); //初始化(创建)void Add(); //添加void Search(); //查找void Change(); //修改
#endif // FAMILY_H_INCLUDED

main.cpp

/***********************************************************
*版权所有(C)2017,
*
*文件名称:main.cpp
*文件标识:无
*内容摘要:主函数(显示模块)
*其它说明:无
*当前版本:V1.0
*作 者:于子淇
*完成日期:2017.12.21
*
*版本号:V1.0
**********************************************************/
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include "family.h"
void display0();
using namespace std;
int main()
{    display0();//程序运行后,直接跳转进入显示模块,对功能进行选择
    return 0;}

期末课程设计-家谱管理系统相关推荐

  1. 课程设计-家谱管理系统

    family.h#ifndef _TEST #define _TEST #include<iostream> #include<stdio.h> #include<Str ...

  2. java web期末课程设计 学生成绩管理系统(mysql,jstl+el,Javabean)+增删改查,session域+servlet(基础易理解)

    学生成绩管理系统 一.实验目的 为了更好的学习理解JavaWeb,创建了此系统.此系统可以帮助学习Java web基础,特别是javaweb入门,此系统使用大部分Java web基础知识.Java w ...

  3. java期末课程设计----模拟银行业务(带界面)

    java期末课程设计----模拟银行业务(带界面) 本项目包含存款,取款,查询,转账,修改密码等功能的银行管理系统的功能(不涉及数据库).大致流程图如下: 一.设计思路 本系统采用JAVA语言并在ec ...

  4. 销售管理c语言程序设计,C语言课程设计销售管理系统

    C语言课程设计销售管理系统 C语言课程设计 题 目 商品销售系统 指导教师 曹东燕 学生姓名 刘伟 张新星 马国文 学 号 200900804072 200901802005 200900804051 ...

  5. 网吧管理系统C语言作业,C语言课程设计-网吧管理系统.doc

    C语言课程设计-网吧管理系统 <通信工程专业C语言课程设计> 报 告 专 业: 通信工程 班 级: 0802 姓 名: 赵 松 指导教师: 丁 雄 二00九 年 十二 月 二十五 日 目 ...

  6. 数据结构课程设计家谱c语言,数据结构课程设计-家谱的实现与设计.doc

    数据结构课程设计-家谱的实现与设计 课 程 设 计 报 告 课程设计名称:数据结构课程设计 系 : 三系 学 生 姓 名 : 朱强 班 级: 13软件 学 号: 20130311227 成 绩: 指 ...

  7. 教职工员工管理MySQL实训_数据库课程设计---教职工管理系统

    数据库课程设计---教职工管理系统 第 1 页目 录一.需求与功能分析 2二.系统总体框架 3三.功能设计 3四.类的设计与分析 4五.数据库表结构设计 4六.特色算法分析 5七.功能测试 6-10八 ...

  8. c语言程序设计书店销售管理系统,C语言课程设计-书店管理系统

    <C语言课程设计-书店管理系统>由会员分享,可在线阅读,更多相关<C语言课程设计-书店管理系统(25页珍藏版)>请在人人文库网上搜索. 1.计算机程序设计计算机程序设计(C(C ...

  9. oracle课程设计图书销售系统,oracle课程设计图书管理系统

    oracle课程设计图书管理系统 数据库课程设计 设计名称:图书管理系统 组员:尚靖伟(122068) 张红凯(122072) 班级:计 G121 班信息工程学院计算机系 2013 年 6 月 27 ...

最新文章

  1. linux文件类型elf,[Linux]四种ELF对象文件类型
  2. 微信小程序实现分类菜单 swiper分类菜单
  3. 第二十期:黄金三步法 | 汇报时,如何让老板快速抓住重点?
  4. C语言实现MATLAB 6.5中M文件的方法
  5. 星宿UI V1.1-后台优化激励视频判断插件
  6. 日赚1.2亿元,人均月薪5.5万元,蚂蚁集团招股书首亮相......
  7. 2019款iPhone XR新配色机模上手:就是这个味儿
  8. 使用Windows Performance Monitor进行SQL Server性能调整
  9. yolo模型部署——tensorRT模型加速+triton服务器模型部署
  10. 数理统计: 第五章 方差分析与试验设计
  11. 2021-04-02
  12. Unity3D的3D音效的实现
  13. 单片机学习知识点全攻略
  14. 微信小程序中实现地图导航
  15. win10计算机睡眠 隔几分钟就唤醒,Win10电脑睡眠时经常被自动唤醒如何解决
  16. 求树的直径的两种方法
  17. 卡特兰数Catalan
  18. 良知的清醒常常意味着糟糕的记忆力的标志。
  19. PTA 1032 挖掘机技术哪家强(c语言)
  20. 最终幻想:探讨小鹏G9 800V 高压动力系统和架构路线

热门文章

  1. VR开发基础(一)一文理清unity xr plugin架构与openxr标准
  2. upp(统一流程平台),一份迟来的可行性研究报告
  3. cocos-Lua 捕鱼碰撞检测方法
  4. win7软件及游戏运行失败解决方法
  5. mysql 查找小写字母_MySQL中查询时对字母大小写的区分
  6. 2022年全球及中国平权行动合规服务行业头部企业市场占有率及排名调研报告
  7. vue 常见的新增、编辑、查看公用同一个页面
  8. SSHFS 映射远程目录 | Ubuntu18.04把远程目录的文件当做本地的用
  9. centos8系统influxdb2修改默认端口8086
  10. Qt 6 中的 Qt Extras 模块