Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Write a program in Java that will accept input and display a person\'s family tr

ID: 3689777 • Letter: W

Question

Write a program in Java that will accept input and display a person's family tree.

Explanation / Answer

package familytree; import java.io.PrintStream; public class FamilyTree { private static final int DISPLAY_FAMILY_MEMBERS = 1; private static final int ADD_FAMILY_MEMBER = 2; private static final int REMOVE_FAMILY_MEMBER = 3; private static final int EDIT_FAMILY_MEMBER = 4; private static final int SAVE_FAMILY_TREE = 5; private static final int LOAD_FAMILY_TREE = 6; private static final int DISPLAY_ANCESTORS = 7; private static final int DISPLAY_DESCENDANTS = 8; private static final int QUIT = 9; private Input in; private Family family; private PrintStream out; public FamilyTree(Input in, PrintStream out) { this.in = in; this.out = out; family = new Family(); } public void start() { out.println(" Welcome to the Family Tree Builder"); initialise(); while (true) { displayFamilyTreeMenu(); int command = getCommand(); if (quit(command)) { break; } executeOption(command); } } private int getCommand() { return getInteger(" Enter command: "); } private int getInteger(String message) { while (true) { out.print(message); if (in.hasNextInt()) { int n = in.nextInt(); in.nextLine(); return n; } else { in.nextLine(); out.println("Your input was not understood. Please try again."); } } } //good private void displayFamilyTreeMenu() { out.println(" Family Tree Menu"); out.println(DISPLAY_FAMILY_MEMBERS + ". Display Family Members"); out.println(ADD_FAMILY_MEMBER + ". Add Family Member"); out.println(REMOVE_FAMILY_MEMBER + ". Remove Family Member"); out.println(EDIT_FAMILY_MEMBER + ". Edit Family Member"); out.println(SAVE_FAMILY_TREE + ". Save Family Tree"); out.println(LOAD_FAMILY_TREE + ". Load Family Tree"); out.println(DISPLAY_ANCESTORS + ". Display Ancestors"); out.println(DISPLAY_DESCENDANTS + ". Display Descendants"); out.println(QUIT + ". Quit"); } //good private boolean quit(int opt) { return (opt == QUIT) ? true : false; } //good private void executeOption(int choice) { switch (choice) { case DISPLAY_FAMILY_MEMBERS: displayFamilyMembers(); break; case ADD_FAMILY_MEMBER: addFamilyMember(); break; case REMOVE_FAMILY_MEMBER: removeMember(); break; case EDIT_FAMILY_MEMBER: editMember(); break; case SAVE_FAMILY_TREE: saveFamilyTree(); break; case LOAD_FAMILY_TREE: loadFamilyTree(); break; case DISPLAY_ANCESTORS: displayAncestors(); break; case DISPLAY_DESCENDANTS: displayDescendants(); break; default: out.println("Not a valid option! Try again."); break; } } private void removeMember() { displayFamilyMembers(); int choice = selectMember(); if (choice >= 0) { FamilyMember f = family.getFamilyMember(choice); if (f.getIndex() == 0) { out.println("Cannot delete yourself!"); return; } deleteMember(f); } } private void deleteMember(FamilyMember f) { //remove from tree family.removeMember(f); //remove all links to this person if (f.hasParents()) { f.getMother().removeChild(f); f.getFather().removeChild(f); } if(f.getPartner()!=null){ f.getPartner().setPartner(null); f.setPartner(null); } if (f.hasChildren()) { for (FamilyMember member : f.getChildren()) { if (f == member.getMother()) { member.setMother(null); } if (f == member.getFather()) { member.setFather(null); } if (f == member.getPartner()) { member.setPartner(null); } } } } private void saveFamilyTree() { out.print("Enter file name: "); String fileName = in.nextLine(); FileOutput output = new FileOutput(fileName); family.save(output); output.close(); saveRelationships(); } private void saveRelationships() { FileOutput output = new FileOutput("Relationships.txt"); family.saveRelationships(output); output.close(); } private void loadFamilyTree() { out.print("Enter file name: "); String fileName = in.nextLine(); FileInput input = new FileInput(fileName); family.load(input); input.close(); loadRelationships(); } private void loadRelationships() { FileInput input = new FileInput("Relationships.txt"); family.loadRelationships(input); input.close(); } //for selecting family member for editing adding nodes etc private void displayFamilyMembers() { out.println(" Display Family Members"); int count = 0; for (FamilyMember member : family.getFamilyMembers()) { out.println(); if (count + 1 < 10) { out.println((count + 1) + ". " + member.getFirstName() + " " + member.getLastName()); out.println(" " + member.getGender()); out.println(" " + member.getDob()); out.println(" Generation: " + (member.getGeneration() + 1)); } else { out.println((count + 1) + ". " + member.getFirstName() + " " + member.getLastName()); out.println(" " + member.getGender()); out.println(" " + member.getDob()); out.println(" Generation: " + (member.getGeneration() + 1)); } count++; } } private int selectRelative() { out.println(" Select Relative"); out.println("1. Add Parents"); out.println("2. Add Child"); out.println("3. Add Partner"); out.println("4. Add Sibling"); //out.print(" Enter Choice: "); //int choice = in.nextInt(); int choice = getInteger(" Enter Choice: "); if (choice > 0 && choice < 5) { return choice; } return (-1); } private void addFamilyMember() { if (family.getFamilyMembers().isEmpty()) { out.println("No Members To Add To"); return; } int memberIndex = selectMember(); if (memberIndex >= 0) { FamilyMember member = family.getFamilyMember(memberIndex); int relative = selectRelative(); if (relative > 0) { out.println(" Add Member"); //if choice is valid switch (relative) { case 1: //adding parents FamilyMember mum, dad; if (!member.hasParents()) { out.println("Enter Mothers Details"); mum = addMember(relative, "Female"); out.println(" Enter Fathers Details"); dad = addMember(relative, "Male"); member.linkParent(mum); member.linkParent(dad); mum.linkPartner(dad); mum.setGeneration(member.getGeneration() - 1); dad.setGeneration(member.getGeneration() - 1); sortGenerations(); } else { out.println(member.getFirstName() + " " + member.getLastName() + " already has parents."); } break; case 2: //adding child if (member.getPartner() == null) { FamilyMember partner; if (member.getGender().equals("Male")) { out.println("Enter Mothers Details"); partner = addMember(1, "Female"); } else { out.println("Enter Fathers Details"); partner = addMember(1, "Male"); } //create partner member.linkPartner(partner); partner.setGeneration(member.getGeneration()); out.println(); } out.println("Enter Childs Details"); FamilyMember child = addMember(relative, ""); child.linkParent(member); child.linkParent(member.getPartner()); child.setGeneration(member.getGeneration() + 1); sortGenerations(); break; case 3: //adding partner if (member.getPartner() == null) { out.println("Enter Partners Details"); FamilyMember partner = addMember(relative, ""); member.linkPartner(partner); partner.setGeneration(member.getGeneration()); } else { out.println(member.getFirstName() + " " + member.getLastName() + " already has a partner."); } break; case 4: //adding sibling if (member.getFather() == null) { out.println("Enter Mothers Details"); mum = addMember(1, "Female"); out.println(" Enter Fathers Details"); dad = addMember(1, "Male"); member.linkParent(mum); member.linkParent(dad); mum.linkPartner(dad); mum.setGeneration(member.getGeneration() - 1); dad.setGeneration(member.getGeneration() - 1); sortGenerations(); out.println(" Enter Siblings Details"); } else { out.println("Enter Siblings Details"); } FamilyMember sibling = addMember(relative, ""); //create mum and dad mum = member.getMother(); dad = member.getFather(); sibling.linkParent(mum); sibling.linkParent(dad); sibling.setGeneration(member.getGeneration()); break; } } else { out.println("Invalid Option!"); } } else { out.println("Invalid Option!"); } } private int selectMember() { displayFamilyMembers(); //out.print(" Select Member: "); //int choice = in.nextInt(); int choice = getInteger(" Select Member: "); if (choice > 0 && choice = 0) { out.println("Select Detail To Edit: "); out.println("1. Name"); out.println("2. Gender"); out.println("3. Date of Birth"); //out.print(" Enter Choice: "); //int opt = in.nextInt(); int opt = getInteger(" Enter Choice: "); if (opt > 0 && opt < 4) { switch (opt) { case 1: //name out.print("Enter New First Name: "); String fName = in.nextLine(); out.print("Enter New Last Name: "); String lName = in.nextLine(); family.changeName(fName, lName, choice); break; case 2: //Gender FamilyMember f = family.getFamilyMember(choice); String gender = f.getGender(); if (f.getChildren().isEmpty()) { gender = selectGender(); family.changeGender(gender, choice); } else { //swap genders //swap mother father relationships for kids swapGenders(f, choice); } break; case 3: String dob = enterDateOfBirth(); family.changeDOB(dob, choice); } } else { out.println("Invalid Choice!"); } } } private FamilyMember addMember(int option, String gender) { out.print("Enter First Name: "); String fName = formatString(in.nextLine().trim()); out.print("Enter Last Name: "); String lName = formatString(in.nextLine().trim()); //String gender; if (option != 1) { //if not adding parents gender = selectGender(); } String dob = enterDateOfBirth(); FamilyMember f = family.getFamilyMember(family.addMember(fName, lName, gender, dob)); f.setIndex(family.getFamilyMembers().size() - 1); return (f); } private String selectGender() { String gender = null; out.println("Select Gender"); out.println("1. Male"); out.println("2. Female"); //out.print("Enter Choice: "); //int gOpt = in.nextInt(); int gOpt = getInteger("Enter Choice: "); if (gOpt == 1) { gender = "Male"; } else if (gOpt == 2) { gender = "Female"; } else { out.println("Invalid Choice"); } return gender; } private void swapGenders(FamilyMember f, int choice) { String gender; out.println(" NOTE: Editing A Parent Nodes Gender Will Swap Parents Genders " + "And Swap Mother/Father Relationships For All Children."); out.println(" Continue:"); out.println("1. Yes"); out.println("2. No"); //out.print(" Enter Choice: "); //int select = in.nextInt(); int select = getInteger(" Enter Choice: "); if (select > 0 && select < 3) { switch (select) { case 1: //swap relationships gender = selectGender(); //if selected gender is different if (!gender.equals(f.getGender())) { //swap String g = f.getGender(); family.changeGender(gender, choice); family.changeGender(g, f.getPartner().getIndex()); if (g.equals("Male")) { for (FamilyMember m : f.getChildren()) { m.setMother(f); m.setFather(f.getPartner()); } } else { for (FamilyMember m : f.getChildren()) { m.setFather(f); m.setMother(f.getPartner()); } } } break; case 2: break; } } else { out.println("Invalid Choice"); } } private String formatString(String s) { String firstLetter = s.substring(0, 1); String remainingLetters = s.substring(1, s.length()); s = firstLetter.toUpperCase() + remainingLetters.toLowerCase(); return s; } private String enterDateOfBirth() { out.print("Enter Year Of Birth (0 - 2011): "); String y = in.nextLine(); out.print("Enter Month Of Birth (1-12): "); String m = in.nextLine(); if (m.trim().equals("")) { m = "0"; } if (Integer.parseInt(m) < 10) { m = "0" + m; } m += "-"; out.print("Enter Date of Birth (1-31): "); String d = in.nextLine(); if (d.trim().equals("")) { d = "0"; } if (Integer.parseInt(d) < 10) { d = "0" + d; } d += "-"; String dob = d + m + y; while (!DateValidator.isValid(dob)) { out.println("Invalid Date. Try Again:"); dob = enterDateOfBirth(); } return (dob); } private void displayAncestors() { out.print(" Display Ancestors For Which Member: "); int choice = selectMember(); if (choice >= 0) { FamilyMember node = family.getFamilyMember(choice); FamilyMember ms = findRootNode(node, 0, 2, -1); FamilyMember fs = findRootNode(node, 1, 2, -1); out.println(" Print Ancestors"); out.println(" Mothers Side"); if(ms==null){ out.println("Member has no mother"); }else{ printDescendants(ms, node, ms.getGeneration()); } out.println(" Fathers Side"); if(fs==null){ out.println("Member has no father"); }else{ printDescendants(fs, node, fs.getGeneration()); } } else { out.println("Invalid Option!"); } } private void displayDescendants() { out.print(" Display Descendants For Which Member: "); int choice = selectMember(); if (choice >= 0) { FamilyMember node = family.getFamilyMember(choice); out.println(" Print Descendants"); printDescendants(node, null, 0); } else { out.println("Invalid Option!"); } } private FamilyMember findRootNode(FamilyMember node, int parent, int numGenerations, int count) { FamilyMember root; count++; if (count
Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote