日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

家族谱管理系统(C语言版)

發布時間:2024/3/24 windows 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 家族谱管理系统(C语言版) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

家族譜管理系統

一.本程序功能框架圖

二 .系統功能

(1) 文件操作功能:記錄輸入、記錄輸出、初始化:用戶可建立一個家族的族譜保存在文件中。在其后的操作中,可從文件里讀取族譜信息、增加新的家族成員、修改已有的家族成員、刪除已存在的家族成員。操作完成之后可保存在文件中。
(2) 家譜操作功能:輸出家譜,并能查找某人的配偶、所有孩子、所有祖先等功能。

三.系統功能模塊設計:

一.問題描述

本課程設計的主要問題是選擇一種數據結構來描述家譜中家族成員之間的關系,在此數據結構上加之一些操作,選用特定的算法來實現家譜操作的功能和文件操作的功能。
二.基本要求
設計要求:編寫一個程序,采用一棵二叉樹表示一個家譜關系。
具體要求:
(1) 文件操作功能:記錄輸入、記錄輸出、將家譜記錄存盤。
(2) 家譜操作功能:輸出家譜,并能查找某人配偶,查找某人所有的兒子,查找某人的所有祖先。

四.概要設計

1.數據結構的設計
在家譜課程設計中采用二叉樹來表示家譜關系,由于在家譜中每個家族成員的子女不止一個,而雙親只有一個,所以采用二叉樹結構來描述家族成員之間的關系。在家譜課程設計中還用到單鏈表,在設計中要將二叉樹存儲在文件中,最終要讀取文件中的記錄,要將文件中的數據還原到內存中組成二叉樹結構,而文件中元素與元素之間的結構是線性,而且直接對文件中的數據操作很不方便,所以將文件中的元素存儲在單鏈表中,再對單鏈表操作還原成內存中的二叉樹。
在對家譜的文件操作中,為了還原家譜方便,采用按層遍歷的順序保存二叉樹中各結點的信息,在層次遍歷中,使用隊列來實現二叉樹的層次遍歷。
2.算法的設計
本設計從總體上主要分2個模塊,分別是家譜操作模塊和文件操作模塊。

五.源代碼

#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #pragma warning(disable:6011)#include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> #include <assert.h>/*字符串最大長度*/ #define STR_LEN 128 /*最大孩子數*/ #define CHILD_LEN 64 /*緩存容量*/ #define BUFFER_SIZE 1024/*家譜成員信息*/ typedef struct _tMember {char name[STR_LEN]; /*姓名*/char wife[STR_LEN]; /*妻子*/ }Member, * pMember;/*家譜樹節點*/ typedef struct _tTreeNode {Member member; /*成員信息*/struct _tTreeNode* parent; /*父節點*/struct _tTreeNode* children[CHILD_LEN]; /*孩子節點*/int count; /*孩子數量*/int level; /*節點層級*/ }TreeNode, * pTreeNode;/*創建樹節點*/ pTreeNode createTreeNode(pTreeNode parent, pMember member) {pTreeNode node = (pTreeNode)calloc(1, sizeof(TreeNode));if (node) {node->member = *member;if (parent) {node->parent = parent;node->level = parent->level + 1;parent->children[parent->count++] = node;}}return node; }/*刪除樹節點*/ void removeTreeNode(pTreeNode cursor) {if (cursor) {if (cursor->parent) {pTreeNode parent = cursor->parent;int position = -1;for (int index = 0; index < parent->count; ++index) {if (parent->children[index] == cursor) {position = index;break;}}if (position != -1) {for (int index = position + 1; index < parent->count; ++index) {parent->children[index - 1] = parent->children[index];}--parent->count;}}} }/*計算成員層級*/ int countMemberLevel(const char content[]) {int level = 0;const char* cursor = content;while (*cursor == ' ') {++level;++cursor;}return level; }/*輸入性別*/ void inputSex(char sex[]) {do {int option;printf("\n");printf("----------\n");printf(" 1 男\n");printf(" 2 女\n");printf("----------\n");printf(" 請選擇:");scanf("%d", &option);switch (option) {case 1:strcpy(sex, "男");return;case 2:strcpy(sex, "女");return;}} while (1); }/*檢測日期(yyyy-mm-dd)*/ int checkDate(const char date[]) {int yyyy, mm, dd;if (strlen(date) != 10) return 0;if (sscanf(date, "%4d-%2d-%2d", &yyyy, &mm, &dd) != 3) return 0;if (yyyy < 1999)return 0;if (yyyy >= 3000) return 0;if (mm < 1) return 0;if (mm > 12) return 0;if (dd < 1) return 0;if (dd > 31) return 0;return 1; }/*輸入日期*/ void inputDate(char date[]) {do {scanf("%s", date);if (checkDate(date)) break;printf("格式錯誤,請重新輸入!(yyyy-mm-dd)\n");} while (1); }/*編輯家譜成員信息*/ void editFamilyMember(pMember member) {printf("╔-----------------------------------------╗\n");printf(" $ 編輯家譜成員信息 $\n");if (strlen(member->name)) {printf(" 姓名:%s\n", member->name);}else {printf(" 姓名:");scanf("%s", member->name);}printf(" 妻子:");scanf("%s", member->wife);printf("╚-----------------------------------------╝\n"); }/*輸出成員標題*/ void showFamilyMemberTitle() {printf(" %-10s", "姓名");printf(" %-10s", "妻子");printf("\n"); }/*輸出成員信息*/ void showFamilyMember(pMember member, int newline) {printf(" %-10s", member->name);printf(" %-10s", member->wife);if (newline) {printf("\n");} }/*遞歸遍歷顯示家譜信息*/ void recursiveFamilyTreeNodeShow(pTreeNode cursor, int brother_line[], int flag, int all) {if (cursor) {char generation[STR_LEN] = { 0 };if (all) {showFamilyMember(&cursor->member, 0);}sprintf(generation, "【%d世】", cursor->level + 1);printf("%10s", generation);if (cursor->level > 0) {for (int index = 0; index < cursor->level - 1; ++index) {if (brother_line[index]) {printf(" │");}else {printf(" ");}}if (flag) {printf(" ├─>");}else {printf(" └─>");}}printf(" %s %s\n", cursor->member.name, cursor->member.wife);for (int index = 0; index < cursor->count; ++index) {int flag = (index < cursor->count - 1);if (flag) {brother_line[cursor->level] = 1;}else {brother_line[cursor->level] = 0;}pTreeNode child = cursor->children[index];recursiveFamilyTreeNodeShow(child, brother_line, flag, all);}brother_line[cursor->level] = 0;} }/*遞歸遍歷存儲家譜信息*/ void recursiveFamilyTreeNodeSave(pTreeNode cursor, FILE* output) {if (cursor) {if (cursor->level > 0) {char format[STR_LEN] = { 0 };sprintf(format, "%%%ds", cursor->level);fprintf(output, format, " ");}fprintf(output, "%s ", cursor->member.name);fprintf(output, "%s ", cursor->member.wife);fprintf(output, "\n");for (int index = 0; index < cursor->count; ++index) {pTreeNode child = cursor->children[index];recursiveFamilyTreeNodeSave(child, output);}} }/*遞歸遍歷查詢家譜信息*/ pTreeNode recursiveFamilyTreeNodeFind(pTreeNode cursor, const char name[]) {if (cursor) {if (strcmp(cursor->member.name, name) == 0 || strcmp(cursor->member.wife, name) == 0) {return cursor;}for (int index = 0; index < cursor->count; ++index) {pTreeNode child = cursor->children[index];pTreeNode result = recursiveFamilyTreeNodeFind(child, name);if (result) {return result;}}}return NULL; }/*遞歸遍歷計算家譜成員數量信息*/ int recursiveFamilyTreeNodeCount(pTreeNode cursor) {int count = 0;if (cursor) {count = 1;for (int index = 0; index < cursor->count; ++index) {pTreeNode child = cursor->children[index];count += recursiveFamilyTreeNodeCount(child);}}return count; }/*遞歸遍歷清空家譜信息*/ void recursiveFamilyTreeNodeClear(pTreeNode cursor) {if (cursor) {for (int index = 0; index < cursor->count; ++index) {pTreeNode child = cursor->children[index];recursiveFamilyTreeNodeClear(child);}free(cursor);} }/*從文件中加載家譜信息*/ pTreeNode loadFamilyTree() {pTreeNode root = NULL;FILE* input = fopen("familytree.txt", "r");if (input) {pTreeNode cursor = NULL;char buffer[BUFFER_SIZE] = { 0 };while (fgets(buffer, sizeof(buffer), input)) {Member member = { 0 };if (sscanf(buffer, "%s %s", member.name, member.wife) == 2) {int level = countMemberLevel(buffer);if (level == 0) {assert(root == NULL);root = createTreeNode(NULL, &member);cursor = root;}else {int step = level - cursor->level;assert(step <= 1);if (step != 1) {int count = 0 - step + 1;while (count) {cursor = cursor->parent;--count;}}cursor = createTreeNode(cursor, &member);}}}fclose(input);}return root; }/*將家譜信息存儲到文件*/ void saveFamilyTree(pTreeNode root) {FILE* output = fopen("familytree.txt", "w");if (output) {recursiveFamilyTreeNodeSave(root, output);fclose(output);} }/*顯示家譜信息*/ void showFamilyTree(pTreeNode root, int all) {printf("╔-----------------------------------------╗\n");printf(" $ 顯示家譜信息 $\n");int* brother_line = (int*)calloc(1024, sizeof(int));if (all) {showFamilyMemberTitle();}recursiveFamilyTreeNodeShow(root, brother_line, 0, all);free(brother_line);printf("╚-----------------------------------------╝\n"); }/*添加家譜成員*/ void addFamilyTree(pTreeNode* root) {char name[STR_LEN] = { 0 };printf("╔-----------------------------------------╗\n");printf(" $ 添加家譜成員 $\n");printf(" 輸入新成員姓名:");scanf("%s", name);if (*root) {if (!recursiveFamilyTreeNodeFind(*root, name)) {pTreeNode target = NULL;char parentname[STR_LEN] = { 0 };printf(" 輸入新成員的父親或者母親名字(指定關系):");scanf("%s", parentname);target = recursiveFamilyTreeNodeFind(*root, parentname);if (target) {Member member = { 0 };strcpy(member.name, name);editFamilyMember(&member);createTreeNode(target, &member);saveFamilyTree(*root);showFamilyMemberTitle();showFamilyMember(&member, 1);printf("----------------\n");printf("成功添加以上家譜成員!\n");}else {printf("添加失敗,家譜中未找到該名字!\n");}}else {printf("添加失敗,該成員名稱已經存在!\n");}}else {Member member = { 0 };strcpy(member.name, name);editFamilyMember(&member);*root = createTreeNode(NULL, &member);saveFamilyTree(*root);showFamilyMemberTitle();showFamilyMember(&member, 1);printf("----------------\n");printf("成功添加以上家譜成員!\n");}printf("╚-----------------------------------------╝\n"); }/*刪除家譜成員*/ void removeFamilyTree(pTreeNode* root) {pTreeNode target = NULL;char name[STR_LEN] = { 0 };printf("╔-----------------------------------------╗\n");printf(" $ 刪除家譜成員 $\n");printf(" 輸入姓名:");scanf("%s", name);target = recursiveFamilyTreeNodeFind(*root, name);if (target) {showFamilyMemberTitle();showFamilyMember(&target->member, 1);removeTreeNode(target);recursiveFamilyTreeNodeClear(target);if (target == *root) {*root = NULL;}saveFamilyTree(*root);printf("----------------\n");printf("成功刪除以上家譜成員!\n");}else {printf(" 沒有找到相關信息!\n");}printf("╚-----------------------------------------╝\n"); }/*查找家譜成員*/ void findFamilyTree(pTreeNode root) {pTreeNode target = NULL;char name[STR_LEN] = { 0 };printf("╔-----------------------------------------╗\n");printf(" $ 查找家譜成員 $\n");printf(" 輸入姓名:");scanf("%s", name);target = recursiveFamilyTreeNodeFind(root, name);if (target) {int* brother_line = (int*)calloc(1024, sizeof(int));printf("---------------\n");showFamilyMemberTitle();showFamilyMember(&target->member, 1);printf("---------------\n");printf("【所有孩子】\n");recursiveFamilyTreeNodeShow(target, brother_line, 0, 0);free(brother_line);printf("【所有祖先】\n");showFamilyMemberTitle();while (target->parent) {target = target->parent;showFamilyMember(&target->member, 1);}}else {printf(" 沒有找到相關信息!\n");}printf("╚-----------------------------------------╝\n"); }/*修改家譜成員*/ void modifyFamilyTree(pTreeNode root) {pTreeNode target = NULL;char name[STR_LEN] = { 0 };printf("╔-----------------------------------------╗\n");printf(" $ 修改家譜成員 $\n");printf(" 輸入姓名:");scanf("%s", name);target = recursiveFamilyTreeNodeFind(root, name);if (target) {showFamilyMemberTitle();showFamilyMember(&target->member, 1);printf("----------------\n");editFamilyMember(&target->member);printf("----------------\n");saveFamilyTree(root);printf("成功修改以上家譜成員!\n");}else {printf(" 沒有找到相關信息!\n");}printf("╚-----------------------------------------╝\n"); }/*統計家譜成員*/ void statFamilyTree(pTreeNode root) {int count = recursiveFamilyTreeNodeCount(root);printf("╔-----------------------------------------╗\n");printf(" $ 統計家譜成員 $\n");printf(" 成員數量:%d\n", count);printf("╚-----------------------------------------╝\n"); }/*菜單操作*/ void menuOptions(pTreeNode root) {system("title 家族譜管理系統");while (1) {int option = 0;printf("╔-----------------------------------------╗\n");printf(" $ 家族譜管理系統 $\n");printf(" 1 # 顯示家譜(精簡)\n");printf(" 2 # 顯示家譜(完整)\n");printf(" 3 # 添加家譜成員\n");printf(" 4 # 刪除家譜成員\n");printf(" 5 # 查找家譜成員\n");printf(" 6 # 修改家譜成員\n");printf(" 7 # 統計家譜成員\n");printf(" 0 # 退出\n");printf("╚-----------------------------------------╝\n");printf(" 請選擇:");scanf("%d", &option);if (option == 0) break;switch (option) {case 1:showFamilyTree(root, 0);break;case 2:showFamilyTree(root, 1);break;case 3:addFamilyTree(&root);break;case 4:removeFamilyTree(&root);break;case 5:findFamilyTree(root);break;case 6:modifyFamilyTree(root);break;case 7:statFamilyTree(root);break;}} }/*主函數*/ int main() {/*從文件加載家譜信息*/pTreeNode root = loadFamilyTree();if (root) {/*進入操作菜單*/menuOptions(root);/*釋放家譜樹*/recursiveFamilyTreeNodeClear(root);}return 0; }

六.調試和運行情況簡述

本程序包括的兩個模塊,文件操作和家譜操作功能模塊,基本實現了家譜記錄輸入、讀取存盤記錄、清除家譜存盤記錄、添加成員、存盤、修改家譜成員信息、刪除家譜成員實現了查找某人記錄、查找某人的孩子、查找某人的祖先、輸出家譜等功能。但本系統還有一個缺點,如果文件中沒有家譜信息系統將不能正常打開

總結

以上是生活随笔為你收集整理的家族谱管理系统(C语言版)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。