Laborator 2 PC FAIMA - Rezolvare

Rezolvarea pentru problema 1 (problema 2 este similara)

Clasa Moda



package iterations;

/**
*
* @author Deroude
*/
public class Moda {

private String stil, culoare, accesorii;

public Moda(String stil, String culoare, String accesorii) {
this.stil = stil;
this.culoare = culoare;
this.accesorii = accesorii;
}

public Moda() {
}

public String getAccesorii() {
return accesorii;
}

public void setAccesorii(String accesorii) {
this.accesorii = accesorii;
}

public String getCuloare() {
return culoare;
}

public void setCuloare(String culoare) {
this.culoare = culoare;
}

public String getStil() {
return stil;
}

public void setStil(String stil) {
this.stil = stil;
}
}

Clasa principala


package iterations;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
*
* @author Deroude
* Programul prezinta metoda iterativa, pastrand toate informatiile intr-o structura de date de tip HashMap
* Aceasta metoda este similara pentru exercitiul alternativ, si nu depinde de existenta unei solutii analitice
* Va reamintesc totusi ca, in acest caz, stilul dintr-un anumit an se putea obtine analitic, din restul impartirii anului la 3,
* iar culoarea se putea obtine din restul impartirii la 19 (mai exact cea mai scurta secventa care se repeta integral)
*/
public class Iterations {

private static final String[] STILURI = new String[]{"Mini", "Maxi", "Office"};

/*Folosim o structura de date care face corespondenta intre culori si initiale, pentru a ne usura munca*/
public static final Map CULORI = construiesteTabelCulori();

/*Evitam sa scriem culorile de mai multe ori intr-un array - le scriem intr-un String, anume un sir de caractere*/
private static final String SECVENTA_CULORI = "RRROGVAAITRRROGVAAT";
private static final int START_YEAR = 1920;
private static final int END_YEAR = 2050;
private static final int KNOWN_YEAR = 2012;
private static final Moda modaReferinta = new Moda("Office", "violeT", "Minimal");

/**
* @param args the command line arguments
*/
public static void main(String[] args) {

/*Structura de date cu informatii despre toti anii*/
HashMap totiAnii = new HashMap();
totiAnii.put(KNOWN_YEAR, modaReferinta);
int y = KNOWN_YEAR - 1;
int c = 18;
int s = 2;

/*Iteram pentru anii dinainte...*/
while (y > START_YEAR) {
totiAnii.put(y, new Moda(STILURI[s], CULORI.get(SECVENTA_CULORI.substring(c, c + 1)), calculeazaAccesorii(0, c)));
y--;
c = urmatoareaCuloare(c, false);
s = urmatorulStil(s, false);
}
y = KNOWN_YEAR + 1;
c = 18;
s = 2;

/*... si pentru anii de dupa anul de referinta*/
while (y < END_YEAR) {
            totiAnii.put(y, new Moda(STILURI[s], CULORI.get(SECVENTA_CULORI.substring(c, c + 1)), calculeazaAccesorii(s, c)));
            y++;
            c = urmatoareaCuloare(c, true);
            s = urmatorulStil(s, true);
        }

        /*Citim de la tastatura anul*/
        System.out.println("Introduceti anul pentru care doriti sa aflati moda, sau 0 daca doriti sa iesiti: ");
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int year = 2012;
        while (year != 0) {
            try {
                String input = reader.readLine();
                year = Integer.parseInt(input);

                /*Verificam corectitudinea numarului introdus*/
                if (year != 0 && (year < 1970 || year > 2050)) {
System.out.println("Nu ati introdus un numar corect (1970-2050)");
} else {
Moda moda = totiAnii.get(year);
System.out.printf("Moda in %d este: Stil %s, Culoare %s, Accesorii - %s", year, moda.getStil(), moda.getCuloare(), moda.getAccesorii());
}
} catch (IOException ex) {
System.out.println("Dispozitivul de introducere date nu a functionat corect");
} catch (NumberFormatException ne) {
System.out.println("Nu ati introdus un numar corect (1970-2050)");
}
}
}

private static Map construiesteTabelCulori() {
Map m = new HashMap();
m.put("R", "Rosu");
m.put("O", "Oranj");
m.put("G", "Galben");
m.put("V", "Verde");
m.put("A", "Albastru");
m.put("I", "Indigo");
m.put("T", "violeT");
return Collections.unmodifiableMap(m);
}

/*calculam urmatoarea culoare*/
private static int urmatoareaCuloare(int c, boolean forward) {
if (forward) {            
if (c == SECVENTA_CULORI.length() - 1) {
return 0;
} else {
return c + 1;
}
} else {
if (c == 0) {
return SECVENTA_CULORI.length() - 1;
} else {
return c - 1;
}
}
}
/*calculam urmatorul stil*/
private static int urmatorulStil(int s, boolean forward) {
if (forward) {
if (s == STILURI.length - 1) {
return 0;
} else {
return s + 1;
}
} else {
if (s == 0) {
return STILURI.length - 1;
} else {
return s - 1;
}
}
}

/*calculam accesoriile in functie de stil si culoare*/
private static String calculeazaAccesorii(int stil, int culoare) {
String acc = "";
if ((stil == 0 || stil == 2) && SECVENTA_CULORI.charAt(culoare) != 'V' && SECVENTA_CULORI.charAt(culoare) != 'G') {
acc += "Minimal;";
}
if (stil == 0 || stil == 1) {
acc += "Extravagant;";
}
if (SECVENTA_CULORI.charAt(culoare) != 'R' && SECVENTA_CULORI.charAt(culoare) != 'A' && SECVENTA_CULORI.charAt(culoare) != 'T') {
acc += "Clasic;";
}
return acc;
}
}

0 comentarii: