Programação Dicas e Outras Coisas Tiago da Conceição Mota Vinícius Fernandes dos Santos Tópicos Especiais em Programação 2008-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
Mais curtos possíveis... 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...... 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; radiusofthecircle < maxradiusofthecircle ; radiusofthecircle ++) { /... / }
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] ; i n t 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 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 ) ; } }
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 ) { i n t n ; double x1, x2, y1, y2 ; while ( 1 ) { scanf ( "%d ",&n ) ; i f (! n ) break ; scanf ( "%l f%l f ",&x1,& y1 ) ; scanf ( "%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 struct _Ponto { double x, y ; } Ponto ; void leponto ( Ponto p ) { scanf ( "%l f%l f ", &(p >x ), &(p >y ) ) ; } double d i s t ( Ponto p1, Ponto p2 ) { return ( 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 ) { i n t n ; Ponto p1, p2 ; while ( 1 ) { scanf ( "%d ", &n ) ; i f ( n == 0) { break ; }
Algumas Dicas para Competições Legibilidade leponto (&p1 ) ; leponto (&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
printf("[formato(s)]",...); Entrada e Saída Avançadas printf
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 d o x X u f c s Descrição int (decimal) int (octal) int (hexadecimal abcdef) int (hexadecimal ABCDEF) unsigned double char 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,...);
p r i n t f ( "%d %d \ n ", 123, 456); p r i n t f ( "%5d %5d \ n ", 123, 456); p r i n t f ( "%05d %05d \ n ", 123, 456); p r i n t f ( "% 5d % 5d \ n ", 123, 456); p r i n t f ( "%0 5d %0 5d \ n ", 123, 456); p r i n t f ( "% 5d % 5d \ n ", 123, 456); p r i n t f ( "%0+5d %0+5d \ n ", 123, 456); p r i n t f ( "% +5d % +5d \ n ", 123, 456); 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); Entrada e Saída Avançadas printf
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 ] ) ; for ( 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 d o x X u f c s Descrição int (decimal) int (octal) int (hexadecimal abcdef) int (hexadecimal ABCDEF) unsigned float char 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 ler o próximo caracter.
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 ler o próximo caracter. 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 ler o próximo caracter. 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 ( scanf ( "%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 { scanf ( "%d%c ", &a, &c ) ; /... / } while ( c!= \ n ) ; Lendo todos os caracteres até o final da linha: scanf ( " %[^\n]% c ", s ) ;
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, sizeof ( v ) ) ; memset ( v, 0xFF, sizeof ( v ) ) ; msmset ( v, 1, sizeof ( v ) ) ; # define INFINITO 0x33333333 memset ( v, INFINITO, sizeof ( 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 ) return 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] ; i n t n ; i n t key, elem ; scanf ( "%d ", &n ) ; for ( i = 0; i < n ; i ++) { scanf ( "%d ", &(v [ i ] ) ) ; } q s o r t ( v, n, sizeof ( v [ 0 ] ), intcmp ) ;
Algumas Funções Úteis Funções de Ordenação e Busca while ( scanf ( "%d ", &key ) == 1) { elem = bsearch (&key, v, n, sizeof ( 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.
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 ; scanf ( "%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 ) ; }