Avatar billede Stine_EP1 Nybegynder
15. januar 2011 - 17:14 Der er 30 kommentarer og
1 løsning

HJÆLP! :)

Hej alle!

Jeg sidder og er godt i gang med mit eksamensprojekt, men bliver mødt af et problem, jeg simpelthen ikke kan finde løsningen på, og håber nu, der er et klogt hoved, der kan hjælpe mig. Det drejer sig om programmering på absolut begynder-niveau!

Jeg har lavet et program, der fungerer som database for GPS-systemer - med et userinterface, hvor det skal være muligt at foretage valg - hvilket fungerer fint. Man kan få vist alt i databasen, søge efter et specifikt produkt, slette et specifikt produkt, oprette et produkt, gemme og hente til/fra fil.

Men jeg ønsker nu at lave fejlmeddelelser for følgende:

1) Når man vælger at få vist alle produkter i databasen, men der ingen produkter er tilføjet.
2) Når man søger, men søgningen ikke giver et resultat.
3)en fejlmeddelelse, når der ikke tastes ét af "kodeordene" fra menuen.

Her er lidt kodning, som sikkert giver lidt mere overblik:

import java.util.Scanner;
import java.util.HashMap;

/**
* Write a description of class UI here.
*
* @author (Stine EP)
* @version (12.01.2011)
*/
public class UI
{
    // instance variables - replace the example below with your own
    private Scanner reader;
    private Database database;

    /**
    * Constructor for objects of class UI
    */
    public UI()
    {
        // initialise instance variables
        reader = new Scanner(System.in);
        database = new Database();
    }
   
    public static void main(String [ ] args)
    {
  UI ui = new UI();
  ui.startDatabase();
  }

    /**
    * An example of a method - replace this comment with your own
    *
    * @param  y  a sample parameter for a method
    * @return    the sum of x and y
    */
    public void startDatabase()
    {
        // put your code here
      boolean finished = false;
   
    printWelcome();
    while(!finished)
    {
    printMenu();   
    String input = getInput("Indtast valg: ");
 
    if(input.contains("1"))
    {
    printAlleModeller();   
    } 
   
    if(input.contains("2"))
    {
    tilføjModel();   
    }
   
    if(input.contains("3"))
    {
    sletModel();   
    }
       
    if(input.contains("4"))
    {
    søgModel();   
    }   
   
    if(input.contains("5"))
    {
    database.saveToFile();
    }
   
    if(input.contains("6"))
    {
    database.readFromSavedFile();
    }
    if(input.contains ("7"))
    {
    finished = true;
    printFarvel();
    }
   
   
    }
    }
    public void printWelcome()
    {
    System.out.println("Velkommen til databasen over GPS-systemer, nedenfor kan du se dine muligheder. \n");
       
    }
   
    private void printMenu()
    {
    System.out.println();
    System.out.println("Tast 1, hvis du ønsker at se alt indhold i databasen.\n");
    System.out.println("Tast 2, hvis du ønsker at tilføje et produkt til databasen.\n");
    System.out.println("Tast 3, hvis du ønsker at slette et produkt fra databasen.\n");
    System.out.println("Tast 4, hvis du ønsker at søge efter et produkt i databasen.\n");
    System.out.println("Tast 5, hvis du ønsker at gemme til fil.\n");
    System.out.println("Tast 6, hvis du ønsker at hente en gemt fil.\n");
    System.out.println("Tast 7, hvis du ønsker at afslutte databasen.\n");
    System.out.println();
    }
 
 
    public String getInput(String besked)
   
    {
    System.out.print(besked);
   
    String inputLine = reader.nextLine().toLowerCase().trim();
   
    return inputLine;
    }
   
    public void printAlleModeller()
   
    {
    database.showProduktinfo();   
    }
   
    public void tilføjModel()
    {
        System.out.println("Tilføj et produkt til databasen:");
        String model = getInput("Model: ");
        String fabrikant = getInput("Fabrikant: ");
        String pris = getInput("Pris, kr: ");
        String skaermstoerrelse = getInput("Skærmstørrelse, cm: ");
        database.addProduktinfo(model, fabrikant, pris, skaermstoerrelse);
            }
   
    public void sletModel()
    {
        System.out.println("Slet et produkt fra databasen:");
    String model = getInput("Indtast det produkt, du ønsker at slette: ");
    database.removeProduktinfo(model);
    System.out.println("Produktet er nu slettet fra databasen");
    }
     
    public void søgModel()
    {
   
    System.out.println("Søg efter et produkt i databasen.");   
    String model = getInput("Indtast det produkt, du ønsker at søge efter: ");   
    database.searchProduktinfo(model);
    }
   
    private void printFarvel()
    {
    System.out.println("Farvel - databasen er nu afsluttet!");   
    }
}


Mit problem er, at jeg har lavet det hele som Strings - og jeg har prøvet 48 konstruktioner, som bare ikke vil give resultat. Jeg er meget tæt på at give op :) Dette er ikke opgivet som noget, der skal fremgå i min opgave, men jeg vil meget gerne kunne det alligevel!

På forhånd TAK!!

/Stine
Avatar billede arne_v Ekspert
15. januar 2011 - 17:17 #1
Håndtering af intet fundet må jo hænge sammen med den kode som faktisk søger i databasen.

Prøv og vis den!
Avatar billede Stine_EP1 Nybegynder
15. januar 2011 - 17:21 #2
Her er koden, dedr søger i databasen:

public void searchProduktinfo(String model)//Finder den ansøgte model
    {   
    Produktinfo info1 = gps.get(model);
    System.out.println(info1.getInfo());   
    }
Avatar billede arne_v Ekspert
15. januar 2011 - 17:27 #3
Men hvad gør gps.get?

Returnerer den null hvis der ikke findes noget?

Smider den en exception?

Har Produktinfo en collection som er tom hvis der ikke findes noget?
Avatar billede Stine_EP1 Nybegynder
15. januar 2011 - 17:31 #4
Jeg prøvet at lade koden forklare :)Dette er koden i databasen:

import java.util.HashMap;
import java.util.Iterator;
import java.io.Serializable;

/**
* Databasen
*
* @Stine EP
* @12.01.2011
*/
public class Database implements Serializable
{
    // instance variables - replace the example below with your own
  private HashMap<String, Produktinfo> gps;
  private IO io;

    /**
    * Constructor for objects of class Database
    */
    public Database()
    {
        // initialise instance variables
    gps = new HashMap<String, Produktinfo>();
    io = new IO();
    }
   
 
    //Mutator metode, der tilføjer information om det angivne projekt i databasen
   
    public void addProduktinfo(String model, String fabrikant, String pris, String skaermstoerrelse)
    {
        // tilføjer via eksternt metodekald (.put) oplysninger i "gps"
      gps.put(model, new Produktinfo(model, fabrikant, pris, skaermstoerrelse));
      System.out.println("Produktet er nu tilføjet databasen");
    }
   
      public void removeProduktinfo(String model)//Fjerner den model, der ønskes fjernet
    {
    gps.remove(model);
    System.out.println("Du har nu fjernet produktet: " + model + " fra databasen.");
    }
   
    public void searchProduktinfo(String model)//Finder den ansøgte model
    {   
    Produktinfo info1 = gps.get(model);
    System.out.println(info1.getInfo());   
    }
   
    public void showProduktinfo()//viser alle i databasen
    {
        for(String model: gps.keySet())
        {
        Produktinfo info = gps.get(model);
        System.out.println(info.getInfo());     
        }     
    }
   
    public void saveToFile() //Gemmer til fil
    {
        io.write(gps);
        System.out.println("Filer er gemt!");
    }
    public void readFromSavedFile(){ //Henter fra fil
        gps = io.read();
        System.out.println("Filer er indlæst!");
    }
}

