Documente Academic
Documente Profesional
Documente Cultură
Indrumar Laborator
Daca din activitatea de laborator se obtin cel putin 6 puncte nu mai este necesara
prezentarea la examen. In acest caz, Nota laborator = Activitate laborator.
Examenul consta din rezolvarea (la calculator) a unei probleme asemanatoare cu cele
propuse in timpul semestrului.
Pentru studentii care au atat Activitate de laborator cat si nota la examen, nota finala se
calculeaza astfel:
Pentru promovarea laboratorului este necesara obtinerea unei note mai mari sau
egala cu 5.
1. Se deschide un Notepad (Start -> Run -> notepad [Enter]) si se scrie primul
program in Java:
class HelloWorld
{
public static void main(String args[])
{
System.out.println(“Hello World!”);
}
}
Pentru accesarea caii din Clipboard se da click dreapta si, din meniu, se selecteaza
Paste.
7. Pentru verificare se executa javac, iar rezultatul trebuie sa fie similar cu cel din
figura de mai jos:
…>d:
…>cd Student
9. Se compileaza HelloWorld.java:
…>javac HelloWorld.java
…>java HelloWorld
11. Pentru modificarea programului trebuie editat codul aflat in fisierul
HelloWorld.java si repetati pasii 9 si 10.
Laborator 2
Conform specificatiilor de acces ale unei clase si ale mebrilor ei, doar clasele
publice si membrii declarati publici ai unei clase sunt accesibili in afara pachetului
in care se gasesc.
Pentru a folosi o clasa publica dintr-un anumit pachet, sau pentru a apela o metoda
publica a unei clase publice a unui pachet, exista trei solutii:
• specificarea numelui complet al clasei
• importul clasei respective
• importul intregului pachet in care se gaseste clasa.
Importul unei clase sau interfete se face prin instructiunea import in care specificam
numele complet al clasei sau interfetei pe care dorim sa o folosim dintr-un anumit pachet:
import numePachet.numeClasa;
import java.awt.Button;
import numePachet.*;
import java.awt.*;
Instructiunea package actioneaza asupra intregului fisier sursa la inceputul caruia apare.
Cu alte cuvinte nu putem specifica faptul ca anumite clase dintr-un fisier sursa apartin
unui pachet, iar altele altui pachet.
Daca nu este specificat un anumit pachet, clasele unui fisier sursa vor face parte din
pachetul implicit (care nu are nici un nume). In general, pachetul implicit este format din
toate clasele ¸si intefet¸ele directorului curent de lucru. Este recomandat insa ca toate
clasele si intefetele sa fie plasate in pachete, pachetul implicit fiind folosit doar
pentru aplicatii mici sau prototipuri.
Exemplu
class UsePachet
{
public static void main (String args[])
{
NumerePrime np = new NumerePrime();
System.out.println(np.EstePrim(3));
}
}
Exercitiu
Se cere implementarea metodelor din clasa NumerePrime si apelarea lor in clasa
UsePachet.
Laborator 3
Fluxuri
Majoritatea aplicatiilor necesita citirea unor informatii care se gasesc pe o sursa externa
sau trimiterea unor informatii catre o destinatie externa. Informatia se poate gasi oriunde:
intr-un fisier pe disc, in retea, in memorie sau in alt program si poate fi de orice tip: date
primitive, obiecte, imagini, sunete, etc. Pentru a aduce informatii dintr-un mediu extern,
un progam Java trebuie sa deschida un canal de comunicatie (flux) de la sursa
informatiilor (fisier, memorie, socket, etc) si sa citeasca secvential informatiile
respective.
Atat sursa externa a unor date cat si destinatia lor sunt vazute ca fiind niste procese care
produc, respectiv consuma informatii.
Definitii:
Observatii:
In general, intrarea standard este tastatura iar iesirea standard este ecranul.
Intrarea si iesirea standard sunt reprezentate de obiecte pre-create ce descriu fluxuri de
date care comunica cu dispozitivele standard ale sistemului.
Aceste obiecte sunt definite publice in clasa System si sunt:
• System.in - fluxul standar de intrare
• System.out - fluxul standar de iesire
• System.err - fluxul standar pentru erori
Afisarea oricaror rezultate pe ecran (in modul consola) se poate face cu ajutorul
urmatoarelor metode:
System.out.print (argument);
System.out.println(argument);
System.out.printf (format, argumente...);
System.out.format (format, argumente...);
Citirea datelor se poate face folosind metoda System.in.read(). De cele mai multe ori se
foloseste metoda readLine impreuna cu o clasa de procesare care ofera aceasta metoda.
Exemplul tipic este:
BufferedReader stdin = new BufferedReader(
new InputStreamReader(System.in));
System.out.print("Introduceti o linie:");
String linie = stdin.readLine()
System.out.println(linie);
Exemplul 1
class Input
{
public static void main(String args[])
throws java.io.IOException
{
byte zona[] = new byte[50];
System.in.read(zona);
String sir = new String(zona,0);
System.out.println(sir);
}
}
Exemplul 2
class Calc
{
public static void main(String args[])
{
System.out.println("Introduceti prima valoare");
int a = System.in.read();
System.out.println("Introduceti a doua valoare");
int b = System.in.read();
// Se calculeaza suma folosind metoda parseInt() a
//clasei Integer
int c = a + b;
System.out.println("Suma este" +c);
}
}
Exemplul 3
import java.io.*;
public class InputLinie
{
public static void main ( String [] args )
{
BufferedReader stdin = new BufferedReader(
new InputStreamReader(System.in));
System.out.print("Introduceti o linie:");
String linie = stdin.readLine()
System.out.println(linie);
}
}
Exercitiu
Fluxuri (continuare)
Clasificarea fluxurilor
• Fisier
FileReader, FileWriter
FileInputStream, FileOutputStream
Numite si fluxuri fisier, acestea sunt folosite pentru citirea datelor dintr-un fisier,
respectiv scrierea datelor intr-un fisier.
• Memorie
CharArrayReader, CharArrayWriter
ByteArrayInputStream, ByteArrayOutputStream
Aceste fluxuri folosesc pentru scrierea/citirea informatiilor in/din memorie
si sunt create pe un vector existent deja. Cu alte cuvinte, permit tratarea vectorilor
ca sursa/destinatie pentru crearea unor fluxuri de intrare/iesire.
• Pipe
PipedReader, PipedWriter
PipedInputStream, PipedOutputStream
Implementeaza componentele de intrare/iesire ale unei conducte de date (pipe).
Pipe-urile sunt folosite pentru a canaliza iesirea unui program sau fir de executie
catre intrarea altui program sau fir de executie.
Exemplul 1
import java.io.*;
class CreareFisier
{
public static void main(String args[])
{ FileOutputStream fdest;
if (args.length !=1)
{System.out.println("Utilizare:java CreareFisier destinatie");
System.exit(1);
}
try
{ fdest = new FileOutputStream(args[0]);
char c;
while ((c=(char)System.in.read()) != '\u001a')
fdest.write((byte)c);
fdest.close();
System.exit(0);
}
catch(IOException e){}
}
}
Exemplul 2
import java.io.*;
public class CopiereFisiere
{
static FileInputStream fsursa;
static FileOutputStream fdest;
}
}
Exercitiu
Fluxuri de procesare
Fluxurile de procesare (sau de filtrare) sunt responsabile cu preluarea datelor de la un flux
primitiv si procesarea acestora pentru a le oferi intr-o alta forma, mai utila dintr-un
anumit punct de vedere. De exemplu, BufferedReader poate prelua date de la un flux
FileReader si sa ofere informatia dintr-un fisier linie cu linie. Fiind primitiv, FileReader
nu putea citi decat caracter cu caracter. Un flux de procesare nu poate fi folosit decat
impreuna cu un flux primitiv.
Clasele ce descriu aceste fluxuri pot fi impartite in functie de tipul de procesare pe care il
efectueaza astfel:
• ”Bufferizare”
BufferedReader, BufferedWriter
BufferedInputStream, BufferedOutputStream
Sunt folosite pentru a introduce un buffer in procesul de citire/scriere a
informatiilor, reducand astfel numarul de accesari la dispozitivul ce reprezinta
sursa/destinatia originala a datelor. Sunt mult mai eficiente decat fluxurile fara
buffer si din acest motiv se recomanda folosirea lor ori de cate ori este posibil.
• Filtrare
FilterReader, FilterWriter
FilterInputStream, FilterOutputStream
Sunt clase abstracte ce definesc o interfata comuna pentru fluxuri care
filtreaza automat datele citite sau scrise.
• Conversie octeti-caractere
InputStreamReader, OutputStreamWriter
Formeaza o punte de legatura intre fluxurile de caractere si fluxurile de octeti. Un
flux InputStreamReader citeste octeti dintr-un flux InputStream si ii converteste la
caractere, folosind codificarea standard a caracterelor sau o codificare specificata
de program. Similar, un flux OutputStreamWriter converteste caractere in octeti si
trimite rezutatul catre un flux de tipul OutputStream.
• Serializare
ObjectInputStream, ObjectOutputStream
Sunt folosite pentru serializarea obiectelor.
• Concatenare
SequenceInputStream
Concateneaza mai multe fluxuri de intrare intr-unul singur.
• Conversie tipuri de date
DataInputStream, DataOutputStream
Folosite la scrierea/citirea datelor de tip primitiv intr-un format binar, independent
de masina pe care se lucreaza.
• Numarare
LineNumberReader
LineNumberInputStream
Ofera si posibilitatea de numarare automata a liniilor citite de la un flux de intrare.
Fluxurile de procesare nu pot exista de sine statatoare ci se suprapun pe un flux primitiv
de citire/scriere a datelor. Din acest motiv, constructorii claselor pentru fluxurile de
procesare nu primesc ca argument un dispozitiv extern de memorare a datelor ci o
referinta la un flux primitiv responsabil cu citirea/scrierea efectiva a datelor:
Exemple:
//crearea unui flux de intrare printr-un buffer
BufferedReader in = new BufferedReader(new
FileReader("fisier.txt"));
//echivalent cu
FileReader fr = new FileReader("fisier.txt");
BufferedReader in = new BufferedReader(fr);
//crearea unui flux de iesire printr-un buffer
BufferedWriter out = new BufferedWriter(new
FileWriter("fisier.txt")));
//echivalent cu
FileWriter fo = new FileWriter("fisier.txt");
BufferedWriter out = new BufferedWriter(fo);
Asadar, crearea unui flux pentru procesarea datelor are formatul general:
FluxProcesare numeFlux = new FluxProcesare(fluxPrimitiv);
Exemplul 1
import java.io.*;
class CitesteNumar
{ public static void main(String args[])throws IOException
{ int numar;
Exemplu 2
import java.io.*;
class BufferedIO
{
public static void main(String args[])
{ byte[] buf = new byte[1024];
int citit;
try
{ FileInputStream fin = new FileInputStream(args[0]);
FileOutputStream fout = new FileOutputStream(args[1]);
BufferedInputStream bfin = new BufferedInputStream(fin,4096);
BufferedOutputStream bfout = new BufferedOutputStream(fout,2048);
bfin.mark(128);
citit = bfin.read(buf,0,128);
bfout.write(buf,0,citit);
bfin.reset();
while((citit = bfin.read(buf,0,1024)) != -1)
bfout.write(buf,0,citit);
bfout.flush();
bfin.close();
bfout.close();
}
catch (FileNotFoundException e)
{ System.out.println("Nu exista fisierul sursa " + args[0]);
}
catch (IOException e1)
{ System.out.println("Eroare I/O");
}
}
}
Exemplu 3
import java.io.*;
class ScriePrime
{ public static void main(String args[])
{ int prime[] = new int[400];
int index = 0, nr = 2;
while ( index < 400)
{ if (estePrim(nr))
prime[index++] = nr;
nr++;
}
try
{ FileOutputStream fout = new FileOutputStream("NrPrime.dat");
BufferedOutputStream buffer = new BufferedOutputStream(fout);
DataOutputStream date = new DataOutputStream(buffer);
for(int i=0;i<400;i++)
date.writeInt(prime[i]);
date.close();
}
catch(IOException e)
{ System.out.println("Eroare " + e);
System.exit(1);
}
System.exit(0);
}
public static boolean estePrim(int nr)
{ double radical = Math.sqrt(nr);
for(int i=2;i<= radical;i++)
if (nr%i == 0)
return false;
return true;
}
}
Exercitiu
Sa se citeasca din fisierul NrPrime.dat numerele prime care sunt mai mari decat 100 si
mai mici de 200.
Laborator 6
Serializarea obiectelor
Definitie
Serializarea este o metoda ce permite transformarea unui obiect intr-o secventa de
octeti sau caractere din care sa poata fi refacut ulterior obiectul original.
Acest lucru inseamna ca serializarea permite salvarea intr-o maniera unitara a tuturor
informatiilor unui obiect pe un mediu de stocare extern programului. Procesul invers, de
citire a unui obiect serializat pentru a-i reface starea originala, se numeste deserializare.
Important! Un obiect este serializabil daca si numai daca clasa din care face parte
implementeaza interfata Serializable.
Exemplu
//Punct.java
import java.io.*;
class Punct implements Serializable
{ int x,y;
Punct(int x,int y)
{ this.x = x;
this.y = y;
}
public String toString()
{ return "Punct(" + x + "," + y +")";
}
}
//Cerc.java
import java.io.*;
class Cerc implements Serializable
{ Punct p;
int r;
Cerc(int x,int y,int r)
{ p = new Punct(x,y);
this.r = r;
}
//ScrieObiecte.java
import java.io.*;
class ScrieObiecte
{ public static void main(String args[]) throws Exception
{ FileOutputStream fdest = new FileOutputStream("FisierObiecte");
ObjectOutputStream objdest = new ObjectOutputStream(fdest);
objdest.writeObject(new Punct(5,10));
objdest.writeObject(new Cerc(3,5,10));
objdest.close();
}
}
//CitesteObiecte.java
import java.io.*;
class CitesteObiecte
{ public static void main(String args[]) throws Exception
{ FileInputStream fsursa = new FileInputStream("FisierObiecte");
ObjectInputStream objsursa = new ObjectInputStream(fsursa);
Punct p = (Punct) objsursa.readObject();
System.out.println(p.toString());
Cerc c = (Cerc) objsursa.readObject();
System.out.println(c.toString());
objsursa.close();
System.out.println("Again " + p + "\n" + c);
}
}
Exercitiu
Sa se salveze intr-un fisier 5 obiecte din clasa Angajat de mai jos apoi sa se
restaureze cele 5 obiecte si sa se calculeze salarul mediu.
class Angajat
{
String cnp;
String nume;
float salar;
Exemple:
RandomAccesFile f1 = new RandomAccessFile("fisier.txt", "r");
//deschide un fisier pentru citire
RandomAccesFile f2 = new RandomAccessFile("fisier.txt", "rw");
//deschide un fisier pentru scriere si citire
In plus fata de metodele de tip read si write clasa pune la dispozitie si metode pentru
controlul pozitiei pointerului de fisier. Acestea sunt:
• skipBytes - muta pointerul fisierului inainte cu un numar specificat de octeti
• seek - pozitioneaza pointerului fisierului inaintea unui octet specificat
• getFilePointer - returneaza pozitia pointerului de fisier.
Exemplu 1
import java.io.*;
try{
//Se deschide fisierul pentru citire si scriere
RandomAccessFile rand = new RandomAccessFile(file,"rw");
rand.close();
catch(IOException e)
{
System.out.println(e.getMessage());
}
}
}
Exemplu 2
import java.io.*;
import java.util.*;
class RAFisier
{
public static void main(String args[]) throws IOException
{
RandomAccessFile fis;
int i;
long pozitie;
System.out.println("Fisierul este");
fis.seek(0);
for(i = 0;i < 10;i++)
System.out.print(fis.readDouble() + "\t");
System.out.println("\nFisierul modificat");
fis.seek(0);
for(i = 0;i < 10;i++)
System.out.print(fis.readDouble() + "\t");
fis.close();
}
}
Exercitiu
Exemplu de folosire:
//Lista.java
class Lista
{ protected NodLista cap = null;
protected NodLista coada = null;
protected int nrElem = 0;
//ScrieLista.java
import java.io.*;
class ScrieLista
{ public static void main(String args[]) throws Exception
{ Lista lista = new Lista();
for(int i = 0;i < 5;i++)
lista.adauga(new Integer(i));
FileOutputStream fdest = new FileOutputStream("FisierLista");
ObjectOutputStream objdest = new ObjectOutputStream(fdest);
objdest.writeObject(lista.cap);
objdest.writeObject(lista.coada);
objdest.close();
}
}
Exercitiu
Iteratori si enumerari
Definitie
Enumerarile si iteratorii descriu modalitati pentru parcurgerea secventiala a unei colectii,
indiferent daca aceasta este indexata sau nu.
Iteratorii sunt preferati enumerarilor datorita posibilitatii lor de a actiona asupra colectiei
pe care o parcurg prin metode de tip remove, add, set.
Atentie
Deoarece colectiile sunt construite peste tipul de date Object, metodele de tip next sau
prev ale iteratorilor vor returna tipul Object, fiind responsabilitatea noastra de a face
conversie (cast) la alte tipuri de date, daca este cazul.
Exemplu
//ListaIterator.java
import java.util.*;
class ListaIterator implements Enumeration
{
protected NodLista poz;
//CitesteLista.java
import java.io.*;
class CitesteLista
{
public static void main(String args[]) throws Exception
{
Lista lista = new Lista();
FileInputStream fsursa = new FileInputStream("FisierLista");
ObjectInputStream objsursa = new ObjectInputStream(fsursa);
lista.cap = (NodLista)objsursa.readObject();
lista.coada = (NodLista)objsursa.readObject();
System.out.println("Lista contine:");
java.util.Enumeration e = new ListaIterator(lista);
while(e.hasMoreElements())
{ Integer element = (Integer)e.nextElement();
System.out.println(element.toString());
}
}
}
Exercitiu
//TestIterator.java
import java.util.*;
class TestIterator
{
public static void main ( String args [])
{
ArrayList a = new ArrayList ();
// Adaugam numerele de la 1 la 10
for (int i=1; i <=10; i++)
a.add(new Integer (i));
// Amestecam elementele colectiei
Collections.shuffle(a);
System.out.println (" Vectorul amestecat : " + a);
// Parcurgem vectorul
// Daca elementul curent este par , il facem 0
//...
System . out. print (" Rezultat : " + a);
}
}
//Backtracking.java
public abstract class Backtracking
{
abstract boolean conditieContinuare();
abstract boolean solutie();
abstract void nivelUrmator();
abstract void nivelAnterior();
abstract boolean existaUrmator();
abstract void elementUrmator();
abstract boolean sfarsitCautare();
}
//Permutare.java
public class Permutare extends Backtracking
{ int n;
int k=0;
int[] v;
public Permutare(int n)
{ this.n = n;
v = new int[n+1];
nivelUrmator();
}
boolean conditieContinuare()
{ for(int i = 1;i < k;i++)
if(v[i] == v[k])
return false;
return true;
}
boolean solutie()
{ return k == n;
}
void nivelUrmator()
{ v[++k] = 0;
}
void nivelAnterior()
{ k--;
}
boolean sfarsitCautare()
{ return k == 0;
}
boolean existaUrmator()
{ return v[k] < n;
}
void elementUrmator()
{ v[k]++;
}
//TestPermutare.java
import java.io.*;
class TestPermutare
{public static void main(String args[])throws IOException
{ int n;
System.out.println("Toate permutarile de n elemente");
InputStreamReader sin = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(sin);
System.out.print("Introduceti (un numar intreg >=1) n = ");
n = Integer.valueOf(in.readLine()).intValue();
Permutare p = new Permutare(n);
while(p.cautaSolutie())
p.printSolutie();
}
}
Exercitiu
Modificati programul de mai sus pentru a rezolva problema celor 8 regine. Pentru a
intelege mai bine problema vizitati:
http://gaia.ecs.csus.edu/~wang/backtrack/queens/queen1/eightqueens.html
Laborator 11
Applet-uri
Un applet reprezinta un program Java de dimensiuni reduse ce gestioneaza o suprafata
de afisare (container) care poate fi inclusa intr-o pagina Web. Un astfel de program se
mai numeste miniaplicatie.
Ca orice alta aplicatie Java, codul unui applet poate fi format din una sau mai multe clase.
Una dintre acestea este principala si extinde clasa Applet, aceasta fiind clasa ce trebuie
specificata in documentul HTML ce descrie pagina Web in care dorim sa includem
appletul.
Pachetul care ofera suport pentru crearea de appleturi este java.applet, cea mai
importanta clasa fiind Applet.
import java.applet.Applet;
import java.awt.Graphics;
3. Compilarea
4. Rularea applet-ului
Applet-urile nu ruleaza independent. Ele pot fi rulate doar prin intermediul unui
browser: Internet Explorer, Firefox, Opera, etc. Sau printr-un program special cum ar
fi appletviewer din kitul de dezvoltare J2SDK. Pentru a executa un applet trebuie sa
facem doua operatii:
• Crearea unui fisier HTML in care vom include applet-ul. Sa consideram fisierul
simplu.html, avand continutul de mai jos:
<html>
<head>
<title>Primul applet Java</title>
</head>
<body>
<applet code=FirstApplet.class width=400 height=400>
</applet>
</body>
</html>
Exercitiu