// michaekt g-3 o-1 // filen er utf-8 import easyIO.*; import java.io.*; import java.util.*; /** * @author Michael Thung (michaekt [at] ifi [dot] uio [dot] no) * * Tar seg av folkeregisteret i Ruritania, og holder rede på slektskapsforhold * mellom landets innbyggere. */ class Oblig1 { // Dette er kontrolleren. Register r; Utsyn v; public static void main(String[] args) { Oblig1 k = new Oblig1(); } Oblig1() { // starter modell og utsyn r = new Register(); v = new Utsyn(); programLoop(); } /** * Tar seg av selve kjøringen av programmet. */ private void programLoop() { // skriv ut menyen først. v.skrivMeny(); boolean boolKjorer = true; while(boolKjorer) { int intValg = v.hentHeltall("\nValg (0 for meny): "); switch(intValg) { case 0: v.skrivMeny(); break; case 1: registrerPerson(); break; case 2: visPerson(); break; case 3: nyForelder(); break; case 4: registrerEkteskap(); break; case 5: kjorSkilsmisse(); break; case 6: v.skrivTekst("Til fil"); break; case 7: v.skrivTekst("Fra fil"); break; case 8: v.skrivTekst("Flest egne barn"); break; case 9: v.skrivTekst("Skriv søsken"); break; case 10: v.skrivTekst("Fetter/kusine"); break; case 11: boolKjorer = false; break; default: v.skrivTekst("Forventer et tall mellom 0 og 11! Prøv igjen."); } } } /** * Registrerer ny person med eventuelle foreldre. */ private void registrerPerson() { // registrerer person v.skrivTekst("\nRegistrer ny person\n" + "-------------------"); String strNavn = v.hentTekst("Navn på person: "); char kjonn = Character.toLowerCase(v.hentTegn("Kjønn (m eller k): ")); if (kjonn != 'm' && kjonn != 'k') { v.skrivTekst("Forventer enten k for kvinne eller m for mann. Gå tilbake og prøv igjen!"); return; } Person p = (kjonn == 'm') ? new Mann(strNavn) : new Kvinne(strNavn); // registrerer foreldre String strMorsNavn = v.hentTekst("Navn på mor: "); String strFarsNavn = v.hentTekst("Navn på far: "); Kvinne mor; Mann far; if (strMorsNavn.equals("?")) { mor = null; } else { mor = new Kvinne(strMorsNavn); } if (strFarsNavn.equals("?")) { far = null; } else { far = new Mann(strFarsNavn); } r.nyPerson(strNavn, p, mor, far); v.skrivTekst("Ny person: " + strNavn + " lagt til i registeret."); } /** * Viser person med tilhørende info. */ private void visPerson() { String strNavn = v.hentTekst("Navnet på personen du ønsker å vise: "); if (!r.personFinnes(strNavn)) { v.skrivTekst("Denne personen finnes ikke. Gå tilbake og prøv igjen!"); return; } else { Person p = r.hentPerson(strNavn); v.skrivTekst("\nNavn: " + p.toString()); String kjonn = (p instanceof Mann) ? "Mann" : "Kvinne"; v.skrivTekst("Kjønn: " + kjonn); v.skrivTekst("Status: " + r.giftStatus(p.toString())); String mor = (r.hentMor(strNavn) == null) ? "Ukjent" : r.hentMor(strNavn).toString(); String far = (r.hentFar(strNavn) == null) ? "Ukjent" : r.hentFar(strNavn).toString(); v.skrivTekst("Navn på mor: " + mor); v.skrivTekst("Navn på far: " + far); // sjekker barn og skriver eventuelt navnene på dem if (p.antallBarn() != 0) { v.skrivTekst("Antall barn: " + p.antallBarn()); v.skrivTekst("Barnas navn:"); String[] strBarnasNavn = p.hentAlleBarn(); String strListe = ""; for (int x = 0; x < strBarnasNavn.length; x++) { strListe += strBarnasNavn[x] + " "; } v.skrivTekst(strListe); } else { v.skrivTekst("Har ingen barn."); } } } /** * Legger inn ny forelder */ private void nyForelder() {} /** * Registrerer ekteskap mellom to personer. */ private void registrerEkteskap() { v.skrivTekst("\nRegistrer ekteskap\n" + "------------------"); String strNavnEktemann = v.hentTekst("Navn på ektemann: "); String strNavnHustru = v.hentTekst("Navn på hustru: "); // Sjekker at begge er registrerte if (!r.personFinnes(strNavnEktemann) || !r.personFinnes(strNavnHustru)) { v.skrivTekst("Ett eller begge navnene du oppga finnes ikke. Gå tilbake og prøv igjen!"); return; } Person k = r.hentPerson(strNavnHustru); Person m = r.hentPerson(strNavnEktemann); // Sjekker at vi har riktige instanser av kvinne og mann if (!(k instanceof Kvinne) || !(m instanceof Mann)) { v.skrivTekst("Navnene du oppga stemmer ikke overens. Gå tilbake og prøv igjen!"); return; // passer på at ingen allerede er gifte } else if (m.erGift() || k.erGift()) { v.skrivTekst("En eller begge av personene er alt gift. Gå tilbake og prøv igjen!"); return; } // bryllupsseremoni! r.bryllup((Mann) m, (Kvinne) k); v.skrivTekst(m.toString() + " og " + k.toString() + " er nå gift!"); } private void kjorSkilsmisse() { v.skrivTekst("\nRegistrer skilsmisse\n" + "--------------------"); String strNavnEktemann = v.hentTekst("Navn på ektemann: "); String strNavnHustru = v.hentTekst("Navn på hustru: "); // Sjekk at begge er registrerte if (!r.personFinnes(strNavnEktemann) || !r.personFinnes(strNavnHustru)) { v.skrivTekst("Ett eller begge navnene du oppga finnes ikke. Gå tilbake og prøv igjen!"); return; } Person k = r.hentPerson(strNavnHustru); Person m = r.hentPerson(strNavnEktemann); // Sjekker at personene er gift med hverandre (trenger ikke sjekke kjønn, osv) if (!(m.hentEktefelle().toString()).equals(k.toString())) { v.skrivTekst("Personene du oppga er ikke gift med hverandre. Gå tilbake og prøv igjen!"); return; } // skilsmisse! r.skilsmisse((Mann) m, (Kvinne) k); v.skrivTekst(m + " og " + k + " er nå skilt!"); } } /** * Tar seg av å hente og vise informasjon til brukeren. */ class Utsyn { In inn = new In(); /** * Henter tekst-data fra brukeren */ public String hentTekst(String strTekst) { System.out.print(strTekst); return inn.inLine(); } /** * Henter en verdi fra brukeren. */ public int hentHeltall(String strTekst) { System.out.print(strTekst); return inn.inInt(); } /** * Henter et tegn fra brukeren. */ public char hentTegn(String strTekst) { System.out.print(strTekst); return inn.inChar(); } /** * Skriver tekst til skjerm. */ public void skrivTekst(String strTekst) { System.out.println(strTekst); } /** * Skriver menyen til skjerm. */ public void skrivMeny() { System.out.print("\n\nPersonregister\n\n" + " 1) Registrer ny person\n" + " 2) Vis person\n" + " 3) Ny far/mor\n" + " 4) Registrer ekteskap\n" + " 5) Registrer skilsmisse\n" + " 6) Til fil\n" + " 7) Fra fil\n" + " 8) Flest egne barn\n" + " 9) Skriv søsken\n" + "10) Fetter/kusine\n" + "11) Avslutt\n"); } } /** * Datamodellen for registeret. */ class Register { // Her begynner selve modellen. HashMap personer = new HashMap(); /** * Registrerer ny person. */ protected void nyPerson(String n, Person p, Kvinne mor, Mann far) { // sjekk om mor eller far eksisterer fra før, eventuelt registrerer dem. if (mor != null) { if (!personFinnes(mor.toString())) { personer.put(mor.toString(), mor); } } if (far != null) { if (!personFinnes(far.toString())) { personer.put(far.toString(), far); } } // Registrerer foreldrene til personen i objektet, og legger personen inn. p.nyMor(mor); p.nyFar(far); personer.put(n, p); } protected boolean personFinnes(String n) { if (personer.containsKey(n)) { return true; } else { return false; } } protected Person hentPerson(String n) { return personer.get(n); } protected Kvinne hentMor(String n) { Person p = hentPerson(n); return p.hentMor(); } protected Mann hentFar(String n) { Person p = hentPerson(n); return p.hentFar(); } protected String giftStatus(String n) { Person p = personer.get(n); if (!p.erGift()) { return "Ugift"; } else { return "Gift med " + p.hentEktefelle().toString(); } } protected void bryllup(Mann m, Kvinne k) { m.giftMedPerson(k); k.giftMedPerson(m); } protected void skilsmisse(Mann m, Kvinne k) { m.fjernEktefelle(); k.fjernEktefelle(); } } /** * Superklasse for person-objektene */ abstract class Person { String strNavn; Person ektefelle; Mann far; Kvinne mor; int intAntallBarn; Person(String n) { this.strNavn = n; intAntallBarn = 0; } /** * toString-metode for personer som returnerer navnet. */ public String toString() { return strNavn; } /** * Fjerner feil mor, og legger inn ny mor. */ public void nyMor(Kvinne k) { mor = k; // legger inn personen som morens barn mor.nyttBarn(strNavn, this); } /** * Fjerner eventuell feil far, og legger inn ny far. */ public void nyFar(Mann m) { far = m; // legger inn personen som farens barn far.nyttBarn(strNavn, this); } /** * Henter personens mor */ public Kvinne hentMor() { return mor; } /** * Henter personens far */ public Mann hentFar() { return far; } /** * Inngår ekteskap med en person */ public void giftMedPerson(Person p) { ektefelle = p; } /** * Tar ut skilsmisse med en person */ public void fjernEktefelle() { ektefelle = null; } /** * Sjekker om personen er gift */ public boolean erGift() { if (ektefelle == null) { return false; } else { return true; } } /** * Returnerer antall barn */ public int antallBarn() { return intAntallBarn; } /** * Returnerer personens ektefelle */ public Person hentEktefelle() { return ektefelle; } //public void nyttBarn(String n, Person p) {} abstract String[] hentAlleBarn(); //public void fjernBarn(String n) {} } /** * Subklasse av person for hankjønn. */ class Mann extends Person { HashMap barn = new HashMap(); Mann(String n) { super(n); } /** * Legger inn nytt barn i modellen for far. */ public void nyttBarn(String n, Person p) { barn.put(n, p); intAntallBarn++; } public String[] hentAlleBarn() { String[] strBarneNavn = new String[barn.size()]; int intAnt = 0; // går gjennom hashmapen med barn og legger navnene inn i et array. for (String s: barn.keySet()) { strBarneNavn[intAnt] = s; intAnt++; } return strBarneNavn; } /** * Fjerner barnet fra personen */ public void fjernBarn(String n) { barn.remove(n); intAntallBarn--; } } /** * Subklasse av person for hunkjønn. */ class Kvinne extends Person { Person[] barn = new Person[10]; Kvinne(String n) { super(n); } /** * Legger inn nytt barn i modellen for mor. */ public void nyttBarn(String n, Person p) { // legg barnet til på slutten av arrayet. for (int x = 0; x < barn.length; x++) { if (barn[x] == null) { barn[x] = p; break; } } intAntallBarn++; } /** * Henter alle barnas navn */ public String[] hentAlleBarn() { String[] strBarneNavn = new String[intAntallBarn]; int intAnt = 0; // Går gjennom arrayet med barn og legger navnene inn i et nytt. for (int x = 0; x < barn.length; x++) { if (barn[x] != null) { strBarneNavn[intAnt] = barn[x].toString(); intAnt++; } } return strBarneNavn; } /** * Fjerner barnet fra personen */ public void fjernBarn(String n) { for (int x = 0; x < barn.length; x++) { if ((barn[x].toString()).equals(n)) { barn[x] = null; } } intAntallBarn--; } }