Avatar billede nocol Nybegynder
13. januar 2003 - 13:00 Der er 40 kommentarer og
2 løsninger

hey problemer med program til at holde styr på medlemmer af sarp

Hey
jeg forsøger at lave et lille program i java som skulle holde styr på hvem vi har medlemmer. Hvad er galt med koden nedenfor??

import java.io.*;

public class Personregister
{
    public static void main(String [] args) throws IOException
    {
        Person oversigt = new Person ();

        oversigt.tilfoj    ("soren Lerby",111177,"Drumdonsbedvej");
        oversigt.tilfoj    ("Michael Laudrup",150667,"Herlufholsvej");
        oversigt.tilfoj    ("Diego Maradona",141256,"Maglekildevej");
        oversigt.tilfoj    ("Zamorano",291167,"Succesvej");
        oversigt.tilfoj    ("Ukendt",111111,"Ukendt");

        System.out.println (oversigt);

    }
}

class Person
{
    private Mennesker[] register;
    private int antal;

    public Person()
    {
        register = new Mennesker[5];
        antal = 0;
    }

    public void tilfoj (String navn, int cpr, String adr)
    {
        register[antal] = new Mennesker (navn, cpr, adr);
        antal++;
    }
}

class Mennesker
{
    private String navn, adr;
    private int cpr;

    public Mennesker (String name, int number, String adresse)
    {
        navn = name;
        cpr = number;
        adr = adresse;
    }
}
Avatar billede nocol Nybegynder
13. januar 2003 - 13:02 #1
Det er muligt at jeg kommer med et spm. mere senere - da jeg gerne skulle have det til at arbejde sammen med noget GUI - altså så man kan søge på hvem der er medlemmer ud fra et navn eller cpr.nr....

Men lad os nu først lige få løst dette her!
Avatar billede hbhansen Nybegynder
13. januar 2003 - 13:05 #2
Øhh, koden ser rigtig ud, hvad giver den da af fejl?
Avatar billede nocol Nybegynder
13. januar 2003 - 13:09 #3
en runtime fejl - den compiler fint, men giver en fejl i dos. Den skulle jo gerne skrive alle mine "personer" ud - det GØR DEN IKKE....
Avatar billede hbhansen Nybegynder
13. januar 2003 - 13:10 #4
Prøv at bruge:
  System.out.println(oversigt.toString());
Istedet for:
  System.out.println (oversigt);
Avatar billede nocol Nybegynder
13. januar 2003 - 13:16 #5
men jeg har jo ingen toString metode...Det er måske lige meget?
Avatar billede hbhansen Nybegynder
13. januar 2003 - 13:17 #6
Jep, den er med i alle klasser, da den findes i klassen Object som arves af alle klasser! (Skulle jeg mene :-))
Avatar billede nocol Nybegynder
13. januar 2003 - 13:17 #7
Det hjalp heller ikke - stadig samme fejl!
Avatar billede soreno Praktikant
13. januar 2003 - 13:17 #8
Jeg tror jeg ville tilføje en metode til Person der udskriver personerne:

public String toString()
{
  StringBuffer sb = new StringBuffer();
  for(int i=0;i<antal;i++)
  {
      String temp = "person[" + i + "]";
      sb.append(temp);
      sb.append(register[i]);
  }
  return sb.toString();
}

Også tilføje samme medtode til Menneske klassen:
public String toString()
{
  return "[" + navn + "][" + cpr + "][" + adr + "]";
}
Avatar billede soreno Praktikant
13. januar 2003 - 13:20 #9
Hvis du synes det er forvirrende at bruge forskellige variabelnavne kan du f.eks. gøre sådan:
class Mennesker
{
    private String navn, adr;
    private int cpr;

    public Mennesker (String navn, int cpr, String adr)
    {
        this.navn = navn;
        this.cpr = cpr;
        this.adr = adr;
    }
}

Så er det måske nemmere at holde styr på ?
Avatar billede nocol Nybegynder
13. januar 2003 - 13:21 #10
Ok..er lige tabt...

Gider du prøve at vise mig det hele i en samlet oversigt - altså dit indflettet i mit...Kan ikke lige se hvad du mener??? - sorry -
Avatar billede soreno Praktikant
13. januar 2003 - 13:22 #11
Hvis nu en af personerne ændre navn kunne det måske være rart at kunne gøre, så derfor kan det være en god ide at lave get/set metoder til dine datamembers.

F.eks.
class Mennesker
{
..

  public String getNavn()
  {
    return this.navn;
  }

