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