Den returnerer ikke null, hvis der ikke findes noget.
Giver det mening? :) Der er ingen throws exeption!
Avatar billede arne_v Ekspert
15. januar 2011 - 17:40 #5
Get af en ikke eksisterende key i en HashMap returnerer null, så det er nok hvad du skal teste på.
Avatar billede Stine_EP1 Nybegynder
15. januar 2011 - 18:20 #6
Og det virker på hhv. search og remove. MANGE tak, hvor er du god!

Men hvis du ser på:

1) printMenu(), hvordan skal jeg så få en fejlmeddelelse, hvis brugeren ikke indtaster mellem 1-7? For det er skrevet som String, ikke int. Der ville jeg kunne bruge en if(det indtastede er mindre end 1 og større end 7){ udskriv fejlmeddelelse} Er meget i tvivl om denne del.

2) showProduktinfo() - her kan jeg ikke gennemskue, hvad jeg kan gøre, således jeg skriver en kode for if(der ingen produkter er i databasen){udskriv fejlmeddelelse}

Kan du gennemskue dette?

TAK :)
Avatar billede arne_v Ekspert
15. januar 2011 - 18:29 #7
re 1)

do {
  // udskriv menu
  // indlæs valg n
} while(n < 1 || n > 7);

vil sikre at n er 1-7.
Avatar billede arne_v Ekspert
15. januar 2011 - 18:31 #8
if(gps.size() > 0) {
  // der er noget i gps
} else {
  // der er ikke noget i gps
}
Avatar billede Stine_EP1 Nybegynder
15. januar 2011 - 18:43 #9
Tak for din tålmodighed - men Syddansk Universitet er ikke altid god til at sikre, at lærerne kommer ordentlig ud til eleverne.

Jeg sidder ihærdigt og prøver, men den vil ikke udskrive "der er ikke noget gemt i gps"...
Avatar billede arne_v Ekspert
16. januar 2011 - 00:51 #10
Hvordan ser din kode ud?
Avatar billede Stine_EP1 Nybegynder
16. januar 2011 - 11:27 #11
public void showProduktinfo()//viser alle i databasen
    {
      for(String model : gps.keySet())
      {
        Produktinfo info = gps.get(model);
        System.out.println(info.getInfo());     
      }

Det er en for-løkke, og derfor kan jeg ikke få din kode med if implementeret, den brokker sig over size.
Avatar billede decoon Nybegynder
16. januar 2011 - 14:14 #12
public void showProduktinfo()//viser alle i databasen
    {
if(gps.isEmpty()){
System.out.println("Der er pt. ikke oprettet nogle GPS enheder i databasen.");
} else {
      for(String model : gps.keySet())
      {
        Produktinfo info = gps.get(model);
        System.out.println(info.getInfo());   
      }
}
}
Avatar billede arne_v Ekspert
16. januar 2011 - 19:21 #13
Hvor har du sat den if ind?
Avatar billede Stine_EP1 Nybegynder
16. januar 2011 - 19:35 #14
Så, nu virker det, Arne - den udskriver nu fejlmeddelelse, hvis der ingen produkter er i databasen. Er det fordi, isEmpty() er en metode i HashMap? Super sejt, at du lige kunne kringle den!

Nu er der kun problemet med printMenu tilbage, jeg skal nemlig også her have implementeret en fejlmeddelelse, hvis der ikke indtastes mellem "1" og "7".
Avatar billede arne_v Ekspert
16. januar 2011 - 19:51 #15
isEmpty var ikke mit forslag
Avatar billede arne_v Ekspert
16. januar 2011 - 19:53 #16
do {
  // udskriv menu
  // indlæs valg n
  if(n >= 1 && n <= 7) {
      done = true;
  } else {
      // fortæl dem at de skal indtaste tal 1-7
    done = false;
  }
} while(!done);
Avatar billede Stine_EP1 Nybegynder
16. januar 2011 - 20:02 #17
Gud, nej - tak til decoon så. Det virkede!

Okay, jeg er jo ret meget nybegynder, så jeg prøver lige at give mit bud på, hvad du præcist mener:

printWelcome();
    while(!finished)
    {
    printMenu();   
    String input = getInput("Indtast valg: ");

if(getInput>=1 && getInput<=7){
done= true;
} else{

System.out.println("Indtast et tal mellem 1-7");
done=false;
}
}while(!finished);

Er det, hvad du mener? :)
Avatar billede Stine_EP1 Nybegynder
16. januar 2011 - 20:14 #18
String input, ikke getInput... Men øv, den vil bare slet ikke kompilere. Alternativet er vel at bruge en switch case, men vil bare gerne have det andet til at virke!!
Avatar billede arne_v Ekspert
16. januar 2011 - 20:40 #19
int n = Integer.parseInt(input);

