16 decembrie 2011

Exercitii noi PL/SQL

I. Tabela student {matricol, nume, grupa, medie, bursa} si tabela note {matricol, data, nota}
a) un trigger pt fiecare insert/update/delete in tabela note care va actualiza corespunzator tabela student cu media care reiese;
Apoi se vor insera note diverse.
b) o procedura stocata care acorda burse unui student luat ca parametru (matricol) a.i. pt fiecare nota de 7,8 => add 100 la bursa, pt fiecare nota 9, 10 => add 200 la bursa
c) de apelat procedura intr-un cursor pt toti studentii intr-o grupa  (grupa data de la tastatura)
d) afisare tabel {matricol, nume, grupa, medie, nr.note, bursa}
codul sursa AICI

II. Pachetul facultate care contine o functie bonus (cu parametru matricol) si intoarce o valoare egala cu 100*nr.notelor de 10. Pachetul mai are un cursor ce selecteaza studentii care au  cel putin 3 note de 10 si media peste 9. Folosind cursorul si functia definita, se adauga bonusul la valoarea bursei studentului care respecta toate aceste conditii. Exceptie: pt studentul cu bursa > 1000, tratare prin setarea bursei la 1000.

// creare tabele

create table note (
matricol number(3),
cod_materie number(3),
nota number(2)
);

create table studenti (

matricol number(3),
bursa number(3)
);

// interfata pachet


CREATE OR REPLACE PACKAGE facultate AS

FUNCTION bonus (mymatricol IN number) RETURN number;

CURSOR smart IS
select S.matricol from studenti S
where S.matricol IN (
select N.matricol from note N
where (select count (*) from note where nota = 10 AND matricol = N.matricol) > 2
) AND (
select avg(nota)
from note
where matricol = S.matricol
) >= 9;

bursa_mare EXCEPTION;

END;

// implementare pachet


CREATE OR REPLACE PACKAGE BODY facultate AS

FUNCTION bonus (mymatricol IN number) RETURN number IS
numar number;
begin
numar:=0;
select count(*) into numar
from note
where matricol=mymatricol AND nota=10;
return 100*numar;
end bonus;

END facultate;

// programul principal


declare
vc facultate.smart%ROWTYPE;
valoare number;

BEGIN

open facultate.smart;
LOOP BEGIN
fetch facultate.smart into vc;
exit when facultate.smart%NOTFOUND;

valoare := facultate.bonus(vc.matricol);
IF valoare>1000 THEN raise facultate.bursa_mare; END IF;

update studenti set bursa=bursa+valoare
where matricol=vc.matricol;

EXCEPTION WHEN facultate.bursa_mare
THEN update studenti set bursa=1000 where matricol=vc.matricol;

END;
END LOOP;
close facultate.smart;
END;



Turnurile din Hanoi

A                 B                 C

Varianta cu Divide et Impera:


#include <iostream>

using namespace std;
int tija[67];
// tija['A'], tija['B'], tija['C'] = nr discuri de pe fiecare tija

void hanoi (int n, char a, char c, char b, int & nm) {

if (n==1) {
tija[a]--;
tija[c]++;
cout<<"Mutarea: "<<a<<"->"<<c<<" (A: "<<tija['A']<<" discuri, B:";
cout<<tija['B']<<" discuri, C: "<<tija['C']<<" discuri)"<<endl;
}
else {
// muta n-1 discuri din a in b, folosind c
hanoi (n-1, a, b, c, nm);
tija[a]--;
tija[c]++;
cout<<"Mutarea: "<<a<<"->"<<c<<" (A: "<<tija['A']<<" discuri, B:";
cout<<tija['B']<<" discuri, C: "<<tija['C']<<" discuri)"<<endl;
// muta n-1 discuri din b in c, folosind a
hanoi (n-1, b, c, a, nm);
}
nm++;
}

int main () {

int n;
int nr_miscari = 0;
char a='A', b='B', c='C';
cout<<"n=";
cin>>n;

tija['A']=4;
tija['B']=0;
tija['C']=0;
cout<<"Initial: (A: "<<tija['A']<<" discuri, B:";
cout<<tija['B']<<" discuri, C: "<<tija['C']<<" discuri)"<<endl;

// muta n discuri de pe tija a pe tija c, folosind tija b
hanoi (n,a,c,b, nr_miscari);

cout<<"S-au folosit "<<nr_miscari<<" miscari"<<endl;
return 0;
}

pentru jucat, apasati AICI
pentru solutia folosind stive, apasati AICI, la cap.3

12 decembrie 2011

Functii si pachete in PL/SQL

Acelasi tabel student {matricol, nume, grupa, medie, bursa} :

