Texto

(1)

Alguns Exemplos em Java

Fernando Silva & Luís Lopes

DCC-FCUP

(2)

Problema 1: Dígito mais frequente

I

Exemplo: o número 3435667323 contém:

I

1 (2), 4 (3), 1 (4), 1 (5), 2 (6) e 1 (7)

I

digitoMaisFrequente(3435667323) retorna 3

I

se existir um empate, deve mostrar o menor dígito.

I

Sugestão:

I

usar um contador por cada dígito (vector com 10 contadores)

I

d=n%10 dá o dígito das unidades; n=n/10 retira dígito das

unidades

(3)

Problema 1: Dígito mais frequente

p u b l i c c l a s s D i g i t C o u n t e r T e s t { p u b l i c s t a t i c v o i d m a i n ( S t r i n g [] a r g s ) { i n t m o s t _ f r e q = h i g h e s t F r e q u e n c y D i g i t ( 6 6 9 2 6 0 2 6 7 ) ; S y s t e m . out . p r i n t ( " m o s t f r e q u e n t - > " + m o s t _ f r e q ); S y s t e m . out . p r i n t l n (); } s t a t i c i n t h i g h e s t F r e q u e n c y D i g i t (i n t n ) { i n t[] c o u n t e r s = new i n t[ 1 0 ] ; w h i l e ( n > 0 ) { i n t d = n % 10; c o u n t e r s [ d ] + + ; n /= 10; } i n t max = 0; f o r ( i n t i = 1 ; i < c o u n t e r s . l e n g t h ; i ++ ) i f ( c o u n t e r s [ i ] > c o u n t e r s [ max ] ) max = i ; r e t u r n max ; } }

(4)

Problema 2: Histogramas

Escrever um método void histograma(int notas[]) que,

recebendo como parâmetro um vector de classificações, dados

como valores inteiros, produza um histograma de estrelas (*) que

indique o número de alunos que obtiveram uma determinada

classificação (supor apenas os registos de 0 a 20).

I

Exemplo:

I

dados 12 13 12 17 14 14 18 15 13 15 12 15

I

deve produzir:

12: ***

13: **

14: **

15: ***

17: *

18: *

I

Sugestão: solução parecida com anterior, mas com 21

(5)

Problema 2: Histogramas

c l a s s H i s t o g r a m T e s t { p u b l i c s t a t i c v o i d m a i n ( S t r i n g [] a r g s ) { i n t[] n o t a s = {12 ,13 ,12 ,17 ,14 ,14 ,18 ,15 ,13 ,15 ,12 ,15}; h i s t o g r a m ( n o t a s ); } s t a t i c v o i d h i s t o g r a m (i n t[] n o t a s ) { i n t[] c o u n t e r s = new i n t[ 2 1 ] ; f o r ( i n t i = 0 ; i < n o t a s . l e n g t h ; i ++ ) c o u n t e r s [ n o t a s [ i ] ] + + ; f o r ( i n t i = 0 ; i < c o u n t e r s . l e n g t h ; i ++ ) i f ( c o u n t e r s [ i ] > 0 ) { S y s t e m . out . p r i n t ( i + " : " ); f o r ( i n t j = 0 ; j < c o u n t e r s [ i ] ; j ++ ) S y s t e m . out . p r i n t ( " * " ); S y s t e m . out . p r i n t l n (); } } }

(6)

Problema 3: Pontos no plano xy

p u b l i c c l a s s P o i n t { p r i v a t e i n t x , y ; p u b l i c P o i n t () { x = 0; y = 0; } p u b l i c P o i n t (i n t x0 , i n t y0 ) { x = x0 ; y = y0 ; } p u b l i c d o u b l e d i s t a n c e ( P o i n t q ) { P o i n t p = t h i s; r e t u r n M a t h . s q r t ( ( p . x - q . x )^2 + ( p . y - q . y )^2 ); } p u b l i c S t r i n g t o S t r i n g () { r e t u r n " ( " + x + " , " + y + " ) " ; } }

I