og test på n.

Og done og finished skal nok være samme variabel.
Avatar billede decoon Nybegynder
16. januar 2011 - 20:48 #20
Sup! Prøv dette :)

public void startDatabase()
    {
      boolean finished = false;
 
    printWelcome();
    while(!finished)
    {
    printMenu(); 
    String input = getInput("Indtast valg: ");

if (input) {
    if (input < 1 && input > 7) {
    System.out.println("Du har indtastet et forkert nummer.");
    } else {

    if(input.contains("1"))
    {
    printAlleModeller(); 
    }
 
    if(input.contains("2"))
    {
    tilføjModel(); 
    }
 
    if(input.contains("3"))
    {
    sletModel(); 
    }
     
    if(input.contains("4"))
    {
    søgModel(); 
    } 
 
    if(input.contains("5"))
    {
    database.saveToFile();
    }
 
    if(input.contains("6"))
    {
    database.readFromSavedFile();
    }
    if(input.contains ("7"))
    {
    finished = true;
    printFarvel();
    }
  }
  }
    }
    }
Avatar billede decoon Nybegynder
16. januar 2011 - 21:10 #21
Glem overstående kommentar, lå ikke mærke til det var en String. Det arne_v forslår virker fint(Selvfølgelig).
Avatar billede Stine_EP1 Nybegynder
16. januar 2011 - 22:16 #22
Tak til alle forsalg.

Arne - dit forslag virker fint, hvis jeg indsætter en printMenu();

efter  else{
    System.out.println("Indtast et tal mellem 1-7");
    finished = false;
    printMenu();
    }

For ellers udskrives menuen jo ikke igen! Ihh, hvor er det dejligt, når det lykkedes. Men tit er det, som nybegynder, svært at se alle tingene for sig!

MANGE TAK!!! Skal/kan jeg på nogen måde give point?
Avatar billede arne_v Ekspert
16. januar 2011 - 22:53 #23
Jeg skal først smide et svar.
Avatar billede Stine_EP1 Nybegynder
16. januar 2011 - 23:06 #24
Det virker vist ikke helt alligevel - æv.
Men smid du bare et svar, så skal jeg nok godkende, eller hvad man gør - som tak for dine forsøg :)
Avatar billede arne_v Ekspert
16. januar 2011 - 23:30 #25
Hvad virker ikke?
Avatar billede Stine_EP1 Nybegynder
17. januar 2011 - 10:20 #26
Når jeg tester på n, som du skrev, så får jeg godt nok en fejlmeddelelse, men samtidig bliver finished = true, og så afsluttes databasen. Finishhed = true skal først fremkomme, når brugeren taster 7 - "if(inout.contains("7")){ // udskriv farvel finished = true;}
Avatar billede arne_v Ekspert
18. januar 2011 - 02:38 #27
Hvordan ser koden ud nu?
Avatar billede Stine_EP1 Nybegynder
18. januar 2011 - 12:56 #28
import java.util.Scanner;
import java.util.HashMap;

/**
* Write a description of class UI here.
*
* @author (Stine EP)
* @version (12.01.2011)
*/
public class UI
{
    // instance variables - replace the example below with your own
    private Scanner reader;
    private Database database;

