Ayuda Retos (Asarch y Thot)
Software
Esta entrada es especial, selecciona algunos temas que ayuden a superar el reto de asarch y el reto de Thot en el lenguaje de programacion C.
Despues redistribuire este contenido en sus respectivos temas.
Antes que nada, tendremos que instalar ciertas guias de referencia especialmente importantes para un programador de C y que nos ayudaran las porximas veces que tengamos dudas sobre funciones, sintaxis o bibliotecas.
En Debian GNU/Linux:
apt-get install manpages-dev manpages-posix-dev
Argumentos desde linea de comandos y getopt().
Me hubiera gustado explicarlo yo, pero no creo poder explicarlo de manera mas clara que el buen amigo thot aqui.
Biblioteca math.h
La biblioteca math.h delara funciones y macros matematicas, las macrod EDOM y ERANGE que se definen en errno.h señalan los errores de dominio y rango para esta biblioteca, nos es de especial interes la funcion double sqrt(double x), que regresa la raiz cuadrada de x como un double, siempre y cuando x sea mayor o igual que 0. ejemplo:
/*Programa que calcula la raiz cuadrada de un numero*/
#include<stdio.h>
#include<math.h>
int main(){
double entrada=0;
printf("Ingresa un numero: \n");
scanf("%lf",&entrada);
printf("%g\n",entrada);
if(entrada >= 0)
printf("La raiz cuadrada de %g es: %g\n",entrada ,sqrt(entrada));
else
printf("Entrada no valida\n");
return 0;
}
Para compilar con la biblioteca math.h es necesario el argumento -lm en gcc
$gcc sqrt.c -o sqrt -lm
Bibliotecas limits.h y float.h
Estas bibliotecas definen constantes pamigo thot aquiara el tamaño maximo y minimo de enteros y numeros flotantes respectivamente, para nuestro caso podria ser util conocer las constantes INT_MAX, INT_MIN, LONG_MAX, LONG_MIN, FLT_MAX, FLT_MIN.
Estas bibliotecas incluyen muchas mmas constantes muy interesantes para mas informacion:
$man limits.h
$man float.h
Manejo de errores y exit
Como sabemos, cuando ejecutamos un programa en un entorno tipo UNIX, se abren al menos 3 descriptores de archivo, stdin, stdout y stderr.
Este ultimo nos sirve para recoger todos los errores ocurridos dentro de la ejecucion, conociendo los limites de permitidos para algun valor en particular, podriamos de ser necesario mandar un mensaje a stderr si el valor antes dicho no cumple con algun parametro, esto lo podemos hacer con una sentencia como la que sigue:
fprintf(stderr,"Error: %s no es un dato no valido", argv[inddatomalo] );
Debido a que los datos no son los adecuados, lo mejor es terminar la ejecucion del programa, esto se logra con la sentencia exit(), lo usual en los sistemas tipo Unix es que un valor distinto de 0 indica algún fallo durante la ejecución.
exit() es equivalente a un return en la función main() y esta implementado en la biblioteca estandar.
Comentarios y Estilo
Un buen programador crea programas autodocumentados, los comentarios son parte esencial de esto, pero también debemos saber cuando usarlos, no es correcto comentar cada 1 o 2 lineas de codigo, sencillamente tenemos qe facilitar la comprensión de lo que escribimos.
Comentamos para evitar que la persona que lee el codigo pierda tiempo tratando de entender el porque de esta o aquella instrucción. Tambien existe la posibilidad de que el codigo que escribamos quede muy lejos de la comprensión de los simples mortales, no, no es presunción este tipo de codigo existe y tendremos que comentar "Solo el inicio, explicando que hace todo el fragmento de codigo y marcar el final", no tiene mucho sentido tratar de explicar el codigo si este sobrepasa el requerimiento de la comprensión misma del lenguaje, como por ejemplo la implementacion de la IEEE de alto rendimiento para el seno y el coseno.
Tambien es muy buena idea incluir la licencia del programa, un ejemplo es este :
/* Copyright (c) 2008, Alberto Rodriguez Sanchez "Vendaval"
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the COLECTIVO MONONEURONA nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY ALBERTO RODRIGUEZ SANCHEZ "VENDAVAL" ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL ALBERTO RODRIGUEZ SANCHEZ "VENDAVAL" BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
A mi humilde parecer, el estilo BSD para los comentarios es el mas propio, pues facilita la lectura de los mismos.
El estilo es mas o menos este:
/*Una Sola Linea al estilo BSD*/
/*
*Varias lineas
*Al
*Estilo
*BSD
*/
El comentario de una linea con // no es usado.
Tiempo de ejecucion de un pragrama.
En sistemas Tipo Unix, es facil saber el tiempo que tarda en ejecutace algun programa o comando, esto lo hacemos con:
$time NombreDelComando/Programa
recuerda que si es un programa que tu mismo compilaste debes dar la ruta absoluta o simplemente ubicarte en el directorio donde se encuentra y ejecutar:
$time ./MiPrograma
Orientacion General sobre el reto de asarch.
Este reto esta orientado a conseguir un programa que cumpla ciertas caracteristicas, es a mi parecer un ejercicio zen de concentracion, buscando y cuidando cada detalle de la implementacion.
Orientacion general sobre el Reto de thot.
Lo interesante de este reto radica en lograr el rendimiento para que el programa se ejecute en menos de un segundo, tomando en cuenta que puedes leer en determinado momento hasta 10,000 lineas de 3 elementos cada una y que tenemos alrededor de 1000,000,000 de operaciones (sumas, restas,comparaciones), es de notar que la restriccion es que no se pinten 2 casas consecutivas del mismo color, asi que leidos 3 valores se excluye el del color anterior y se determina el minimo de los restantes y este se acumula. hay que recordar que no necesariamente los valores seran distintos, asi que hay que tomar decisiones para ciertos eventos.
Seria interesante generar un archivo con datos de prueba, tal que sirva de referencia a la hora de depurar el programa.
Permalink: http://mononeurona.org/entries/view/vendaval/1596
Comentblogs:Podrias citar a los chingones:
* Estilo de Linus:
http://lxr.linux.no/linux/Documentation/CodingStyle
* Estilo BSD de OpenBSD:
http://www.openbsd.org/cgi-bin/man.cgi?query=style&apropos=0&sektion=0&manpath=OpenBSD+Current&arch=i386&format=html
* Estilo BSD de FreeBSD:
http://www.freebsd.org/cgi/man.cgi?query=style&apropos=0&sektion=0&manpath=FreeBSD+7.0-RELEASE&format=html
* Estilo BSD de NetBSD:
ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-current/src/share/misc/style
* Entrada de Wikipedia sobre el estilo de indentacion:
http://en.wikipedia.org/wiki/Indent_style
* Entrada de Wikipedia sobre el estilo de la codificacion:
http://en.wikipedia.org/wiki/Coding_style
2008-10-16 12:55:36-05
Pues el reto de Asarch, ya puse la solución en su blog, lo interesante sería que se entendiera como usar la versión larga de getopt para que cualquier lo pudiera hacer.
En cuanto al archivo de prueba yo tengo uno para el reto, los casos de prueba usados en el concurso. De aquí el chiste es el análisis, que espero en estos días escribir. A más tardar sábado, porque he tenido mucho trabajo.
2008-10-16 13:58:30-05
El del pintor la neta que si esta críptico... pero charros, todavía no den la solución por favor.
Con eso me voy a chingar a los ingenierios en sistemas computacionales de la escuela :-P
2008-10-16 14:04:59-05
Aguanten un poquito por fas, tengo un semana muy cule.....
2008-10-16 16:55:23-05
Chingón pues tú dices tonathiu para cuándo pongo la solución si quieres me aguanto otra semana. De todos modos para mí es mejor porque ahorita ando un poco saturado.
2008-10-18 13:56:19-05
¿Tiene que ser estrictamente en C? ¿Se puede tambien en C++?
2008-10-20 22:42:36-05
Pues lo de estilo es independiente del lenguaje, C++ es muy bueno y completo así que todo lo que puede hacer en C lo puedes hacer en C++.
2008-10-21 17:55:59-05










