Premiär! Fyndchans i SweClockers Månadens Drop

Programmeringsuppgift Java - behöver hjälp!!!!

Permalänk

Programmeringsuppgift Java - behöver hjälp!!!!

public class Elevator {
private int floors;
private int currentFloor = 0;
private int destinationFloor;
private static final int MAX_FLOORS = 100;
private static final int MIN_FLOORS = 2;

}
public Elevator(int floors) {
this.floors = floors;
currentFloor = 0;
}

public int getFloors() {
return floors;
if(floors < MIN_FLOORS)
return MIN_FLOORS;
else if(floors > MAX_FLOORS)
return MAX_FLOORS;

}

public int getDestinationFloor() {
return destinationFloor;

}

public boolean moveElevator(int) {
if (destinationFloor < 0 || destinationFloor > floors)
return false;
else
currentFloor = destinationFloor;
return true;

}

//Vilken våning hissen är på ska kunna läsas av och ändras, men bara inom det tillåtna intervallet för just det hus hissen är installerad i. Försöker man till exempel flytta hissen till våning 74 i ett hus som bara har fem våningar så ska det inte fungera. Resultatet av att försöka sätta våningen ska meddelas som en boolean.

@Override
public String toString() {
return "Floors= " + floors + ", Current Floor= " + currentFloor;

}

Hej!! Så här långt har jag kommit med en programmeringsuppgift som jag fick som kompletteringsuppgift. Först gav jag upp helt men jag förstår mer nu och har försökt att göra så bra metoder som möjligt utifrån instruktionerna jag fick. Det jag är osäker på är om det ska stå int i moveElevator parametern? Det borde väl göra det då de ska mata in ett värde som anger vart de ska flytta den? Och har jag lyckats göra så att de bara kan ange värden inom det tillåtna intervallet för just det huset så att det annars meddelas som en boolean? Är super osäker hehe. Är även osäker på syftet med toString-metoden så därför vet jag inte heller om jag har gjort eller skrivit den rätt. Och har jag de metoder jag behöver eller behöver jag fler?? Kopierar in instruktionerna för uppgifterna nedan. Vore så tacksam om någon kunde hjälpa mig!! Nybörjare på programmering:(

"Uppgiften går ut på att implementera en klass som representerar en hiss. När ett objekt av klassen skapas måste man ange hur många våningar huset som hissen är installerad i har. Det minsta antalet tillåtna våningar är två, och det högsta hundra. Om man försöker ange ett antal utanför detta intervall så ska antalet sättas till det närmsta tillåtna värdet.

Du får inte använda någon scanner någonstans i hissklassen, och inte heller någon utskrift. Du får använda bägge i ditt testprogram, men testprogrammet ingår inte i uppgiften.

En hiss befinner sig alltid på en våning som från början är 0 (bottenvåningen). Vilken våning hissen är på ska kunna läsas av och ändras, men bara inom det tillåtna intervallet för just det hus hissen är installerad i. Försöker man till exempel flytta hissen till våning 74 i ett hus som bara har fem våningar så ska det inte fungera. Resultatet av att försöka sätta våningen ska meddelas som en boolean.

Klassen ska också ha en toString-metod."

Permalänk
Medlem

Du kan börja med att formatera ditt inlägg så att det blir lite mer lättläsligt. Lägg din kod innanför [.code] kod här [./code] utan punkterna då förstås och fixa indenteringen.

void foo(int bar) { return bar; }

Permalänk
Medlem

@sallyfowlr:

Enligt uppgift får du inte ha någon utskrift så din toString() är meningslös eftersom den inte hör till uppgiften. Men jag rekommenderar att ha kvar den för debugsyfte när du kör programmet.

1. Jag skulle säga att variabeln "destinationFloor" inte ska vara en instansvariabel utan en lokal variabel för moveElevator().

2. Det går inte att ta reda på destinationFloor eftersom hissen rör sig i omedelbar hastighet.

public int getDestinationFloor() { return destinationFloor; }

3. Du kan inte bara skriva "int" du måste namnge det också.
Rimligtvis så skickar man med våningen som man ska till.

public boolean moveElevator(int) { if (destinationFloor < 0 || destinationFloor > floors) return false; else currentFloor = destinationFloor; return true; }

4. Denna metod kommer alltid returnera "floors". All annan kod är såkallad "unreachable code" eftersom du har ett return-uttryck som avslutar metoden. Dessutom så stod det i uppgiften att antalet våningar ska sättas vid skapande av objektet, alltså konstruktorn.

public int getFloors() { return floors; if (floors < MIN_FLOORS) return MIN_FLOORS; else if (floors > MAX_FLOORS) return MAX_FLOORS; }

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

Kontrollen mot min/max antal våningar bör göras i konstruktorn. Finns inget nu som hindrar någon att ange 200 våningar och åka dit.

Visa signatur

Intel i7 4970K, Fractal define mini, 24GB DDR3 1600mhz , 500GB SSD * 2 RAID0, GeForce 1060 6gb

Permalänk

public class Elevator { private int floors; private int currentFloor = 0; private static final int MAX_FLOORS = 100; private static final int MIN_FLOORS = 2; }

Har tagit bort destinationFloor som instansvariabel!

public Elevator(int floors) { this.floors = floors; if(floors < MIN_FLOORS) return MIN_FLOORS; else if(floors > MAX_FLOORS) return MAX_FLOORS; }

Har fixat så att denna kontroll görs när objektet skapas which obv makes sense, vet ej hur jag tänkte innan.

public int getFloors() { return floors;

Jag har skrivit den här metoden för att get the number of floors men finns det ens något syfte med den? Jag får ju reda på hur många floors som finns i hissen i konstruktion när jag skapar objektet? Eller är jag helt ute och cyklar?
}

public boolean moveElevator(int destinationFloor) { if (destinationFloor < 0 || destinationFloor > floors) return false; else currentFloor = destinationFloor; return true; }

Och måste jag ha någon set-Metod som sets the currentFloor eller räcker det som jag har gjort det? Den här uppgiften ska inte var lång alls men vet inte om jag har med allt. Och en sista fråga! När man skriver att this.floors = floors, vad exakt är det som händer och görs då? Tack Tack Tack!!!!!

@Override public String toString() { return "The elevator is on floor" + currentFloor; }

P.S Längst ned i instruktionerna står det att vi ska ha en toString-metod i klassen så det är därför den är där:)

