Table of Contents

Laborator 2 - Node.js


Obiective

Seminarul de fațӑ ȋși propune familiarizarea studentului cu limbajul de programare JavaScript, prin introducerea urmӑtoarelor noțiuni:


Resurse pentru acest seminar

Se va utiliza ȋn cadrul seminarului un interpretor de Javascript (NodeJS) disponibil online:


Sau se poate utiliza direct bash-ul, dupӑ cum este prezentat mai jos:

$ node
> console.log("Bine ați venit la seminarul de Introducere ȋn Informaticӑ!")


Alte resurse online de studiu:


Variabile

JavaScript, ca si Python este tot un limbaj in care variabilele sunt tastate dinamic. Toate variabilele se incadreaza in următoarele primitive:

sau compuse Object.

Array si Function sunt sub tipuri ale Object.

De retinut ca in Javascript functiile sunt tot un tip de date. Ex:

var afiseaza = function(){ console.log(“Hello World”) }

Dar se poate folosi și o scriere similară cu cea din C

function afiseaza(){ console.log(“Hello World”) }

Variabile numerice

In Javascript toate numerele sunt stocate ca numere cu virgula mobila sub denumirea de tip Number.

// Sintaxa aferentӑ declarӑrii unui numӑr ȋntreg
myInt = 7
 
// Sintaxa aferentӑ declarӑrii unui numӑr real
myFloat = 7.1
 
//ambele numere for fi stocate ca float dar putem verifica daca un numar este intreg
//cu Number.isInteger(variabila)
 
if( Number.isInteger(myInt) ) console.log( "this number is an integer" )
Variabile de tip string

String-urile se pot defini fie utilizȃnd apostrofuri, fie ghilimele ca si in python.

myString = 'hello'
myString = "hello"


suma = a  + b
hello = "hello"
world = "world"
message = hello + " " + world
# Asta va funcționa desi in python nu functioneaza!
 
one = 1
two = 2
three = 3
hello = "hello"
 
console.log (one + two + three + hello);


Structuri de date

Arrays

Array-urile / Listele pot conține orice tip de variabilӑ/-e, iar numӑrul elementelor pe care ȋl conțin este variabil și nerestrictiv. Listele pot fi de asemenea iterate ȋntr-o manierӑ foarte simplӑ, dupӑ cum este prezentat ȋn exemplul de mai jos:

# Se declarӑ lista.
 
mylist = []
 
# Se insereazӑ elementele ȋn listӑ.
 
mylist.push(1)
mylist.push(2)
mylist.push(3)
 
# Se afișeazӑ element cu element conținutul listei.
 
console.log( mylist[0] )
console.log( mylist[1] )
console.log( mylist[2] )
 
# Outputul va arӑta cam așa:
1
2
3

La fel ca și ȋn alte limbaje de programare, elementele din listӑ sunt indexate ȋncepȃnd cu 0, nu cu 1.

// Se afișeazӑ element cu element conținutul listei, utilizȃnd o structurӑ repetitivӑ de tip "for".
 
for (value of mylist):
    console.log(value)
 
// Outputul va arӑta cam așa:
1
2
3
 
// sau direct console.log(mylist)
//
 
// de asemenea in JavaScript array-urile mai au si o metoda forEach care primeste o functie ce poate fi apelata pentru fiecare element
 
mylist.forEach( function(value,index ){
   //in javascript putem crea functii anonime atunci cand este nevoie
   //nu e nevoie sa ne definim in prealabil functia, o putem crea pe moment unde este necesara
   console.log("mylist["+index+"] e "+value);
} );
Metode si proprietati predefinite utile ȋn lucrul cu liste



Map

Un obiect de tip Map din Javascript ese similar unui dicționar din python unde orice cheie este un sir de caractereMap. Singura diferenta e ca in JavaScript si functiile sunt tipuri de variabila asa ca acest dictionar poate sa retina si metode. In plus Map nu are cheile restricionate la siruri de caractere, chei poti fi orice tip de variabila inclusiv obiecte.

Cum se declarӑ un dicționar?

optionalRepartizare = new Map()
 
optionalRepartizare.set("Ana","Grafica inginereasca")

Cum se parcurg elementele unui Map?

Aici exista mai multe metode dar probabil cea mai usoara ramane metoda forEach

optionalRepartizare.forEach(function(value,key){
  console.log(key,value);
});
//ca si in cazul array-urile aceasta metoda primeste o functie ce va fi apelata pentru fiecare obiect

Cum se eliminӑ valori dintr-un Map?

