Loops Elegantes
Septiembre 6 2008 :: c ::
Estoy en este momento estudiando The C Programming Language, más que nada como repaso de la sintaxis de C. Los ejercicios, aunque parecen básicos, son muy interesantes como problemas de programación.
En uno de los ejercicios se nos pide hacer una función reverse que tome una cadena y la devuelva invertida. Mi solución rapida fue:
void reverse(char line[], int n) {
int temp, i, j, t ;
if( (n/2) == ((n+1)/2) ) {
t = -1 ;
} else {
t = 0 ;
}
j = (n/2) ;
for(i=0 ; i < j ; i++) {
temp = line[i] ;
line[i] = line[ (j*2)-i+t ] ;
line[ (j*2)-i+t ] = temp ;
}
line[ n ] = ‘\0′ ;
}
Pero en el cápitulo 3 dan la forma de codificarlo de los autores:
void reverse( char s[] ) {
int c, i, j;
for( i = 0, j = strlen(s)-1 ; i < j ; i++, j– ) {
c = s[i] ;
s[i] = s[j] ;
s[j] = c ;
}
}
Me encanto como esta estructurado el loop, por el simple hecho de que no tengo la costumbre de hacer una doble inicialización y mucho menos un incremento y un decremento simultáneos en la tercera expresión del for. El código es super elegante y ahorra el problema y el exceso de código que tuve que poner en mi versión por si el tamaño de la cadena era impar o par.
Por que no es buena práctica usar breaks en un loop.
Además me di cuenta de lo siguiente, es una frase hecha que no es buena práctica usar breaks en un loop, el tema es que en realidad generalmente no es necesario ( salvo en casos especiales donde se necesita ejecutar algunas lineas de código antes de evaluar la condición del break ). Supongamos el siguiente codigo:
for( x=0 ; x < n ; x++) {
......
.....
if( condicion_de_break ) break ;
}
Se puede resolver más elegantemente de la siguiente forma:
for( x=0 ; x < n && !condicion_de_break ; x++) {
......
.....
}
Autor: Emiliano Martínez Luque.


Deja un Comentario
Guía de los comentarios
Tu Email es requerido pero no sera publicado.
Podes usar los siguientes tags de HTML:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>Si no comentastes antes tu comentario debera ser aprovado antes de que se lo muestre. Perdón, pero hay demasiado spam.