Permalänk
Medlem

Du kan inte ha return i konstruktorn

Visa signatur

Intel i7 4970K, Fractal define mini, 24GB DDR3 1600mhz , 500GB SSD * 2 RAID0, GeForce 1060 6gb

Permalänk
Medlem
Skrivet av sallyfowlr:

public Elevator(int floors) { this.floors = floors; if(floors < MIN_FLOORS) return MIN_FLOORS; else if(floors > MAX_FLOORS) return MAX_FLOORS; }

Har fixat så att denna kontroll görs när objektet skapas which obv makes sense, vet ej hur jag tänkte innan.

Du kan inte använda "return" av ett värde i en konstruktor för en konstruktor skapar alltid objektet man instansierar, inget annat. Det enda som ska vara klart när konstruktorn har kört klart är att alla värden ska vara korrekta. Du sätter fortfarande this.floors till floors vilket betyder att man kan sätta våning 2000 om man vill.
Undantaget med "return" är att man kan skriva "return;" vilket avbryter konstruktorn på den raden, det använder man om man inte vill köra vidare kod men det behöver du inte göra för denna uppgift.

Skrivet av sallyfowlr:

public int getFloors() { return floors;

Jag har skrivit den här metoden för att get the number of floors men finns det ens något syfte med den? Jag får ju reda på hur många floors som finns i hissen i konstruktion när jag skapar objektet? Eller är jag helt ute och cyklar?
}

Syftet är att den är publikt åtkomstbar vilket betyder att du kan kalla "elevator.getFloors()" för att få antalet våningar. Om du inte hade haft denna metod så kan man inte få reda på denna information.

Skrivet av sallyfowlr:

public boolean moveElevator(int destinationFloor) { if (destinationFloor < 0 || destinationFloor > floors) return false; else currentFloor = destinationFloor; return true; }

Och måste jag ha någon set-Metod som sets the currentFloor eller räcker det som jag har gjort det? Den här uppgiften ska inte var lång alls men vet inte om jag har med allt. Och en sista fråga! När man skriver att this.floors = floors, vad exakt är det som händer och görs då? Tack Tack Tack!!!!!

