Laborator FAIMA #9 / An 1 Semestru 1

Se citesc de la tastatura 3 numere intregi a, b, c, separate prin virgule, reprezentand parametrii unei ecuatii de gradul 2 a*x2+b*x+c=0. Sa se afiseze solutiile reale ale ecuatiei, sau mesajul "Ecuatia nu are solutii reale".

Exemple:

1,2,1
Solutii: 1,1
1,-2,1
Solutii: -1,-1
1,0,1
Solutii: -1,1
1,1,1
Solutii: Ecuatia nu are solutii reale

Rezolvare - Laborator FAIMA #8 / An 1 Semestru 1


public class RezolvareFAIMA {

public static void main(String args[]) {
Scanner input = new Scanner(System.in);
String nl = "";
while (!nl.equals("stop")) {
nl = input.nextLine().toLowerCase();
try {
String[] sNumere = nl.split(",");
if (sNumere.length > 1) {
int[] iNumere = new int[sNumere.length];
for (int i = 0; i < sNumere.length; i++) {
iNumere[i] = Integer.parseInt(sNumere[i]);
}
int cmmdc = iNumere[0], cmmmc = iNumere[0];
for (int i = 1; i < iNumere.length; i++) {
// Folosim algoritmul lui Euclid. Mai multe informatii despre CMMDC: http://en.wikipedia.org/wiki/Greatest_common_divisor
cmmdc = calculeazaCMMDC(cmmdc, iNumere[i]);
// Folosim reducerea la CMMDC. Mai multe informatii: http://en.wikipedia.org/wiki/Least_common_multiple
cmmmc = cmmmc * iNumere[i] / calculeazaCMMDC(cmmmc, iNumere[i]);
}
System.out.println("CMMMC: " + cmmmc + "; CMMDC: " + cmmdc);
} else {
System.out.println("Sunt necesare cel putin doua numere.");
}
} catch (Exception e) {
if (!nl.equals("stop")) {
System.out.println("Numere incorecte");
}
}
}
System.out.println("Program terminat. O zi buna!");
}

private static int calculeazaCMMDC(int a, int b) {
if (b == 0) {
return a;
} else {
return calculeazaCMMDC(b, a % b);
}
}
}

Laborator FAIMA #8 / An 1 Semestru 1

Se citește de la tastatură un șir de numere naturale separate prin virgulă. Se va afișa cel mai mare divizor comun al numerelor (CMMDC)și cel mai mic multiplu comun (CMMMC). Programul va continua să primească de lucru până la introducerea comenzii 'stop' și va afișa un mesaj de eroare dacă datele primite sunt incorecte.

Rezolvare - Laborator FAIMA #7 / An 1 Semestru 1


public class RezolvareFAIMA {

    public static void main(String args[]) {
        Scanner input = new Scanner(System.in);
        String nl = "";
        while (!nl.equals("stop")) {
            nl = input.nextLine().toLowerCase();
            try {
                int n = Integer.parseInt(nl);
                System.out.println(aranjareFactorizare(factorizareSimpla(n)));
            } catch (Exception e) {
                if (!nl.equals("stop")) {
                    System.out.println("Numar incorect");
                }
            }
        }
        System.out.println("Program terminat. O zi buna!");
    }
    
    private static List< Integer > factorizareSimpla(Integer n){        
        if(n==1){
            return new LinkedList< Integer >();
        }else{
            for(int i=2;i<=n;i++){
                if(n%i==0){
                    List rec=factorizareSimpla(n/i);
                    rec.add(i);
                    return rec;
                }
            }
            return null;
        }
    }
    
    private static String aranjareFactorizare(List< Integer > factorizare){        
        HashMap< Integer,Integer > factoriUnici=new HashMap< Integer,Integer >();
        for(Integer factor:factorizare){
            if(factoriUnici.containsKey(factor)){
                factoriUnici.put(factor, factoriUnici.get(factor)+1);
            }else{
                factoriUnici.put(factor,1);
            }
        }
        String ret="";
        for(Integer factorUnic:factoriUnici.keySet()){
            ret+=""+factorUnic+(factoriUnici.get(factorUnic)>1?"^"+factoriUnici.get(factorUnic):"")+"*";
        }
        return ret.substring(0,ret.length()-1);
    }
}

Laborator FAIMA #7 / An 1 Semestru 1

Se introduce un numar natural de la tastatura. Afisati descompunerea lui in factori primi. Daca numarul este incorect, afisati un mesaj de eroare. Daca se introduce de la tastatura "stop", terminati programul.
Exemplu:

4
Descompunere: 2^2
18
Descompunere: 2*3^2
r
Numarul introdus e incorect
stop
Program terminat. La revedere!

Hint: Ce face functia urmatoare?


private static List< Integer > functie(Integer n){        
        if(n==1){
            return new LinkedList();
        }else{
            for(int i=2;i<=n;i++){
                if(n%i==0){
                    List rec=functie(n/i);
                    rec.add(i);
                    return rec;
                }
            }
            return null;
        }
    }

Rezolvare - Laborator FAIMA #6 / An 1 Semestru 1

Clasa Participant

public class Participant {
    public static enum INSTRUMENTE{
        VIOARA,PIAN,VIOLONCEL,DIRIJAT
    }
    private String nume;
    private int varsta;
    private INSTRUMENTE[] instrumente;

    public Participant(String nume, int varsta, INSTRUMENTE[] instrumente) {
        this.nume = nume;
        this.varsta = varsta;
        this.instrumente = instrumente;        
    }

    public String getNume() {
        return nume;
    }

    public void setNume(String nume) {
        this.nume = nume;
    }

    public int getVarsta() {
        return varsta;
    }

    public void setVarsta(int varsta) {
        this.varsta = varsta;
    }

    public INSTRUMENTE[] getInstrumente() {
        return instrumente;
    }

    public void setInstrumente(INSTRUMENTE[] instrumente) {
        this.instrumente = instrumente;
    }
    
    public boolean cantaLa(INSTRUMENTE instrument){
        for(INSTRUMENTE i:instrumente){
            if (i==instrument){
                return true;
            }
        }
        return false;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 67 * hash + (this.nume != null ? this.nume.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Participant other = (Participant) obj;
        if ((this.nume == null) ? (other.nume != null) : !this.nume.equals(other.nume)) {
            return false;
        }
        return true;
    }
    
}

Clasa Grupa de Varsta


public class GrupaDeVarsta {
    private int min,max;
    private String nume;

    public GrupaDeVarsta(int min, int max, String nume) {
        this.min = min;
        this.max = max;
        this.nume = nume;
    }

    public int getMin() {
        return min;
    }

    public void setMin(int min) {
        this.min = min;
    }

    public int getMax() {
        return max;
    }

    public void setMax(int max) {
        this.max = max;
    }

    public String getNume() {
        return nume;
    }

    public void setNume(String nume) {
        this.nume = nume;
    }
    
    public boolean eInGrupaDeVarsta(Participant p){
        if(p.getVarsta()>=min && p.getVarsta()<=max){
            return true;
        }
        else{
            return false;
        }
    }    

Clasa Clasificare


public class Clasificare implements Comparable< Clasificare > {

    private Participant participant;
    private int nota;
    private Participant.INSTRUMENTE instrument;

    public Clasificare(Participant p, Participant.INSTRUMENTE instrument, int nota) {
        this.participant = p;
        this.instrument = instrument;
        this.nota = nota;
    }

    public Participant getParticipant() {
        return participant;
    }

    public void setParticipant(Participant p) {
        this.participant = p;
    }

    public Participant.INSTRUMENTE getInstrument() {
        return instrument;
    }

    public void setInstrument(Participant.INSTRUMENTE instrument) {
        this.instrument = instrument;
    }

    public int getNota() {
        return nota;
    }

    public void setNota(int nota) {
        this.nota = nota;
    }

    @Override
    public int compareTo(Clasificare o) {
        if (this.instrument == o.instrument) {
            return this.nota - o.nota;
        } else {
            throw new IllegalArgumentException("Cele doua clasificari nu pot fi comparate deoarece sunt la instrumente diferite");
        }
    }
}

Clasa principala


public class TestFAIMA {
    /*
     * Definim constantele din aplicatie: ingrediente, retete
     */

    private static final Participant[] participanti = new Participant[]{
        new Participant("Elizabeth Leonskaja", 12, new Participant.INSTRUMENTE[]{Participant.INSTRUMENTE.PIAN, Participant.INSTRUMENTE.DIRIJAT}),
        new Participant("Evgheni Kissin", 8, new Participant.INSTRUMENTE[]{Participant.INSTRUMENTE.PIAN, Participant.INSTRUMENTE.VIOARA})
            // si asa mai departe ...
    };
    private static final Clasificare[] clasificari = new Clasificare[]{
        new Clasificare(participanti[0], Participant.INSTRUMENTE.PIAN, 5),
        new Clasificare(participanti[0], Participant.INSTRUMENTE.DIRIJAT, 3),
        new Clasificare(participanti[1], Participant.INSTRUMENTE.PIAN, 5),
        new Clasificare(participanti[1], Participant.INSTRUMENTE.VIOARA, 2)
            //si asa mai departe ...
    };
    private static final GrupaDeVarsta[] grupe = new GrupaDeVarsta[]{
        new GrupaDeVarsta(5, 10, "Copii"),
        new GrupaDeVarsta(11, 15, "Juniori"),
        new GrupaDeVarsta(16, 18, "Tinere sperante")
    };

    public static void main(String[] args) {
        for (GrupaDeVarsta g:grupe){
            System.out.println("Grupa "+g.getNume());
            for(Participant.INSTRUMENTE instr:Participant.INSTRUMENTE.values()){
               System.out.println(instr.toString());
               TreeSet< Clasificare > clasament=new TreeSet< Clasificare >();
               for(Clasificare c:clasificari){
                   if(c.getInstrument()==instr && g.eInGrupaDeVarsta(c.getParticipant())){
                       try{
                           clasament.add(c);
                       }catch(IllegalArgumentException e){
                           System.out.println("Eroare in clasament: "+e.getMessage());
                       }
                   }
               }
               for(Clasificare c:clasament){
                   System.out.println(c.getParticipant().getNume()+" - "+c.getNota());
               }
            }            
        }
    }
}

Laborator FAIMA #6 / An 1 Semestru 1

La Olimpiada Internationala de Muzica se inscriu concurenti din toata lumea, care canta (fiecare) la diverse instrumente. Fiecare concurent primeste cate un calificativ intre 1 si 5 pentru fiecare instrument la care concureaza. In functie de anul nasterii, fiecare concurent este clasificat intr-o grupa de varsta (5-10 ani: copii, 11-15 ani: juniori, 16-18 ani: tinere sperante). Afisati clasamentul pentru fiecare grupa de varsta, pentru fiecare instrument.
Concurentii sunt:

  • Elisabeth Leonskaja, 12 ani: pian - 5; dirijat - 3
  • Evgheni Kissin, 8 ani: pian - 5; vioara - 2
  • Joshua Bell, 6 ani: pian - 3; vioara - 5
  • Itzhak Perlman, 16 ani: dirijat - 3; vioara - 5
  • Mstislav Rostropovich, 18 ani: pian - 3; violoncel - 5
  • Yo Yo Ma, 13 ani: pian - 2; violoncel- 4
  • Maxim Vengerov, 14 ani: vioara - 5; dirijat - 4
  • Vladimir Ashkenazy, 16 ani: pian - 5
  • David Oistrakh, 18 ani: vioara - 5
  • Misha Maisky, 12 ani: violoncel - 5; vioara - 3
  • Daniel Baremboim, 15 ani: pian - 4; dirijat - 5
  • David Garett, 6 ani: vioara - 4

Rezolvare - Laborator FAIMA #5 / An 1 Semestru 1

Clasa Ingredient


public class Ingredient {

    public static final int KG = 0, BUCATA = 1, LITRU = 2;
    private String nume;
    private Float cost;
    private int unitate;

    public Ingredient(String nume, Float cost, int unitate) {
        this.nume = nume;
        this.cost = cost;
        this.unitate = unitate;
    }

    public String getNume() {
        return nume;
    }

    public void setNume(String nume) {
        this.nume = nume;
    }

    public Float getCost() {
        return cost;
    }

    public void setCost(Float cost) {
        this.cost = cost;
    }

    public int getUnitate() {
        return unitate;
    }

    public void setUnitate(int unitate) {
        this.unitate = unitate;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 47 * hash + (this.nume != null ? this.nume.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Ingredient other = (Ingredient) obj;
        if ((this.nume == null) ? (other.nume != null) : !this.nume.equals(other.nume)) {
            return false;
        }
        return true;
    }
}

Clasa ComponentReteta


public class ComponentReteta {
    private Ingredient ingredient;
    private float cantitate;

    public ComponentReteta(Ingredient ingredient, float cantitate) {
        this.ingredient = ingredient;
        this.cantitate = cantitate;
    }

    public Ingredient getIngredient() {
        return ingredient;
    }

    public void setIngredient(Ingredient ingredient) {
        this.ingredient = ingredient;
    }

    public float getCantitate() {
        return cantitate;
    }

    public void setCantitate(float cantitate) {
        this.cantitate = cantitate;
    }
    
    
}

Clasa Reteta


public class Reteta {

    private String nume;
    private int numarPortii;
    private ComponentReteta[] ingrediente;

    public Reteta(String nume, ComponentReteta[] ingrediente, int numarPortii) {
        this.nume = nume;
        this.ingrediente = ingrediente;
        this.numarPortii = numarPortii;
    }

    public String getNume() {
        return nume;
    }

    public ComponentReteta[] getIngrediente() {
        return ingrediente;
    }

    public int getNumarPortii() {
        return numarPortii;
    }
    /**
     * Calculeaza pretul pentru executarea unei retete
     * @return pretul pe numarul de portii date de reteta
     */
    public float getPret(){
        float pret=0;
        for (ComponentReteta cr:ingrediente){
            pret+=cr.getCantitate()*cr.getIngredient().getCost();
        }
        return pret;
    }
}

Clasa principala


public class RezolvareFAIMA {
    /*
     * Definim constantele din aplicatie: ingrediente, retete
     */

    private static final Ingredient faina = new Ingredient("Faina", 5f, Ingredient.KG),
            ulei = new Ingredient("Ulei", 7f, Ingredient.LITRU),
            lapte = new Ingredient("Lapte", 8f, Ingredient.LITRU),
            mar = new Ingredient("Mar", 4f, Ingredient.KG),
            morcov = new Ingredient("Morcov", 0.5f, Ingredient.BUCATA);
    private static final Reteta prajituraCuMorcovi = new Reteta("Prajitura cu Morcovi", new ComponentReteta[]{
                new ComponentReteta(faina, 2f),
                new ComponentReteta(lapte, 0.5f),
                new ComponentReteta(ulei, 0.7f),
                new ComponentReteta(morcov, 6f)}, 5);
    private static final Reteta prajituraCuMere = new Reteta("Prajitura cu Mere", new ComponentReteta[]{
                new ComponentReteta(faina, 2.5f),
                new ComponentReteta(lapte, 1.5f),
                new ComponentReteta(ulei, 0.3f),
                new ComponentReteta(mar, 1f)}, 7);

    public static void main(String[] args) {
        HashMap< Reteta,Integer > comandaDeAzi=new HashMap< Reteta, Integer >();
        comandaDeAzi.put(prajituraCuMere, 9);
        comandaDeAzi.put(prajituraCuMorcovi, 3);
        System.out.println("Pret total comanda de azi: "+calculeazaTotal(comandaDeAzi));
    }
    
    /**
     * Calculam costurile totale pentru o comanda data 
     * @param portii comanda este un tabel / 
     * HashMap cu retete si numar de portii comandate
     * @return pretul total
     */
    private static float calculeazaTotal(HashMap< Reteta,Integer > portii){
        float pret=0;
        for(Reteta r:portii.keySet()){
            pret+=((float)(portii.get(r) /r.getNumarPortii()+1))*r.getPret();
        }
        return pret;
    }
}

Laborator FAIMA #5 / An 1 Semestru 1

La inceputul zilei, bucatarul unui restaurant primeste o lista cu mancarurile si numarul de portii pe care trebuie sa le prepare. Fiecare mancare se prepara dupa o reteta gandita pentru un numar de portii, care contine un set de ingrediente, din fiecare ingredient fiind necesara o anumita cantitate, exprimata in grame, mililitri sau bucati.
Vazand lista cu mancaruri, bucatarul socoteste ce cantitate totala din fiecare ingredient ii este necesara si il trimite pe ajutorul lui la piata sa faca cumparaturi. Stiind pretul fiecarui produs in parte, ajutati-l pe bucatar sa compileze lista si sa ii dea ajutorului lui banii corecti.

Exemplu de reteta:

Nume: Ciorba de vacuta
Numar de portii: 8
Ingrediente:
  • 600 grame de carne de vita
  • 2 morcovi
  • 1 patrunjel radacina
  • 1 telina mica
  • 2 cepe
  • 1 conopida
  • 300 de grame de fasole verde
  • 2 ardei grasi
  • 3 cartofi cuburi
  • 2 rosii
  • 1 leustean
  • 20 grame sare
  • 10 grame piper
  • 1 lamaie
  • 300 ml bors
  • 400g smantana

Rezolvare - Laborator FAIMA #4 / An 1 Semestru 1

Clasa Masina


public class Masina {
    private String nume;
    private int vcurba,vlinie,handicap;
/**
 * 
 * @param nume
 * @param vcurba
 * @param vlinie
 * @param handicap 
 */
    public Masina(String nume, int vcurba, int vlinie, int handicap) {
        this.nume = nume;
        this.vcurba = vcurba;
        this.vlinie = vlinie;
        this.handicap = handicap;
    }
    

    public String getNume() {
        return nume;
    }

    public void setNume(String nume) {
        this.nume = nume;
    }

    public int getVcurba() {
        return vcurba;
    }

    public void setVcurba(int vcurba) {
        this.vcurba = vcurba;
    }

    public int getVlinie() {
        return vlinie;
    }

    public void setVlinie(int vlinie) {
        this.vlinie = vlinie;
    }

    public int getHandicap() {
        return handicap;
    }

    public void setHandicap(int handicap) {
        this.handicap = handicap;
    }
    
}

Clasa Segment

public class Segment {
    public static final int CURBA=0,LINIE=1;
    
    private int tip,distanta;
/**
 * 
 * @param tip
 * @param distanta 
 */
    public Segment(int tip, int distanta) {
        this.tip = tip;
        this.distanta = distanta;
    }

    public int getTip() {
        return tip;
    }

    public void setTip(int tip) {
        this.tip = tip;
    }

    public int getDistanta() {
        return distanta;
    }

    public void setDistanta(int distanta) {
        this.distanta = distanta;
    }
    
    
}

Clasa Circuit

public class Circuit {
    private String nume;
    private Segment[] segmente;
/**
 * 
 * @param nume
 * @param segmente 
 */
    public Circuit(String nume, Segment[] segmente) {
        this.nume = nume;
        this.segmente = segmente;
    }    

    public String getNume() {
        return nume;
    }

    public void setNume(String nume) {
        this.nume = nume;
    }

    public Segment[] getSegmente() {
        return segmente;
    }

    public void setSegmente(Segment[] segmente) {
        this.segmente = segmente;
    }
    
}

Clasa Rezultat

public class Rezultat implements Comparable< Rezultat > {

    private String numeMasina;
    private int timp;

    /**
     * 
     * @param numeMasina
     * @param timp 
     */
    public Rezultat(String numeMasina, int timp) {
        this.numeMasina = numeMasina;
        this.timp = timp;
    }

    public String getNumeMasina() {
        return numeMasina;
    }

    public void setNumeMasina(String numeMasina) {
        this.numeMasina = numeMasina;
    }

    public int getTimp() {
        return timp;
    }

    public void setTimp(int timp) {
        this.timp = timp;
    }

    @Override
    public int compareTo(Rezultat o) {
        return this.timp - o.timp;
    }
}
Clasa principala

public class RezolvareFAIMA {
    /*
     * Definim constantele din aplicatie: masini, segmente, circuite
     */

    private static final Masina[] MASINI = new Masina[]{
        new Masina("Turtle Apotheosis", 2, 10, 0),
        new Masina("Gently Snail", 5, 4, 20),
        new Masina("Sleepy MacLarden", 2, 15, 25),
        new Masina("Old Tom Sheriff", 5, 10, 50)
    };
    private static final Circuit[] CIRCUITE = new Circuit[]{
        new Circuit("Burburring", new Segment[]{
            new Segment(Segment.CURBA, 100),
            new Segment(Segment.LINIE, 200),
            new Segment(Segment.CURBA, 50),
            new Segment(Segment.LINIE, 50),
            new Segment(Segment.LINIE, 200),
            new Segment(Segment.CURBA, 50),
            new Segment(Segment.CURBA, 200),
            new Segment(Segment.LINIE, 150)
        }),
        new Circuit("Silversandman", new Segment[]{
            new Segment(Segment.LINIE, 200),
            new Segment(Segment.CURBA, 100),
            new Segment(Segment.CURBA, 100),
            new Segment(Segment.LINIE, 50),
            new Segment(Segment.CURBA, 200),
            new Segment(Segment.LINIE, 50),
            new Segment(Segment.CURBA, 100),
            new Segment(Segment.LINIE, 200)
        })
    };

    public static void main(String[] args) {
        for (Circuit c : CIRCUITE) {
            System.out.println("Rezultatele pe circuitul " + c.getNume());
            Rezultat[] rezultate = new Rezultat[MASINI.length];
            int i = 0;
            for (Masina m : MASINI) {
                int timp = m.getHandicap();
                for (Segment s : c.getSegmente()) {
                    switch (s.getTip()) {
                        case Segment.CURBA:
                            timp += s.getDistanta() / m.getVcurba();
                            break;
                        case Segment.LINIE:
                            timp += s.getDistanta() / m.getVlinie();
                            break;
                    }
                }
                rezultate[i++] = new Rezultat(m.getNume(), timp);
            }
            Arrays.sort(rezultate);
            for (Rezultat r : rezultate) {
                System.out.println(r.getNumeMasina() + ": " + r.getTimp());
            }
        }
    }
}

Laborator FAIMA #4 / An 1 Semestru 1

Mai multe masini se intrec pe un circuit oarecare, alcatuit din mai multe segmente, de dimensiuni (in metri) si forme diferite (curba sau linie dreapta). Presupunem ca masinile accelereaza instantaneu pana la viteza maxima si ca fiecare are o viteza maxima diferita in curba si in linie dreapta. De asemenea, fiecare masina pleaca cu un handicap (in secunde), care conteaza la timpul final. Sa se scrie un program care sa ordoneze masinile in ordinea timpului de parcurgere a 10 ture complete de circuit.

Folositi urmatoarele masini:

Nume Viteza in curba (m/s) Viteza in linie dreapta (m/s) Handicap (s)
Turtle Apotheosis 2 10 0
Gently Snail 5 4 20
Sleepy MacLarden 2 15 25
Old Tom Sheriff 5 10 50

Folositi urmatoarele circuite:
Nume Compozitie
Burburring Curba 100m, Linie dreapta 200m, Curba 50m, Linie dreapta 50 m, Linie dreapta 200m, Curba 50m, Curba 200m, Linie dreapta 150m
Silversandman Linie dreapta 200m, Curba 100m, Curba 100m, Linie dreapta 50m, Curba 200m, Linie dreapta 50m, Curba 100m, Linie dreapta 200m


Folositi clase pentru a modela notiunile cu care lucrati, e.g.:

public class Masina{
    public String nume;
    public int vitezaCurba,vitezaLinie, handicap;
}

Hint: folositi rezolvarea de data trecuta pentru a completa clasa Masina, in asa fel incat sa faceti Masinile comparabile intre ele

Rezolvare - Laborator FAIMA #3 / An 1 Semestru 1



import java.util.Arrays;
import java.util.Date;
import java.util.Random;

/**
 *
 * @author Deroude
 */
public class RezolvareFAIMA {
    /*
     * Definim constantele din aplicatie: numerele din enunt, vectorii cu nume
     */
    private static final int NUMBER_COUNT = 10, MIN_NUMBER = 1, MAX_NUMBER = 100, NAME_COUNT = 3;
    private static final String[] LAST_NAMES = new String[]{"Ionescu", "Peterson", "Al Mansour", "Chen", "d'Armagnac"},
            FIRST_NAMES_MALE = new String[]{"Hassan", "Richard", "Li", "Benjamin", "Xavier"},
            FIRST_NAMES_FEMALE = new String[]{"Maria", "Sophie", "Angela", "Francesca", "Khalilah"};
    
    /*
     * Folosim o alta metoda de a obtine numere aleatorii, cu ajutorul unui obiect de tipul Random
     */
    private static final Random SEEDER=new Random(new Date().getTime());

    /**
     * Metoda noastra principala contine doar apeluri la cele doua metode care realizeaza ce ne-am propus
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        System.out.println("\nGenerated numbers: ");
        for (int i : generateNumbers(NUMBER_COUNT,MIN_NUMBER,MAX_NUMBER)) {
            System.out.print(i+"; ");
        }
        System.out.println("\nGenerated names: ");
        for (String s : generateFullNames(NAME_COUNT,LAST_NAMES,FIRST_NAMES_FEMALE,FIRST_NAMES_MALE)) {
            System.out.print(s+"; ");
        }
    }

    /*
     * Metoda care genereaza numere aleatorii si le sorteaza  
     */
    private static Integer[] generateNumbers(int count, int min, int max) {
        Integer[] ret = new Integer[count];
        for (int i = 0; i < count; i++) {
            /*
             * Folosim functia definita de noi mai jos, cu numele random
             */
            ret[i] = random(min, max);
        }
        /*
         * Folosim functia de sortare definita de noi mai jos, cu numele sort
        */
        return sort(ret);
    }

    private static String[] generateFullNames(int count, String[] lastNames, String[] femaleNames, String[] maleNames) {
        String[] fullNames = new String[count];
        for (int i = 0; i < count; i++) {
            /*
             * Incepem cu numele de familie
             */
            String name = lastNames[random(0, lastNames.length - 1)] + ", ";
            /*
             * Determinam daca este barbat sau femeie si concatenam doua nume aleatorii
             */
            if (Math.random() > 0.5) {
                name += femaleNames[random(0, femaleNames.length - 1)] + " " + femaleNames[random(0, femaleNames.length - 1)];
            } else {
                name += maleNames[random(0, maleNames.length - 1)] + " " + maleNames[random(0, maleNames.length - 1)];
            }
            fullNames[i]=name;
        }
        return sort(fullNames);
    }

    /*
     * Metoda de sortare. Ea poate sorta orice fel de obiecte (T), atata vreme cat
     * ele sunt comparabile (extends Comparable). Folosim algoritmul "Bubble Sort"
     * pe care l-ati descoperit voi data trecuta
     */
    
    public static < T extends Comparable< T >> T[] sort(T[] unsorted) {
        T[] sorted = Arrays.copyOf(unsorted, unsorted.length);
        boolean changed = true;
        while (changed) {
            changed = false;
            for (int i = 0; i < sorted.length - 1; i++) {
                /*
                 * Pentru ca un obiect sa fie comparabil, el trebuie sa aiba
                 * o metoda numita compareTo, pe care o apelam astfel:
                 *  eu.compareTo(celalalt) -> daca rezultatul este 0, eu sunt egal cu celalalt
                 *  daca este >0, eu sunt superior din punctul de vedere al comparatiei respective,
                 *  daca este <0, eu sunt inferior fata de celalalt
                 */
                if (sorted[i].compareTo(sorted[i + 1]) > 0) {
                    /*
                     * Inversam obiectele folsind metoda celor 3 pahare
                     */
                    T swapper = sorted[i];
                    sorted[i] = sorted[i + 1];
                    sorted[i + 1] = swapper;
                    changed = true;
                }
            }
        }
        return sorted;
    }
    
    /*
     * Metoda definita de noi pentru a obtine un numar intreg aleator intre min si max
     */

    private static Integer random(int min, int max) {
       return SEEDER.nextInt(max-min)+min;
    }
}

Laborator FAIMA #3 / An 1 Semestru 1

1. Generati aleator 10 numere naturale intre 1 si 100. Afisati-le in ordine crescatoare.

2. Se dau 5 nume de familie si 10 nume proprii (5 feminine, 5 masculine). Sa se genereze aleator 3 nume complete, acatuite dintr-un nume de familie si 2 nume proprii. Sa se afiseze cele 3 nume in ordine alfabetica, dupa numele de familie, apoi dupa cele doua nume proprii, in ordine.

Exemplu:

Nume de familie: Ionescu, Peterson, Al Mansour, Chen, d'Armagnac
Nume proprii: Hassan, Richard, Li, Benjamin, Xavier, Maria, Sophie, Angela, Francesca,Khalilah
Rezultat
Al Mansour Sophie Khalilah
Chen Hassan Richard
Chen Richard Xavier

Rezolvare - Laborator FAIMA #2 / An 1 Semestru 1


public class RezolvareFAIMA {

    private static final int RUNDE_MAX = 200;
    private static final int FETE_ZAR = 6;
    private static final int MAX_TURE_MASCARICI = 4;
    /*Adunam intr-un vector de String textele aferente tuturor actiunilor
     * ce pot aparea in joc. Observati ca actiunile aferente zarurilor 2,3,4,5
     * apar de doua ori, ca sa le putem adresa direct. De asemenea, apare si o
     * actiune aferenta zarului virtual 7, care se obtine din zarul 6 + bonus de
     * contraatac. La sfarsit, adaugam si celelalte mesaje pe care le vom transmite
     * si pe care le vom adresa individual.
     * Observati ca mesajele contin indicatori (e.g. {0}, {1}) in locurile unde
     * vom completa cu alte elemente de text, folosind clasa MessageFormat.
     */
    private static final String[] ACTIUNI = new String[]{"{0} Rateaza",
        "{0} il infige pe {1} in pamant pana la genunchi",
        "{0} il infige pe {1} in pamant pana la genunchi",
        "{0} il infige pe {1} in pamant pana la brau",
        "{0} il infige pe {1} in pamant pana la brau",
        "{0} il infige pe {1} in pamant pana la gat",
        "{0} il infige pe {1} in pamant pana la gat",
        "{0} foloseste Apa Vie. Rezultat: {1}",
        "{0} castiga.",
        "{0} se salveaza.",
        "Incaierarea se termina la egalitate",
        "Mascariciul e in joc"};
    private static final String[] COMBATANTI = new String[]{"Greuceanu", "Zmeul"};

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int tureMascarici = 0;
        int bonusContraatac = 0;
        /* Variabila alCuiERandul este un int, 1 sau 0, pentru a putea adresa
         * vectorul de combatanti direct
         */
        int alCuiERandul = 0;
        boolean[] aFolositApaVie = new boolean[2];
        int runda;
        for (runda = 0; runda < RUNDE_MAX; runda++) {
            /*
             * Intai da cu zarul povestitorul, daca mascariciul nu e in joc
             */
            if (tureMascarici == 0) {
                int zarPovestitor = (int) (Math.random() * FETE_ZAR + 1);
                if (zarPovestitor == 6) {
                    tureMascarici = MAX_TURE_MASCARICI;
                    System.out.println(ACTIUNI[11]);
                }
            }
            /*
             * Da cu zarul jucatorul si se calculeaza scorul atacului,
             * care se si tipareste
             */
            int zarJucator = (int) (Math.random() * FETE_ZAR + 1);
            if (tureMascarici > 0) {
                zarJucator = FETE_ZAR + 1 - zarJucator;
            }
            zarJucator += bonusContraatac;
            if (zarJucator == 1) {
                bonusContraatac = 1;
            } else {
                bonusContraatac = 0;
            }
            /*
             * MessageFormat.format ne ajuta sa compunem un mesaj pe baza
             * unui model si a unor argumente. Mesajul de la metrou, alcatuit cu
             * MessageFormat ar arata cam asa:
             *      String model="Urmeaza statia {0} cu peron pe partea {1}.";
             *      MessageFormat.format(model,new Object[]{"Piata Unirii","dreapta"};
             * rezultatul fiind:
             *      Urmeaza statia Piata Unirii cu peron pe partea dreapta
             */
            System.out.println(MessageFormat.format(ACTIUNI[zarJucator - 1], new Object[]{COMBATANTI[alCuiERandul], COMBATANTI[1 - alCuiERandul]}));
            /*
             * Daca jucatorul e pe cale sa castige
             */
            if (zarJucator >= 6) {
                /*
                 * Daca adversarul nu a folosit inca apa vie
                 */
                if (!aFolositApaVie[1 - alCuiERandul]) {
                    /*
                     * Calculam scorul de la apa vie, tinand cont si de mascarici
                     */
                    int zarApaVie = (int) (Math.random() * FETE_ZAR + 1);
                    if (tureMascarici > 0) {
                        zarApaVie = FETE_ZAR + 1 - zarApaVie;
                    }
                    /*
                     * Afisam rezultatul de la apa vie
                     */
                    System.out.println(MessageFormat.format(ACTIUNI[7], new Object[]{COMBATANTI[1 - alCuiERandul], zarApaVie}));
                    if (zarApaVie < 5) {
                        /*
                         * Jucatorul a castigat; iesim din iteratie
                         */
                        System.out.println(MessageFormat.format(ACTIUNI[8], COMBATANTI[alCuiERandul]));
                        break;
                    } else {
                        /*
                         * Adversarul s-a salvat
                         */
                        aFolositApaVie[1 - alCuiERandul] = true;
                        System.out.println(MessageFormat.format(ACTIUNI[9], COMBATANTI[1 - alCuiERandul]));
                    }
                } else {
                    /*
                     * Jucatorul a castigat; iesim din iteratie
                     */
                    System.out.println(MessageFormat.format(ACTIUNI[8], COMBATANTI[alCuiERandul]));
                    break;
                }
            }
            /*
             * Daca mascariciul e in joc, scadem turele alocate lui
             */
            if (tureMascarici > 0) {
                tureMascarici--;
            }
            /*
             * Schimbam randul
             */
            alCuiERandul = 1 - alCuiERandul;
        }
        /*
         * Am terminat iteratia; daca am ajuns la numarul maxim de runde
         * inseamna ca nimeni nu a castigat. Afisam mesajul de egalitate.
         */
        if (runda == RUNDE_MAX) {
            System.out.println(ACTIUNI[10]);
        }
    }
}

Laborator FAIMA #2 / An 1 Semestru 1

Înainte de toate, câteva linkuri promise, unde puteți găsi documentație pentru programare în general, cu aplicare la limbajul Java:

Thinking in Java de Bruce Eckel
Roxie's Bleeding at the Keyboard
Introduction to Programming Using Java de David Eck

Biblioteca UPB este de asemenea o sursă excelentă, mai ales pentru manuale în limba română.

Problema de azi:

Greuceanu și Zmeul se încaieră. Procedeul este că fiecare, când îi vine rândul, își ia adversarul în brațe și îl înfige în pământ, fie până la genunchi (1), fie până la brâu (2), fie până la gât (3), fie nu reușește deloc (0). Dacă unul dintre combatanți reușește să îl înfigă pe celălalt în pământ până la gât, îi taie capul și lupta se termină. Dacă cei doi rezista 100 de runde (fiecare) fără victoria vreunuia, se întorc fiecare acasă cu rezultat de egalitate. Se aplică următoarele constrângeri:

