Sunteți pe pagina 1din 8

FMI - Tehnici Avansate de Programare, Laborator

-1-

Clasa Scanner Scrieri cu format* Clasa String Exerciii i probleme

FMI - Tehnici Avansate de Programare, Laborator

-2-

Clasa Scanner
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; 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); } }

FMI - Tehnici Avansate de Programare, Laborator

-3-

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:
5 2 1 1 1 3 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; 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 java.io.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]); }

FMI - Tehnici Avansate de Programare, Laborator

-4-

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."); } } }

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

Scrieri cu format*
Pentru scrieri cu format se poate folosi o form a metodei printf a clasei PrintStream (System.out este un obiect de tip PrintStream).
printf(String format, Object ... args)

Parametrul format este un ir de caractere care conine cel puin cte o specificare a formatului pentru fiecare argument care urmeaz. Aceast specificaie are forma general
%[argument_index$][flags][width][.precision]conversion

(parantezele drepte au semnificaia de opional) Opiunile din forma general pot lua urmtoarele valori:
conversion

un caracter ce specific tipul, de exemplu:

d, o i x se folosesc pentru ntregi i arat c reprezentarea valori este n baza 10, 8, respectiv16 .

FMI - Tehnici Avansate de Programare, Laborator f, g i a se folosesc pentru valori reale i arat c reprezentarea va fi n notaie zecimal, tiinific sau hexazecimal cu exponent. c pentru caracter s pentru ir de caractere b pentru boolean (afiat true sau false)

-5-

un ntreg reprezentnd numrul argumentului care urmeaz parametrului de format. De exemplu 1$ se refer la primul argument. Se poate folosi i simbolul < in loc de o secven de tipul numr$, indicnd faptul c se folosete acelai argument ca i la specificarea anterioar.
argument_index flags

este un set de caractere care modific formatul de ieire. De exemplu + foreaz scrierea semnului pentru valori numerice 0 foreaz completarea valorilor numerice cu 0 - arat c argumentul va fi aliniat la stnga

numrul minim de caractere pe care va fi scris ieirea precision folosit de exemplu pentru a specifica numrul de zecimale pentru valori reale.
width

Exemplu
class ExpPrintf{ public static void main(String s[]){ String s1="ab"; int x=3; float f1=1.2345f,f2=3f; System.out.printf("Un intreg %d",x); System.out.println(); System.out.printf("Un intreg scris pe sase caractere aliniat la dreapta %6d",x); System.out.println(); System.out.printf("Numarul PI cu 5 zecimale %.5f",Math.PI); System.out.println(); System.out.printf("Numarul PI cu 5 zecimale scris pe zece caractere %10.5f",Math.PI); System.out.println(); System.out.printf("primul numar real %f,al doilea numar %f \nal doilea numar cu semn %<+f, primul numar cu 2 zecimale %1$.2f\n",f1,f2); System.out.printf("Sir aliniat la dreapta %10s, la stanga %1$-10s sirul %1$s",s1); } }

FMI - Tehnici Avansate de Programare, Laborator

-6-

Clasa String
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 (returneaz poziia, -1 dac nu apare) indexOf (int ch) indexOf (int ch, int index) indexOf (String str) indexOf (String str, int index)
String s = "maama"; int poz = s.indexOf('a'); while(poz != -1){ System.out.printf("%d ",poz); poz = s.indexOf('a',poz+1); }

Accesarea unui subir dintr-un ir: substring


String s1 = new String("abcdefg"); System.out.println(s1.substring(4));//efg System.out.println(s1.substring(1,5)); //de la 1 la 4, nu la 5-> bcde

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

FMI - Tehnici Avansate de Programare, Laborator


String s1 = "a b", s2; char c1 = 'a', c2 = 'b'; s2 = c1+" "+c2; System.out.println(s1+"/"+s2); System.out.println(s1==s2);

-7-

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 +. 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);

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 pot utiliza clasele StringBuilder sau StringBuffer (dac lucram cu threaduri) din pachetul java.lang.

FMI - Tehnici Avansate de Programare, Laborator

-8-

Exerciii i probleme
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. Creai un tablou de numere complexe (de tipul Complex implementat anterior). a) Afiai numerele din tablou i modulul fiecruia folosind instruciunea for pentru colecii b) Adunai la primul numr din tabloul obinut celelalte numere i afiai numrul rezultat. 3. Se citesc de la tastatur dou iruri de caractere. S se determine numrul de apariii ale primului ir n cel de al doilea. 4. Scriei o aplicaie Java care s afieze argumentele primite n ordine lexicografic. 5. Scriei o aplicaie Java care mparte o propoziie primit de la tastatur n cuvinte (cuvintele se pot separa prin spaiu, virgul sau punct). 6. Valoarea unui ir de caractere de tip String nu poate fi modificat dup creare (de exemplu nu se poate modifica un caracter al irului). Dac este necesar i modificarea irului de caractere se pot utiliza clasele StringBuilder sau StringBuffer. Consultai documentaia i scriei un exemplu n care s folosii metode ale clasei StringBuilder care modific valoarea irului curent.

Problem

Scriei o clas pentru o list simplu nlnuit. Folosii aceast clas pentru a parcurge 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.