(varianta pdf)

SwRTc – supliment proiect

Fluxuri de intrare-iesire (IO) Java

 

 

IO.1. Descrierea

 

In aceasta lucrare vor fi acoperite urmatoarele probleme:

·      Lucrul cu fluxurile de intrare-iesire (IO) Java

·      Programe ecou pentru consola standard si fisiere

·      Programe care combina diferite tipuri de fluxuri IO

 

 

IO.2. Clase Java pentru operatii de intrare-iesire (IO)

 

IO.2.1. Definitii si clasificari ale fluxurilor IO Java

 

            Programele pot avea nevoie sa preia  informatii de la surse externe, sau sa trimita informatii catre destinatii externe. Sursa si/sau destinatia pot fi: fisier pe disc, retea, memorie (alt program), dispozitive IO standard (ecran, tastatura). Tipurile informatiilor sunt diverse: caractere, obiecte, imagini, sunete.

 

            Pentru preluarea informatiilor programul deschide un flux de la o sursa de informatii si citeste serial (secvential, FIFO) informatiile, astfel:

Figura 1. Fluxuri de intrare (citire) Java

 

Pentru  trimiterea informatiei programul deschide un flux catre o destinatie de informatie si scrie serial (secvential, FIFO) informatiile, astfel:

Figura 2. Fluxuri de iesire (scriere) Java

 

In functie de tipul de date transferate, clasele din pachetul java.io se impart in doua ierarhii:

 

- fluxurile de caractere (pe 16b), cu radacini ale arborilor de clase derivate superclasele abstracte:

- Reader (pentru fluxuri de intrare) si

- Writer (pentru fluxuri de iesire)

 

- fluxurile de octeti (pe 8b), avand ca radacini ale arborilor de clase derivate superclasele abstracte:

- InputStream (pentru fluxuri de intrare) si

- OutputStream (pentru fluxuri de iesire)

 

In functie de specializarea pe care o implementeaza, subclasele claselor de mai sus se impart in doua categorii:

 

- fluxuri terminale (data sink), care au o sursa / destinatie propriu-zisa, nu un alt flux, avand ca rol interfatarea cu acea sursa / destinatie, fisierele, memoria (tablourile), reteaua (socketurile), sirurile de caractere (String), alte programe (prin conducte - pipes).

 

- fluxuri de prelucrare (processing), care au ca sursa / destinatie un alt flux, avand ca rol prelucrarea informatiilor care trec prin flux: buffer-are (stocare temporara), filtrare de diferite tipuri (conversie, contorizare, etc.), tiparire.

 

Fluxuri terminale (data sink streams)

 

Tip de

Terminal

Utilizare

Fluxuri

de caractere

Fluxuri

de octeti

Memorie

Accesul secvential la tablouri

CharArrayReader

ByteArrayInputStream

CharArrayWriter

ByteArrayOutputStream

Accesul secvential la siruri de caractere

StringReader

StringBufferInputStream

StringWriter

StringBufferOutputStream

Canal / conducta (pipe)

Conducte intre programme

PipedReader

PipedInputStream

PipedWriter

PipedOutputStream

Fisier

Accesul la

fisiere

FileReader

FileInputStream

FileWrite

FileOutputStream

 

Fluxuri de prelucrare (processing streams)

 

Tip de

Prelucrare

Utilizare

Fluxuri de

Caractere

Fluxuri de

octeti

Buffer-are

Stocare

temporară

BufferedReader

BufferedInputStream

BufferedWriter

BufferedOutputStream

Filtrare

Prelucrare

FilterReader

FilterInputStream

FilterWriter

FilterOutpuStream

Conversie octet/caracter

Bridge

byte-char

InputStreamReader

 

OutputStreamWriter

Concatenare

Prelucrare

 

SequenceInputStream

Serializarea obiectelor

ObjectInputStream

ObjectOutputStream

Conversia datelor

Acces la tip date primitiv Java

 

DataInputStream

DataOutputStream

Numararea (contorizarea)

Numarare linii

LineNumberReader

LineNumberInputStream

Testare

Buffer de 1 byte/char

PushBockReader

PushbackInputStream

Imprimare

Tiparire

PrintWriter

PrintStream

 

 

In continuare sunt prezentate cateva exemple de utilizare a fluxurilor de prelucrare care pot fi utilizate de programe pentru citirea de la consola standard de intrare sau pentru scrierea la consola standard de iesire.

 

 

 

 

 

 

 

