Você está na página 1de 76

Programação – Dicas e Outras Coisas

Tiago da Conceição Mota Vinícius Fernandes dos Santos

Tópicos Especiais em Programação

2009-1

Dicas e Outras Coisas Tiago da Conceição Mota Vinícius Fernandes dos Santos Tópicos Especiais em Programação

Algumas Dicas para Competições

Entrada e Saída Avançadas

Algumas Funções Úteis

• Algumas Dicas para Competições • Entrada e Saída Avançadas • Algumas Funções Úteis

Algumas Dicas para Competições

Nomes de Variáveis e Funções

Algumas Dicas para Competições Nomes de Variáveis e Funções

Algumas Dicas para Competições

Nomes de Variáveis e Funções

Mais curtos possíveis

Algumas Dicas para Competições Nomes de Variáveis e Funções • Mais curtos possíveis

Algumas Dicas para Competições

Nomes de Variáveis e Funções

Mais curtos possíveis

mas que ainda expressem seu significado.

Competições Nomes de Variáveis e Funções • Mais curtos possíveis • mas que ainda expressem seu

Algumas Dicas para Competições

Nomes de Variáveis e Funções

Mais curtos possíveis

mas que ainda expressem seu significado.

Variáveis mais usadas: apenas 1 letra.

Demais variáveis: 2 ou 3 caracteres.

ainda expressem seu significado. • Variáveis mais usadas: apenas 1 letra. • Demais variáveis: 2 ou

Algumas Dicas para Competições

Nomes de Variáveis e Funções

Mais curtos possíveis

mas que ainda expressem seu significado.

Variáveis mais usadas: apenas 1 letra.

Demais variáveis: 2 ou 3 caracteres.

Funções: em torno de 5 caracteres.

mais usadas: apenas 1 letra. • Demais variáveis: 2 ou 3 caracteres. • Funções: em torno

Algumas Dicas para Competições

Nomes de Variáveis e Funções

for

( radiusOfTheCircle

=

<

0;

radiusOfTheCircle

radiusOfTheCircle ++)

maxRadiusOfTheCircle ;

{

 

/

.

.

.

/

}

radiusOfTheCircle radiusOfTheCircle ++) maxRadiusOfTheCircle ; {   / ∗ . . . ∗ / }

Algumas Dicas para Competições

Comentários

Algumas Dicas para Competições Comentários

Algumas Dicas para Competições

Comentários

Não coloque comentários em seus programas.

Algumas Dicas para Competições Comentários • Não coloque comentários em seus programas.

Algumas Dicas para Competições

Comentários

Não coloque comentários em seus programas.

Algumas exceções:

Trecho de código de objetivo não tão claro.

Significado das dimensões de uma matriz.

Apenas uma linha de comentário é suficiente.

não tão claro. • Significado das dimensões de uma matriz. • Apenas uma linha de comentário

Algumas Dicas para Competições

Estático vs. Dinâmico

Algumas Dicas para Competições Estático vs. Dinâmico

Algumas Dicas para Competições

Estático vs. Dinâmico

Praticamente todos os problemas deixam claro os limites.

Algumas Dicas para Competições Estático vs. Dinâmico • Praticamente todos os problemas deixam claro os limites.

Algumas Dicas para Competições

Estático vs. Dinâmico

Praticamente todos os problemas deixam claro os limites.

Use alocação estática sempre que puder.

Dinâmico • Praticamente todos os problemas deixam claro os limites. • Use alocação estática sempre que

Algumas Dicas para Competições

Estático vs. Dinâmico

Praticamente todos os problemas deixam claro os limites.

Use alocação estática sempre que puder.

Mais chances de erros com alocação dinâmica, principalmente manipulando ponteiros.

estática sempre que puder. • Mais chances de erros com alocação dinâmica, principalmente manipulando ponteiros.

Algumas Dicas para Competições

Estático vs. Dinâmico

#define MAXN

105

/

.

.

.

/

i n t

v [MAXN]

;

i n t m[MAXN] [MAXN] ;