Det räcker gott och väl med det där.
"this.floors = floors" betyder att instansvariabeln "this.floors" (variabeln du har deklarerat i "roten" till klassen) tilldelas värdet från den lokala variabeln "floors". Varför man måste använda "this.floors" är för att variablerna har samma namn men existerar i olika scopes. Hade du skrivit "floors = floors" hade du bara satt om den lokala variabeln till värdet från den lokala variabeln.

Skrivet av sallyfowlr:

@Override public String toString() { return "The elevator is on floor" + currentFloor; }

P.S Längst ned i instruktionerna står det att vi ska ha en toString-metod i klassen så det är därför den är där:)

Ok, fint!

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk

Fattar så mycket mer!!!

Tack tack tack, ni har verkligen hjälpt mig så mycket😭 Har fixat allt ni sa var fel men jag har några frågor till!! Jag har ju skapat två statiska variabler som har värdet 2 och 100 men behövs det ens? Nu ser ju koden ut såhär

ublic class Elevator { private int floors; private int currentFloor = 0; private static final int MAX_FLOORS = 100; private static final int MIN_FLOORS = 2; public Elevator(int floors) { this.floors = floors; if(floors < MIN_FLOORS) floors = MIN_FLOORS; else if(floors > MAX_FLOORS) floors = MAX_FLOORS; }

Men skulle den inte lika gärna kunna se ut såhär? Min första impuls var att skapa statiska variabler men jag kanske bara komplicerade det.

public class Elevator { private int floors; private int currentFloor = 0; public Elevator(int floors) { this.floors = floors; if(floors < 2) floors = 2; else if(floors > 100) floors = 100; }

En sista fråga! Jag har ju satt currentFloor till 0 men det behövs väl inte heller eftersom att alla variabler som är int automatiskt har värdet 0 när de skapas. Känner mig så jävla dum med alla frågor men ni har verkligen lyckats förklara allt så bra för mig!!

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av sallyfowlr:

public boolean moveElevator(int destinationFloor) { if (destinationFloor < 0 || destinationFloor > floors) return false; else currentFloor = destinationFloor; return true; }

Jag vet att det är dela meningar hur man ska använda måsvingar { } till if-satser. Jag föredrar att alltid ha måsvingar oavsett om det bara är en rad. Enkelt att förhindra buggar i programmet.

Men i det här fallet är det osäkert vad du menar. Ska den sista return true ingå i if-satsen eller vara sist i metoden? Oavsett så kommer resultatet bli detsamma i just det här fallet.

Vilket av de här två menar du:

public boolean moveElevator(int destinationFloor) { if (destinationFloor < 0 || destinationFloor > floors) { return false; } else { currentFloor = destinationFloor; return true; } }

eller

public boolean moveElevator(int destinationFloor) { if (destinationFloor < 0 || destinationFloor > floors) { return false; } else { currentFloor = destinationFloor; } return true; }

Permalänk
Medlem
Skrivet av Pake:

Jag vet att det är dela meningar hur man ska använda måsvingar { } till if-satser. Jag föredrar att alltid ha måsvingar oavsett om det bara är en rad. Enkelt att förhindra buggar i programmet.

Men i det här fallet är det osäkert vad du menar. Ska den sista return true ingå i if-satsen eller vara sist i metoden? Oavsett så kommer resultatet bli detsamma i just det här fallet.

Vilket av de här två menar du:

public boolean moveElevator(int destinationFloor) { if (destinationFloor < 0 || destinationFloor > floors) { return false; } currentFloor = destinationFloor; return true; }

eller

public boolean moveElevator(int destinationFloor) { if (destinationFloor < 0 || destinationFloor > floors) { return false; } else { currentFloor = destinationFloor; } return true; }

Det blir exakt samma resultat med båda de fallen faktiskt. Däremot håller jag absolut med dig. Måsvingar ska alltid vara på plats även om det bara är en rad. Det gör oerhört mycket för andra att läsa din kod om man följer samma struktur och att använda måsvingar är trots allt standarden för Java.

Edit: För att jobba vidare lite på det hade det också varit mycket snyggare att använda följande struktur (Enligt mig då)

public boolean moveElevator(int destinationFloor) { if (destinationFloor < 0 || destinationFloor > floors) { return false; } currentFloor = destinationFloor; return true; }

Permalänk
Medlem
Skrivet av sallyfowlr:

Tack tack tack, ni har verkligen hjälpt mig så mycket😭 Har fixat allt ni sa var fel men jag har några frågor till!! Jag har ju skapat två statiska variabler som har värdet 2 och 100 men behövs det ens? Nu ser ju koden ut såhär

ublic class Elevator { private int floors; private int currentFloor = 0; private static final int MAX_FLOORS = 100; private static final int MIN_FLOORS = 2; public Elevator(int floors) { this.floors = floors; if(floors < MIN_FLOORS) floors = MIN_FLOORS; else if(floors > MAX_FLOORS) floors = MAX_FLOORS; }

Men skulle den inte lika gärna kunna se ut såhär? Min första impuls var att skapa statiska variabler men jag kanske bara komplicerade det.

public class Elevator { private int floors; private int currentFloor = 0; public Elevator(int floors) { this.floors = floors; if(floors < 2) floors = 2; else if(floors > 100) floors = 100; }

Jag tycker det är bra att du rent spontant tänker att förutsättningarna ska vara specifierade som statiska variabler. Det är mycket enklare att förändra värdena för en variabel än alla ställen i koden. I just detta fall är det bara totalt 4st ställen så det är inte supermånga men som standard bör man ha det som statiska variabler så som du har. Det är en mycket god vana.

Skrivet av sallyfowlr:

En sista fråga! Jag har ju satt currentFloor till 0 men det behövs väl inte heller eftersom att alla variabler som är int automatiskt har värdet 0 när de skapas. Känner mig så jävla dum med alla frågor men ni har verkligen lyckats förklara allt så bra för mig!!

Skickades från m.sweclockers.com

Det skadar inte att vara övertydlig. Dessutom är det en dålig vana att utgå från att värden kommer ha defaultvärden. Det hade exempelvis inte fungerat att göra så med en lokal variabel i en metod.
Fokusera på att skriva kod som är enkel att förstå och enkel att underhålla istället för att skriva exempelvis underförstådd kod eller komplicerad kod för att spara rader exempelvis. Det lönar sig i längden och underlättar för dig och andra som tittar på koden.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Skrivet av sallyfowlr:

Tack tack tack, ni har verkligen hjälpt mig så mycket😭 Har fixat allt ni sa var fel men jag har några frågor till!! Jag har ju skapat två statiska variabler som har värdet 2 och 100 men behövs det ens? Nu ser ju koden ut såhär

ublic class Elevator { private int floors; private int currentFloor = 0; private static final int MAX_FLOORS = 100; private static final int MIN_FLOORS = 2; public Elevator(int floors) { this.floors = floors; if(floors < MIN_FLOORS) floors = MIN_FLOORS; else if(floors > MAX_FLOORS) floors = MAX_FLOORS; }

Men skulle den inte lika gärna kunna se ut såhär? Min första impuls var att skapa statiska variabler men jag kanske bara komplicerade det.

public class Elevator { private int floors; private int currentFloor = 0; public Elevator(int floors) { this.floors = floors; if(floors < 2) floors = 2; else if(floors > 100) floors = 100; }

En sista fråga! Jag har ju satt currentFloor till 0 men det behövs väl inte heller eftersom att alla variabler som är int automatiskt har värdet 0 när de skapas. Känner mig så jävla dum med alla frågor men ni har verkligen lyckats förklara allt så bra för mig!!

Skickades från m.sweclockers.com

Att sätta dina statiska (konstanter ) variabler är en god vana som du bör fortsätta med. Om du ser ett program som har värdet 2 och 100 i en if-sats så funderar du givetvis vad dessa siffror står för, eller hur? Detta kallas "magic numbers" och kan enbart förstås till 100% av den som skrev koden. Skriver du "MAX_ROOMS" istället för 100 så blir det mycket lättare för någon annan att förstå din kod.

Det är oerhört sällan det är du själv som förvaltar din egna kod. Oftast är det någon annan stackare som aldrig sett din kod förut som måste in och ändra eller lägga till funktionalitet. Utveckla för dessa framtida kodare och inte bara för dig idag

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Medlem

För mer avancerade kontroller

Hej,
Vid mer avancerade kontroller kan det vara smidigt att göra något i den här stilen. Dvs lägga in valideringen i en metod.

public boolean moveElevator(int destinationFloor) { if (isValidFloor(destinationFloor) { currentFloor = destinationFloor; return true; }else{ return false; } } private boolean isValidFloor(int destinationFloor){ return destinationFloor > 0 || destinationFloor < floors; }

Visa signatur

// Knatten