IO.2.2. Citirea sirurilor de caractere de la consola prin fluxurile BufferedReader si InputStreamReader

 

Constructorul tipic al clasei BufferedReader este:

 

BufferedReader(Reader in)
          Creaza un flux de intrare a caracterelor cu stocare temporara (si posibilitate de citire a caracterelor sub forma de linii) din fluxul de intrare a caracterelor primit ca parametru (in), utilizand dimensiunea implicita a tabloului intern.

 

Metoda oferita de clasa BufferedReader pentru citirea liniilor de text este:

 

 String

readLine()
          Citeste o linie de text (citeste din bufferul intern pana la intalnirea caracterului care semnaleaza terminarea liniei). Se blocheaza in asteptarea caracterului care semnaleaza terminarea liniei.

 

Constructorul tipic al clasei InputStreamReader este:

 

InputStreamReader(InputStream in)
          Creaza un flux de intrare a caracterelor obtinute prin conversia octetilor primiti de la fluxul de intrare primit ca parametru (in) utilizand setul de caractere implici.

 

O utilizare tipica a acestor doua fluxuri de prelucrare, in cascada, este cea care permite citirea sirurilor de caractere de la consola standard de intrare (tastatura, care este incapsulata in obiectul System.in, al carui tip este InputStream - flux de intrare a octetilor).

 

Exemplu: citirea unui nume de la tastatura:

 

    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    System.out.println(“Introduceti numele: ”);

    String nume = in.readLine();

 

IO.2.3. Afisarea sirurilor de caractere la consola prin fluxul PrintStream

 

Metodele oferite de clasa PrintStream pentru afisarea sirurilor de caractere (scrierea intr-un flux de iesire a octetilor a sirurilor de caractere care cuprind si caractere escape) sunt:

 

 void

print(boolean b)
          Afiseaza valoarea booleana primita ca parametru.

 

      (Similar pentru celelalte tipuri de date primitive Java: char, double, float, int, …)

 void

print(String s)
          Afiseaza sirul de caractere primit ca parametru.

 void

println()
          Termina linia curenta, adaugand un separator de linie.

 void

println(boolean x)
          Afiseaza valoarea booleana primita ca parametru si apoi termina linia.

 

      (Similar pentru celelalte tipuri de date primitive Java: char, double, float, int, …)

 void

println(String x)
          Afiseaza sirul de caractere primit ca parametru si apoi termina linia.

O utilizare tipica a acestui flux de prelucrare este cea care permite scrierea sirurilor de caractere la consola standard de iesire (monitorul, care este incapsulat intr-un OutputStream ce serveste ca destinatie obiectului System.out, al carui tip este PrintStream).

 

Exemplu: afisarea argumentelor programului curent:

 

    PrintStream ps = System.out;

    ps.println(“Argumentele programului: ”);

    for (int i=0; i<args.length; i++) {

      ps.print(args[i] + “ ”);

    }

    ps.println();

 

IO.2.4. Citirea sirurilor de caractere de la consola prin fluxul DataInputStream

 

Constructorul clasei DataInputStream este:

 

DataInputStream(InputStream in)
          Creaza un flux de intrare a octetilor care permite citirea datelor formatate (ca tipuri primitive) de la fluxul de intrare a octetilor primit ca parametru (in).

 

Metodele oferite de clasa DataInputStream pentru citirea datelor formatate (ca tipuri primitive) de la fluxul de intrare a octetilor primit ca parametru in momentul constructiei sunt:

 

 boolean

readBoolean()
          Citeste un octet din fluxul de intrare a octetilor primit ca parametru in momentul constructiei (din amonte), si returneaza true daca este nenul si false daca este nul.

 byte

readByte()
          Citeste si returneaza un octet.

 char

readChar()
          Citeste si returneaza un
char.

 double

readDouble()
          Citeste 8 octeti si returneaza un
double.

 float

readFloat()
          Citeste 4 octeti si returneaza un float.

 void

readFully(byte[] b)
          Citeste octetii disponibili si ii stocheaza in tabloul primit ca parametru. Metoda se blocheaza pana cand b.length octeti sunt disponibili.

 void

readFully(byte[] b, int off, int len)
          Citeste len octeti si ii stocheaza in tabloul primit ca parametru incepand de la indexul off. Metoda se blocheaza pana cand len octeti sunt disponibili.

 int

readInt()
          Citeste 4 octeti si returneaza un
int.

 long

readLong()
          Citeste 8 octeti si returneaza un long.

 short

readShort()
          Citeste 2 octeti si returneaza un short.

 String