    /**
    * Constructor for objects of class UI
    */
    public UI()
    {
        // initialise instance variables
        reader = new Scanner(System.in);
        database = new Database();
    }
   
    public static void main(String [ ] args)
    {
  UI ui = new UI();
  ui.startDatabase();
  }


  public void startDatabase()
    {

    boolean finished = false;
    printWelcome();
    while(!finished)
    {
    printMenu(); 
    String input = getInput("Indtast valg: ");

    if(input.contains("1"))
    {
    printAlleModeller(); 
    } 
   
    if(input.contains("2"))
    {
    tilføjModel();   
    }
   
    if(input.contains("3"))
    {
    sletModel();   
    }
       
    if(input.contains("4"))
    {
    søgModel();   
    }   
   
    if(input.contains("5"))
    {
    database.saveToFile();
    }
   
    if(input.contains("6"))
    {
    database.readFromSavedFile();
    }
    if(input.contains ("7"))
    {
    finished = true;
    printFarvel();
    } 
  }
}
    public void printWelcome()
    {
    System.out.println("Velkommen til databasen over GPS-systemer, nedenfor kan du se dine muligheder. \n");
       
    }
   
    public void printMenu()
    {
    System.out.println();
    System.out.println("Tast 1, hvis du ønsker at se alt indhold i databasen.\n");
    System.out.println("Tast 2, hvis du ønsker at tilføje et produkt til databasen.\n");
    System.out.println("Tast 3, hvis du ønsker at slette et produkt fra databasen.\n");
    System.out.println("Tast 4, hvis du ønsker at søge efter et produkt i databasen.\n");
    System.out.println("Tast 5, hvis du ønsker at gemme til fil.\n");
    System.out.println("Tast 6, hvis du ønsker at hente en gemt fil.\n");
    System.out.println("Tast 7, hvis du ønsker at afslutte databasen.\n");
    System.out.println();
    }
 
 
    public String getInput(String besked)
   
    {
    System.out.print(besked);
   
    String inputLine = reader.nextLine().toLowerCase().trim();
   
    return inputLine;
    }
   
    public void printAlleModeller()
   
    {
    database.showProduktinfo(); 
    }
 
    public void tilføjModel()
    {
        System.out.println("Tilføj et produkt til databasen:");
        String model = getInput("Model: ");
        String fabrikant = getInput("Fabrikant: ");
        String pris = getInput("Pris, kr: ");
        String skaermstoerrelse = getInput("Skærmstørrelse, cm: ");
        database.addProduktinfo(model, fabrikant, pris, skaermstoerrelse);
            }
   
    public void sletModel()
    {
        System.out.println("Slet et produkt fra databasen:");
    String model = getInput("Indtast det produkt, du ønsker at slette: ");
    database.removeProduktinfo(model);
    }
     
    public void søgModel()
    {
    System.out.println("Søg efter et produkt i databasen.");   
    String model = getInput("Indtast det produkt, du ønsker at søge efter: ");   
    database.searchProduktinfo(model);
    }
   
    private void printFarvel()
    {
    System.out.println("Farvel - databasen er nu afsluttet!");   
    }
   
}
Avatar billede arne_v Ekspert
22. januar 2011 - 23:58 #29
Den kode tester ikke på en integer n.
Avatar billede danco Nybegynder
29. januar 2011 - 23:40 #30
String input = getInput("Indtast valg: ");
    int valg = Integer.parseInt(input);

    switch(valg) {
      case 1:
      printAlleModeller();
      break;

      case 2:
      tilføjModel();
      break;
    }


Det burde løse dit problem, og så tillader jeg mig at bruge en switch i stedet for en lang række if statements, i min verden er det bare pænere at bruge en switch i dette tilfælde.
Avatar billede arne_v Ekspert
03. marts 2011 - 03:36 #31
Tid at få afsluttet?
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