int

n ;

vs. Dinâmico #define MAXN 105 / ∗ . . . ∗ / i n t v

Algumas Dicas para Competições

Depuração

Algumas Dicas para Competições Depuração

Algumas Dicas para Competições

Depuração

Durante a competição não há tempo de executar o programa passo a passo.

Dicas para Competições Depuração • Durante a competição não há tempo de executar o programa passo

Algumas Dicas para Competições

Depuração

Durante a competição não há tempo de executar o programa passo a passo.

Inserir printf’s de depuração em pontos estratégicos do código.

tempo de executar o programa passo a passo. • Inserir printf ’s de depuração em pontos

Algumas Dicas para Competições

Depuração

Durante a competição não há tempo de executar o programa passo a passo.

Inserir printf’s de depuração em pontos estratégicos do código.

Utilizar o depurador apenas para encontrar a linha e o estado do programa num erro em tempo de execução.

código. • Utilizar o depurador apenas para encontrar a linha e o estado do programa num

Algumas Dicas para Competições

Depuração

for

(

i

=

0;

i

<

n ;

i ++)

 

{

 

for

 

( j

=

(

i

+

1);

 

j

<

n ;

j ++)

{

p r i n t f ( "[%d,%d ]

"

,

i

,

j

)

;

p r i n t f (

"%d \ n " ,

i

j

)

;

}

}

( "[%d,%d ] " , i , j ) ; p r i n t f

Algumas Dicas para Competições

Legibilidade

Algumas Dicas para Competições Legibilidade

Algumas Dicas para Competições

Legibilidade

Não economize espaços e parênteses em expressões.

Algumas Dicas para Competições Legibilidade • Não economize espaços e parênteses em expressões.

Algumas Dicas para Competições

Legibilidade

Não economize espaços e parênteses em expressões.

Não utilize construções “obscuras”.

Legibilidade • Não economize espaços e parênteses em expressões. • Não utilize construções “obscuras”.

Algumas Dicas para Competições

Legibilidade

Não economize espaços e parênteses em expressões.

Não utilize construções “obscuras”.

Utilize funções para substituir trechos de código com determinado objetivo e para organizar o código.

• Utilize funções para substituir trechos de código com determinado objetivo e para organizar o código.

Algumas Dicas para Competições

Legibilidade

Não economize espaços e parênteses em expressões.

Não utilize construções “obscuras”.

Utilize funções para substituir trechos de código com determinado objetivo e para organizar o código.

Utilize estruturas e tipos definidos para organizar os dados.

com determinado objetivo e para organizar o código. • Utilize estruturas e tipos definidos para organizar

Algumas Dicas para Competições

Legibilidade

int

main ( void )

 

{

 

int

n ;

double

x1 , x2 , y1 , y2 ;

 

while (1)

 

{

 

s canf

(

"%d " ,&n )

;

i f

(

!

n )

break ;

s canf ( "%l f%l f

"

,&x1 ,& y1

)

;

s canf ( "%l f%l f " ,&x2 ,& y2 ) ;

p r i n t f

( "%.3 f

\

n " , s q r t (

 

( x1x2 ) + ( y1y2 ) (

( x1x2 ) y1y2 ) ) ) ;

 

}

return

 

0;

}

