Sunteți pe pagina 1din 8

FMI - Tehnici Avansate de Programare, Laborator 3

-1-

Tablouri multidimensionale Clasa Scanner Clasele String i StringBuffer* Probleme

Tablouri multidimensionale
Tablourile multidimensionale trebuie gndite ca tablouri unidimensionale ale cror elemente sunt tablouri unidimensionale etc. De aceea referirea la un element al unui tablou multidimensional a se face prin:
a[indice1]...[indicen].

1)

Exemple
int a[][] ; a=new int[3][3] ; for(int i=0 ;i<3 ;i++) for(int j=0 ;j<3 ;j++) a[i][j]=i+j;

2)
int[][] a = new int[3][]; a[0] = new int[3]; a[1] = new int[4]; a[2] = new int[2];

Ia natere astfel un tablou de forma: Exerciii: 1. S se creeze o clas MatriceTriunghiulara care are dou cmpuri: un numr ntreg n i un tablou bidimensional a de numere ntregi, precum i dou metode: - o metod pentru citirea matricei inferior triunghiular a de dimensiune n - o metod de afiare a acestei matrice. S se scrie o clas principal n care s se creeze i s se afieze o matrice inferior triunghiular, folosind clasa MatriceTriunghiulara De exemplu:
n=4 a= 3 4 7 9 0 6 1 5 8 2

(matricea se va afia sub aceast form triunghiular) 2. Rescriei n una din clasele scrise la laboratorul anterior (Complex etc) metoda toString i ilustrai utilitatea acesteia.

FMI - Tehnici Avansate de Programare, Laborator 3

-2-

Amintesc: n Java orice clas extinde direct (implicit sau explicit) sau indirect clasa Object, a crei definiie apare n pachetul java.lang (clasele formeaz o structur de arbore n care rdcina este clasa Object). Metoda
public String toString()

a clasei Object returneaz reprezentarea obiectului curent ntr-un String i este apelat de cte ori este necesar o conversie a obiectului la tipul String. Putem suprascrie aceast metod n orice clas pentru a ntoarce reprezentarea obiectului ca ir de caractere n forma dorit de noi. Astfel, dac adugm n clasa Dreptunghi metoda
public String toString(){ return "lungime "+lung+",latime"+lat; }

n loc de d.afisare() putem scrie direct


System.out.print("Dreptunghi initial: "+d); System.out.print("Dreptunghi unitate: "+d2);

Clasa Scanner
O clas care se poate folosi pentru citirea datelor de tipuri primitive sau String este clasa Scanner din pachetul java.util. Aceast clas se poate folosi pentru citirea din diferite surse: de la tastatur, din fiier, din obiecte de tip String, n funcie de tipul obiectul trimis ca parametru constructorului clasei: InputStream, File, String. Pentru a utiliza o clas din alt pachet dect java.lang, fie prefixm numele clasei cu pachetul din care face parte, fie folosim o declarare import (plasat la nceputul unitii de compilare). Astfel, pentru a crea un obiect de tip Scanner avem varintele:
java.util.Scanner sc; sc= new java.util.Scanner(System.in);

sau importm clasa printr-o declarare import (plasat la nceputul unitii de compilare care conine clasa ce folosete obiecte de tip Scanner):
import java.util.Scanner;

i putem scrie direct


Scanner sc = new Scanner(System.in);

n mod predefinit un obiect de tip Scanner citete entiti delimitate prin caractere albe i apoi ncearc s le interpreteze n modul cerut. Pentru tipurile primitive de date exist metodele nextByte(), nextShort(), nextInt(), nextLong(), nextFloat(), nextDouble(), nextBoolean(). Pentru a testa dac sunt disponibile valori de anumit tip exist metode ca hasNextInt(), hasNextDouble() etc. Exist i metodele hasNext() i next() pentru a testa existena unei urmtoare entiti (fr un tip specificat), respectiv pentru citirea urmtoarei entiti (tipul rezultatului ntors de metoda next() este String). Mai menionm metodele nextLine() i hasNextLine() (utile de exemplu dac dorim s citim un ir de caractere care conine i spaii)

FMI - Tehnici Avansate de Programare, Laborator 3

-3-

Observaie: atunci cnd se testeaz existena unei entiti de un anumit tip, dac

urmtoarea entitate nu are tipul dorit ea rmne n bufferul de intrare (poate fi citit cu metoda next())

Exemple 1. n urmtorul exemplu sunt citite dou numere ntregi de la tastatur i se afieaz suma lor
import java.util.Scanner; class ExpScanner{ public static void main(String arg[]){ Scanner sc=new Scanner(System.in); System.out.print("Introduceti doua numere intregi: "); int x=sc.nextInt(); int y=sc.nextInt(); System.out.println("Suma lor este "+(x+y)); } }

2. S presupunem c dorim s citim un ntreg. n caz c valoarea introdus de utilizator nu reprezint un ntreg, i permitem utilizatorului s reintroduc valoarea. Utilizatorul va putea reintroduce valoarea de un numr maxim de ori.
import java.util.Scanner; class TestScan{ static final int NR_MAX=3;//constanta public static void main(String arg[]){ int i,k=0; Scanner sc=new Scanner(System.in); System.out.print("Introduceti un intreg: "); i=0; while(i<NR_MAX) if(sc.hasNextInt()){ k=sc.nextInt(); i=NR_MAX; } else{ String s=sc.next(); System.out.print(s+" nu este o valoare intreaga."); i++; if(i<NR_MAX) System.out.print("Incercati din nou: "); else System.exit(1); } System.out.printf("Ati introdus intregul %d",k); } }

3. Avnd o clas Muchie cu cmpurile reprezentnd vrful iniial, vrful final i costul muchiei i un fiier cu urmtoarea structur: pe prima linie avem numrul de muchii, iar pe urmtoarele cte trei numere reprezentnd vrful iniial, vrful final i costul unei muchii, ca de exemplu:

FMI - Tehnici Avansate de Programare, Laborator 3


5 2 1 1 1 3

-4-

3 3 2 4 4

10.5 4 17.23 20 0.5

s se construiasc un vector de muchii cu datele citite din fiier.


import java.util.Scanner; import java.util.InputMismatchException; import java.util.NoSuchElementException; //import java.util.Locale; import java.io.FileNotFoundException; import java.io.File; class Muchie{ int vi,vf; double cost; Muchie(int vi,int vf, double cost){ this.vi=vi; this.vf=vf; this.cost=cost; } public String toString(){ return "("+vi+","+vf+")"+" "+cost; } } class TestScanF{ public static void main(String arg[]){ int i,n; Muchie muchii[]; try{ Scanner scFisier=new Scanner(new File("muchii.in")); //scFisier.useLocale(Locale.ENGLISH); n=scFisier.nextInt(); muchii=new Muchie[n]; for(i=0;i<n;i++) muchii[i]=new Muchie(scFisier.nextInt(), scFisier.nextInt(), scFisier.nextDouble()); scFisier.close(); for(i=0;i<n;i++) System.out.println(muchii[i]); } catch(FileNotFoundException fnf){ System.out.println("Fisier inexistent."); } catch(InputMismatchException im){ System.out.println("Date de tip incorect."); } catch(NoSuchElementException nse){ System.out.println("Nu exista informatii despre toate muchiile."); } } }

FMI - Tehnici Avansate de Programare, Laborator 3

-5-

Observaii:
1. Nu este obligatoriu s tratm erorile InputMismatchException i NoSuchElementException aruncate de metodele nextInt() i nextDouble() . n acest caz puteam folosi metodele hasNextInt() sau hasNextDouble() ale clasei Scanner dac vroiam s ne asigurm ca datele citite sunt corecte. 2. Este obligatoriu s tratm eroarea FileNotFoundException, altfel vom avea eroare la compilare

Problem Folosind clasa pentru list nlnuit scris la laboratorul anterior, scriei o aplicaie pentru parcurgea n lime un graf neorientat reprezentat prin liste de adiacen (clasa scris pentru list se va folosi la reprezentarea grafului i pentru coada necesar la parcurgerea n lime). Datele se vor citi din fiier.

FMI - Tehnici Avansate de Programare, Laborator 3

-6-

Clasele String i StringBuffer*


n Java irurile de caractere sunt obiecte ale clasei String din pachetul java.lang. Un literal de tip String este o secven de caractere ntre ghilimele
String s="Un sir de caractere";

Amintim o serie de metode utile n lucrul cu iruri de caractere din clasa String Determinarea lugimii unui ir: lenght Accesarea unui caracter din ir: charAt Spre exemplu, urmtoarea secven de cod afieaz caracterele din irul s cte unul pe linie
String s="Un sir de caractere"; for(int i=0;i<s.length();i++) System.out.println(s.charAt(i));

Cutarea unui caracter sau a unui ir de caractere ntr-un ir: indexOf,


lastIndexOf

Accesarea unui subir dintr-un ir: substring Exemplu Codul urmtor exemplific utilizarea metodelor indexOf i substring. Testai acest cod pentru caracterele 'c', 's' i 'b'.
String s="Un sir de caractere"; char c='c'; int poz=s.indexOf(c); /*daca nu este gasit caracterul, metoda returneaza -1, altfel returneaza prima pozitie pe care este gasit*/ if(poz>=0){ int poz2=s.indexOf(c,poz+1); //cauta caracterul c de la pozitia poz+1 //substring(i, j)-> caracterele de pe pozitiile de la i la j-1 //substring(i)-> caracterele de la i la sfarsitul sirului if(poz2>=0) System.out.println("Intre primele doua aparitii ale lui "+c+" este subsirul "+s.substring(poz,poz2+1)); else System.out.println("Subsirul care incepe cu singura aparitie a lui "+c+" este "+s.substring(poz)); } else System.out.println("Caracterul "+c+" nu apare in sir");

FMI - Tehnici Avansate de Programare, Laborator 3

-7-

Egalitatea a dou iruri: Operatorul == testeaz dac dac dou referine indic acelai obiect. n particular, dac s1 i s2 sunt dou variabile de tip String, atunci s1==s2 este true doar dac s1 i s2 sunt referine ctre acelai ir (nu dac irurile sunt egale n sens lexicografic). Exemplu Urmtoarea secven de cod
String s1="a b", s2; char c1='a', c2='b'; s2=c1+" "+c2; System.out.println(s1+"/"+s2); System.out.println(s1==s2);

va afia
a b/a b false

Pentru a testa egalitatea se folosete metoda equals (sau equalsIgnoreCase pentru a nu diferenia literele mari de mici):
System.out.println(s1.equals(s2));

va afia true

Observaie: Metoda equals este motenit din clasa Object exist metoda equals.
Orice clas extinde direct sau indirect Object, deci motenete aceast metod. Metoda equals a clasei Object verific dac obiectul referit de parametru este acelai cu cel current (ca i ==). ntr-o clas putem suprascrie aceast metod pentru a defini modul n care se face testul de egalitate pentru obiecte aparinnd acestei clase. Compararea a dou iruri lexicografic: se face cu metoda compareTo (sau compareToIgnoreCase) Concatenarea de iruri se face folosind operatorul +. Am vzut deja n exemple c operatorul + este foarte flexibil, permind concatenarea la un obiect de tip String a obiectelor de orice alt tip (se apeleaz implicit metoda toString() a obiectului respectiv) sau a unei variabile de tip primitiv. Mai mult, dac oricare dintre operanzi este de tip String, operatorul + i convertete i pe ceilali la tipul String. Rezultatul operaiei de concatenare este un ir nou (complet distinct de cele concatenate). Exemplu: Ce afieaz urmtoarea secven de cod? Modificai aceast secven pentru a afia rezultatul corect.
System.out.println("1+1="+1+1);

Exerciii: 1. Scriei o aplicaie Java care s afieze argumentele primite n ordine lexicografic

FMI - Tehnici Avansate de Programare, Laborator 3

-8-

2. Scriei o aplicaie Java care, pentru un cuvnt dat de la tastatur afieaz numrul de vocale din cuvnt i cea mai lung subsecven de consoane (consecutive) din cuvnt. 3*. Scriei o aplicaie Java care mparte o propoziie primit de la tastatur n cuvinte (cuvintele se pot separa prin spaiu, virgul i punct). Indicaie: Se poate folosi metoda split din clasa String sau clasa Scanner i metoda useDelimiter a acesteia, ca n exemplul urmtor:
String s="ab cd. ef, gh, j"; //propozitia String s1[]=s.split("[ .,]");//[] semnifica sau pentru lista de separatori; separatorii sunt spatiu, virgula si punct for(String x:s1) if(x.length()!=0) System.out.println(x); System.out.println(); //varianta 2 Scanner sc=new Scanner(s); sc.useDelimiter("[ .,]"); while(sc.hasNext()){ String x=sc.next(); if(x.length()!=0) System.out.println(x); }

Valoarea unui ir de caractere de tip String nu poate fi modificat dup creare (de exemplu nu se poate modifica un caracter, sau un subir al irului). Dac este necesar i modificarea irului de caractere se poate utiliza clasa StringBuffer din pachetul java.lang. Exerciiu: Ce afieaz urmtorul program? Consultai documentaia pentru a aprofunda metodele clasei StringBuffer utilizate i a vedea alte metode ale acestei clase.
class ExempluString{ public static void main(String arg[]){ String s="abcdefgh"; System.out.println("lungime "+s.length()); System.out.println(s.charAt(2)); //s.setCharAt(2)-nu se poate StringBuffer sb=new StringBuffer(s); System.out.println(sb); sb.setCharAt(2,'x'); System.out.println(sb); sb.append('y');//adauga la sfarsit un nou caracter sb.append(1234);//poate adauga si un numar, privit ca sir System.out.println(sb); sb.replace(1,6,"yz");/*inlocuieste subsirul dintre pozitiile 1 si 6 (exclusiv 6) cu yz*/ System.out.println(sb); System.out.println("lungime "+sb.length()); System.out.println(sb.substring(1,4)); s=sb.toString(); System.out.println(s); } }

S-ar putea să vă placă și