  public void setNavn(String navn)
  {
    this.navn = navn;
  }
}
Avatar billede arne_v Ekspert
13. januar 2003 - 13:22 #12
import java.io.*;

public class Personregister {
    public static void main(String[] args) throws IOException {
        Person oversigt = new Person();

        oversigt.tilfoj("soren Lerby", 111177, "Drumdonsbedvej");
        oversigt.tilfoj("Michael Laudrup", 150667, "Herlufholsvej");
        oversigt.tilfoj("Diego Maradona", 141256, "Maglekildevej");
        oversigt.tilfoj("Zamorano", 291167, "Succesvej");
        oversigt.tilfoj("Ukendt", 111111, "Ukendt");

        System.out.println(oversigt);

    }
}

class Person {
    private Mennesker[] register;
    private int antal;

    public Person() {
        register = new Mennesker[5];
        antal = 0;
    }

    public void tilfoj(String navn, int cpr, String adr) {
        register[antal] = new Mennesker(navn, cpr, adr);
        antal++;
    }

    public String toString() {
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < register.length; i++) {
            if (i > 0)
                sb.append(",");
            sb.append(register[i]);
        }
        return sb.toString();
    }
}

class Mennesker {
    private String navn, adr;
    private int cpr;

    public Mennesker(String name, int number, String adresse) {
        navn = name;
        cpr = number;
        adr = adresse;
    }

    public String toString() {
        return (navn + " " + adr + " " + cpr);
    }
}
Avatar billede hbhansen Nybegynder
13. januar 2003 - 13:22 #13
Soreno's forslag med en toString er god, men den  virker nok ikke hvis ikke oversigt.toString() virker!
Hmm, hvilke runtime fejl giver den?
Avatar billede arne_v Ekspert
13. januar 2003 - 13:24 #14
Du kan iøvrigt ikke gemme et CPR nummer i en int.
Avatar billede soreno Praktikant
13. januar 2003 - 13:24 #15
import java.util.*;
class Person
{
    private Mennesker[] register;
    private int antal;

    public Person()
    {
        register = new Mennesker[5];
        antal = 0;
    }

    public void tilfoj (String navn, int cpr, String adr)
    {
        register[antal] = new Mennesker (navn, cpr, adr);
        antal++;
    }

public String toString()
{
  StringBuffer sb = new StringBuffer();
  for(int i=0;i<antal;i++)
  {
      String temp = "person[" + i + "]";
      sb.append(temp);
      sb.append(register[i]);
  }
  return sb.toString();
}
}


class Mennesker
{
    private String navn, adr;
    private int cpr;

    public Mennesker (String name, int number, String adresse)
    {
        navn = name;
        cpr = number;
        adr = adresse;
    }

public String toString()
{
  return "[" + navn + "][" + cpr + "][" + adr + "]";
}
}
Avatar billede nocol Nybegynder
13. januar 2003 - 13:26 #16
til arne v

Hvad mener du med at jeg ikke kan gemme cprnr som en int og hvorfor?? Hvad skal jeg så bruge?
Avatar billede cozey Nybegynder
13. januar 2003 - 13:28 #17
char
Avatar billede nocol Nybegynder
13. januar 2003 - 13:30 #18
ok - nu skriver den det bare ud lidt dumt - hvad nu hvis jeg gerne ville have den til at skrive ud på hver linie, altså:
navn, cpr, adr
navn, cpr, adr
osv...

kan det undgås at den skriver person[0] osv. med ud??
Avatar billede arne_v Ekspert
13. januar 2003 - 13:32 #19
Hvis du vil have dem skrevet ud med en person per linie, så
skal du ikek bruge toString.

Man kan godt sætte linie-skift ind i den, men det er ikke pænt !
Avatar billede soreno Praktikant
13. januar 2003 - 13:33 #20
så kan du tilføje et linie skift hvor du synes det er nødvendigt
public String toString()
{
  StringBuffer sb = new StringBuffer();
  for(int i=0;i<antal;i++)
  {
      String temp = "person[" + i + "]";
      sb.append(temp);
      sb.append(register[i]);
      sb.append("\n");
  }
  return sb.toString();
}
}

OBS. det er ikke helt korrekt at gøre det på den måde - men jeg synes i dit tilfælde er det det nemmeste.
Avatar billede nocol Nybegynder
13. januar 2003 - 13:34 #21
ok, men så må du hjælpe mig med hvad jeg så skal bruge? - og igen hvorfor ikke bruge int til cprnr?
Avatar billede arne_v Ekspert
13. januar 2003 - 13:34 #22
Den største int hedder 2147xxxxxx d.v.s. at du ikke kan
gemme CPR-numre fo rpersoner som er født 22.-31. i en int !