( x1 − x2 ) + ( y1 − y2 ) ∗ ( ( x1 −

Algumas Dicas para Competições

typedef

struct

_Ponto

{

 

double

x ,

y ;

}

Ponto ;

Legibilidade

void

lePonto

( Ponto

p)

 

{

 

s canf ( "%l f%l f " ,

&(p>x ) ,

&(p>y ) ) ;

 

}

double

d i s t

( Ponto

p1

,

Ponto

p2 )

 

{

 

return

(

. x

p2 . x )

 

( p1 . x

p2 . x ) )

+

}

s q r t ( ( ( p1

p2 . y )

( ( p1 . y

( p1 .

y

p2 . y ) ) ) ) ;

p2 . x ) ) + } s q r t ( ( ( p1 −

Algumas Dicas para Competições

int

main

( void )

{

 

int

n ;

Ponto

p1 ,

p2 ;

while

(1)

{

s canf ( "%d " ,

i f

{

0)

( n

==

break ;

}

&n ) ;

Legibilidade

n ; Ponto p1 , p2 ; while (1) { s canf ( "%d " ,

Algumas Dicas para Competições

}

lePonto (&p1 ) ; lePonto (&p2 ) ;

p r i n t f ( "%.3 f \ n " ,

}

return

0;

d i s t ( p1 ,

p2 ) ) ;

Legibilidade

) ; lePonto (&p2 ) ; p r i n t f ( "%.3 f \

Algumas Dicas para Competições

Entrada e Saída Avançadas

Algumas Funções Úteis

• Algumas Dicas para Competições • Entrada e Saída Avançadas • Algumas Funções Úteis

Entrada e Saída Avançadas

printf

Entrada e Saída Avançadas printf

Entrada e Saída Avançadas

printf

printf("[Formato(s)]",

);

• Entrada e Saída Avançadas printf printf(" [ Formato(s) ] ", );

Entrada e Saída Avançadas

printf

printf("[Formato(s)]",

Formato:

);

% [Flags] [[Tamanho] [.Precisão]] [Modificador] Conversor

printf(" [ Formato(s) ] ", • Formato: ); % [ Flags ] [[ Tamanho ] [

Entrada e Saída Avançadas

printf

Conversor

Descrição

d

int (decimal)

o

int (octal)

x

int (hexadecimal – abcdef)

X

int (hexadecimal – ABCDEF)

u

unsigned

f

double

c

char

s

String (vetor de char)

X int (hexadecimal – ABCDEF) u unsigned f double c char s String (vetor de char

Entrada e Saída Avançadas

printf

Modificador

Descrição

h

short

l

long

ll

long

long

Entrada e Saída Avançadas printf Modificador Descrição h short l long ll long long

Entrada e Saída Avançadas

printf

Tamanho do campo: mínimo de caracteres a serem escritos.

Precisão: caracteres a serem escritos depois do . (ponto).

do campo: mínimo de caracteres a serem escritos. • Precisão: caracteres a serem escritos depois do

Entrada e Saída Avançadas

printf

Flag

Descrição

0

Preenche com zeros à esquerda

-

Justifica à esquerda (ignora flag 0) Deixa espaço em branco para sinal positivo

+

Força o aparecimento do sinal

à esquerda (ignora flag 0 ) Deixa espaço em branco para sinal positivo + Força o

Entrada e Saída Avançadas

printf

Seqüência

Descrição

%%

%

\"

"

\\

\

\n

Nova linha Tabulação horizontal

\t

Descrição %% % \ " " \\ \ \ n Nova linha Tabulação horizontal \ t

Entrada e Saída Avançadas

printf

Retorna o número de caracteres escritos.

Valor de retorno pode ser útil para o sprintf.

Avançadas printf • Retorna o número de caracteres escritos. • Valor de retorno pode ser útil

Entrada e Saída Avançadas

printf

Retorna o número de caracteres escritos.

Valor de retorno pode ser útil para o sprintf.

Versão para escrita em strings:

sprintf(s,

fmt,

);

• Valor de retorno pode ser útil para o sprintf . • Versão para escrita em

Entrada e Saída Avançadas

printf

p

r i n t f

( "%d

%d \ n" ,

123,

 

456);

p

r i n t f

( "%5d

%5d \ n " ,

%5d \ n " ,

123 ,

456);

p

r i n t f

( "%05d

%05d \ n "

%05d \ n "

,

123 ,

456);

p

p

p

r i n t f

r i n t f

r i n t f

( "%5d

( "%0

5d

5d

( "% − 5d ( "%0 5d 5d ( "% −

( "%

( "% − 5d ( "%0 5d 5d ( "% −

%5d \ n "

% − 5d \ n " , %0 % − 5d \ n " 5d \

,

%0

% − 5d \ n " , %0 % − 5d \ n " 5d \
% − 5d \ n " , %0 % − 5d \ n " 5d \

%

% − 5d \ n " , %0 % − 5d \ n " 5d \
% − 5d \ n " , %0 % − 5d \ n " 5d \

5d \ n "

5d \ n "

123

,

456);

,

,

123 ,

123 ,

456);

456);

p

r i n t f

( "%0+5d

%0+5d \ n "

%0+5d \ n "

,

123 ,

456);

p

r i n t f

( "%+5d

%+5d \ n " ,

% − +5d \ n " ,

123 ,

456);

\ n " , 123 , − 456); p r i n t f ( "%

Entrada e Saída Avançadas

printf

p

r i n t f

(

"%f \ n " ,

 

1234.5678 );

p

r i n t f

(

"%.3 f \ n " ,

1234.5678);

p

r i n t f

(

"%8.2 f

\ n " ,

 

1234.5678);

p

r i n t f

(

" %08.2

f

\

n "

,

1234.5678);

p

r i n t f

(

"%8.2 f

\

n " ,

1234.5678 );

f \ n " , 1234.5678); p r i n t f ( "% − 8.2

Entrada e Saída Avançadas

printf

Escrevendo uma lista de inteiros, separados por espaço, na string s:

Entrada e Saída Avançadas printf • Escrevendo uma lista de inteiros, separados por espaço, na string

Entrada e Saída Avançadas

printf

Escrevendo uma lista de inteiros, separados por espaço, na string s:

esc

=

s p r i n t f ( s

,

"%d " ,

v [ 0 ] ) ;

 

for

(

i

=

1;

i

<

n ;

i ++)

 

{

 

esc +=

s p r i n t f ( s

+

esc ,

"

%d " ,

v [ i

]

)

;

}

++)   {   esc += s p r i n t f ( s +

Entrada e Saída Avançadas

scanf

Entrada e Saída Avançadas scanf

Entrada e Saída Avançadas

scanf

Conversor

Descrição

d

int (decimal)

o

int (octal)

x

int (hexadecimal – abcdef)

X

int (hexadecimal – ABCDEF)

u

unsigned

f

float

c

char

s

String (ignora espaços brancos e lê até espaço branco)

[

Lê apenas um determinado conjunto de caracteres

s String (ignora espaços brancos e lê até espaço branco) [ Lê apenas um determinado conjunto

Entrada e Saída Avançadas

scanf

Modificador

Descrição

h

short

l

long

ll

long

long

Entrada e Saída Avançadas scanf Modificador Descrição h short l long ll long long

Entrada e Saída Avançadas

scanf

Espaço instrui a ler todos os caracteres brancos até um não-branco.

Demais caracteres instruem a casar com o próprio caractere.

a ler todos os caracteres brancos até um não-branco. • Demais caracteres instruem a casar com

Entrada e Saída Avançadas

scanf

Espaço instrui a ler todos os caracteres brancos até um não-branco.

Demais caracteres instruem a casar com o próprio caractere.

Tamanho do campo: máximo de caracteres a serem lidos.

Demais caracteres instruem a casar com o próprio caractere. • Tamanho do campo: máximo de caracteres

Entrada e Saída Avançadas

scanf

Espaço instrui a ler todos os caracteres brancos até um não-branco.

Demais caracteres instruem a casar com o próprio caractere.

Tamanho do campo: máximo de caracteres a serem lidos.

Flag * : lê o elemento mas não o armazena.

• Tamanho do campo: máximo de caracteres a serem lidos. • Flag * : lê o

Entrada e Saída Avançadas

scanf

Conversor [:

Seqüência de caracteres terminada por ] corresponde ao conjunto a ser lido.

Para incluir o ], coloque-o antes de todos os outros caracteres (e encerre com outro ]).

Caracter ˆ no início da seqüência indica que o conjunto não contém os caracteres especificados.

Utilize - para intervalos de caracteres.

indica que o conjunto não contém os caracteres especificados. • Utilize - para intervalos de caracteres.

Entrada e Saída Avançadas

scanf

Retorna o número de elementos lidos.

Não conta os marcados com a flag * .

Retorna EOF em caso de término de entrada.

de elementos lidos. • Não conta os marcados com a flag * . • Retorna EOF

Entrada e Saída Avançadas

scanf

Retorna o número de elementos lidos.

Não conta os marcados com a flag * .

Retorna EOF em caso de término de entrada.

Versão para leitura a partir de strings:

sscanf(s,

fmt,

);

. • Retorna EOF em caso de término de entrada. • Versão para leitura a partir

Entrada e Saída Avançadas

scanf

Lendo valores para n da entrada até que esta termine:

while

( s canf ( "%d " ,

&n )

==

1 )

{

/

.

.

.

/

}

esta termine: while ( s canf ( "%d " , &n ) == 1 ) {

Entrada e Saída Avançadas

scanf

Lendo lista de números, separados por vírgula, até o final da linha:

do

{

 

s canf

( "%d%c " ,

&a ,

&c ) ;

/

.

.

.

/

}

while

( c

!=

\ n ’

)

;

" , &a , &c ) ; / ∗ . . . ∗ / } while

Entrada e Saída Avançadas

scanf

Lendo todos os caracteres até o final da linha:

scanf ( " %[^\n]%c " ,

s ) ;

e Saída Avançadas scanf • Lendo todos os caracteres até o final da linha: scanf (

Entrada e Saída Avançadas

scanf

Lendo todos os caracteres até o final da linha:

scanf ( " %[^\n]%c " , s ) ;

Onde está o erro?

• Lendo todos os caracteres até o final da linha: scanf ( " %[^\n]% ∗ c

Entrada e Saída Avançadas

scanf

Lendo todos os caracteres até o final da linha:

scanf ( " %[^\n]%c " , s ) ;

Onde está o erro?

Código correto:

i f

( scanf ( " %[^\ n ] " ,

s )

==

0)

{

s [0]

=

’ \0

;

}

getchar ( ) ;

Código correto: i f ( scanf ( " %[^\ n ] " , s ) ==

Algumas Dicas para Competições

Entrada e Saída Avançadas

Algumas Funções Úteis

• Algumas Dicas para Competições • Entrada e Saída Avançadas • Algumas Funções Úteis

Algumas Funções Úteis

Funções Genéricas

Algumas Funções Úteis Funções Genéricas

Algumas Funções Úteis

Funções Genéricas

memset(v, b, sizeof(v)); Preenche com o byte b todo o vetor v.

Funções Úteis Funções Genéricas • memset(v, b, sizeof(v)); • Preenche com o byte b todo o

Algumas Funções Úteis

Funções Genéricas

memset(v, b, sizeof(v));

Preenche com o byte b todo o vetor v.

Exemplos:

memset ( v

,

memset ( v , msmset ( v ,

0 ,

si zeo f ( v ) ) ;

0xFF ,

1, sizeof ( v

si zeo f ( v ) ) ;

)

)

;

#define INFINITO 0x3F3F3F3F memset ( v , INFINITO , si zeo f ( v ) ) ;

, − 1, sizeof ( v si zeo f ( v ) ) ; ) )

Algumas Funções Úteis

Funções de Ordenação e Busca

Algumas Funções Úteis Funções de Ordenação e Busca

Algumas Funções Úteis

Funções de Ordenação e Busca

qsort(v,

n,

sizeof(v[0]),

fnccmp);

Ordena o vetor v, de n elementos, utilizando a função de comparação fnccmp.

sizeof(v[0]), fnccmp); • Ordena o vetor v , de n elementos, utilizando a função de comparação

Algumas Funções Úteis

Funções de Ordenação e Busca

i n t

intcmp

( const

void

e1 ,

const void e2 )

{

 

i

n t

a1 ,

a2 ;

 

a1

=

(

(

i n t

) e1 ;

 

a2

=

i n t

) e2 ;

i (a1

f

<

a2 )

 

return

1;

 

i (a1

f

>

a2 )

 

return

1;

 

return

0;

}

return − 1;   i ( ∗ a1 f > ∗ a2 )   return 1;

elem

=

bsearch(key,

fnccmp);

v,

Algumas Funções Úteis

Funções de Ordenação e Busca

n,

sizeof(v[0]),

Procura pela chave key no vetor v de n elementos, utilizando a função de comparação fnccmp.

Retorna um ponteiro para o elemento achado, ou NULL caso o conteúdo de key não seja encontrado em v.

fnccmp . • Retorna um ponteiro para o elemento achado, ou NULL caso o conteúdo de

i n t int int

v [MAXN] ; n ; key , elem ;

 

s canf

( "%d " ,

&n ) ;

i

for

(

i

=

0;

<

n ;

i ++)

Algumas Funções Úteis

Funções de Ordenação e Busca

{

s canf

( "%d " ,

&( v [

i

]

) )

;

}

qsort

(v ,

n ,

sizeof ( v [ 0 ] )

,

intcmp ) ;

" , &( v [ i ] ) ) ; } qsort (v , n ,

Algumas Funções Úteis

Funções de Ordenação e Busca

while

{

( s canf ( "%d " ,

&key )

==

1 )

elem = bsearch (&key intcmp ) ;

i f

{

( elem == NULL )

,

v ,

n ,

sizeof ( v [ 0 ] ) ,

}

else

{

}

p

p

r i n t f

r i n t f

( "%d

( "%d

nao ] ) , } else { } p p r i n t f r i

, } else { } p p r i n t f r i n t

encontrado

encontrado . \ n" ( v [ 0 ] ) , } else { } p p r i n

. \ n"

,

key ) ;

,

key ) ;

}

else { } p p r i n t f r i n t f (

Algumas Funções Úteis

Funções para Tratamento de String

Algumas Funções Úteis Funções para Tratamento de String

tam = strlen(s); Retorna o tamanho da string s.

Algumas Funções Úteis

Funções para Tratamento de String

• tam = strlen(s); • Retorna o tamanho da string s . Algumas Funções Úteis Funções

tam = strlen(s);

Retorna o tamanho da string s.

Algumas Funções Úteis

Funções para Tratamento de String

cmp = strcmp(s1, s2);

Compara as strings s1 e s2.

Retorna um valor informando se s1 é “menor”, “maior” ou igual a s2.

Compara as strings s1 e s2 . • Retorna um valor informando se s1 é “menor”,

strcpy(s1, s2);

Copia a string em s2 para s1.

Algumas Funções Úteis

Funções para Tratamento de String

• strcpy(s1, s2); • Copia a string em s2 para s1 . Algumas Funções Úteis Funções

strcpy(s1, s2);

Copia a string em s2 para s1.

Algumas Funções Úteis

Funções para Tratamento de String

strcat(s1, s2);

Concatena a string em s2 ao final string s1.

Úteis Funções para Tratamento de String • strcat(s1, s2); • Concatena a string em s2 ao

Algumas Funções Úteis

Funções para Tratamento de String

r = strtok(s1, s2);

Separa a string em s1 em tokens, delimitados pelos caracteres em s2.

Chamadas subseqüentes de strtok são feitas com s1 tendo valor NULL.

Retorna um ponteiro para o próximo token, ou NULL caso não haja mais tokens.

s2 pode ser diferente a cada chamada.

Cuidado! strtok altera a string s1.

caso não haja mais tokens . • s2 pode ser diferente a cada chamada. • Cuidado!

Algumas Funções Úteis

Funções para Tratamento de String

char

s1 [MAXS]

,

s2 [MAXS] ,

r

;

s canf

( "%s%s " ,

s1 ,

s2

)

;

for

(

r

=

s t r t o k

( s1 ,

s2 ) ;

 

r

!= NULL;

r

=

s t r t o k

(NULL,

 

s2 ) )

{

 

p r i n t f (

"%s \ n " ,

r

)

;

}

r = s t r t o k (NULL,   s2 ) ) {   p