Avatar billede jmarkling Nybegynder
02. februar 2001 - 23:34 Der er 5 kommentarer og
1 løsning

Opret en klasse som simulerer en kombinationslås

Jeg har problmer med følgende opgave:

Implementer en klasse som kan bruges i et program, som simulerer en kombinationslås. Låsen har en rund knap, med numrene 0 til 39 markeret på kanten. Øverst over låsen er der en pil. Låsen har en 3 nummeret kombination, som vi kalder X, Y og Z. For at åbne låsen må knappen først drejes med uret mindst én omgang til position X er udfor pilen. Herefter skal det drejses mod uret til position Y, er udfor pilen. Til sidst drejes knappen igen med uret til position Z er udenfor pilen, på dette tidspunkt er det muligt at åbne låsen.

Klassen Laas skal have en konstruktør som initialiserer med en 3 nummeret kombination.
Følgende metoder skal også være til stede.
A) En metode til at ændre 3 nummer kombination. ( den har jeg lavet)

B) En metode til at dreje knappen i en angiven retning til et specificeret nummer. ( Denne metode har jeg ikke lige kunne gennemskue,)

C) En metode til at låse med. ( lock(){ status = false; }

D) En metode til at prøve at åbne låsen. ( Det har jeg heller ikke kunne gennemskue)

E) En equals og clone metode ( har jeg lavet)

Der udover skal jeg lave en main metode til at teste med.

Problemet ligger i at jeg ikke ved hvordan jeg skal gribe problemstilling an omkring hviklke instans variabler jeg skal bruge, og hvor mange. jeg mangler bare nogle ideer til hvordan man muligvis kunne gribe det an. Især de 2 metoder B og D.

PS.
Avatar billede mukke Nybegynder
03. februar 2001 - 01:38 #1
hmm..

public static final boolean TURN_CLOCKWISE = true;
public static final boolean TURN_COUNTERCLOCKWISE = false;

int x,y,z; // koden
int position;
int lockLevel; // 0,1,2,3

public lock() {lockLevel = 3;}

public move(boolean direction, int position)
{
  this.position = position;
  if (lockLevel == 3)
  {
    if (directon == TURN_CLOCKWISE && position == x) { lockLevel = 2; }
  }
  else if (lockLevel == 2)
  {
    if (direction != TURN_COUNTERCLOCKWISE)
    {
      // reset låsen.
      lock();
    }
    else
    {
      if (location == Y) { lockLevel = 1 );
    }
  }
}

(to be continued..)
Avatar billede mukke Nybegynder
03. februar 2001 - 01:44 #2
(fortsat)

da det vel næppe er meningen vi skal lave hele opgaven for dig, vil jeg lade dig selv færdiggøre public move.

mht til variablen lockLevel:

3 vil sige at den er \"helt låst\".
0 vil sige at den er klar til at blive åbnet:
Når knappen fra starten er flyttet (i den rigtige retning) til x, sættes lockLevel til 2, hvilket vil sige at det nu er Y der skal findes.
Bevæges der i den forkerte retning nulstilles låsen vha. lock. Ellers undersøges om vi er nået målet og lockLevel sænkes evt. Klares den sidste også nås lockLevel == 0 hvilket vil sige at den er klar til at blive åbnet:

public boolean open()
{
  return lockLevel == 0;
}
Avatar billede mukke Nybegynder
03. februar 2001 - 01:44 #3
(Det skal siges jeg ikek har forsøgt ovenstående i en compiler, og at java ikke ligefrem er mit yndlingssprog, men jeg håber da at ideen sadig er klar :)
Avatar billede jmarkling Nybegynder
03. februar 2001 - 10:23 #4
Hej Mukke...

Mange tak for hjælpen. Jeg har forstået ideen, men hvad med problem med, at knappen skal dreje mindst 1 omgang, når den skal drejes til posistion x.
Avatar billede mukke Nybegynder
03. februar 2001 - 11:58 #5
hmm.. kan laves på mange måder vil jeg tro - spørgsmålet er hvor elegant det skal gøres. En forholdsvis simpel måde kunne vel være at tilføje et ekstre lockLevel - 4 som den starter på, samt en ekstra variabel - æ.
På det tidspunkt låsen låses, sættes lockLevel til 4 og æ sættes til location. og nu skal man så for at komme fra lockLevel 4 til 3 bevæge med uret indtil man når frem til æ.
Avatar billede mukke Nybegynder
03. februar 2001 - 12:02 #6
(hmm nu jeg tænker over det betyder det jo godt nok at man skal dreje og ramme den for at det virker; en lille ændring ville være at kriteriet for at komme videre fra 4 til 3 er at man bevæger sig HEN OVER æ - eksempel:

æ = 10
location = 5
turn(TURN_CLOCKWISE, 12);

så skal du bare undersøge om æ er i intervallet ]location;12]

husk også at der er muligt at gå fra lockLevel 4 til 2 i et hug, hvorfor du skal bruge en if (lockLevel == 3) efter det første check med level 4 - ikke en else if ;-)
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