Functii
a) o functie nestocata care intoarce un mesaj: valideaza valoarea burselor primite de studenti dupa regulile:
1. studentii restantieri, cei cu media < 7 si cei cu media mai mica decat media grupei lor nu primesc burse
2. bursele nu pot depasi 1000 sau sa fie mai mici de 100
3. bursele nu pot fi > media*110
b) o functie stocata pe disc ce calculeaza bursa recomandata pt fiecare student, dupa regulile:
1. media peste 7 si media > media grupei
2. suma burselor studentilor din grupa sa nu depaseasca 2000
3. fiecare bursa sa fie cuprinsa intre 100 si 1000 si sa fie proportionala cu mediile din grupa (bursa=media*2000/suma_medii_grupa). De actualizat bursele cu aceste valori.
c) Pentru fiecare grupa calculat coeficientul grupei k = (nr_studenti cu media > media grupei)/nr total de studenti. Se vor da bonusuri studentilor proportional cu acest coeficient: bursa = bursa * (k+1). La coeficientul cel mai mic nu se da nimic, la coeficientul cel mai mare se da bonus inca o data valoarea bursei.
rezolvarile aici

Pachete
Au 2 parti: specificatia (un fel de interfata) si implementarea (functiilor, procedurilor).
In specificatie se pun variabilele globale, definitia tipurilor de date create, antetele functiilor si procedurilor, se denumesc exceptiile si se scriu cursoarele.
Obiectul creat se numeste facultate si are:
  • variabila globala nr_studenti
  • o functie: getter pentru nr_studenti
  • o procedura: setter pentru nr_studenti
  • definirea unui tip de date grupa cu campurile {nume, nr_studenti, medie}
  • o functie ce intoarce un obiect de tip grupa, cu parametru nr_matricol
  • o procedura care listeaza o grupa luata ca parametru, si afiseaza cele 3 campuri
  • un cursor care itereaza peste multimea de cei mai buni studenti pt fiecare grupa
  • o exceptie bursa_0
Se cere:
a) afisarea var globale nr_studenti
b) stergerea celui mai slab student din fiecare grupa, actualizarea var globale & reafisarea ei
c) folosind cursorul si functiile definite - listarea tuturor grupelor
d) folosind acelasi cursor, ridicarea exceptiei bursa_0 cand un student cu media cea mai mare din grupa are bursa 0; se trateaza cu actualizarea bursa=media*100.
rezolvarile aici

06 decembrie 2011

Aplicatie cu socketi TCP in Java

Un mini-messenger, fara interfata grafica, intre mai multi clienti conectati la un server. Serverul stocheaza mesajele de la un client si le furnizeaza destinatiei la cerere (atunci cand destinatia cere acest lucru).
Rularea se face din linia de comanda, iar mesajele care provin de la clienti sunt de forma:
sign_in*username
sign_out*username
send_message*sender*receiver*mesaj
receive_messages*username
Este doar un sablon, ce poate fi imbunatatit cu:
* interfata grafica pe partea clientului
* verificarea autenticitatii celui care trimite mesajul (send_message*sender*...) si a faptului ca e logat
* primire automata a mesajelor fara explicitare (receive_messages)
* etc

Descarcare aici

Triggeri in PL/SQL

Tabela student: {matricol, nume, grupa, medie, bursa}
1) creati un trigger care la fiecare inserare in tabela va popula bursa acelor stud cu medii > 7 , bursa = medie * 100; dupa acest trigger, insert 10 inreg in tabela; la inserare bursa=0
2) creati un nou trigger care se va asigura k la fiecare update al coloanei bursa , bursa nu se va da decat stud cu medii >= 7 si bursa e in intervalul 700..1000 (0 la medie<7, 700 la mai mic, 100 la mai mare); trigger pe toti studentii dintr-o grupa
3) folosind un view (proiectie a tabelei student), creati un trigger pe acest view care se executa la comanda delete si in momentul stergerii unui rand din view sa redistribuie bursa studentului respectiv celorlalti studenti din grupa sa; dar daca studentul este cel mai bun din grupa atunci stergerea este anulata;

1)
create table studenti (
matricol number(3),
nume varchar2(40),
grupa varchar2(5),
medie number(2),
bursa number(5)
);

CREATE OR REPLACE TRIGGER inserare
BEFORE INSERT ON studenti FOR EACH ROW
WHEN (new.bursa = 0 AND new.medie > 7)
BEGIN
:new.bursa := :new.medie * 100;
END;
/

insert into studenti values (100, 'ion', '341C1', 8, 0);
insert into studenti values (101, 'gheo', '341C1', 10, 0);
insert into studenti values (102, 'vasi', '341C1', 7, 0);
insert into studenti values (103, 'delia', '341C1', 5, 0);
insert into studenti values (104, 'diana', '341C1', 9, 0);

insert into studenti values (105, 'liviu', '341C5', 9, 0);
insert into studenti values (106, 'xena', '341C5', 8, 0);
insert into studenti values (107, 'raul', '341C5', 10, 0);
insert into studenti values (108, 'costin', '341C5', 9, 0);
insert into studenti values (109, 'daria', '341C5', 7, 0);

pentru celelalte exercitii rezolvate accesati (aici)