"Mi estilo es el arte de luchar, sin luchar"
quis custodiet ipsos custodes? Juvenal, Sátiras, VI 346-348

Ayuda Retos (Asarch y Thot)

2008-10-16 09:50:29-05

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


Comments Comentblogs:
1.- asarch wrote:

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
2.- thot wrote:

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
3.- asarch wrote:

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
4.- tonathiu wrote:

Aguanten un poquito por fas, tengo un semana muy cule.....

2008-10-16 16:55:23-05
5.- thot wrote:

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
6.- asarch wrote:

¿Tiene que ser estrictamente en C? ¿Se puede tambien en C++?

2008-10-20 22:42:36-05
7.- vendaval wrote:

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
New Comentblog
Captcha Image
Login




Join us!
Forgot your password?
vendaval
Alberto Rodriguez Sanchez Estudiante de Ingenieria en Computación en la UAM-A, programo en C, C++, C#, Python, Scheme, PHP,y Haskell. Uso Archlinux, Debian GNU/Linux, Mac OS X, OpenSolaris, NetBSD, FreeBSD, Plan9 y Win2. Pienso especializarme en computo científico y criptografía, que son mis grandes pasiones.

También pienso que la programación computacional es un Arte y que muchos programas son elegantes, muchos exquisitos, muchos son brillantes. Mi pensar es que se pueden escribir grandes programas, programas nobles y programas verdaderamente magníficos,por ello prefiero la Sintaxis Avanzada en los programas por que muestra un dominio del lenguaje y un buen grado de abstracción.

FreeBSD, C, Enlightenment y VI(M); son mis SO, Lenguaje de programación, manejador de ventanas y editor favoritos.

Practico Kali Filipino, Limalama y JKD (soy seguidor de la filosofía de Bruce Lee). Ademas soy el guardian la Sexta Casa del Zodiaco y también escribo con cierta regularidad en este blog.

"Se como el agua, piensa como el fuego"
Powered by
Despabilando la MonoNeurona.org
Livechat
<-Nombre

wrote:

on 17/1/10

wrote:
que parsante
on 17/1/10

Puro Hueso wrote:
chistosito
on 8/10/09

vendaval wrote:
ok, =)
on 5/10/09

Puro Hueso wrote:
salgo a las 2, no creo que te quede (mejor quedate a ver viejas)
on 5/10/09

vendaval wrote:
Soul-Tlamaqui -> http://callix.azc.uam.mx/soul
on 1/10/09

rik wrote:
:P soul-tralmakui tiene página? :P
on 1/10/09

vendaval wrote:
207202346 recuerda
on 26/9/09

puro hueso wrote:
me urge que me llames
on 21/8/09

eVa wrote:
Hola mi querido Betux :) ya no lo he visto en línea, ya conectese no? Un beso!
on 20/8/09


@aarkerio: no puedo cambiar mi css. =(
48 minutes ago
y que onda, ya llego la lap o no?
10 hours, 55 minutes ago
LOL
1 week ago
Seguro usas gnome, yo por eso fluxbox...donde todas las pendejadas que suceden son por mi culpa
1 week, 2 days ago
Entonces estas estrenando lap aarkerio??
1 week, 5 days ago
Pues hay que poner tema y fecha.
2 weeks, 1 day ago
Campus Party ...Igual el próximo Año. =(
3 weeks ago
@asarch: malo para el hígado.
3 weeks, 1 day ago
Peleando con un X-gdb
3 weeks, 1 day ago
Creo que algo cambio: http://www.scribd.co m/doc/35539144/pnp12 pt
3 weeks, 3 days ago
Mis Albums
FirefoxjEdit.orgGimpOpenOffice.orgHacker
Top
Colectivo MonoNeurona.org © 2002-2010.