Google Code Jam 2010 - Africa Classification Round

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

[ Hits: 3.238 ]

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

Estrutura Simples (REGISTRO)

Busca em texto - Lista encadeada

Aplicção em C++

Agenda Eletronica

Programa recursivo para obter raiz quadrada


  

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