optionalRepartizare.delete("Ana")
Metode si proprietati utile ȋn lucrul cu Dictionare



Operatori

Operatorii and "&&" și or "||"
nume = "Madalina"
varsta = 34
 
if ( nume == "Madalina" && varsta == 34 )
    console.log( "Numele tau este Madalina si ai 34 de ani." )
 
if ( nume == "Madalina" || varsta == 34 )
    console.log( "Numele tau este Madalina si ai 34 de ani." )
 
Operatorul not "!"

Operatorul ”!” sau operatorul de negare inverseazӑ valoarea de adevӑr a expresiei sau a variabilei.

variabila = true
 
// Secvența urmӑtoare va afișa valoarea de adevӑr "False"
console.log ( !variabila );
 



Structuri repetitive

Ȋn general, declarațiile sunt executate secvențial: prima declarație dintr-o funcție este executatӑ prima, urmatӑ de a doua, și tot așa. Pot exista situații ȋn care este necesarӑ execuția unui bloc de instrucțiuni ȋn repetate rȃnduri. Limbajele de programare oferӑ variate structuri de control ce permit cai pentru execuția unor bucӑți mai complicate de cod.

Buclele permit execuția unor declarații sau unor grupuri de declarații de mai multe ori.

Javascript oferӑ urmӑtoarele tipuri de bucle/structuri repetitive:

Structura repetitivӑ sau bucla "for"

Structura repetitivӑ “for” din JavaScript are 3 variante

for(declaratie;conditie;pas) similara cu cea din C

for(valoare of array)

for(index in array) sau proprietate in obiect

listaDeNume = ["Ana", "Maria", "Ioana", "Irina", "Andreea", "Cristina"]
 
for (var i =0; i<listaDeNume.length; i++){
  console.log(listaDeNume[i]);
}
 
//sau
 
for (var nume of listaDeNume){
  console.log(nume);
}
 
//sau
 
for (var i in listaDeNume){
  console.log(listaDeNume[i]);
}
Structura repetitivӑ sau bucla "while"

Structura repetitivӑ “while” se executӑ atȃt timp cȃt condiția indicatӑ este respectatӑ. Este similarӑ unei declarații de tip “if”, ȋnsӑ bucla “while” se va opri ȋn momentul ȋn care condiția enunțatӑ nu va mai fi ȋndeplinitӑ. Cu alte cuvinte, se va verifica “cȃt timp” este valabilӑ condiția respectivӑ, și nu “dacӑ” ea este validӑ. De exemplu, dorim sӑ afișӑm cifrele de la 0 la 9.

count = 0
 
while(count < 10){
    console.log(count)
    count++
}
Declarațiile "break" și "continue"

Declarația “break” este utilizatӑ pentru a ieși dintr-o structurӑ repetitivӑ; este o alternativӑ la condiția de ieșire. De exemplu, dorim sӑ afișӑm cifrele de la 0 la 9.

count = 0
 
while(true){
    console.log(count)
    count = count + 1
    if(count > 10)
        break
}

Declarația “continue” este utilizatӑ pentru a sӑri peste un bloc de instrucțiuni. De exemplu, dorim sa afișӑm toate numerele pare din intervalul [0, 20].

number = 0
 
while(number < 21){
    if( number % 2 == 1 )
        continue
    console.log(number)
}



Funcții

Ce sunt funcțiile?

Funcțiile sunt o metodӑ convenabilӑ de partiționare a codului ȋn blocuri organizate ce faciliteazӑ gestionarea acestuia. De asemenea in JavaScript functiile sub obiecte si implicit pot fi stocate in variabile ca orice at timp de data..

Cum se declarӑ funcțiile?

Ȋn Javascript , funcțiile sunt definite folosind cuvȃntul cheie function argumente si codul functiei similar cu C/C++. De exemplu:

function functiaMea(){
    console.log("Bine ati veni la cursul de introducere in informatica!")
}
 
//sau
var functiaMea = function(){
    console.log("Bine ati veni la cursul de introducere in informatica!")
}

De asemenea, o funcție poate primi argumente (variabile trimise ca parametru de cӑtre “apelant” funcției). Mai mult, funcțiile pot returna rezultate. Exemplul de mai jos reprezintӑ o funcție ce primește ca parametri douӑ numere și returneazӑ suma acestora.

var sumaNumerelor = function( a, b){
    return a + b
}

Functii anonime

Spre deosebire de alte limbaje in JavaScript o functie poate fi definita doar acolo unde este nevoie in caz ca nu mai trebuie refolosita.

var suma = function(a,b){return a+b;}(1,2)
// in aceasta situatie se va genera functia si va fi apelata pe loc pentru valorile a=1 b=2

Acest lucru este util in JavaScript cand unul din argumentele unei functii/metode asteapta alta functie. De exemplu o filtrare peste un arary

var ar = [2,9,11,14]
 
console.log( 
  ar.filter(function(value){
    if( value % 2 == 0) return true;
    else return false;
  })
);
 
// acest cod paseaza o functie care returneaza true sau false in functie de paritatea argumentului
// astfel array ar va fi filtrat si se va returna un array ce contine daor elementele pare din ar

Din moment ce functia este un tip de variabila optiunile sunt nelmitate. De exemplu

// o functie care primeste un numar si verifica paritatea
var estePar = function( numar ){
  if(numar%2 == 0) return true;
  return false;
}
 
// o functie care primeste un nume de functie si un argument
// si apeleaza functia cu acel argument
var apeleazaFunctie = function( functeDataDeMine, argument ){
  return functeDataDeMine(argument)
}
 
 
// parcurge cu un for numerele de la 0 la 4
// si apeleaza functia este par pentru fiecare i
for(var i = 0; i<5; i++)
if( apeleazaFunctie( estePar, i) ){ console.log(i + " este par ") }
else { console.log(i + " este impar ") }



Obiecte

Un obiect din Javascript ese similar unui dicționar din python unde orice cheie este un sir de caractere. Singura diferenta e ca in JavaScript si functiile sunt tipuri de variabila asa ca acest dictionar poate sa retina si metode

Cum se declarӑ un dicționar?

optionalRepartizare = {}
 
optionalRepartizare ["Ana"] = "Grafica inginereasca"
//sau
optionalRepartizare.Andrei = "Introducere in informatica"
//dar si 
optionalRepartizare.salut = function(){ console.log("salut) }

De asemenea:

optionalRepartizare = {
    "Ana" : "Grafica inginereasca",
    "Andrei" : "Introducere in informatica",
    "salut" : function(){ console.log("salut) }
}
 
// functia se apealeaza prin
optionalRepartizare.salut()

Cum se parcurg elementele unui obiect?

Obiectele pot fi iterate cu ajutorul structurei “for .. in” ce returneaza indexii din obiect

optionalRepartizare = {
    "Ana" : "Grafica inginereasca",
    "Andrei" : "Introducere in informatica",
    "Radu" : "Grafica inginereasca",
    "Serban" : "Mecanica", 
    "Roxana" : "Introducere in informatica"
 
}
 
for (var numeStudent in optionalRepartizare )
   console.log( numeStudent, optionalRepartizare[numeStudent])

Cum se eliminӑ valori dintr-un obiect?

delete optionalRepartizare["Ana"]
Funcții si metode utile ȋn lucrul cu dicționare

Din moment ce aceastea nu sunt Dictionare propriu zise ci obiecte numarul de functii si metode predefinite este limitat



Exerciții și aplicații

  1. [15p] Creați cȃte o variabilӑ de tipul: number, boolean și string, dupӑ cum urmeazӑ:
    • Variabila de tip int va reține valoarea 20.
    • Variabila de tip boolean.
    • Variabila de tip string reține valoarea “javascript”.
  2. [15p] Utilizȃnd funcția typeof, determinați tipul variabilelor definite la exercițiul anterior.
  3. [20p] Creați o listӑ cu numele fetelor din grupa voastrӑ (numele nu trebuie sӑ fie distincte). Respectȃnd ordinea cerințelor rezolvați urmӑtoarele cerințe:
    • Sortați lista de nume.
    • Utilizȃnd o listă auxiliară, determinați numӑrul de apariții al fiecӑrui nume.
    • Determinați numele care apare de cele mai multe ori ȋn lista inițialӑ.
    • Determinați numele care apare de cele mai puține ori ȋn lista inițialӑ.
    • Revenind la lista inițialӑ de nume, inversați ordinea elementelor.
  4. [30p] Creați cu ajutorul unui Map o bazӑ de date ȋn care sӑ rețineți numerele de telefon ale colegilor de grupӑ. Parcurgeți-l și afișați toate persoanele al căror număr are un anumit prefix (e.g., 0735).
  5. [20p] Scrieți o secvențӑ de cod care sӑ afișeze ȋn consolӑ toate numerele pare divizibile cu 7 din intervalul [0, 3463]. Hint: utilizați for. Ajustați codul astfel ȋncȃt la apariția primului multiplu al lui 833, algoritmul sӑ se opreascӑ.