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;
}
}