readUTF()
       Citeste un sir de caractere care a fost codat utilizand un format UTF-8 modificat.

 String

readLine()
     Metoda nerecomandata (deprecated) pentru citirea sirurilor de caractere terminate cu separator de linie.

Exemplu: citirea unui nume de la tastatura:

 

    DataInputStream  in = new DataInputStream(new BufferedInputStream(System.in));

    System.out.println(“Introduceti numele: ”);

    String nume = in.readLine();

 

IO.2.5. Afisarea sirurilor de caractere la consola prin fluxul DataOutputStream

 

Constructorul clasei DataOutputStream este:

 

DataOutputStream(OutputStream out)
          Creaza un flux de iesire a octetilor care permite scrierea datelor formatate (ca tipuri primitive) catre fluxul de iesire a octetilor primit ca parametru (out).

 

Metodele oferite de clasa DataOutputStream pentru scrierea datelor formatate (ca tipuri primitive) in fluxul de iesire a octetilor primit ca parametru in momentul constructiei (din aval) sunt:

 

 void

flush()
          Forteaza trimiterea datelor scrise in acest flux de iesire catre fluxul de iesire (din aval) primit ca parametru in momentul constructiei.

 void

writeBoolean(boolean v)
          Scrie valoarea booleana primita ca parametru in fluxul de iesire (din aval) primit ca parametru in momentul constructiei, ca octet.

 void

writeByte(int v)
          Scrie octetul specificat ca parametru (cei mai putin semnificativi 8 biti ai argumentului v) in fluxul de iesire (din aval) primit ca parametru in momentul constructiei.

 void

writeBytes(String s)
          Scrie ca secventa de octeti sirul de caractere parametru, in fluxul de iesire din aval.

 void

writeChar(int v)
          Scrie cei doi octeti ai caracterului Unicode specificat ca parametru (cei mai putin semnificativi 16 biti ai argumentului
v) in fluxul de iesire din aval.

 void

writeDouble(double v)
          Converteste argumentul
double la un long utilizand metoda doubleToLongBits() din clasa Double, apoi scrie valoarea rezultata ca 8 octeti in fluxul de iesire din aval, cel mai semnificativ octet primul.

 void

writeFloat(float v)
          Converteste argumentul float la un int utilizand floatToIntBits() din Float, apoi scrie valoarea rezultata ca 4 octeti in fluxul de iesire din aval, cel mai semnificativ octet primul.

 void

writeInt(int v)
          Scrie valoarea specificata ca parametru int ca 4 octeti in fluxul de iesire din aval, cel mai semnificativ octet primul.

 void

writeLong(long v)
          Scrie valoarea specificata ca parametru long ca 8 octeti in fluxul de iesire din aval, cel mai semnificativ octet primul.

 void

writeShort(int v)
          Scrie valoarea specificata ca parametru short ca 2 octeti in fluxul de iesire din aval, cel mai semnificativ octet primul.

 void

writeUTF(String str)
          Scrie sirul de caractere specificat ca parametru in fluxul de iesire (din aval) primit ca parametru in momentul constructiei utilizand codarea UTF-8 modificata a Java, intr-o forma independenta de masina de calcul.

Exemplu: afisarea argumentelor programului curent:

 

    DataOutputStream  dos = new DataOutputStream (System.out);

    dos.writeBytes(“Argumentele programului: \n”);

    for (int i=0; i<args.length; i++) {

      dos.writeBytes(args[i] + “ ”);

    }

    dos.writeChar(\n’);

    dos.flush();

 

IO.2.6. Citirea si scrierea fisierelor prin fluxuri de caractere

 

            In continuare sunt ilustrate:

 

- citirea dintr-un fisier, caracter cu caracter, prin intermediul unui flux de caractere (Unicode!):

 

1

2

3

4

5

6

7

8

9

10

11

  // Crearea unui obiect referinta la fisier pe baza numelui fisierului

  File inputFile = new File(“nume1.txt”);

 

  // Crearea unui flux de intrare a caracterelor dinspre fisierul dat

  FileReader in = new FileReader(inputFile);

 

  // Citirea unui caracter din fisier

  int c = in.read();         // Input

 

  // Inchiderea fisierului

  in.close();

 

- scrierea intr-un fisier, caracter cu caracter, prin intermediul unui flux de caractere:

 

1

2

3

4

5

6

7

8

9

10

11

12

  // Crearea unui obiect referinta la fisier pe baza numelui fisierului

  File outputFile = new File(“nume2.txt”);

 

  // Crearea unui flux de iesire a caracterelor spre fisierul dat

  FileWrite out = new FileWriter(outputFile);

 

  char c = ‘x’;

  // Scrierea unui caracter in fisier

  out.write(c);         // Output

 

  // Inchiderea fisierului

  out.close();

 

 

IO.3. Programe de lucru cu fluxuri IO Java

 

IO.3.1. Programe ecou consola

 

In continuare sunt prezentate cateva variante de programe Java care folosesc diferite fluxuri de intrare-iesire pentru a lucra cu consolele standard de intrare si de iesire.

 

De reflectat:

 

Care sunt diferentele intre urmatoarele doua programe?

 

Programul EcouConsola_BR_PS citeste linii de text de la tastatura (consola standard de intrare) si le afiseaza in consola standard de iesire, folosind clasele BufferedReader si PrintStream. (script pentru lansare)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

import java.io.*;

/**

  * Ecou consola folosind BufferedReader si PrintStream

  */

public class EcouConsola_BR_PS {

 

  public static void main (String args[]) throws IOException {

    // Intrare - consola prin BufferedReader (si InputStreamReader)

    BufferedReader inConsola =

           new BufferedReader(new InputStreamReader(System.in));

 

    // Iesire - consola prin PrintStream

    PrintStream outConsola= System.out;

 

    String sirCitit;

    outConsola.println("\nPentru terminare introduceti '.' si <Enter>");

 

    while (true) {

      outConsola.print("\n?> ");

 

      // Citirea unei linii de text de la consola

      sirCitit = inConsola.readLine();

 

      // Conditie terminare program

      if (sirCitit.equals(new String("."))) break;

 

      // Citirea unei linii de text de la consola

      outConsola.println("!> " + sirCitit);

    }

  }

}

 

Programul EcouConsola_DIS_DOS citeste linii de text de la tastatura (consola standard de intrare) si le afiseaza in consola standard de iesire, folosind clasele DataInputStream si DataOutputStream. (script pentru lansare)

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

import java.io.*;

/**

  * Ecou consola folosind DataInputStream si DataOutputStream

  */

public class EcouConsola_DIS_DOS {

 

  public static void main (String args[]) throws IOException {

    // Intrare - consola prin DataInputStream (si BufferedInputStream)

    DataInputStream inConsola

           = new DataInputStream(new BufferedInputStream(System.in));

    // Iesire - consola prin DataOutputStream

    DataOutputStream outConsola = new DataOutputStream(System.out);

 

    String sirCitit;

    outConsola.writeBytes("Pentru oprire introduceti '.' si <Enter>\n");

    outConsola.flush();

 

    while (true) {

      outConsola.writeBytes("\n?> ");

      outConsola.flush();

 

      // Citirea unei linii de text de la consola

      sirCitit = inConsola.readLine(); // metoda nu e recomandata!!!

 

      // Conditie terminare program

      if (sirCitit.equals(new String(".")))   break;

 

      // Scrierea liniei de text la consola

      outConsola.writeBytes("!> " + sirCitit + "\n");

      // Fortarea trimiterii (golirii bufferului)

      outConsola.flush();

    }

  }

}

 


 

IO.3.2. Programe de copiere a fisierelor

 

In continuare sunt prezentate cateva variante de programe Java care folosesc diferite fluxuri de intrare-iesire pentru a lucra cu fisiere pe disc.

 

De reflectat:

 

Care sunt diferentele intre urmatoarele doua programe?

 

Programul CopiereFisier1 citeste linii de text dintr-un fisier de intrare si le scrie intr-un fisier (copie) de iesire, folosind clasele BufferedReader si PrintWriter. (script pentru lansare)

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

  import java.io.*;

 

  public class CopiereFisier1 {

 

    public static void main(String[] args) throws IOException {

 

      System.out.println("\nProgramul CopiereFisier a fost lansat...\n");

 

      // Intrare consola

      BufferedReader inConsola = new

                          BufferedReader(new InputStreamReader(System.in));

 

      System.out.print("Introduceti numele fisierului de copiat: ");

      String numeFisier = inConsola.readLine();

 

      // Intrare fisier

      BufferedReader inFisier = null;

      try {

        inFisier = new BufferedReader(new FileReader(numeFisier));

      }

      catch (FileNotFoundException ex) {

        System.out.println("Fisierul nu exista in acest director");

        System.exit(0);

      }

 

      numeFisier = "Copie_" + numeFisier;

 

      // Iesire fisier

      PrintWriter outFisier = new PrintWriter(

                         new BufferedWriter(new FileWriter(numeFisier)));

 

      String linieText;

 

      // Cat timp mai sunt linii de text de citit din fisier

      while ((linieText = inFisier.readLine())!=null) {

 

        // Scrierea liniei de text in fisier

        outFisier.println(linieText);

        outFisier.flush();

      }

     

      // Inchiderea fisierelor

      inFisier.close();

      outFisier.close();

    }

  }

 

Programul CopiereFisier_BR_PS citeste linii de text dintr-un fisier de intrare si le scrie intr-un fisier (copie) de iesire, folosind clasele BufferedReader, InputStreamReader si PrintWriter. (script pentru lansare)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

import java.io.*;

 

/**

  * Copiere fisier folosind BufferedReader si PrintStream

  */

public class CopiereFisier_BR_PS {

  public static void main (String args[]) throws IOException {

    BufferedReader inConsola  = new BufferedReader

                               (new InputStreamReader(System.in));

 

    System.out.print("\nIntroduceti numele fisierului de copiat: ");

    String sirCitit = inConsola.readLine();

 

    // Intrare -fisier prin BufferedReader,InputStreamReader,FileInputStream

    BufferedReader inFisier = new BufferedReader(new InputStreamReader

                                 (new FileInputStream(sirCitit)));

 

    System.out.print("Introduceti numele fisierului copie: ");

    sirCitit = inConsola.readLine();

 

    // Iesire - fisier prin PrintStream (si FileOutputStream)

    PrintStream outFisier = new PrintStream(new FileOutputStream(sirCitit));

 

    while (true) {

      // Citirea unei linii de text din fisier

      sirCitit = inFisier.readLine();

 

      // Conditie terminare program

      if (sirCitit == null)   break;

 

      // Scrierea liniei de text in fisier

      outFisier.println(sirCitit);

    }

  }

}

 

 

IO.4. Modificarea programelor Java pentru a lucra cu fluxuri IO

 

IO.4.1. Programe de lucru cu fisiere

 

In laborator:

 

1. Pornind de la programul CopiereFisier1 se va crea un program AfisareFisier1 care sa citeasca linii de text dintr-un fisier de intrare si sa le afiseze in consola standard de iesire, folosind clasele BufferedReader si PrintWriter.

 

 

2. Pornind de la programul CopiereFisier1 se va crea un program ScriereInFisier1 care sa citeasca linii de text de la tastatura (consola standard de intrare) si sa le scrie intr-un fisier de iesire, folosind clasele BufferedReader si PrintWriter.

 

 

3. Pornind de la programul CopiereFisier_BR_PS se va crea un program ScriereInFisier_BR_PS care sa citeasca linii de text de la tastatura (consola standard de intrare) si sa le scrie intr-un fisier de iesire, folosind clasele BufferedReader, InputStreamReader si PrintWriter.

 

4. Se va compara efectul utilizarii programului ScriereInFisier1 cu efectul utilizarii programului ScriereInFisier_BR_PS.

 

IO.4.2. Program de calcul al unui polinom (varianta fara fisiere)

 

 

Programul Polinom3.java reprezinta o varianta a programului Polinom2.java in care:

 

- initializarea atributelor este realizata de un constructor fara parametri, Polinom3(),

 

- afisarea polinomului este realizata de o metoda fara parametri si care nu returneaza nimic,

numita afisarePolinom(),

 

- obtinerea atributelor in format String este realizata de o metoda cu numele toString(), care

nu primeste parametru si returneaza polinomul sub forma de sir de caractere (obiect de tip

String) in formatul:

P(X) = 1 + 2*X^1 + 3*X^2 + 4*X^3 + 5*X^4

daca se presupune ca gradul este 4 iar coeficientii sunt {1, 2, 3, 4, 5}.

 

- returnarea primului coeficient este realizata de o metoda fara parametri, termenLiber(),

 

- returnarea sumei coeficient este realizata de o metoda fara parametri, sumaCoeficienti(),

 

- calculul valorii polinomului este realizat de o metoda fara parametri, care returneaza o valoare

de tip int, valoarePolinom().

 

 

Metoda main() a clasei UtilizarePolinom3.java contine scenariul principal (obtinere valori, calcule, afisare rezultate).

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

  import javax.swing.JOptionPane;

 

  public class UtilizarePolinom3 {

    public static void main(String[] args) {

      System.out.println("Programul UtilizarePolinom3 a fost lansat...");

 

      // Constructor - initializeaza elementele polinomului

      Polinom3 pol = new Polinom3();

 

      // Apelul metodei care afiseaza polinomul

      pol.afisarePolinom();

 

      // Obtinerea unei valori a necunoscutei (X)

      int X = Integer.parseInt(JOptionPane.showInputDialog(

                                     "Introduceti valoarea necunoscutei"));

      // Afisarea valorii necunoscutei (X)

      System.out.println("X = " + X);

     

      // Apelul metodei care calculeaza polinomul pentru necunoscuta X

      int P_X = pol.valoarePolinom(X);

 

      // Afisarea valorii P(X)

      System.out.println("P(" + X + ") = " + P_X);

 

      // Apelul metodei care calculeaza polinomul pentru necunoscuta = 0

      int P_0 = pol.termenLiber();

 

      // Afisarea valorii P(0)

      System.out.println("P(0) = " + P_0);

 

      // Apelul metodei care calculeaza polinomul pentru necunoscuta = 1

      int P_1 = pol.sumaCoeficienti();

 

      // Afisarea valorii P(1)

      System.out.println("P(1) = " + P_1);

 

      System.exit(0);      // Inchiderea interfetei grafice

    }

  }

 

 

 

 

 

 

 

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

  import javax.swing.JOptionPane;

  public class Polinom3 {

    protected int N;         // gradul polinomului

    protected int[] C;       // coeficientii polinomului

 

    // Constructor - initializeaza elementele polinomului

    public Polinom3() {

      // Obtinerea gradului polinomului (N)

      N = Integer.parseInt(JOptionPane.showInputDialog(

                                  "Introduceti gradul polinomului"));

      // Crearea tabloului coeficientilor (de dimensiune N+1)

      C = new int[N+1];

 

      // Obtinerea coeficientilor Ci, unde i=0,N

      for (int i=0; i<=N; i++) {

        C[i] = Integer.parseInt(JOptionPane.showInputDialog(

                                      "Coeficientul de grad " + i));

      System.out.println("A fost creat un obiect Polinom...");

      }

    }

    // Metoda care afiseaza polinomul

    public void afisarePolinom() {

      // Termenul liber Co

      System.out.print("P(X) = " + C[0]);

 

      // Termenii Ci*X^i, unde i=1,N

      for (int i=1; i<=N; i++) {

        System.out.print(" + " + C[i]  + "*X^" + i);

      }

      System.out.println();     

    }

    // Metoda care calculeaza valoarea polinomului pentru o necunoscuta

    public int valoarePolinom(int X) {

      int P_X = 0;

      int X_i = 1;

 

      // Termenii +Ci*X^i, unde 0=1,N

      for (int i=0; i<=N; i++) {

        P_X = P_X + C[i]*X_i;

        X_i = X_i * X;

      }

      return (P_X);     

    }

    // Metoda care calculeaza valoarea polinomului pentru necunoscuta = 0

    public int termenLiber() {

      return (C[0]);

    }

    // Metoda care calculeaza valoarea polinomului pentru necunoscuta = 1

    public int sumaCoeficienti() {

      int S_C = C[0];

      for (int i=1; i<=N; i++) {

        S_C = S_C + C[i];

      }

      return (S_C);

    }

    // Metoda care returneaza tabloul coeficientilor polinomului

    public int[] coeficienti() {

      int[] coef = new int[N+1];

      System.arraycopy(C, 0, coef, 0, N+1);

      return (coef);

    }

    // Metoda care returneaza coeficientii polinomului sub forma de String

    public String toString() {

      String polinom = "" + C[0];

 

      // Termenii Ci*X^i, unde i=1,N

      for (int i=1; i<=N; i++) {

        polinom = polinom + " + " + C[i]  + "*X^" + i;

      }

      return (polinom);     

    }

  }

 


 

IO.4.3. Program de calcul al unui polinom (varianta de lucru cu fisiere)

 

 

Programul Polinom4.java reprezinta o varianta a programului Polinom3.java in care initializarea atributelor este realizata de:

 

- un constructor cu parametru de tip String, care obtine gradul polinomului si valorile

coeficientilor de la utilizator, initializeaza atributele cu aceste valori, si apoi le scrie intr-un

fisier pe disc (al carui nume este pasat ca parametru),

 

- un constructor cu un parametru de tip String si un parametru de tip int[], care

foloseste tabloul primit pentru a initializa valorile atributelor, apoi le scrie intr-un

fisier pe disc (al carui nume este pasat ca parametru),

 

- un constructor cu doi parametri de tip String, care formeaza din ei numele unui

fisier de pe disc, din care citeste valorile coeficientilor si cu ele initializeaza atributele.

 

 

 

Metoda main() a clasei Utilizare1Polinom4 contine un scenariu de utilizare a clasei Polinom4 bazat pe apelul primului constructor (cel care obtine valorile coeficientilor de la utilizator). (script pentru lansare)

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

  import javax.swing.JOptionPane;

  import java.io.*;

 

  public class Utilizare1Polinom4 {

    public static void main(String[] args) throws IOException {

      System.out.println("Programul Utilizare1Polinom4 a fost lansat...");

 

      // Apelul constructorului care initializeaza elementele polinomului

      // cu valori obtinute de la utilizator, si le scrie in fisier

      Polinom4 pol = new Polinom4("coef.txt");

 

      // Apelul metodei care afiseaza polinomul

      pol.afisarePolinom();

 

      // Obtinerea unei valori a necunoscutei (X)

      int X = Integer.parseInt(JOptionPane.showInputDialog(

                                     "Introduceti valoarea necunoscutei"));

 

      // Afisarea valorii necunoscutei (X)

      System.out.println("X = " + X);

     

      // Apelul metodei care calculeaza polinomul pentru necunoscuta X

      int P_X = pol.valoarePolinom(X);

 

      // Afisarea valorii P(X)

      System.out.println("P(" + X + ") = " + P_X);

 

      // Apelul metodei care calculeaza polinomul pentru necunoscuta = 0

      int P_0 = pol.termenLiber();

 

      // Afisarea valorii P(0)

      System.out.println("P(0) = " + P_0);

 

      // Apelul metodei care calculeaza polinomul pentru necunoscuta = 1

      int P_1 = pol.sumaCoeficienti();

 

      // Afisarea valorii P(1)

      System.out.println("P(1) = " + P_1);

 

      System.exit(0);      // Inchiderea interfetei grafice

    }

  }

 

 

Primul constructor asigura:

- obtinerea valorii atributelor de la utilizator,

- persistenta atributelor (scrierea lor pe disc).

 

Al doilea constructor asigura:

- obtinerea valorii atributelor de la un alt obiect,

- persistenta atributelor (scrierea lor pe disc).

 

Al treilea constructor asigura:

- obtinerea valorii atributelor persistente de pe disc.

 

Cele trei variante pot fi utile in cazul sistemelor client-server in care se doreste realizarea persistentei datelor (pe disc) la server.

 

 

Metoda main() a clasei Utilizare2Polinom4 contine un scenariu de utilizare a clasei Polinom4 bazat pe apelul celui de-al treilea constructor (cel care obtine valorile dintr-un fisier). (script pentru lansare)

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

  import javax.swing.JOptionPane;

  import java.io.*;

 

  public class Utilizare2Polinom4 {

    public static void main(String[] args) throws IOException {

      System.out.println("Programul Utilizare2Polinom4 a fost lansat...");

 

      // Apelul constructorului care initializeaza elementele polinomului

      // cu valori citite din fisier

      Polinom4 pol = new Polinom4("coef", "txt");

 

      // Apelul metodei care afiseaza polinomul

      pol.afisarePolinom();

 

      // Obtinerea unei valori a necunoscutei (X)

      int X = Integer.parseInt(JOptionPane.showInputDialog(

                                     "Introduceti valoarea necunoscutei"));

 

      // Afisarea valorii necunoscutei (X)

      System.out.println("X = " + X);

     

      // Apelul metodei care calculeaza polinomul pentru necunoscuta X

      int P_X = pol.valoarePolinom(X);

 

      // Afisarea valorii P(X)

      System.out.println("P(" + X + ") = " + P_X);

 

      // Apelul metodei care calculeaza polinomul pentru necunoscuta = 0

      int P_0 = pol.termenLiber();

 

      // Afisarea valorii P(0)

      System.out.println("P(0) = " + P_0);

 

      // Apelul metodei care calculeaza polinomul pentru necunoscuta = 1

      int P_1 = pol.sumaCoeficienti();

 

      // Afisarea valorii P(1)

      System.out.println("P(1) = " + P_1);

 

      System.exit(0);      // Inchiderea interfetei grafice

    }

  }

 

 

 

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

00

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

  import javax.swing.JOptionPane;

  import java.io.*;

 

  public class Polinom4 {

    protected int N;         // gradul polinomului

    protected int[] C;       // coeficientii polinomului

 

    // Constructor - initializeaza elementele polinomului

    // cu valori obtinute de la utilizator, si le scrie in fisier

    public Polinom4(String numeFisier) throws IOException {

 

      PrintWriter outFisier = new PrintWriter(new

                          BufferedWriter(new FileWriter(numeFisier)));

 

      // Obtinerea gradului polinomului (N)

      N = Integer.parseInt(JOptionPane.showInputDialog(

                                  "Introduceti gradul polinomului"));

 

      // Stocarea numarului de coeficienti

      outFisier.println(N+1);

 

      // Crearea tabloului coeficientilor (de dimensiune N+1)

      C = new int[N+1];

 

      // Obtinerea coeficientilor Ci, unde i=0,N

      for (int i=0; i<=N; i++) {

        C[i] = Integer.parseInt(JOptionPane.showInputDialog(

                                      "Coeficientul de grad " + i));

        // Stocarea coeficientilor

        outFisier.println(C[i]);

      }

      outFisier.close();

 

      System.out.println("A fost creat un obiect Polinom...");

    }

 

    // Constructor - initializeaza elementele polinomului

    // cu valori obtinute ca parametru, si le scrie in fisier

    public Polinom4(String numeFisier, int[] coeficienti) throws IOException {

 

      PrintWriter outFisier = new PrintWriter(new

                          BufferedWriter(new FileWriter(numeFisier)));

 

      // Obtinerea gradului polinomului (N)

      N = coeficienti.length - 1;

 

      // Stocarea numarului de coeficienti

      outFisier.println(N+1);

 

      // Crearea tabloului coeficientilor (de dimensiune N+1)

      C = new int[N+1];

 

      // Obtinerea coeficientilor Ci, unde i=0,N

      for (int i=0; i<=N; i++) {

        C[i] = coeficienti[i];

 

        // Stocarea coeficientilor

        outFisier.println(C[i]);

      }

      outFisier.close();

 

      System.out.println("A fost creat un obiect Polinom...");

    }

 

    // Constructor - initializeaza elementele polinomului

    // cu valori citite din fisier

    public Polinom4(String nume, String extensie) throws IOException {

 

      String numeFisier = nume + "." + extensie;

 

      BufferedReader inFisier = new BufferedReader(new FileReader(numeFisier));

 

      // Obtinerea gradului polinomului (N)

      N = Integer.parseInt(inFisier.readLine()) - 1;

 

      // Crearea tabloului coeficientilor (de dimensiune N+1)

      C = new int[N+1];

 

      // Obtinerea coeficientilor Ci, unde i=0,N

      for (int i=0; i<=N; i++) {

        C[i] = Integer.parseInt(inFisier.readLine());

      }

      inFisier.close();

     

      System.out.println("A fost creat un obiect Polinom...");

    }

   

    // Metoda care afiseaza polinomul

    public void afisarePolinom() {

 

      // Termenul liber Co

      System.out.print("P(X) = " + C[0]);

 

      // Termenii Ci*X^i, unde i=1,N

      for (int i=1; i<=N; i++) {

        System.out.print(" + " + C[i]  + "*X^" + i);

      }

      System.out.println();     

    }

 

    // Metoda care calculeaza valoarea polinomului pentru o necunoscuta

    public int valoarePolinom(int X) {

      int P_X = 0;

      int X_i = 1;

 

      // Termenii +Ci*X^i, unde 0=1,N

      for (int i=0; i<=N; i++) {

        P_X = P_X + C[i]*X_i;

        X_i = X_i * X;

      }

      return (P_X);     

    }

 

    // Metoda care calculeaza valoarea polinomului pentru necunoscuta = 0

    public int termenLiber() {

      return (C[0]);

    }

 

    // Metoda care calculeaza valoarea polinomului pentru necunoscuta = 1

    public int sumaCoeficienti() {

      int S_C = C[0];

      for (int i=1; i<=N; i++) {

        S_C = S_C + C[i];

      }

      return (S_C);

    }

 

    // Metoda care returneaza tabloul coeficientilor polinomului

    public int[] coeficienti() {

      int[] coef = new int[N+1];

      System.arraycopy(C, 0, coef, 0, N+1);

      return (coef);

    }

 

    // Metoda care returneaza coeficientii polinomului sub forma de String

    public String toString() {

      String polinom = "" + C[0];

 

      // Termenii Ci*X^i, unde i=1,N

      for (int i=1; i<=N; i++) {

        polinom = polinom + " + " + C[i]  + "*X^" + i;

      }

      return (polinom);     

    }

  }