Google Code Jam 2010 - Africa Classification Round

Publicado por Enzo de Brito Ferber (última atualização em 19/12/2011)

[ Hits: 3.400 ]

Homepage: http://www.maximasonorizacao.com.br

Download reverse.zip




Problema B.

http://code.google.com/codejam/contest/dashboard?c=351101#s=p1

Dado um arquivo de entrada com n linhas, ler cada linha do arquivo e imprimir as PALAVRAS em ordem inversa.
Por exemplo:

VIVA O LINUX É MUITO BOM

Imprime:

Case #1: BOM MUITO É LINUX O VIVA

  



Esconder código-fonte

// reverse.c
// Enzo Ferber - dez 2011

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LINES      101
#define LETTERS    1001

// reverse word from A to B
void rword ( char *str, int a, int b )
{
     char *aux = (char *) malloc ( (b - a + 1) * sizeof ( char ));
     register int i;
     
     for ( i = a; i < b; i++ ) *(aux++) = str[i];
     for ( i = a; i < b; i++ ) str[i] = *(--aux);
     
     // free memory 
     free ( aux );
}

// reverse the whole string
void rstr ( char *str )
{
     char *backup = (char *) malloc ( strlen(str) * sizeof(char));
     register int i, j;
     
     for ( i = 0, j = strlen(str) - 1; i < strlen(str); i++, j-- )
         backup[i] = str[j];
         
     strncpy ( str, backup, strlen(str) );

     free ( backup );
}
     
// main function ...
int main ( int argc, char *argv[] )
{
     register int i = 0, j = 0, a, lines;
     char line[ LINES ][ LETTERS ], c;
     FILE *input;
     
     // arguments
     if ( argc < 2 )
     {
          printf ( "Usage: %s <input_file>\n", argv[0] );
          exit ( -1 );
     }
     
     // try to open input file
     if( !(input = fopen(argv[1], "r")))
     {
         printf ( "# Could not open file %s\n", argv[1] );
         exit ( -1 );
     }
     
     // read file
     while ( (c = fgetc(input)) && !feof(input) )
     {
           if ( c != '\n' )
              line[i][j++] = c;
           else 
           {
                line[i][j] = 0x0;
                i++;
                j = 0;
           }
     }
     
     // store lines number
     lines = i;
     
     // reverse whole string, then words
     for ( i = 1; i < lines; i++)
     {
         rstr ( line[i] );

         for ( j = 0; j < strlen(line[i]); j++ )
         {
             for ( a = j; a <= strlen(line[i]); a++ )
             {
                 if ( line[i][a] == ' ' || line[i][a] == '{FONTE}' ) 
                 {
                      rword(line[i], j, a);
                      j = a;
                      break;
                 }
             }
         }
     }
     
     for ( i = 1; i < lines; i++ )
         printf ( "Case #%d: %s\n", i, line[i] );
         
     return 0;
}
                 

Scripts recomendados

Agenda Eletronica

Campo Minado em C

Árvore binária AVL

Tabela Hash feita em C

Função strncat


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts