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