Gyakorlati alapok III.
Lakásfelújítás algoritmikusan
Pálinkó Tímea tanítványom dicsőségére legyen mondva, hogy részben lakásfelújítás közben tanulta a Java-programozást. Így csakis Neki juthatott eszébe, hogy az interfészek tanulmányozása során, konkrétan ezt a kódlehetőséget felhasználva implementáljon egy komplex lakásfelújító alkalmazást. Állítása szerint a program naprakész (2021. év tavasza) és jól modellezi a lakásfelújítás bonyolult módon számítható költségeit. Mivel én ebben a szakmában teljesen járatlan vagyok, így rövid leírást kértem Tímeától, másként esélyem sem volt megérteni a voltaképpen egyszerű matematikai műveletek mögötti szakmai tartalmat. Minderről röviden ezt írta:
A program a festés és burkolás
költségeinek számítását végzi el (csemperagasztó és glettanyag nincs benne)
négyzet vagy téglalap alapú szobával számolva.
A felhasználótól bekéri az adatokat (méterben), a szoba szélességét,
hosszúságát, és az ajtók-ablakok felületét összesen.
Alapterület
szélesség és a hosszúság
szorzata, ez lesz a padló és a plafon mérete. (szelesseg
* hosszusag)
A festendő felületek számítása
Az alapterület szorozva a
helyiség magasságával (ez a fal felülete), kivonva belőle az ajtók és ablakok
felülete, a plafon felülete pedig hozzáadva, mert általában azt is festik. ((alapterulet
* magassag)-ajtoAblak + alapterulet)
A burkolás ára
A választott burkolóanyag
négyzetméteres árát bekérjük, ezt szorozzuk az alapterülettel, és hozzáadjuk a
burkoló szakember bérét (ez jelenleg be van állítva fix összegre), amit
szintén Ft/négyzetméter árban adtunk meg és az alapterülettel szoroztuk. (alapTerulet()
* (burkoloAr + burkolatAra))
Festés ára
Bekérjük a válaszott festék
négyzetméterre vonatkozó árát, ehhez hozzáadjuk a festőnek fizetendő
négyzetméterenkénti árat, ezt az összeget pedig megszorozzuk az
alapterülettel, így megkapjuk a festés árát. (falterulet()
* (festoAr + festekAra));
Mivel a glettanyag és a csemperagasztó szükséges mennyisége nagyon sok
tényezőtől függ, ezért ez nem lett beleszámolva az árba, illetve sok esetben
nincs is rá szükség.
Tímea konzolos alkalmazását természetesen már "objektumokon orientálta", azaz programozástechnikailag megfelel az objektumorientáltság klasszikusnak mondott szabályainak. A keletkezett osztályok és interfészek a következők:
-
Controller.java
-
Gyerekszoba.java
-
Halo.java
-
IFelujitasArak.java
-
Lakasfelujitas.java
-
Validator.java
Nézzük meg a futtatható Java-kódot:
Controller.java
import java.util.Scanner;
public class Controller {
private Scanner sc = new Scanner(System.in);
Validator valid = new Validator();
private double hosszusag;
private double szelesseg;
private double ajtoAblak;
private double festekAra;
private double burkolatAra;
public Scanner getSc() {
return sc;
}
public void setSc(Scanner sc) {
this.sc = sc;
}
public double getHosszusag() {
return hosszusag;
}
public void setHosszusag(double hosszusag) {
this.hosszusag = hosszusag;
}
public double getSzelesseg() {
return szelesseg;
}
public void setSzelesseg(double szelesseg) {
this.szelesseg = szelesseg;
}
public double getAjtoAblak() {
return ajtoAblak;
}
public void setAjtoAblak(double ajtoAblak) {
this.ajtoAblak = ajtoAblak;
}
public double getFestekAra() {
return festekAra;
}
public void setFestekAra(double festekAra) {
this.festekAra = festekAra;
}
public double getBurkolatAra() {
return burkolatAra;
}
public void setBurkolatAra(double burkolatAra) {
this.burkolatAra = burkolatAra;
}
public double hosszBekeres(){
boolean isValid = true;
String hossz;
do{
System.out.println("Kérem, adja meg a
helyiség hosszát méterben!");
hossz = sc.nextLine();
isValid = valid.isValid(hossz);
}while(isValid == false);
hosszusag = Double.parseDouble(hossz);
return hosszusag;
}
public double szelessegBekeres(){
boolean isValid = true;
String szel ;
do{
System.out.println("Kérem, adja meg a
helyiség szélességét méterben!");
szel = sc.nextLine();
isValid = valid.isValid(szel);
}while (isValid == false);
szelesseg = Double.parseDouble(szel);
return szelesseg;
}
public double ajtoAblak(){
boolean isValid = true;
String ajtok;
do{
System.out.println("Kérem, adja meg az ajtók és ablakok négyzetméterben
kifejezett mennyiségét!");
ajtok = sc.nextLine();
isValid = valid.isValid(ajtok);
if(isValid == true &&
Double.parseDouble(ajtok)> szelesseg*hosszusag){
isValid =
false;
System.out.println("Az ajtók ablakon nagysága nagyobb, mint a falfelület!");
}
}while(isValid == false);
ajtoAblak = Double.parseDouble(ajtok);
return ajtoAblak;
}
public double festekArBekeres(){
boolean isValid = true;
String festek ;
do{
System.out.println("Kérem, adja meg a helyiségben használatos festék átlagárat
négyzetméterként!");
festek = sc.nextLine();
isValid = valid.isValid(festek);
}while (isValid == false);
setFestekAra(Double.parseDouble(festek));
return getFestekAra();
}
public double burkoloanyagArBekeres(){
boolean isValid = true;
String burkolat;
do{
System.out.println("Kérem, adja meg a
burkolóanyag négyzetméter árát!");
burkolat = sc.nextLine();
isValid = valid.isValid(burkolat);
}while (isValid == false);
setBurkolatAra(Double.parseDouble(burkolat));
return getBurkolatAra();
}
public void gyerekszoba(){
System.out.println("Kérem, adja meg a gyerekszoba
méreteit.");
}
public void haloszoba(){
System.out.println("Kérem, adja meg a hálószoba méreteit.");
}
public int valasztas(){
boolean isValid = true;
String valasztas;
int valasz;
do{
System.out.println("Kérem, válasszon melyik helyiséget szeretné
számolni!"+"\n1.) gyerekszoba \n2.) hálószoba");
valasztas = sc.nextLine();
isValid=valid.helyes(valasztas);
}while(isValid == false);
valasz = Integer.parseInt(valasztas);
return valasz;
}
}
Gyerekszoba.java
public class Gyerekszoba implements
IFelujitasArak{
Controller cont = new Controller();
double hosszusag = cont.hosszBekeres();
double szelesseg = cont.szelessegBekeres();
double ajtoAblak = cont.ajtoAblak();
double burkolatAr = cont.burkoloanyagArBekeres();
double festekAr = cont.festekArBekeres();
Gyerekszoba(){
System.out.println("A gyerekszoba alapterulete méterre
kerekítve: : " + (int)alapTerulet() + " m2");
System.out.println("A gyerekszoba falfelülete: méterre
kerekítve: " + (int)falterulet() + " m2" );
System.out.println(" A gyerekszoba burkolásának költsége
összesen: " + (int)burkolas() + " Ft. ");
System.out.println("A
gyerekszoba festésének költsége (mennyezettel együtt) " + (int)festes() + "
Ft");
szovegFesto();
szovegBurkolo();
}
@Override
public double alapterulet(double szelesseg, double hosszusag) {
return szelesseg * hosszusag ;
}
@Override
public double falterulet(double alapterulet, double ajtoAblak, double
magassag) {
return (alapterulet * magassag) - ajtoAblak + alapterulet;
}
@Override
public double burkulasAra(double alapterulet, double burkoloAr, double
burkolatAra) {
return (alapTerulet() * (burkoloAr+burkolatAra));
}
@Override
public double festesAra(double falterulet, double festoAr, double festekAra) {
return (falterulet() * (festoAr+festekAra));
}
public double alapTerulet(){
return alapterulet(hosszusag, szelesseg);
}
public double falterulet(){
double falfelulet = ((alapTerulet() - ajtoAblak) * magassag) + alapTerulet();
return falfelulet ;
}
public double burkolas(){
return(alapTerulet() * (burkoloAr + burkolatAr));
}
public double festes(){
return (falterulet() * (festekAr + festoAr)) + (alapTerulet()
* (festekAr + festoAr));
}
public void szovegFesto(){
System.out.println("A beállított nm ár festés munkadíjboz: "
+ festoAr);
}
public void szovegBurkolo(){
System.out.println("A beállított nm ár burkoló munkadíjhoz: "
+ burkoloAr);
}
}
Halo.java
public class Halo implements IFelujitasArak{
Controller cont = new Controller();
double hosszusag = cont.hosszBekeres();
double szelesseg = cont.szelessegBekeres();
double ajtoAblak = cont.ajtoAblak();
double burkolatAr = cont.burkoloanyagArBekeres();
double festekAr = cont.festekArBekeres();
Halo(){
System.out.println("A háló alapterulete méterre kerekítve: :
" + (int)alapTerulet() + " m2");
System.out.println("A háló falfelülete: méterre kerekítve: "
+ (int)falterulet() + " m2" );
System.out.println(" A háló burkolásának költsége összesen: "
+ (int)burkolas() + " Ft. ");
System.out.println("A háló festésének költsége (mennyezettel
együtt) " + (int)festes()+ " Ft");
szovegFesto();
szovegBurkolo();
}
@Override
public double alapterulet(double szelesseg, double hosszusag) {
return szelesseg * hosszusag;
}
@Override
public double falterulet(double alapterulet, double ajtoAblak, double
magassag) {
return(alapterulet - ajtoAblak) *magassag + alapterulet;
}
@Override
public double burkulasAra(double alapterulet, double burkoloAr, double
burkolatAra) {
return (alapTerulet() * (burkoloAr+burkolatAra));
}
@Override
public double festesAra(double falterulet, double festoAr, double festekAra) {
return (falterulet() * (festoAr + festekAra));
}
public double alapTerulet(){
return alapterulet(hosszusag, szelesseg);
}
public double falterulet(){
double falfelulet = ((alapTerulet() - ajtoAblak) * magassag)
+ alapTerulet();
return falfelulet ;
}
public double burkolas(){
return(alapTerulet()*(burkoloAr+burkolatAr));
}
public double festes(){
return (falterulet() * (festekAr + festoAr)) + (alapTerulet()
* (festekAr + festoAr));
}
public void szovegFesto(){
System.out.println("A beállított négyzetméter ár festés
munkadíjboz: " + festoAr);
}
public void szovegBurkolo(){
System.out.println("A beállított négyzetméter ár burkoló
munkadíjhoz: " + burkoloAr);
}
}
IFelujitasArak.java
public interface IFelujitasArak {
public int festoAr = 3000;
public int burkoloAr = 5000;
public double magassag = 2.3;
public double alapterulet(double szelesseg, double
hosszusag);
public double falterulet (double alapterulet,double
ajtoAblak, double magassag);
public double burkulasAra(double alapterulet, double
burkoloAr, double burkolatAra);
public double festesAra (double falterulet, double festoAr,
double festekAra);
}
Lakasfelujitas.java
public class Lakasfelujitas {
public static void main(String[] args) {
Controller cont = new Controller();
switch(cont.valasztas()){
case 1 : cont.gyerekszoba(); break;
case 2 : cont.haloszoba(); break;
}
}
}
Validator.java
public class Validator {
public boolean isValid(String hossz){
boolean isValid = true;
try{
Double.parseDouble(hossz);
}
catch(NumberFormatException ae){
System.out.println("Kérem, csak számot válasszon!");
isValid = false;
}
if(isValid == true){
if(Double.parseDouble(hossz)<1){
System.out.println("Kérem, 1-nél nagyobb számot válasszon!");
isValid =
false;
}
}
return isValid;
}
public boolean helyes(String valasztas){
boolean helyes = true;
int valasz;
try{
Integer.parseInt(valasztas);
}
catch (NumberFormatException ae){
System.out.println("Kérem, csak számot válasszon: 1 vagy
2!");
helyes = false;
}
if (helyes == true){
valasz=Integer.parseInt(valasztas);
if(valasz != 1 && valasz !=2){
System.out.println("Kérem, csak a megadott lehetőségekből válasszon!");
helyes =
false;
}
}
return helyes;
}
}
Végeredmény:
Kerem, adja meg a tippet!
s
Nem szamot adott meg!
false
Kerem, adja meg a tippet!
0
true
Kerem, 1-90 kozotti szamot valasszon!
Kerem, adja meg a tippet!
3
true
Kerem, adja meg a tippet!
3
true
Ne irja ketszer ugyanazt a szamot
Kerem, adja meg a tippet!
4
true
Kerem, adja meg a tippet!
h
Nem szamot adott meg!
false
Kerem, adja meg a tippet!
Nem szamot adott meg!
false
Kerem, adja meg a tippet!
5
true
Kerem, adja meg a tippet!
6
true
Kerem, adja meg a tippet!
7
true
Tippek:
3 4 5 6 7
A kisorsolt szamok:
9 26 63 67 86
Onnek 0 talalata van.