Suponhamos que pretendemos ler n pontos no plano e

determinar qual deles está mais próximo da origem. Como

fazer?

(7)

Problema 3: Pontos no plano xy

i m p o r t j a v a . u t i l .*; p u b l i c c l a s s P o i n t T e s t { p u b l i c s t a t i c v o i d m a i n ( S t r i n g [] a r g s ) { S c a n n e r s t d I n = new S c a n n e r ( S y s t e m . in ); i n t np = s t d I n . n e x t I n t (); P o i n t [] ap = new P o i n t [ np ]; f o r ( i n t i = 0 ; i < np ; i ++ ) { i n t x = s t d I n . n e x t I n t (); i n t y = s t d I n . n e x t I n t (); ap [ i ] = new P o i n t ( x , y ); } P o i n t q = c l o s e s t T o O r i g i n ( ap ); S y s t e m . out . p r i n t l n ( " c l o s e s t to o r i g i n - > " + q ); } ...

(8)

Problema 3: Pontos no plano xy

... p u b l i c s t a t i c P o i n t c l o s e s t T o O r i g i n ( P o i n t [] ap ) { P o i n t c l o s e s t = ap [ 0 ] ; P o i n t o r i g i n = new P o i n t (0 ,0); d o u b l e m i n i m u m = c l o s e s t . d i s t a n c e ( o r i g i n ); f o r ( i n t i = 1 ; i < ap . l e n g t h ; i ++ ) { d o u b l e d i s t = ap [ i ]. d i s t a n c e ( o r i g i n ); i f ( d i s t < m i n i m u m ) { c l o s e s t = ap [ i ]; m i n i m u m = d i s t ; } } r e t u r n c l o s e s t ; } }

(9)

Problema 4: Vectores multidimensionais

p u b l i c c l a s s V e c t o r {

p r i v a t e i n t dim ; // dimension of the vector

p r i v a t e d o u b l e[] d a t a ; // array of vector’s components

p u b l i c V e c t o r (i n t d ) { dim = d ; d a t a = new d o u b l e[ d ]; } p u b l i c V e c t o r (d o u b l e... a ) { dim = a . l e n g t h ; d a t a = new d o u b l e[ dim ]; f o r (i n t i = 0; i < dim ; i ++) d a t a [ i ] = a [ i ]; } p u b l i c i n t d i m e n s i o n () { r e t u r n dim ; }

(10)

Problema 4: Vectores multidimensionais

p u b l i c d o u b l e dot ( V e c t o r v ) { V e c t o r u = t h i s; d o u b l e sum = 0 . 0 ; f o r (i n t i = 0; i < dim ; i ++) sum = sum + ( u . d a t a [ i ] * v . d a t a [ i ]); r e t u r n sum ; } p u b l i c d o u b l e n o r m () { V e c t o r u = t h i s; r e t u r n M a t h . s q r t ( u . dot ( u )); } p u b l i c V e c t o r p l u s ( V e c t o r v ) { V e c t o r u = t h i s; V e c t o r w = new V e c t o r ( dim ); f o r (i n t i = 0; i < dim ; i ++) w . d a t a [ i ] = u . d a t a [ i ] + v . d a t a [ i ]; r e t u r n w ; } ... }

(11)

Problema 4: Vectores multidimensionais

p u b l i c s t a t i c v o i d m a i n ( S t r i n g [] a r g s ) { d o u b l e[] x d a t a = { 1.0 , 2.0 , 3.0 , 4.0 }; d o u b l e[] y d a t a = { 5.0 , 2.0 , 4.0 , 1.0 }; V e c t o r x = new V e c t o r ( x d a t a ); V e c t o r y = new V e c t o r ( y d a t a ); S t d O u t . p r i n t l n ( " x = " + x ); S t d O u t . p r i n t l n ( " y = " + y ); V e c t o r z = x . p l u s ( y ); S t d O u t . p r i n t l n ( " | x | = " + x . n o r m ( ) ) ; S t d O u t . p r i n t l n ( " <x , y > = " + x . dot ( y )); } }

(12)

Problema 5: Números complexos

p u b l i c f i n a l c l a s s C o m p l e x {

p r i v a t e f i n a l d o u b l e re ; // real

p r i v a t e f i n a l d o u b l e im ; // imaginary // constructor that takes in rectangular coordinates

p u b l i c C o m p l e x (d o u b l e re , d o u b l e im ) { t h i s. re = re ; t h i s. im = im ; } // accessor methods p u b l i c d o u b l e re () { r e t u r n re ; } p u b l i c d o u b l e im () { r e t u r n im ; } ...

(13)

Problema 5: Números complexos

...

// return this Complex number plus b

p u b l i c C o m p l e x p l u s ( C o m p l e x b ) { C o m p l e x a = t h i s;

r e t u r n new C o m p l e x ( a . re () + b . re () , a . im () + b . im ( ) ) ; }

// return this Complex number minus b

p u b l i c C o m p l e x m i n u s ( C o m p l e x b ) { C o m p l e x a = t h i s;

r e t u r n new C o m p l e x ( a . re () - b . re () , a . im () - b . im ( ) ) ; }

// return this Complex number times b

p u b l i c C o m p l e x t i m e s ( C o m p l e x b ) { C o m p l e x a = t h i s; r e t u r n new C o m p l e x ( a . re () * b . re () - a . im () * b . im () , a . re () * b . im () + a . im () * b . re () ); } ... }

(14)

Problema 5: Números complexos

p u b l i c c l a s s T e s t C o m p l e x { p u b l i c s t a t i c v o i d m a i n ( S t r i n g [] a r g s ) { C o m p l e x a = new C o m p l e x (5.0 , 6 . 0 ) ; S y s t e m . out . p r i n t l n ( " a = " + a ); C o m p l e x b = new C o m p l e x ( -2.0 , 3 . 0 ) ; S y s t e m . out . p r i n t l n ( " b = " + b ); C o m p l e x c = b . t i m e s ( a ); S y s t e m . out . p r i n t l n ( " c = " + c ); C o m p l e x d = new C o m p l e x (0.0 , 0 . 0 ) ; S y s t e m . out . p r i n t l n ( " d = " + d ); C o m p l e x e = c . d i v i d e ( d ); S y s t e m . out . p r i n t l n ( " e = " + e ); } }

(15)

Problema 5: Números complexos (alternativa)

p u b l i c f i n a l c l a s s C o m p l e x {

p r i v a t e f i n a l d o u b l e re ; // real

p r i v a t e f i n a l d o u b l e im ; // imaginary // constructor that takes in rectangular coordinates

p u b l i c C o m p l e x (d o u b l e re , d o u b l e im ) { t h i s. re = re ; t h i s. im = im ; } // accessor methods p u b l i c d o u b l e re () { r e t u r n re ; } p u b l i c d o u b l e im () { r e t u r n im ; } // string representation p u b l i c S t r i n g t o S t r i n g () { r e t u r n re () + " + " + im () + " i " ; } }

(16)

Problema 5: Números complexos

p u b l i c c l a s s C o m p l e x M a t h {

// return this Complex number plus b

p u b l i c s t a t i c C o m p l e x p l u s ( C o m p l e x a , C o m p l e x b ) {

r e t u r n new C o m p l e x ( a . re () + b . re () , a . im () + b . im ( ) ) ; }

// return this Complex number minus b

p u b l i c s t a t i c C o m p l e x m i n u s ( C o m p l e x a , C o m p l e x b ) {

r e t u r n new C o m p l e x ( a . re () - b . re () , a . im () - b . im ( ) ) ; }

// return this Complex number times b

p u b l i c s t a t i c C o m p l e x t i m e s ( C o m p l e x a , C o m p l e x b ) { r e t u r n new C o m p l e x ( a . re () * b . re () - a . im () * b . im () , a . re () * b . im () + a . im () * b . re () ); } ... }

(17)

Problema 5: Números complexos

p u b l i c c l a s s T e s t C o m p l e x { p u b l i c s t a t i c v o i d m a i n ( S t r i n g [] a r g s ) { C o m p l e x a = new C o m p l e x (5.0 , 6 . 0 ) ; S y s t e m . out . p r i n t l n ( " a = " + a ); C o m p l e x b = new C o m p l e x ( -2.0 , 3 . 0 ) ; S y s t e m . out . p r i n t l n ( " b = " + b ); C o m p l e x c = C o m p l e x M a t h . t i m e s ( a , b ); S y s t e m . out . p r i n t l n ( " c = " + c ); C o m p l e x d = new C o m p l e x ( 0 . 0 , 0 . 0 ) ; S y s t e m . out . p r i n t l n ( " d = " + d ); C o m p l e x e = C o m p l e x M a t h . d i v i d e ( c , d ); S y s t e m . out . p r i n t l n ( " e = " + e ); } }

(18)

Problema 6: Média, variância, desvio padrão ...

p u b l i c c l a s s O n e P a s s { p r i v a t e i n t N = 0; p r i v a t e d o u b l e sum = 0 . 0 ; p r i v a t e d o u b l e s u m 2 = 0 . 0 ; p u b l i c v o i d add (d o u b l e v a l u e ) { sum = sum + v a l u e ; s u m 2 = s u m 2 + v a l u e * v a l u e ; N ++; } p u b l i c d o u b l e m e a n () { r e t u r n sum / N ; } p u b l i c d o u b l e v a r i a n c e () { r e t u r n ( N * s u m 2 - sum * sum ) / ( N *( N - 1 ) ) ; } p u b l i c d o u b l e s t d d e v () { r e t u r n M a t h . s q r t ( v a r i a n c e ( ) ) ; }

(19)

Problema 6: Média, variância, desvio padrão ...

// test client p u b l i c s t a t i c v o i d m a i n ( S t r i n g [] a r g s ) { S c a n n e r s t d I n = new S c a n n e r ( S y s t e m . in ); O n e P a s s d a t a s e t = new O n e P a s s (); w h i l e(! s t d I n . h a s N e x t D o u b l e ()) d a t a s e t . add ( s t d I n . n e x t D o u b l e ( ) ) ; d o u b l e m e a n = d a t a s e t . m e a n (); d o u b l e s t d d e v = d a t a s e t . s t d d e v (); d o u b l e lo = m e a n - 1 . 9 6 * s t d d e v ; d o u b l e hi = m e a n + 1 . 9 6 * s t d d e v ; // print results S y s t e m . out . p r i n t l n ( " m e a n = " + m e a n ); S y s t e m . out . p r i n t l n ( " s a m p l e s t d d e v = " + s t d d e v ); S y s t e m . out . p r i n t ( " 95% c o n f i d e n c e i n t e r v a l = " ); S y s t e m . out . p r i n t l n ( " [ " + lo + " , " + hi + " ] " ); } }

(20)

Problema 6: Multiplicação de matriz por vector

I

Multiplicação de uma vector a[N][M] por um vector u[M]

para dar v [N]:

i.e.

v

i

=

M−1

X

j=0

a

ij

× u

j

(0 ≤ i < N)

(21)

Problema 6: Multiplicação de matriz por vector

c l a s s M a t r i x V e c t o r P r o d u c t T e s t { p u b l i c s t a t i c v o i d m a i n ( S t r i n g [] a r g s ) { i n t[ ] [ ] a = {{1 ,2 ,3} ,{4 ,5 ,6}}; i n t[] u = {1 ,2 ,3}; i n t[] v = m a t r i x V e c t o r M u l t ( a , u ); f o r( i n t i = 0 ; i < v . l e n g t h ; i ++ ) S y s t e m . out . p r i n t ( v [ i ] + " " ); S y s t e m . out . p r i n t l n (); } s t a t i c i n t[] m a t r i x V e c t o r M u l t (i n t[ ] [ ] a , i n t[] u ) { i n t[] v = new i n t[ a . l e n g t h ]; f o r( i n t i = 0 ; i < v . l e n g t h ; i ++ ) { v [ i ] = 0; f o r( i n t j = 0 ; j < u . l e n g t h ; j ++ ) v [ i ] += a [ i ][ j ] * u [ j ]; } r e t u r n v ; } }

(22)

Problema 7: Triângulo de Pascal

O triângulo de Pascal pode ser visto como uma matriz triangular

inferior:

1

ou

1

<-- lin 0

1

1

1

1

<-- lin 1

1

2

1

1

2

1

<-- lin 2

1

3

3

1

1

3

3

1

<-- lin 3

1

4

6

4

1

1

4

6

4

1

<-- lin 4

1

5

10

10

5

1

1

5 10 10

5

1 <-- lin 5

Cada valor é a soma dos dois valores mais próximos da linha

anterior. A representação corresponde a uma matriz triangular

inferior.

(23)

Problema 7: Triângulo de Pascal

Método para calcular as linhas do Triângulo de Pascal, usando

uma matriz apenas dimensionada triangularmente:

p u b l i c c l a s s P a s c a l T r i a n g l e T e s t { ... i n t[ ] [ ] t r i a n g u l o P a s c a l (i n t n ) { i n t[ ] [ ] tp = new i n t[ n ] [ ] ; f o r ( i n t i = 0 ; i < n ; i ++ ) tp [ i ] = new i n t[ i + 1 ] ; f o r ( i n t i = 0 ; i < n ; i ++ ) { tp [ i ] [ 0 ] = 1; f o r ( i n t j = 1 ; j < i ; j ++ ) tp [ i ][ j ] = tp [ i - 1 ] [ j -1] + tp [ i - 1 ] [ j ]; tp [ i ][ i ] = 1; } r e t u r n tp ; } }

(24)

Problema 7: Triângulo de Pascal

Método para calcular as linhas do Triângulo de Pascal, usando

uma matriz apenas dimensionada triangularmente:

i m p o r t j a v a . u t i l .*; p u b l i c c l a s s P a s c a l T r i a n g l e T e s t { p u b l i c s t a t i c v o i d m a i n ( S t r i n g [] a r g s ) { S c a n n e r arg = new S c a n n e r ( a r g s [ 0 ] ) ; i n t n = arg . n e x t I n t (); i n t[ ] [ ] tp = c o m p u t e P a s c a l T r i a n g l e ( n ); f o r( i n t i = 0 ; i < tp . l e n g t h ; i ++ ) { f o r( i n t j = 0 ; j <= i ; j ++ ) S y s t e m . out . p r i n t ( tp [ i ][ j ] + " " ); S y s t e m . out . p r i n t l n (); } } ... }

(25)

Problema 7: Dimensionamento matriz triangular

inferior

Ilustração da matriz triangular inferior que representa o triângulo

de Pascal (só estamos a reservar memória para o número correcto

de elementos na linha):

(26)

Problema 8: Escrita de Números por Extenso

Dado um número n : 0 ≤ n < 1000000, escreva um programa que

traduza n para texto.

I

Exemplos:

I

100 = cem

I

105 = cento e cinco

I

1000 = mil

I

12345 = doze mil trezentos e quarenta e cinco

I

10045 = dez mil e quarenta e cinco

I

10000 = dez mil

(27)

Problema 8: Sugestões

I

Como lidar com números menores que 100, i.e. números com

dois dígitos N = d

1d2

?

I

Se d

1

for 0?

I

números de 0 a 9 i.e. temos strings de “zero” a “nove”

I

String unidades[]={"zero",...,"nove"};

I

indexamos o vector com o valor de d

2

I

Se d

1

for 1?

I

números de 10 a 19 i.e. temos strings de “dez” a “dezanove”

I

String dez_dezanove[]={"dez",...,"dezanove"};

I

Se d

2

for 0?

I

temos números números 20, 30, ..., 90.

I

String dezenas[]={"","","vinte",...,"noventa"};

I

Caso geral com os dois dígitos

I

temos números números como 25, 33, ...

(28)

Problema 8: método converte2()

i m p o r t j a v a . u t i l .*; c l a s s N u m b e r 2 T e x t T e s t { s t a t i c S t r i n g u n i d a d e s [ ] = { " z e r o " , " um " , " d o i s " , " t r e s " , " q u a t r o " , " c i n c o " , " s e i s " , " s e t e " , " o i t o " , " n o v e " }; s t a t i c S t r i n g d e z _ d e z a n o v e [ ] = { " dez " , " o n z e " , " d o z e " , " t r e z e " , " c a t o r z e " , " q u i n z e " , " d e z a s s e i s " , " d e z a s s e t e " , " d e z o i t o " , " d e z a n o v e " }; ... s t a t i c S t r i n g c o n v e r t e 2 (i n t n ) { i n t d1 = n / 1 0 ; i n t d2 = n % 1 0 ; i f ( d1 = = 0 ) // 0X r e t u r n u n i d a d e s [ d2 ]; i f ( d1 = = 1 ) // 1X r e t u r n d e z _ d e z a n o v e [ d2 ]; i f ( d2 = = 0 ) // X0 r e t u r n d e z e n a s [ d1 ]; // XY r e t u r n d e z e n a s [ d1 ] + " e " + u n i d a d e s [ d2 ]; } ...

(29)

Problema 8: método converte3()

Como converter números menores que 1000?

... s t a t i c S t r i n g c e n t e n a s [ ] = { " " , " c e n t o " , " d u z e n t o s " , " t r e z e n t o s " , " q u a t r o c e n t o s " , " q u i n h e n t o s " , " s e i s c e n t o s " , " s e t e c e n t o s " , " o i t o c e n t o s " , " n o v e c e n t o s " }; ... s t a t i c S t r i n g c o n v e r t e 3 (i n t n ) { i n t d1 = n / 1 0 0 ; i n t d2 = n % 1 0 0 ; i f ( d1 = = 0 ) // se menor que 100 r e t u r n c o n v e r t e 2 ( d2 ); i f ( d1 ==1 && d2 = = 0 ) // se 100 r e t u r n " cem " ; i f ( d2 = = 0 ) // se múltiplo de 100 r e t u r n c e n t e n a s [ d1 ]; r e t u r n c e n t e n a s [ d1 ] + " e " + c o n v e r t e 2 ( d2 ); } ...

(30)

Problema 8: método converte6()

Como converter números menores que 1000000?

...

s t a t i c S t r i n g l i g a r (i n t n ) {

// adiciona "e" se for menor que 100 ou multiplo de 100

r e t u r n ( n < 1 0 0 || n % 1 0 0 = = 0 ) ? " e " : " " ; } s t a t i c S t r i n g c o n v e r t e 6 (i n t n ) { i n t d1 = n / 1 0 0 0 ; i n t d2 = n % 1 0 0 0 ; i f ( d1 = = 0 ) // se menor que 1000 r e t u r n c o n v e r t e 3 ( d2 ); i f ( d1 ==1 && d2 = = 0 ) // 1000 r e t u r n " mil " ; i f ( d1 = = 1 ) // "mil e 0xx" "mil xxx" r e t u r n " mil " + l i g a r ( d2 ) + c o n v e r t e 3 ( d2 ); i f ( d2 = = 0 ) // 10000 ou 600000 r e t u r n c o n v e r t e 3 ( d1 ) + " mil " ; r e t u r n c o n v e r t e 3 ( d1 ) + " mil " + l i g a r ( d2 ) + c o n v e r t e 3 ( d2 ); } ...

(31)

Problema 8: método main()

Leitura do input e escrita:

... p u b l i c s t a t i c v o i d m a i n ( S t r i n g a r g s []) { S c a n n e r s t d i n = new S c a n n e r ( S y s t e m . in ); w h i l e( s t d i n . h a s N e x t I n t ()) { i n t n u m b e r = s t d i n . n e x t I n t (); S y s t e m . out . p r i n t f ( " % s \ n " , c o n v e r t e 6 ( n u m b e r )); } } ...

Imagem

Referências

temas relacionados :