Brug String i.s.f.. Så kan du også sætte en streg ind mellem de 6 og de 4.
Avatar billede arne_v Ekspert
13. januar 2003 - 13:37 #23
import java.io.*;

public class Personregister {
    public static void main(String[] args) throws IOException {
        Person oversigt = new Person();

        oversigt.tilfoj("soren Lerby", 111177, "Drumdonsbedvej");
        oversigt.tilfoj("Michael Laudrup", 150667, "Herlufholsvej");
        oversigt.tilfoj("Diego Maradona", 141256, "Maglekildevej");
        oversigt.tilfoj("Zamorano", 291167, "Succesvej");
        oversigt.tilfoj("Ukendt", 111111, "Ukendt");

        oversigt.print(System.out);

    }
}

class Person {
    private Mennesker[] register;
    private int antal;

    public Person() {
        register = new Mennesker[5];
        antal = 0;
    }

    public void tilfoj(String navn, int cpr, String adr) {
        register[antal] = new Mennesker(navn, cpr, adr);
        antal++;
    }

    public String toString() {
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < antal; i++) {
            if (i > 0)
                sb.append(",");
            sb.append(register[i]);
        }
        return sb.toString();
    }
   
    public void print(PrintStream ps) {
        for (int i = 0; i < antal; i++) {
            ps.println(register[i]);
        }
    }
}

class Mennesker {
    private String navn, adr;
    private int cpr;

    public Mennesker(String name, int number, String adresse) {
        navn = name;
        cpr = number;
        adr = adresse;
    }

    public String toString() {
        return (navn + " " + adr + " " + cpr);
    }
}
Avatar billede nocol Nybegynder
13. januar 2003 - 13:39 #24
Fortsætter lige med arbejde lidt på det - vender tilbage senere - mht. til at få personregister til at arbejde sammen med GUI!

Er det svært at lave det sådan så en given bruger taster et cpr.nr. ind og klikker på en knap der hedder søg (og programmet så søger i arrayet) og der så herefter kommer en person frem med cprnr. navn og adresse i hver sin label?
altså sådan her lidt "krreativt" illustreret grafisk:

|--------------------|
|Cprnr.: XXXXXXXXX  |
|____________________|

|--------------------|
|navn: XXXXXXXXX    |
|____________________|

|--------------------|
|Adresse: XXXXXXXXX  |
|____________________|
Avatar billede arne_v Ekspert
13. januar 2003 - 13:39 #25
Ovenstående udskriver dem eksplicit med en person per linie.

Grunden til at jeg ikke kan lide linie-skift i toString er at
det kan totalt fucke output up, når man i andre sammenhænge
bruger toString og forventer at det komemr ud i en linie.
Avatar billede arne_v Ekspert
13. januar 2003 - 13:40 #26
Nej en sådan søgning er lavet masser af gange før.
Avatar billede nocol Nybegynder
13. januar 2003 - 13:43 #27
Til Arne - hvad gjorde du helt præcist for at fjerne det der viser hvor ia arrayet den enkelte person er placeret??

Til Arne og Soreno - Jeg har aldrig, i min korte tid som java-"programmør" set brugen af
sb.append(temp);
sb.append(register[i]);
sb.append("\n");

Hvad betyder det sb.append??
Avatar billede soreno Praktikant
13. januar 2003 - 13:46 #28
StringBuffer bruges, af performance (hastighed) hensyn, istedet for f.eks.
String test = "Hello";
test = test + " ";
test = test + "world";
Avatar billede arne_v Ekspert
13. januar 2003 - 13:49 #29
public String toString() {
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < antal; i++) {
            if (i > 0)
                sb.append(",");
            sb.append(register[i]);
        }
        return sb.toString();
    }
   
gør det samme som:

}

    public String toString() {
        String res = "";
        for (int i = 0; i < antal; i++) {
            if (i > 0)
                res = res + ",";
            res = res + register[i];
        }
        return res;
    }
   
Men StringBuffer og append er bare mere effektivt (kører
hurtigere).
Avatar billede arne_v Ekspert
13. januar 2003 - 13:51 #30
Jeg forstå ikke spørgsmålet:
  hvad gjorde du helt præcist for at fjerne det der viser hvor ia arrayet den enkelte person er placeret??

Hvis ikke man skriver array indexet ud, så bliver de jo bare skrevet ud.
Avatar billede nocol Nybegynder
14. januar 2003 - 10:11 #31
Hey Arne V - håber du er derude...

