Vous êtes sur la page 1sur 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
• 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

• 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.
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.
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.
Algumas Dicas para Competições
Nomes de Variáveis e Funções

for ( radiusOfTheCircle = 0;
r a d i u s O f T h e C i r c l e < maxRadiusOfTheCircle ;
r a d i u s O f T h e C i r c l e ++)
{
/∗ . . . ∗/
}
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 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.
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.


• Use alocação estática sempre que puder.
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.
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;
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.
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.
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.
Algumas Dicas para Competições
Depuração

f o r ( i = 0 ; i < n ; i ++)
{
f o r ( 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 ) ;
}
}
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.


• 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.
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.
Algumas Dicas para Competições
Legibilidade

i n t main ( void )
{
int n;
double x1 , x2 , y1 , y2 ;
while ( 1 )
{
s c a n f ( "%d " ,&n ) ;
i f ( ! n ) break ;
s c a n f ( "%l f%l f " ,&x1 ,& y1 ) ;
s c a n f ( "%l f%l f " ,&x2 ,& y2 ) ;
p r i n t f ( " %.3 f \ n " , s q r t ( ( x1−x2 ) ∗
( x1−x2 ) + ( y1−y2 ) ∗ ( y1−y2 ) ) ) ;
}
return 0;
}
Algumas Dicas para Competições
Legibilidade

typedef s t r u c t _Ponto
{
double x , y ;
} Ponto ;

void l e P o n t o ( Ponto ∗p )
{
s c a n f ( "%l f%l f " , &(p−>x ) , &(p−>y ) ) ;
}

double d i s t ( Ponto p1 , Ponto p2 )


{
r e t u r n ( s q r t ( ( ( p1 . x − p2 . x ) ∗ ( p1 . x − p2 . x ) ) +
( ( p1 . y − p2 . y ) ∗ ( p1 . y − p2 . y ) ) ) ) ;
}
Algumas Dicas para Competições
Legibilidade

i n t main ( void )
{
int n;
Ponto p1 , p2 ;

while ( 1 )
{
s c a n f ( "%d " , &n ) ;
i f ( n == 0 )
{
break ;
}
Algumas Dicas para Competições
Legibilidade

l e P o n t o (&p1 ) ;
l e P o n t o (&p2 ) ;

p r i n t f ( " %.3 f \ n " , d i s t ( p1 , p2 ) ) ;


}

return 0;
}
• 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

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

• printf("[Formato(s)]", ...);
• Formato:
% [Flags] [[Tamanho] [.Precisão]] [Modificador] Conversor
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)
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).
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
Entrada e Saída Avançadas
printf

Seqüência Descrição
%% %
\" "
\\ \
\n Nova linha
\t Tabulação horizontal
Entrada e Saída Avançadas
printf

• Retorna o número de caracteres escritos.


• Valor de retorno pode ser útil para o sprintf.
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, ...);
Entrada e Saída Avançadas
printf

printf ( "%d %d \ n " , 123 , −456);


printf ( "%5d %5d \ n " , 123 , −456);
printf ( "%05d %05d \ n " , 123 , −456);
printf ( "%−5d %−5d \ n " , 123 , −456);
printf ( "%0 5d %0 5d \ n " , 123 , −456);
printf ( "%− 5d %− 5d \ n " , 123 , −456);
printf ( "%0+5d %0+5d \ n " , 123 , −456);
printf ( "%−+5d %−+5d \ n " , 123 , −456);
Entrada e Saída Avançadas
printf

printf ( "%f \ n " , 1 2 3 4 . 5 6 7 8 ) ;


printf ( " %.3 f \ n " , 1 2 3 4 . 5 6 7 8 ) ;
printf ( " %8.2 f \ n " , 1 2 3 4 . 5 6 7 8 ) ;
printf ( " %08.2 f \ n " , 1 2 3 4 . 5 6 7 8 ) ;
printf ( " %−8.2 f \ n " , 1 2 3 4 . 5 6 7 8 ) ;
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 s:
esc = s p r i n t f ( s , "%d " , v [ 0 ] ) ;
f o r ( i = 1 ; i < n ; i ++)
{
esc += s p r i n t f ( s + esc , " %d " , v [ i ] ) ;
}
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
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.
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.
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.
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.
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.
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, ...);
Entrada e Saída Avançadas
scanf

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

while ( s c a n f ( "%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 c a n f ( "%d%c " , &a , &c ) ;
/∗ . . . ∗/
} while ( c ! = ’ \ n ’ ) ;
Entrada e Saída Avançadas
scanf

• Lendo todos os caracteres até o final da linha:

s c a n f ( " %[^\ n]%∗c " , s ) ;


Entrada e Saída Avançadas
scanf

• Lendo todos os caracteres até o final da linha:

s c a n f ( " %[^\ n]%∗c " , s ) ;

• Onde está o erro?


Entrada e Saída Avançadas
scanf

• Lendo todos os caracteres até o final da linha:

s c a n f ( " %[^\ n]%∗c " , s ) ;

• Onde está o erro?


• Código correto:

i f ( s c a n f ( " %[^\ n ] " , s ) == 0 )


{
s [ 0 ] = ’ \0 ’ ;
}
getchar ( ) ;
• 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

• memset(v, b, sizeof(v));
• Preenche com o byte b todo o vetor v.
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 , 0 , s i z e o f ( v ) ) ;

memset ( v , 0xFF , s i z e o f ( v ) ) ;
msmset ( v , −1, s i z e o f ( v ) ) ;

# define INFINITO 0x3F3F3F3F


memset ( v , INFINITO , s i z e o f ( v ) ) ;
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.
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 f ( ∗ a1 < ∗a2 )
r e t u r n −1;
i f ( ∗ a1 > ∗a2 )
return 1;
return 0;
}
Algumas Funções Úteis
Funções de Ordenação e Busca

• elem = bsearch(key, v, n, sizeof(v[0]),


fnccmp);
• 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.
Algumas Funções Úteis
Funções de Ordenação e Busca

i n t v [MAXN ] ;
int n;
i n t key ,
∗elem ;

s c a n f ( "%d " , &n ) ;


f o r ( i = 0 ; i < n ; i ++)
{
s c a n f ( "%d " , &( v [ i ] ) ) ;
}

q s o r t ( v , n , s i z e o f ( v [ 0 ] ) , intcmp ) ;
Algumas Funções Úteis
Funções de Ordenação e Busca

while ( s c a n f ( "%d " , &key ) == 1 )


{
elem = bsearch (& key , v , n , s i z e o f ( v [ 0 ] ) ,
intcmp ) ;
i f ( elem == NULL )
{
p r i n t f ( "%d nao encontrado . \ n " , key ) ;
}
else
{
p r i n t f ( "%d encontrado . \ n " , key ) ;
}
}
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.

• cmp = strcmp(s1, s2);


• Compara as strings s1 e s2.
• Retorna um valor informando se s1 é “menor”, “maior” ou
igual a s2.
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 para Tratamento de String

• strcpy(s1, s2);
• Copia a string em s2 para s1.

• strcat(s1, s2);
• Concatena a string em s2 ao final string s1.
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.
Algumas Funções Úteis
Funções para Tratamento de String

char s1 [MAXS] , s2 [MAXS] , ∗ r ;

s c a n f ( "%s%s " , s1 , s2 ) ;

f o r ( 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 ) ;
}

Vous aimerez peut-être aussi