  • Atac normal: la rândul lui, un combatant dă cu zarul: 1 înseamna ratare (0), 6 înseamnă victorie (3); 2 și 3 înseamnă (1); 4 și 5 înseamnă (2)
  • Contraatac: dacă, într-o rundă, un combatant a ratat (0), celălalt obține bonus +1 la rezultatul său imediat următor
  • Apa vie: un combatant aflat în situația de a pierde, are voie sa dea cu zarul: dacă dă 5 sau 6, corbul îi aduce apă vie și îl salvează. Apa vie poate fi folosită o singură dată de către un combatant
  • Măscărici: înainte de fiecare atac povestitorul dă cu zarul. Dacă rezultatul este 6, în scenă apare măscăriciul, care inversează toate zarurile pentru următoarele 4 atacuri (inclusiv cel curent): e.g. 6 devine 1, 2 devine 5; în timpul acestor atacuri, povestitorul nu mai dă cu zarul, pentru că măscăriciul e deja în scenă
  • Începe Greuceanu

Hint: pentru a obține un număr aleator pentru zar (+0.5p pentru cine știe de ce 'număr aleator pentru zar' e o eroare lingvistică), puteți folosi următoarea expresie:

private static final int MAX=6;
...
//Math.random() returneaza o valoare rațională aleatorie în intervalul (0,1)
//(int)(ceva) încearcă să convertească 'ceva' la tipul de date int (întreg)
//Dacă 'ceva' e un număr rațional, reușește; dacă însă e String de exemplu, rezultă o eroare
int zar= (int)(Math.random() * MAX) + 1;

Rezolvare - Laborator FAIMA #1 / An 1 Semestru 1


public class RezolvareFAIMA {

    private static final int MAX = 120;

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

        //Definim un vector cu Da/Nu (valori boolean) unde salvam, pentru fiecare
        //numar natural care ne intereseaza concluzia este compus (DA, true) sau este prim (NU,false)
        //Fiindca ciurul lui Eratostene marcheaza numele compuse (neprime), la inceput singura informatie
        //pe care o avem e ca toate numerele sunt prime. Vectorul nostru asadar contine MAX pozitii, numerotate
        //de la 0 la MAX-1 cu valoarea NU, sau false
        boolean[] p = new boolean[MAX];
        //iteram toate numerele de la 2 la MAX/2+1; orice numar peste MAX/2+1 nu mai poate fi de ajutor, 
        //pentru ca nu mai elimina
        //vreun numar mai mic decat MAX; putem sa iteram si pana la MAX, dar e o irosire de timp, 
        //pentru MAX foarte mare, acest lucru conteaza
        for (int i = 2; i < MAX / 2 + 1; i++) {
            //iteram printre numerele mai mici decat i, interesul fiind ca orice combinatie de
            //2 numere i,j sa fie atinse o singura data (stiind ca inmultirea e comutativa, daca
            //i*j a setat deja pozitia din vector, j*i e o operatie inutila, nu aduce nimic nou;
            //trebuie sa avem grija de asemenea ca pe noi ne intereseaza doar numerele prime/neprime
            //pana la MAX, deci daca i*j depaseste MAX, vrem sa ne oprim din iterat; putem sa scriem si asa:
            //for(int j=2;j<=i&&j*iMAX, oricare ar fi k>j, i*k>MAX
            for (int j = 2; j <= i; j++) {
                if(i*j>=MAX){
                    break;
                }
                //setam pozitia i*j ca fiind DA/true, adica i*j este cu siguranta un numar neprim
                p[i * j] = true;
            }
        }
        //Iteram din nou de la 2 la MAX, parcurgem vectorul si afisam pozitiile prime,
        //adica acelea in care p[i] este fals; 
        //"!" este un operator binar, el se aplica oricarei valori booleene, de exemplu si celor din
        //vectorul nostru; in acest caz, if(!p[i]) este acelasi lucru cu if(p[i]==false); folosind 
        //aritmetica logica din liceu, mi-ar face placere sa imi explicati de ce.
        for (int i = 2; i < MAX; i++) {
            if (!p[i]) {
                System.out.println(i);
            }
        }
    }

Laborator FAIMA #1 / An 1 Semestru 1

Sa se afiseze lista de numere naturale prime mai mici decat 120.

Folositi algoritmul cunoscut sub numele "Ciurul lui Eratostene".

Veti folosi urmatoarele concepte:


private static final MAX_NUMBER=120;

...
boolean[] sita=new boolean[MAX_NUMBER];

for(int i=0;i < MAX_NUMBER;i++){
...
System.out.println("Exemplu afisare - printez numarul "+ i);
}

Test laborator PC FAIMA

Subiect 1

Java

Se introduce de la tastatura o data, in formatul Luna/Zi. Se va afisa zodia in care se afla data respectiva. Se vor folosi oricare 3 zodii cu intervale alese de voi (e.g. Capricorn Ianuarie-Iunie, Sagetator Iulie-Octombrie, Fecioara Noiembrie-Decembrie)
Exemplu de input

1/16

Exemplu de output

Capricorn

Excel

Primele 3 cifre ale unui numar de telefon reprezinta codul telefonic al unei regiuni. Astfel, 421 reprezinta Sud, 143 reprezinta Est, 225 reprezinta Vest si 917 reprezinta Nord. Salvati aceasta informatie pe o foaie de lucru. Pe alta foaie de lucru, pe prima coloana, se introduc numere de telefon de cate 10 cifre. Pe coloana a doua se cere regiunea de care apartine numarul respectiv de telefon. Hint: folositi functiile LEFT si VLOOKUP.

HTML

Sa se realizeze un layout din doua coloane, astfel: coloana din stanga ocupa 70% din pagina, si contine mai multe paragrafe (p) cu titlu (h); coloana din dreapta ocupa 25% si contine doua sub-sectiuni: prima contine linkuri catre titlurile paragrafelor, de culoare #202020; a doua sub-sectiune contine linkuri catre site-uri de pe web (e.g. Wikipedia, Facebook, Yahoo), de culoare #6060A0; pentru ambele sub-sectiuni, cand cursorul se afla deasupra unui link (hint - a:hover) textul trebuie subliniat cu rosu; coloana din stanga trebuie sa fie vizibila tot timpul, indiferent de scroll-ul paginii. Hint: folositi position:fixed.

Subiect 2

Java

Se introduc de la tastatura primele doua numere dintr-o progresie aritmetica, separate prin pauza. Sa se afiseze urmatoarele 10 numere din progresie. Exemplu de input:

1 3

Exemplu de output

5 7 9 11 13 15 17 19 21 23

Excel

Folosind un grafic de tip X Y, realizati o parabola care are varful in punctul de coordonate (0,0); folositi un set de date de minim 100 de valori in intervalul [-100, 100]. Hint: parabola este reprezentarea grafica a unei functii polinomiale de gradul 2 de forma f(x)=ax2+bx+c.

HTML

Scrieti o pagina HTML cu urmatoarele componente:

  • Sectiune cap de pagina, ce contine titlu, subtitlu si o linie de link-uri catre titlurile articolelor de mai jos
  • Sectiune articole, ce cuprinde 5 articole, fiecare alcatuit dintr-un titlu, un link catre sectiunea cap de pagina si un paragraf.
  • Sectiune subsol de pagina, care este mereu vizibila, indiferent de scroll, cu textul "Reclama Dvs. aici"

Toate sectiunile au latimea ecranului si marginea de 5px. Fondul sectiunilor este #f0f0f0 iar chenarul are culoarea #707070

Subiect 3

JAVA

Se introduc de la tastatura 3 numere separate prin pauze, reprezentand parametrii unei ecuatii de gradul doi ax2+bx+c=0. Sa se calculeze solutiile reale ale ecuatiei sau sa se returneze mesajul "Ecuatia nu are solutii reale". Exemplu de input:

1 2 1

Exemplu de output:

1 1

Excel

Se introduc pe o coloana nume complete, in formatul NUME PRENUME. Pe doua alte coloane, sa se afiseze (separat) numele si prenumele.

HTML

Sa se realizeze un tabel cu situatia cluburilor in grupele ECL, avand urmatoarele proprietati: capul de tabel are urmatoarele titluri: Echipa | Numar puncte | Numar partide jucate; sunt 16 echipe ce compun 4 grupe, iar tabelul reflecta acest lucru prin introducerea unei linii goale ce contine doar numele grupei, inainte de randurile aferente echipelor respective. Hint: folositi atributul colspan.

Subiect 4

Java


Se primesc de la tastatura nume proprii separate prin virgule (o singura linie). Trebuie sa se returneze numarul de nume proprii unice introduse. Hint: folositi structuri de date care implementeaza interfata Set
Exemplu de input

Vasile,Mihaela,George,Andreea,Vasile,Ion,Maria,Dumitru,Andreea,Mihaela,Ion,George,Gabriela,Dumitru,Maria
Exemplu de output
8

Excel

Pete, Andre, Marcelo si Thomas sunt jucatori de tenis. Ei joaca mai multe partide intre ei, care sunt reprezentate in Excel prin randuri de forma:

AndrePete1

Rezultatul este 1 daca a castigat primul jucator si 0 daca a castigat cel de-al doilea. Separat de tabelul cu rezultate, realizati un tabel in care sa calculati numarul total de victorii al fiecarui jucator.

HTML

Se va scrie o pagina HTML cu fisier atasat CSS, avand un layout "lichid". Se vor folosi 3 coloane, dintre care una cu dimensiuni variabile, avand fundal rosu si 2 cu dimensiuni fixe si fundal albastru, respectiv verde. Pagina va avea de asemenea o banda de antet si una de subsol, ambele cu fundal gri.

Test laborator BD1

Subiect 1

Sa se afiseze in ordinea datei de angajare, crescator, cei mai vechi 10 angajati din departamentul care are cei mai multi angajati cu data de angajare inainte de o data introdusa de la tastatura. Se vor afisa coloanele: Numele complet, Departamentul si Vechimea (exprimata in luni).


select * from (select e.first_name||' '||last_name "Nume complet",d.department_name "Departament",round(months_between(sysdate,e.hire_date)) "Vechime" 
from hr.employees e, HR.departments d,(select * from (select department_id,count(*) ct  from hr.employees ex where ex.hire_date<'&&threshold' group by department_id order by ct desc) where rownum=1) g
where 
  d.department_id=e.department_id and
  d.department_id=g.department_id
  order by e.hire_date asc) where rownum<11


Subiect 2

Sa se afiseze, pentru fiecare departament, cei mai bine platiti 5 angajati, in ordine descrescatoare a salariului. De asemenea, sa se afiseze o linie de sumar dupa fiecare departament, cu suma salariilor celor 5 angajati din top. Coloanele afisate sunt Denumire Departament, Nume Complet Angajat, Salariu


COLUMN CD HEADING 'Departament'
COLUMN NUM HEADING 'Nume angajat'
COLUMN SAL HEADING 'Salariu'
BREAK ON CD SKIP 1
COMPUTE AVG OF SAL ON CD
SELECT D.DEPARTMENT_NAME CD , E.FIRST_NAME||' '||E.LAST_NAME NUM, E.SALARY SAL
FROM HR.DEPARTMENTS D, HR.EMPLOYEES E
WHERE D.DEPARTMENT_ID=E.DEPARTMENT_ID
  AND (SELECT COUNT(*) FROM HR.EMPLOYEES EX WHERE EX.SALARY>E.SALARY AND EX.DEPARTMENT_ID=E.DEPARTMENT_ID)<5
ORDER BY CD ASC, SAL DESC


Subiect 3

Sa se afiseze suma salariilor din fiecare departament, ordonate dupa numarul de sefi din departamentul respectiv. Se vor afisa coloanele: Denumire Departament, Suma Salarii, Numar Sefi, Numarul de persoane care nu sunt Sefi.


SELECT D.DEPARTMENT_NAME "Nume departament", G.SAL "Total salarii", H.CT "Numar sefi", L.CT "Numar non-sefi"
FROM HR.DEPARTMENTS D,
  (SELECT DEPARTMENT_ID, SUM(EX.SALARY) SAL FROM HR.EMPLOYEES EX GROUP BY EX.DEPARTMENT_ID) G,
  (SELECT DEPARTMENT_ID, COUNT(*) CT FROM HR.EMPLOYEES EXX WHERE EXISTS(SELECT * FROM HR.EMPLOYEES EXXX WHERE EXXX.MANAGER_ID=EXX.EMPLOYEE_ID) GROUP BY EXX.DEPARTMENT_ID) H,
  (SELECT DEPARTMENT_ID, COUNT(*) CT FROM HR.EMPLOYEES EXX WHERE NOT EXISTS(SELECT * FROM HR.EMPLOYEES EXXX WHERE EXXX.MANAGER_ID=EXX.EMPLOYEE_ID) GROUP BY EXX.DEPARTMENT_ID) L
WHERE D.DEPARTMENT_ID=G.DEPARTMENT_ID
  AND D.DEPARTMENT_ID=H.DEPARTMENT_ID
  AND D.DEPARTMENT_ID=L.DEPARTMENT_ID


Subiect 4

Pentru un anumit job introdus de la tastatura, sa se afiseze, pentru fiecare departament in care e prezent, Denumirea departamentului, Numarul de salariati cu jobul respectiv, Salariul total, Salariul mediu, Data angajarii celui mai vechi angajat si Vechimea medie (exprimata in luni).


Subiect 5

Sa se afiseze cei mai bine platiti 3 angajati din fiecare departament si cei mai prost platiti 3 angajati, in ordine descrescatoare ( salariu mediu pe departament, salariu). Coloanele afisate sunt: Nume departament, Nume complet angajat, Salariu, Diferenta fata de salariul mediu pe departament (+/-) Sa se afiseze de asemenea o linie de sumar cu salariul mediu pe departamentul respectiv.



SELECT D.DEPARTMENT_NAME "Nume departament",E.FIRST_NAME||' '||E.LAST_NAME "Nume angajat",E.salary "Salariu",E.salary-(select avg(exx.salary) from hr.employees exx where exx.department_id=e.department_id) "Diferenta"
FROM HR.DEPARTMENTS D, HR.EMPLOYEES E
WHERE D.DEPARTMENT_ID=E.DEPARTMENT_ID AND 
  ((SELECT COUNT (*) FROM HR.EMPLOYEES EX WHERE EX.SALARY > E.SALARY AND EX.DEPARTMENT_ID=E.DEPARTMENT_ID)<3 OR 
    (SELECT COUNT(*) FROM HR.EMPLOYEES EX WHERE EX.SALARY < E.SALARY AND EX.DEPARTMENT_ID=E.DEPARTMENT_ID)<3)
order by e.department_id, e.salary desc


Laborator 11 PC FAIMA

Set 7

Java

Se introduc de la tastatura primele doua numere dintr-o progresie aritmetica, separate prin pauza. Sa se afiseze urmatoarele 10 numere din progresie. Exemplu de input:

1 3

Exemplu de output

5 7 9 11 13 15 17 19 21 23

Excel

Pete, Andre, Marcelo si Thomas sunt jucatori de tenis. Ei joaca mai multe partide intre ei, care sunt reprezentate in Excel prin randuri de forma:

AndrePete1

Rezultatul este 1 daca a castigat primul jucator si 0 daca a castigat cel de-al doilea. Separat de tabelul cu rezultate, realizati un tabel in care sa calculati numarul total de victorii al fiecarui jucator.

HTML

Scrieti o pagina HTML cu urmatoarele componente:

  • Sectiune cap de pagina, ce contine titlu, subtitlu si o linie de link-uri catre titlurile articolelor de mai jos
  • Sectiune articole, ce cuprinde 5 articole, fiecare alcatuit dintr-un titlu, un link catre sectiunea cap de pagina si un paragraf.
  • Sectiune subsol de pagina, care este mereu vizibila, indiferent de scroll, cu textul "Reclama Dvs. aici"

Toate sectiunile au latimea ecranului si marginea de 5px. Fondul sectiunilor este #f0f0f0 iar chenarul are culoarea #707070


Set 8

Java

Se introduc de la tastatura 3 numere separate prin pauze, reprezentand parametrii unei ecuatii de gradul doi ax2+bx+c=0. Sa se calculeze solutiile reale ale ecuatiei sau sa se returneze mesajul "Ecuatia nu are solutii reale". Exemplu de input:

1 2 1

Exemplu de output:

1 1

Excel

Folosind un grafic de tip X Y, realizati o parabola care are varful in punctul de coordonate (0,0); folositi un set de date de minim 100 de valori in intervalul [-100, 100]. Hint: parabola este reprezentarea grafica a unei functii polinomiale de gradul 2 de forma f(x)=ax2+bx+c.

HTML

Definiti din CSS patru clase, care sa aiba culori, dimensiuni si font-uri diferite. De asemenea, definiti stilul link-urilor (a) in asa fel ca, atunci cand cursorul se afla deasupra, dimensiunea sa fie 3em. Pe o linie din HTML, introduceti 10 link-uri, avand fiecare cate una dintre clasele definite in CSS, si continutul '\m/'.


Set 9

Java

La ruleta, intre 1 si 10 si intre 19 si 28, numerele pare sunt negre, iar cele impare sunt rosii. Intre 11 si 18 si intre 29 si 36, numerele pare sunt rosii, iar cele impare sunt negre. Se introduce de la tastatura un numar intreg intre 1 si 36, 'rosu', 'negru', 'par' sau 'impar'. Programul vostru trebuie sa intoarca un numar castigator aleator si sa decida daca pariul introdus e sau nu castigator, afisand si rezultatul. Hint: folositi un obiect din clasa Random. Exemplu de input:

negru

Exemplu de output:

necastigator 15 impar rosu

Excel

Primele 3 cifre ale unui numar de telefon reprezinta codul telefonic al unei regiuni. Astfel, 421 reprezinta Sud, 143 reprezinta Est, 225 reprezinta Vest si 917 reprezinta Nord. Salvati aceasta informatie pe o foaie de lucru. Pe alta foaie de lucru, pe prima coloana, se introduc numere de telefon de cate 10 cifre. Pe coloana a doua se cere regiunea de care apartine numarul respectiv de telefon. Hint: folositi functiile LEFT si VLOOKUP.

HTML

Realizati un suport pentru poza alcatuit din:

  • chenar exterior, dublu, in jurul pozei si etichetei
  • eticheta, pe fond gri
  • chenar interior, simplu, in jurul pozei
Inserati intr-o pagina HTML 3 poze cu etichete, folosind acest suport.

Laborator 10 PC FAIMA

Set 4

Java

Se primesc de la tastatura nume proprii separate prin virgule (o singura linie). Trebuie sa se returneze numarul de nume proprii unice introduse. Hint: folositi structuri de date care implementeaza interfata Set

Exemplu de input

Vasile,Mihaela,George,Andreea,Vasile,Ion,Maria,Dumitru,Andreea,Mihaela,Ion,George,Gabriela,Dumitru,Maria

Exemplu de output

8

Excel

Se introduc pe o coloana nume proprii. Sa se calculeze (automat) numarul de nume proprii unice. Hint: folositi functia COUNTIF.

HTML

Sa se realizeze un layout din doua coloane, astfel: coloana din dreapta ocupa 70% din pagina, si contine mai multe paragrafe (p) cu titlu (h); coloana din stanga ocupa 25% si contine linkuri catre titlurile paragrafelor; coloana din stanga trebuie sa fie vizibila tot timpul, indiferent de scroll-ul paginii. Hint: folositi position:fixed.

Set 5

Java

Se introduc de la tastatura doua numere naturale separate prin pauza. Sa se afiseze cel mai mare divizor comun (cmmdc) al celor doua numere.

Exemplu de input

26 18

Exemplu de output

2

Excel

Se introduc pe o coloana nume complete, in formatul NUME PRENUME. Pe doua alte coloane, sa se afiseze (separat) numele si prenumele.

HTML

Sa se realizeze un meniu orizontal, cu urmatoarele proprietati: fondul meniului este gri deschis, marginea este albastra, iar colturile sunt rotunjite; butoanele sunt asezate la rand, putand ocupa mai multe linii; fiecare buton este spatiat fata de cele din stanga si din dreapta la 10px; butoanele sunt albastre, textul este alb, marginea butoanelor este alba, iar colturile sunt rotunjite; cand cursorul se afla deasupra butonului, culoarea este albastra, textul este alb, iar marginea este albastra.

Set 6

Java

Se introduce de la tastatura o data, in formatul Luna/Zi. Se va afisa zodia in care se afla data respectiva

Exemplu de input

1/16

Exemplu de output

Capricorn

Excel

Pe doua linii, reprezentam numarul de unitati vandute de o companie si profitul total, avand drept coloane cele 12 luni ale unui an. Profitul unitar este de 10$ per unitate, daca in luna respectiva s-au vandut mai putin de 100 de unitati, crescand cu 0.5$ pentru fiecare 100 de unitati vandute in plus fata de primele 100 de unitati. De exemplu, pentru 1000 de unitati vandute intr-o luna, profitul este de 14.5$ per unitate. Reprezentati grafic cele doua linii, pe doua axe diferite, folosind urmatoarele 3 serii, pentru vanzarile lunare:

  • 10 15 25 45 45 190 54 200 23 32 445 1656
  • 200 133 567 4576 966 230 174 250 23 1 429 53
  • 105 127 225 16 425 54 122 30 5300 2262 25 9865

HTML

Sa se realizeze un tabel cu situatia cluburilor in grupele ECL, avand urmatoarele proprietati: capul de tabel are urmatoarele titluri: Echipa | Numar puncte | Numar partide jucate; sunt 16 echipe ce compun 4 grupe, iar tabelul reflecta acest lucru prin introducerea unei linii goale ce contine doar numele grupei, inainte de randurile aferente echipelor respective. Hint: folositi atributul colspan.

Laborator 9 PC FAIMA

Set 1

Java

Se introduce de la tastatura un numar natural A intre 1 si 1020 si un numar natural N intre 1 si 10. Se va returna cel mai mic numar natural mai mare decat A, care reprezinta o putere a lui N. Exemplu de input:

7638 10

Exemplu de rezultat

10000

Excel

Intr-o pagina separata "Catalog", se va defini un Range cu nume studenti. Pe pagina principala "Note", se va face un tabel cu coloanele "Nume student", "Data", "Nota". Numele se vor introduce prin selectie, folosind Range Validation. In pagina "Catalog", langa fiecare nume se va calcula media sa, din pagina "Note", folosind functiile SUMIF si COUNTIF

HTML

Se va scrie o pagina HTML cu fisier atasat CSS, avand un layout "lichid". Se vor folosi 3 coloane, dintre care una cu dimensiuni variabile, avand fundal rosu si 2 cu dimensiuni fixe si fundal albastru, respectiv verde. Pagina va avea de asemenea o banda de antet si una de subsol, ambele cu fundal gri.


Set 2

Java

Se introduce de la tastatura un nume complet, in formatul "Prenume1 Prenume2 ... PrenumeN [particula] Nume", N mai mic ca 5. Particula de noblete se identifica prin faptul ca nu incepe cu litera mare. Se va returna un mesaj in formatul "Identificat: [PARTICULA] NUME, Prenume1 (X alte prenume)". Exemplu de input:

Jean-Francois Daniel Alexandre Gaston de Varmouilles-Geront

Exemplu de rezultat

Identificat: DE VARMOUILLES-GERONT, JEAN-FRANCOIS (3 alte prenume)

Excel

Pe prima coloana scrieti numerele zecimale de la 1 la 10, luate din 0.1 in 0.1. Pe a doua coloana calculati logaritm in baza 10, iar pe a treia coloana calculati logaritm natural din numerele de pe prima coloana. Reprezentati grafic cele doua functii.

HTML

Scrieti un set de linkuri in HTML, cu urmatoarele proprietati:

  • Tintele linkurilor sunt google.com, en.wikipedia.org, yahoo.com, facebook.com si twitter.com
  • Linkurile sunt asezate unul sub altul
  • Formatarea normala este Arial, gri, 1em, fara decoratiuni suplimentare
  • Pe "hover", linkul este Georgia, rosu, italic, 2em, subliniat
  • Un link vizitat are formatare normala, cu singura diferenta ca are o bara neagra in stanga (border-left)



Set 3

Java

Se introduc de la tastatura doua matrici patratice, cate una pe fiecare linie, prin termenii lor, pe randuri, separati prin spatii. Se va returna produsul celor doua matrici, in acelasi format. Exemplu de input:

1 2 3 4
1 0 0 1

Exemplu de rezultat

1 2 3 4

Excel

Colorati 3 zone patrate - 2 in care se vor introduce termenii unor matrici de dimensiune 3x3, iar cea de-a treia unde se va calcula rezultatul inmultirii matricilor. Introduceti in zona "rezultat" formula pentru calculul automat al rezultatului inmultirii. Folositi functia MMULT si aplicati-o cu Ctrl-Shift-Enter pentru a se extinde la nivel de matrice.

HTML

Scrieti un tabel in HTML, care sa aiba un rand de antet cu fond negru, text alb si 10 randuri formatate diferit in functie de paritate (rand par - fond alb / text albastru, rand impar - fond albastru / text alb. Continutul tabelului este cel de pe pagina http://bnro.ro/Cursul-de-schimb-524.aspx

Laborator 8 PC FAIMA

Java

Iepurașul de Paște trebuie să împartă ouăle colorate. Algoritmul pe care îl folosește, implementat în Java, este următorul:

  1. citește de la tastatură numarul de oua dorite
  2. calculeaza numarul de oua colorate astfel:
    1. Maxim 20 de oua in total
    2. Jumatate rosii, dar nu mai putine de 4
    3. Un sfert galbene, dar nu mai multe de 3
    4. Din ouale ramase, doua sunt albastre iar restul verzi
    5. Rotunjirile se fac in minus (folositi Math.floor)
    6. Regulile se respecta in aceasta ordine, ca si prioritate, in caz de conflict
  3. Afiseaza ouale pe culori si revine la starea initiala (accepta comanda urmatoare)

Excel

Folosind algoritmul descris mai sus, concepeti un tabel care are pe linii numele si comenzile diversilor clienti ai Iepurasului, iar pe coloane culorile (rosu,galben,verde,albastru); calculati numarul de oua din fiecare culoare, pentru fiecare comanda, in campurile tabelului, utilizand formule Excel.

Calculati totalurile si realizati un grafic de bare in care sa evidentiati cate oua din fiecare culoare a dat Iepurasul.

HTML

Scrieti trei pagini HTML, dupa cum urmeaza:

  • Prima pagina (home) are un logo alcatuit din poza Iepurasului de Paste si titlul "Retetele Iepurasului"; de asemenea, are o coloana cu linkuri si o coloana cu continut, alcatuita din articole (lorem ipsum)
  • Linkurile din prima pagina conduc catre celelalte doua pagini, care contin retete. Aranjarea in pagina este similara, dar linkurile contin si pagina principala, iar continutul contine un singur articol, un film si un set de poze
  • In fiecare articol trebuie sa existe cel putin o lista de ingrediente, realizata cu ajutorul tag-urilor ul sau ol si li

Laborator 7 PC FAIMA

Java

Sa se scrie un program care are urmatoarele functii: citeste de la tastatura maxim 10 numere reale, separate prin virgule (","); afiseaza numerele primite in ordine crescatoare, dupa care revine la modul de citire. Se iau in considerare si numerele negative.

Excel

Sa se realizeze un Worksheet care reprezinta catalogul anului 1 FAIMA la materia Programarea Calculatoarelor. Acesta trebuie sa contina numele studentilor, grupa, datele la care au avut loc laboratoare, nota test si nota finala, compusa astfel: daca nota la test este mai mica decat 5, nota finala este egala cu nota la test; altfel, este egala cu nota la test plus (numarul de prezente plus numarul de puncte de bonus) supra numarul de prezente total posibil. La fiecare prezenta, un student poate obtine 1p (prezenta), sau 2p(prezenta plus bonus)

HTML

Sa se realizeze o pagina HTML de prezentare a produsului "Zgarda cu fundita rosie pentru caini". Layout-ul trebuie alcatuit din:

  • header, care contine un titlu, un subtitlu si o poza /logo
  • 2 coloane egale ca latime, dintre care una sa contina poze, de aceeasi dimensiune (Google Inmage Search:'dog red scarf'), iar cea de-a doua o prezentare a diferitelor caracteristici, sub forma de paragrafe si/sau liste
  • footer care contine datele de contact.

Pagina trebuie sa fie centrata si sa aiba latimea maxima 700px si latimea minima 550px

Laborator 6 PC FAIMA

Curriculum Vitae HTML

Scrieti o pagina HTML care sa reprezinte CV-ul vostru. Aceasta pagina trebuie sa contina urmatoarele sectiuni / caracteristici:

  • Nume si prenume, scrise cu font Georgia, pe mijlocul paginii, dimensiunea 2em
  • Tabel informatii despre voi, incadrat in chenar, cu doua coloane: in stanga, boldat, titlul sectiunii, aliniat la dreapta; in dreapta detaliile; toate elementele sunt spatiate fata de margine la 5 pixeli; tabelul trebuie sa contina cel putin urmatoarele sectiuni:
    • Date personale si poza
    • Studii
    • Competente
    • Job dorit
    • Salariu dorit
    • Scurta descriere personala
    • Limbi straine
    • Activitati preferate / hobby
  • In dreapta tabelului cu informatii, se va afisa o lista cu linkuri utile scrise cu font Arial, dimensiunea 1.2em -- printre care datele de contact, pagina de Facebook, Linkedin, adresa de email, etc.

Informatiile despre stilul paginii se vor scrie intr-un fisier separat CSS

Veti folosi tag-urile table,thead,tbody,th,tr,td,p,div,h1-h6,a,ul si li; de asemenea, veti folosi atributele class si id. Documentatia pentru aceste taguri se poate gasi pe site-ul W3CSchools

Laborator 5 PC FAIMA

Pentru a prezenta unor potentiali investitori o imagine a firmei Dvs. producatoare de telefoane mobile, vi se cere sa realizati o ilustrare si o proiectie de Cash Flow in Excel / Open Office Calc, folosind date din ultimii 3 ani si analizand o perioada viitoare de 5 ani.

Aveti la dispozitie urmatoarele informatii initiale:

  • Costuri fixe (care nu depind de volumul de productie)
    • Salarii administrative - 2500Euro/luna
    • Transport - 800Euro/luna
    • Chirie si intretinere - 600Euro/luna
    • Comunicatii - 300Euro/luna
    • Marketing - 200Euro/luna
  • Costuri variabile (direct proportionale cu volumul de productie)
    • Materiale - 8Euro/Unitate; Materialele au un discount in functie de volumul de productie intr-o luna, astfel:
      • 10% intre 500-1000 unitati;
      • 20% intre 1000-2000 unitati;
      • 30% peste 2000 unitati
    • Manopera - 2Euro/Unitate
    • Ambalaj si logistica - 1 Euro/Unitate
  • Costuri financiare - 10%/an din Investitia Necesara (egala cu 1.5 * Deficitul Maxim intr-o singura luna)
  • Costuri de achizitie echipamente - pentru a produce 1000 Unitati / luna este nevoie de un echipament speciale de 100.000Euro; firma a achizitionat un astfel de echipament in Ianuarie 2009, cheltuiala fiind adaugata la aceasta rubrica; este decizia voastra cand, sau daca achizitionati echipamente suplimentare.
  • Venituri din vanzare unitati - egal cu Total Comenzi * Pret unitar 15 Euro
    • Total Comenzi este variabil de la luna la luna, insa per total crescator de la an la an; luna Ianuarie are cel mai slab total, 600 de unitati in 2009; raportand la Ianuarie, celelale luni au, in ordine, urmatorii factori: 1.2,1.4,1.3,1.1,1.3,1.5,1.2,1.1,1.3,3.2; fiecare an inregistreaza o crestere de aproximativ 35% fata de anul precedent.

Folosind aceste informatii, realizati un tabel Excel / Open Office Calc in care sa aveti, pe randuri, cheltuielile, parametrii de productie, veniturile si balanta de cash flow, repartizate pe lunile celor 8 ani.

Pe randul de balanta, formatati fondul celulelor in functie de valoare: rosu pentru valori negative si verde pentru valori pozitive

Reprezentati intr-un grafic valorile balantei de cash flow.

Calculati NPV pentru firma Dvs. in 2017, cu o rata de profitabilitate minima de 15%/an

Later edit:

Gasiti aici rezolvarea primilor 3 ani.

Laborator 4 PC FAIMA

Numerele lui Fibonacci

În șirul de numere al lui Fibonacci, fiecare număr reprezintă suma a două numere anterioare, începând cu 0 și 1. Astfel, șirul incepe cu
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610 etc.
Scrieti o metoda Java care sa calculeze primele N numere din șirul de numere al lui Fibonacci. Metoda trebuie sa aiba semnatura:

public static int[] getFibonacci(int N)

Afisati rezultatul acestei metode pentru N=50.

Fie sirul avand ca termen

unde Fi este al i numar Fibonacci. Calculati limita acestui sir (prin aproximatie).


Intr-un fisier Excel, calculati pe randuri diferite, urmatoarele siruri:

  • primele 30 de numere Fibonacci;
  • rapoartele a doua numere succesive Fibonacci, dupa termenul 2;
  • primele 30 de numere dintr-o progresie aritmetica cu ratia definita intr-un camp definit;
  • primele 30 de numere dintr-o progresie geometrica cu ratia definita in alt camp definit;
  • primele 30 de numere din sirul definit astfel:
    Calculati de asemenea suma termenilor calculati din acest sir

Reprezentati grafic aceste randuri.

Laborator 3 PC FAIMA - Rezolvare

Problema rezolvarii codului lui Cezar, ghicind ROT corect pe baza celui mai frecvent caracter din text.


package caesarcypher;

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

    private static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz";
    private static final String CLEAR_TEXT = "hello";
    private static final String CODED_TEXT = "PK XA, KN JKP PK XA: PDWP EO PDA MQAOPEKJ:SDAPDAN 'PEO JKXHAN EJ PDA IEJZ PK OQBBANPDA OHEJCO WJZ WNNKSO KB KQPNWCAKQO BKNPQJA,KN PK PWGA WNIO WCWEJOP W OAW KB PNKQXHAO,WJZ XU KLLKOEJC AJZ PDAI? PK ZEA: PK OHAAL;JK IKNA; WJZ XU W OHAAL PK OWU SA AJZPDA DAWNP-WYDA WJZ PDA PDKQOWJZ JWPQNWH ODKYGOPDWP BHAOD EO DAEN PK, 'PEO W YKJOQIIWPEKJZARKQPHU PK XA SEOD'Z. PK ZEA, PK OHAAL;PK OHAAL: LANYDWJYA PK ZNAWI: WU, PDANA'O PDA NQX;BKN EJ PDWP OHAAL KB ZAWPD SDWP ZNAWIO IWU YKIASDAJ SA DWRA ODQBBHAZ KBB PDEO IKNPWH YKEH,IQOP CERA QO LWQOA: PDANA'O PDA NAOLAYPPDWP IWGAO YWHWIEPU KB OK HKJC HEBA;BKN SDK SKQHZ XAWN PDA SDELO WJZ OYKNJO KB PEIA,PDA KLLNAOOKN'O SNKJC, PDA LNKQZ IWJ'O YKJPQIAHU,PDA LWJCO KB ZAOLEOAZ HKRA, PDA HWS'O ZAHWU,PDA EJOKHAJYA KB KBBEYA WJZ PDA OLQNJOPDWP LWPEAJP IANEP KB PDA QJSKNPDU PWGAO,SDAJ DA DEIOAHB IECDP DEO MQEAPQO IWGASEPD W XWNA XKZGEJ? SDK SKQHZ BWNZAHO XAWN,PK CNQJP WJZ OSAWP QJZAN W SAWNU HEBA,XQP PDWP PDA ZNAWZ KB OKIAPDEJC WBPAN ZAWPD,PDA QJZEOYKRAN'Z YKQJPNU BNKI SDKOA XKQNJJK PNWRAHHAN NAPQNJO, LQVVHAO PDA SEHHWJZ IWGAO QO NWPDAN XAWN PDKOA EHHO SA DWRAPDWJ BHU PK KPDANO PDWP SA GJKS JKP KB?PDQO YKJOYEAJYA ZKAO IWGA YKSWNZO KB QO WHH;WJZ PDQO PDA JWPERA DQA KB NAOKHQPEKJEO OEYGHEAZ K'AN SEPD PDA LWHA YWOP KB PDKQCDP,WJZ AJPANLNEOAO KB CNAWP LEPD WJZ IKIAJPSEPD PDEO NACWNZ PDAEN YQNNAJPO PQNJ WSNU,WJZ HKOA PDA JWIA KB WYPEKJ. - OKBP UKQ JKS!PDA BWEN KLDAHEW! JUILD, EJ PDU KNEOKJOXA WHH IU OEJO NAIAIXAN'Z.";
    private static final int ROT = 1;
    private static final char MAX_FREQ_CHAR = 'e';

    public static void main(String[] args) {
        System.out.println(encode(CLEAR_TEXT.toLowerCase(), ROT));
        int[] F = getFrequencies2(CODED_TEXT.toLowerCase());
        int maxFreq = 0, maxFreqIndex = 0;

        //Afiseaza numarul de aparitie a literelor in text; in acelasi timp afla litera cu cele mai multe aparitii

        for (int i = 0; i < F.length; i++) {
            System.out.printf(" %c - %d; ", ALPHABET.charAt(i), F[i]);
            if (F[i] > maxFreq) {
                maxFreq = F[i];
                maxFreqIndex = i;
            }
        }
        int rot = ALPHABET.indexOf(MAX_FREQ_CHAR) - maxFreqIndex;
        System.out.printf("%nCoded text:%s%nMost probable decode: ROT%d%n%s ", CODED_TEXT, rot, encode(CODED_TEXT, rot));
    }

    /**
     * 
     * @param source Textul care trebuie decodat sau codificat (operatia este simetrica)
     * @param rot Numarul de caractere de salt conform algoritmului de codificare
     * @return Textul codificat
     */
    public static String encode(String source, int rot) {
        if (rot < 0) {
            rot = ALPHABET.length() + rot;
        }

        /*Formez alfabetul de codificare, spargand alfabetul natural in doua bucati,
        la indexul corespunzator numarului "rot" -  de fapt operatiunea de codificare a alfabetului in sine
         * 
         */
        String codeAlphabet = (ALPHABET.substring(rot) + ALPHABET.substring(0, rot)).toUpperCase();
        String encoded = source.toLowerCase();
        for (int i = 0; i < ALPHABET.length(); i++) {

            //Inlocuiesc fiecare caracter din alfabetul natural cu caracterul de pe aceeasi pozitie din alfabetul codificat

            encoded = encoded.replace(ALPHABET.charAt(i), codeAlphabet.charAt(i));
        }
        return encoded;
    }

    /**
     * Metoda de calculare a vectorului cu numar de aparitie a literelor
     * Foloseste calcularea recursiva a numarului de aparitie a fiecarei litere
     * @param source Textul sursa 
     * @return Vector cu numerele de aparitie ale literelor in ordinea din alfabetul natural
     */
    public static int[] getFrequencies(String source) {
        int[] frequencies = new int[ALPHABET.length()];
        for (int i = 0; i < frequencies.length; i++) {
            frequencies[i] = getFrequency(source, ALPHABET.charAt(i));
        }
        return frequencies;
    }

    /**
     * Metoda de calculare a vectorului cu numar de aparitie a literelor
     * Calculeaza in bloc numarul de aparitii
     * Aceasta varianta este mai rapida si mai eficienta - insa in unele situatii 
     * ar putea fi de folos calcularea individuala a frecventei de aparitie a unei litere
     * @param source Textul sursa 
     * @return Vector cu numerele de aparitie ale literelor in ordinea din alfabetul natural
     */
    public static int[] getFrequencies2(String source) {
        int[] frequencies = new int[ALPHABET.length()];
        for (char c : source.toCharArray()) {
            if (ALPHABET.indexOf(c) > -1) {
                frequencies[ALPHABET.indexOf(c)]++;
            }
        }
        return frequencies;
    }

    /**
     * Metoda recursiva de calculare a numarului de aparitii a unei litere in text     
     * @param Textul sursa
     * @param Litera pentru care dorim sa aflam numarul de aparitii
     * @return Numarul de aparitii a literei in text
     */
    public static int getFrequency(String source, char letter) {
        int z = source.indexOf(letter);
        if (z > -1) {
            return 1 + getFrequency(source.substring(z + 1), letter);
        } else {
            return 0;
        }
    }
}


Laborator 3 PC FAIMA

Codul de criptare atribuit lui Iulius Cezar este o maniera simpla de a cifra un text folosind un singur numar pe post de cheie. Modul de criptare este urmatorul: dat fiind numarul X, criptarea ROTX se realizeaza inlocuind fiecare litera din textul clar cu litera corespunzatoare aflata in alfabet la o distanta de X. De exemplu, pentru ROT1, A-->B, B-->C, C-->D, ... , Z-->A. Astfel, textul "HELLO" devine, incifrat, "IFMMP".

Scrieti un program care decripteaza un text cifrat cu cod de substitutie ROTX in toate variantele posibile (26 la numar) si afiseaza de asemenea X (numarul de litere din alfabet) cu care se realizeaza saltul inainte sau inapoi pentru cifrarea fiecarei litere).

ROTX este o varianta a unui sistem de cifrare general, anume cifrul cu substitutie monoalfabetic, ce presupune inlocuirea ne-liniara a literelor (e.g. A-->H, B-->U, C-->L, ... etc). In acest caz, nu mai este suficient sa stim un numar, trebuie sa stim tot alfabetul (i.e. HUL...). Pentru a sparge un astfel de cod, stiind ca textul este scris intr-o anumita limba, putem folosi frecventa de aparitie a literelor in limba respectiva, pentru ca, prin comparatie cu frecventa aparitiei literelor din textul cifrat, sa putem ajunge la o corespondenta cat mai apropiata de cifrul corect.

Scrieti de asemenea o metoda care sa calculeze frecventa aparitiei literelor in textul cifrat.

Folositi ca exemplu urmatorul text in limba engleza

PK XA, KN JKP PK XA: PDWP EO PDA MQAOPEKJ:
SDAPDAN 'PEO JKXHAN EJ PDA IEJZ PK OQBBAN
PDA OHEJCO WJZ WNNKSO KB KQPNWCAKQO BKNPQJA,
KN PK PWGA WNIO WCWEJOP W OAW KB PNKQXHAO,
WJZ XU KLLKOEJC AJZ PDAI? PK ZEA: PK OHAAL;
JK IKNA; WJZ XU W OHAAL PK OWU SA AJZ
PDA DAWNP-WYDA WJZ PDA PDKQOWJZ JWPQNWH ODKYGO
PDWP BHAOD EO DAEN PK, 'PEO W YKJOQIIWPEKJ
ZARKQPHU PK XA SEOD'Z. PK ZEA, PK OHAAL;
PK OHAAL: LANYDWJYA PK ZNAWI: WU, PDANA'O PDA NQX;
BKN EJ PDWP OHAAL KB ZAWPD SDWP ZNAWIO IWU YKIA
SDAJ SA DWRA ODQBBHAZ KBB PDEO IKNPWH YKEH,
IQOP CERA QO LWQOA: PDANA'O PDA NAOLAYP
PDWP IWGAO YWHWIEPU KB OK HKJC HEBA;
BKN SDK SKQHZ XAWN PDA SDELO WJZ OYKNJO KB PEIA,
PDA KLLNAOOKN'O SNKJC, PDA LNKQZ IWJ'O YKJPQIAHU,
PDA LWJCO KB ZAOLEOAZ HKRA, PDA HWS'O ZAHWU,
PDA EJOKHAJYA KB KBBEYA WJZ PDA OLQNJO
PDWP LWPEAJP IANEP KB PDA QJSKNPDU PWGAO,
SDAJ DA DEIOAHB IECDP DEO MQEAPQO IWGA
SEPD W XWNA XKZGEJ? SDK SKQHZ BWNZAHO XAWN,
PK CNQJP WJZ OSAWP QJZAN W SAWNU HEBA,
XQP PDWP PDA ZNAWZ KB OKIAPDEJC WBPAN ZAWPD,
PDA QJZEOYKRAN'Z YKQJPNU BNKI SDKOA XKQNJ
JK PNWRAHHAN NAPQNJO, LQVVHAO PDA SEHH
WJZ IWGAO QO NWPDAN XAWN PDKOA EHHO SA DWRA
PDWJ BHU PK KPDANO PDWP SA GJKS JKP KB?
PDQO YKJOYEAJYA ZKAO IWGA YKSWNZO KB QO WHH;
WJZ PDQO PDA JWPERA DQA KB NAOKHQPEKJ
EO OEYGHEAZ K'AN SEPD PDA LWHA YWOP KB PDKQCDP,
WJZ AJPANLNEOAO KB CNAWP LEPD WJZ IKIAJP
SEPD PDEO NACWNZ PDAEN YQNNAJPO PQNJ WSNU,
WJZ HKOA PDA JWIA KB WYPEKJ. - OKBP UKQ JKS!
PDA BWEN KLDAHEW! JUILD, EJ PDU KNEOKJO
XA WHH IU OEJO NAIAIXAN'Z.

Linkuri utile:

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

Laborator 2 PC FAIMA

Tema de astăzi constă în două probleme, la alegere:


Problema 1


Presupunem că moda respectă un set de reguli stricte, după cum urmează:

  • In fiecare an, obiectele vestimentare sunt fie Mini, fie Maxi, fie Office, iar stilurile se succed exact in aceasta ordine;
  • Culoarea predominanta in fiecare an este una dintre Rosu, Oranj, Galben, Verde, Albastru, Indigo sau Violet - ordinea este cea enumerata, cu 3 exceptii: cand Rosu este la moda, tine 3 ani la rand; Albastru tine 2 ani la rand, iar Indigo (care este mai rar) rateaza una din doua ocazii de a fi la moda. O succesiune tipica este:
    RRROGVeAAIViRRROGVeAAViRRROGVeAAIVi....
  • Accesoriile preferate sunt din trei categorii: Minimal, Extravagant si Clasic. Minimal merge cu moda Mini si Office, dar nu pe Verde si Galben; Extravagant merge doar pe Mini si Maxi; Clasic nu merge pe Rosu, Albastru si Violet; se poate, fireste, ca intr-un an sa mearga mai multe tipuri de accesorii (e.g. intr-un an Mini Oranj merg toate)

Daca 2012 este un an Office Violet, ne intereseaza ce moda era in 1965 si ce moda va fi in

2025.

Problema 2


Presupunem ca in Europa Champions League s-a realizat un pact secret prin care sa se imparta castigatori in mod "echitabil" intre echipele mari, stabilind urmatorul algoritm in urma negocierilor:

  • In fiecare an castigatoarea ECL este din una dintre tarile Anglia, Franta, Spania, Germania, Italia, Portugalia, Rusia, Olanda in aceasta ordine, insa cu cateva exceptii: echipele din Anglia,Spania si Italia castiga cate doua finale la rand, cele din Portugalia castiga doar o data la doua cicluri, cele din Rusia doar o data la trei cicluri, iar la fiecare 4 cicluri apare o castigatoare dintr-o alta tara. Un exemplu de succesiune:
    AAFSSGIIPROAAFSSGIIOAAFSSGIIPOAAFSSGIIROAADDSSGIIPOU....
  • Pentru a pastra aparentele, echipa castigatoare trebuie sa para cea mai puternica, in consecinta trebuie sa aiba cei mai multi Brazilieni in componenta. Concurenta fiind puternica, in fiecare an standardul este diferit - echipele din Portugalia dau tonul: cand castiga o echipa din Portugalia, numarul de Brazilieni necesari ca o echipa sa castige ECL se reseteaza la 1, dupa care creste cu 1 in fiecare an, insa nu mai multi de 10, care este limita impusa de ECL

  • Pentru efectul vizual, o echipa castigatoare a ECL trebuie sa poarte tricouri cu doua dintre urmatoarele culori: Rosu, Alb, Albastru, Negru (o culoare principala si una secundara). Pentru a nu fi nicio confuzie totusi, in doi ani succesivi, echipele castigatoare trebuie sa poarte tricouri diferite, dupa urmatoarea regula: prima culoare este urmatoarea in ordinea enumerarii, iar a doua culoare este cea precedenta in ordinea enumerarii. De exemplu, dupa Rosu-Albastru, urmeaza Alb-Alb; dupa Rosu-Negru urmeaza Alb-Albastru;

Din ce tara va fi echipa castigatoare a ECL in 2025, cati brazilieni va avea si ce culori va purta pe tricou, daca anul acesta (2012) castiga CSKA Moscova (Rusia, Rosu-Negru), iar in 2011 a castigat FC Porto (Portugalia, Alb-Albastru)?

Care este urmatorul an in care Steaua Bucuresti ar putea castiga ECL -- de asemenea, ce culori ar trebui sa poarte si cati Brazilieni ar trebui sa aiba Steaua in componenta in anul respectiv?


Va reamintesc (prin exemple) urmatoarele concepte:


Clasa


Se defineste:


public class Dog {

 private String name, race;
 private Date dateOfBirth;
 private double weight;

 public Dog(String dogName, String dogRace, Date dogDateOfBirth) {
  this.name = dogName;
  this.race = dogRace;
  this.dateOfBirth = dogDateOfBirth;
 }

 public String getName() {
  return this.name;
 }

 public void setName(String dogName) {
  this.name = dogName;
 }

 public Date getDateOfBirth() {
  return dateOfBirth;
 }

 public void setDateOfBirth(Date dateOfBirth) {
  this.dateOfBirth = dateOfBirth;
 }

public String getRace() {
return race;
}

public void setRace(String race) {
this.race = race;
}

 public double getWeight() {
  return weight;
 }

 public void setWeight(double weight) {
  this.weight = weight;
 }
}

... si se foloseste:


Dog myDog=new Dog("Noroc","Maidanez",new Date());
myDog.setWeight(35.3);


Structuri de control

for


for(int i=0;i<10;i++){  System.out.printf("Am ajuns la iteratia %d",i); }

while


int i=0;
while(i<10){  System.out.printf("Am ajuns la iteratia %d",i);  i++; }

if ... else


Date now=new Date();
if(now.getTime()%2L==0){
 System.out.printf("Suntem intr-o milisecunda para");
}
else{
 System.out.printf("Suntem intr-o milisecunda impara");
}

switch ... case ... default


Date now=new Date();
switch((int)(now.getTime()%3L)){
 case 2:
  System.out.printf("Milisecunda de acum da restul 2 la impartirea cu 3");
  break;
 case 1:
  System.out.printf("Milisecunda de acum da restul 1 la impartirea cu 3");
  break;
 default:
  System.out.printf("Milisecunda de acum se imparte la 3");
  break;
}