Jeg har nu forsøgt og forsøgt, men kan ikke finde en løsning på mit problem.
Ideen med programmet er, at ved at taste et cprnr ind, kun de første 6 ciffre foreløbig, så skulle den gerne finde cpr.nr, navn og adresse udfra arrayet og samtidig dele dem op så de kommer i hver sin label....

Jeg kan ikke finde ud af det - har forsøgt med en if-sætning men ved ikke om det er vejen frem...

Det har også gjort at jeg er kommet lidt i tvivl om mit program - hvad kalder jeg egentlig mit array - altså hvad hedder det...Jeg er helt tom i hovedet lige nu...

Programmet ser pt sådan her ud:
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;

public class GuiMouse extends JFrame
{
    JTextField tal1;
    JTextField cpr_nr;
    JTextField navn;
    JTextField adresse;
    JButton knap;
    JLabel overskrift;

      public GuiMouse()
      {
        tal1 = new JTextField(10);
                cpr_nr = new JTextField(10);
                navn = new JTextField(10);
                adresse = new JTextField(10);
        knap = new JButton("Find person");
        overskrift = new JLabel("Medlemmer");

        Container cp = getContentPane();
        cp.setLayout(new FlowLayout());

      cp.add(overskrift);
      cp.add(tal1);
      cp.add(knap);
      cp.add(cpr_nr);
      cp.add(navn);
      cp.add(adresse);

    }

    public static void main(String[] args)
    {
      GuiMouse nyFrame = new GuiMouse();
      nyFrame.setSize(200,200);
      nyFrame.setVisible(true);
    }

    private class MinLytter extends MouseAdapter
    {
      public void mouseClicked(MouseEvent e)
      {
        Person oversigt = new Person();

        oversigt.tilfoj("soren Lerby", 111177, "Drumdonsbedvej");
        oversigt.tilfoj("Michael Laudrup", 150667, "Herlufholsvej");
        oversigt.tilfoj("Diego Maradona", 141256, "Maglekildevej");
        oversigt.tilfoj("Zamorano", 291167, "Succesvej");
        oversigt.tilfoj("Ukendt", 111111, "Ukendt");

                        //System.out.print(oversigt);



      int tal = Integer.parseInt(tal1.getText());
      cpr_nr.setText("Cpr-nr.:");
      navn.setText("Navn:" );
      adresse.setText("Adresse:");
      }
    }
}

class Person
{
    private Mennesker[] register;
    private int antal;

    public Person()
    {
        register = new Mennesker[5];
        antal = 0;
    }

    public void tilfoj(String navn, int cpr, String adr)
    {
        register[antal] = new Mennesker(navn, cpr, adr);
        antal++;

    }

  public String toString() {
          String res = "";
          for (int i = 0; i < antal; i++) {
              if (i > 0)
                  res = res + ",";
              res = res + register[i];
          }
          return res;
      }

}

class Mennesker
{
    String navn, adr;
    int cpr;

    public Mennesker(String name, int number, String adresse)
    {
        navn = name;
        cpr = number;
        adr = adresse;

    }

  public String toString()
    {
        return (navn + " " + adr + " " + cpr);
    }
Avatar billede arne_v Ekspert
14. januar 2003 - 10:18 #32
Det skal være et eller andet i stil med:

class Person
{
    private Mennesker[] register;
    private int antal;

    public Person()
    {
        register = new Mennesker[5];
        antal = 0;
    }

    public void tilfoj(String navn, int cpr, String adr)
    {
        register[antal] = new Mennesker(navn, cpr, adr);
        antal++;

    }

  public Menneske find(String navn) {
          for (int i = 0; i < antal; i++) {
              if(register[i].getNavn().equals(navn)) return register[i];
          }
          return null;
    }
  public String toString() {
          String res = "";
          for (int i = 0; i < antal; i++) {
              if (i > 0)
                  res = res + ",";
              res = res + register[i];
          }
          return res;
      }

}

class Mennesker
{
    String navn, adr;
    int cpr;

    public Mennesker(String name, int number, String adresse)
    {
        navn = name;
        cpr = number;
        adr = adresse;

    }

  public String toString()
    {
        return (navn + " " + adr + " " + cpr);
    }

    public String getNavn() {
        return navn;
    }
}
Avatar billede nocol Nybegynder
14. januar 2003 - 10:27 #33
ok - det forstår jeg ikke helt...Hvor er sammenligningen - altså hvor finder den ud af hvilket nummer i arrayet det søgte cpr hører til?
Avatar billede arne_v Ekspert
14. januar 2003 - 10:45 #34
Den fandt ikke nummeret men personen.

Hvsi du vil have neummeret så er det:

    public int find(String navn) {
          for (int i = 0; i < antal; i++) {
              if(register[i].getNavn().equals(navn)) return i;
          }
          return -1;
    }
Avatar billede convinius Nybegynder
14. januar 2003 - 13:27 #35
spændende...jeg vil også lære det der.

Er i kommet frem til hvilken kode der er rigtig.

Må jeg gerne se den GUI du er kommet frem til.
Hmm...så noget helt sidste....hvordan kobler man GUI og kodningen!
Avatar billede convinius Nybegynder
14. januar 2003 - 14:38 #36
kan man bruge det her...sidder lige og fumler med en gammel opgave. som jeg har prøvet at lave lidt om:


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Gui extends xxxxx implements xxxx

{
    private Button sog, slut;                             private TextField cpr, navn, adresse;                    private int cprint;               
        private int korrekt_resultat;           
    public Gui()
    //konstruktør, sætter vinduet op
    {
    setSize(200,200);                   
        setLocation(150,150);           
    setTitle(getClass().getName());       
   
Container cP= getContentPane();       
cP.setLayout(new FlowLayout());       

cP.add(new Label("sogefelt:"));   
sogfelt= new TextField(20);       
cP.add(sogefelt);

sog= new Button("sog");           
        cP.add(sog);
        kontrol.addActionListener(this);


        cP.add(new Label("CPR:"));       
        cpr= new TextField(10);           
        cP.add(cpr);

        cP.add(new Label("Navn:"));       
        navn= new TextField(10);       
        cP.add(navn);

        cP.add(new Label("Adresse:"));       
        adresse= new TextField(10);       
        cP.add(resultat);


        slut= new Button("slut");               
cP.add(slut);
        slut.addActionListener(this);       
                           
    }
Avatar billede convinius Nybegynder
14. januar 2003 - 14:59 #37
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Gui extends xxxxx implements xxxx



{
    private Button sog, slut;

    private TextField cpr, navn, adresse;



    private int cprint    ;
    private int korrekt_resultat;

    public Gui()
                                            //konstruktør, sætter vinduet op
    {
        setSize(200,200);                    //set vinduets størrelse
        setLocation(150,150);                //og placering (målt i pixels)
        setTitle(getClass().getName());        //skriv klassens navn i titelbjælken

        Container cP= getContentPane();        //referer til 'contentPane'-laget med cP

        cP.setLayout(new FlowLayout());        //vælg layoutmanageren 'FlowLayout'

        cP.add(new Label("sogefelt:"));        //skriver ledeteksten 'sogefelt:'
        tal1= new TextField(20);            //definerer og tilføjer tekstfeltet sogefelt
        cP.add(sogefelt);

        sog= new Button("sog");                //definerer og tilføjer søge-knappen
        cP.add(sog);
        sog.addActionListener(this);


        cP.add(new Label("CPR:"));            //do. for CPR
        cpr= new TextField(20);                //..
        cP.add(cpr);

        cP.add(new Label("Navn:"));            //do. for Navn
        navn= new TextField(20);            //..
        cP.add(navn);

        cP.add(new Label("Adresse:"));        //do. for Adresse
        adresse= new TextField(20);            //..
        cP.add(resultat);


        slut= new Button("slut");            //definerer og tilføjer slut-knappen
        cP.add(slut);
        slut.addActionListener(this);        //registrerer slut-knappen, så tryk på den
                                            //kan opfanges
    }
Avatar billede nocol Nybegynder
14. januar 2003 - 16:51 #38
Hey Arne jeg forstår ikke helt din kode her...
public int find(String navn) {
          for (int i = 0; i < antal; i++) {
              if(register[i].getNavn().equals(navn)) return i;
          }
          return -1;
    }

Hvad sker der egentlig og hvor skal jeg sætte den ind??
Vil ovenstående kode også dele det op så den ud fra det nummer skrevet i den første label så finde den valgte person og skrive cpr.nr, navn og adr. ud i hver sit label??

HJÆLP!!!
Avatar billede arne_v Ekspert
14. januar 2003 - 18:28 #39
Det er en metode som finder indexet udfra navn.

find("Michael Laudrup") vil returnere 1 fordi han er
nummer 2 i liste (husk vi nummererer 0,1,2,3,4).
Avatar billede arne_v Ekspert
14. januar 2003 - 18:29 #40
Og du skal selv kode GUI logikken.
Avatar billede nocol Nybegynder
14. januar 2003 - 20:56 #41
ok...takker
Avatar billede javadummy Nybegynder
14. januar 2003 - 21:44 #42
Hvad kom du frem til Nocol? bare så andre kan se hvad der er sket her :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester