<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SBCodigo.com - Programación y Diseño Web &#187; Jose</title>
	<atom:link href="http://sbcodigo.com/author/jose/feed/" rel="self" type="application/rss+xml" />
	<link>http://sbcodigo.com</link>
	<description>Blog de programación y diseño web</description>
	<lastBuildDate>Thu, 07 Jan 2010 17:43:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Números aleatorios avanzados en c</title>
		<link>http://sbcodigo.com/programacion/numeros-aleatorios-en-c-2/</link>
		<comments>http://sbcodigo.com/programacion/numeros-aleatorios-en-c-2/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 13:54:28 +0000</pubDate>
		<dc:creator>Jose</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://sbcodigo.com/?p=279</guid>
		<description><![CDATA[Despues de ver cómo generar números aleatorios en javascript, veremos ahora como generar números aleatorios en c y números aleatorios entre dos números. Para ello contamos con dos funciones en C para su correcto funcionamiento:

void srand(unsigned int semilla);
int rand(void);

void srand48(long int semilla);
double drand48(void);

En realidad son cuatro funciones, son análogas, srand y rand son para el [...]


No hay posts relacionados.]]></description>
			<content:encoded><![CDATA[<p>Despues de ver <a href="http://sbcodigo.com/programacion/numeros-aleatorios-en-javascript/">cómo generar números aleatorios en javascript</a>, veremos ahora como generar números aleatorios en c y números aleatorios entre dos números. Para ello contamos con dos funciones en C para su correcto funcionamiento:</p>
<pre class="brush: c">
void srand(unsigned int semilla);
int rand(void);

void srand48(long int semilla);
double drand48(void);
</pre>
<p>En realidad son cuatro funciones, son análogas, srand y rand son para el manejo de enteros y srand48 y drand48 para el manejo de números reales.<br />
La función <strong>rand</strong> genera un número aleatorio, pero si hacemos un programa que genere por ejemplo diez números aleatorios, cada vez que ejecutemos el programa vamos a obtener<span id="more-279"></span> los mismos números, ¿por qué? Porque necesitamos definir una semilla para que en cada ejecución del programa se generen números aleatorios distintos. Pues bien, esto lo hacemos con la función <strong>srand</strong>. Hay que tener cuidado con la semilla que escogemos, puesto que si siempre escogemos la misma semilla pués la función rand generará los mismos números, por lo tanto nuestra semilla debe ser &#8220;aleatoria&#8221;, así que <strong>tomaremos como semilla la hora del sistema</strong> (también podemos tener en cuenta el pid del proceso).</p>
<p>Ahora veremos un ejemplo completo:</p>
<pre class="brush: c">
/**
*  Programa:
*      Generacion de numeros aleatorios
*  Descripcion:
*      Programa que genera numeros aleatorios en diferentes rangos
*  Archivo: alea.c
*  Ejecucion: ./alea
*  Compilar: gcc -Wall -o alea alea.c
*  Autor:
*      Jose Mato
* **/
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;time.h&gt;

int main(int argc, char **argv)
{
    int num = 0;

    /* ponemos la semilla para generar numeros aleatorios, la semilla es la hora
        actual */
    srand((unsigned) time(NULL));

    /* generamos un numero aleatorio */
    num = rand();
    printf(&quot;Numero aleatorio: %d\n&quot;, num);

    /* generamos un numero aleatorio entre 0 y 9 */
    num = rand() % 10;
    printf(&quot;Numero entre 0 y 9: %d\n&quot;, num);

    /* generamos un numero aleatorio entre 1 y 10 */
    num = (rand() % 10) + 1;
    printf(&quot;Numero entre 1 y 10: %d\n&quot;, num);

    /* generamos un numero aleatorio entre 10 y 20 */
    num = (rand() % 11) + 10;
    printf(&quot;Numero entre 10 y 20: %d\n&quot;, num);

    /* semilla para numeros reales */
    srand48((unsigned) time(NULL));
    /* generamos un numero REAL entre 5 y 10 */
    float real = drand48() * (10.0 - 5.0) + 5.0;
    printf(&quot;Real entre 5 y 10: %f\n&quot;, real);

    return EXIT_SUCCESS;
}
</pre>
<p>Descargar: <a href="http://sbcodigo.com/wp-content/uploads/2010/01/alea.c">programa alea.c</a></p>
<p>Ya no tienes excusas para hacer programas como simulación de primitiva, quiniela de fútbol, ahorcado, &#8230;&#8230; y todo lo que se te ocurra.</p>


<p>No hay posts relacionados.</p>]]></content:encoded>
			<wfw:commentRss>http://sbcodigo.com/programacion/numeros-aleatorios-en-c-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Convertir entero a cadena en c</title>
		<link>http://sbcodigo.com/programacion/convertir-entero-a-cadena-en-c/</link>
		<comments>http://sbcodigo.com/programacion/convertir-entero-a-cadena-en-c/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 17:08:11 +0000</pubDate>
		<dc:creator>Jose</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://sbcodigo.com/?p=262</guid>
		<description><![CDATA[En el post anterior vimos como convertir una cadena a entero, ahora veremos lo contrario.
Igual que atoi nos convierte una cadena en un entero, la función itoa nos convierte un entero en una cadena. El problema de esta función es que no es estándar, y por lo tanto no estará disponible en todos los compiladores [...]


No hay posts relacionados.]]></description>
			<content:encoded><![CDATA[<p>En el post anterior vimos como <a href="http://sbcodigo.com/programacion/convertir-cadena-a-entero-en-c/">convertir una cadena a entero</a>, ahora veremos lo contrario.<br />
Igual que atoi nos convierte una cadena en un entero, <strong>la función itoa</strong> nos convierte un entero en una cadena. El problema de esta función es que no es estándar, y por lo tanto no estará disponible en todos los compiladores o sistemas, por lo tanto vamos a hacer una pequeña &#8220;trampa&#8221; para emular dicha función.<br />
Para la &#8220;trampa&#8221; emplearemos la función <strong>sprintf</strong>:</p>
<pre class="brush: c">

int sprintf(char *cadena, const char *formato, ...);
</pre>
<p>Esta función es parecida a printf, pero en vez de mandar a la salida estándar el resultado, lo almacena en la variable &#8216;cadena&#8217;. A continuación vamos a ver un sencillo ejemplo:<span id="more-262"></span></p>
<pre class="brush: c">

/**
 *  Programa:
 *      Conversion numero entero a cadena
 *  Descripcion:
 *      Programa que convierte un numero entero (tipo int) a una cadena de
 *      caracteres (tipo char *)
 *  Archivo: int2string.c
 *  Ejecucion: ./int2string
 *  Compilar: gcc -Wall -o int2string int2string.c
 *  Autor:
 *      Jose Mato
 * **/
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int main(int argc, char **argv)
{
    int num_entero = 529;
    char cadena[10];

    /* la salida se almacena en la variable &#039;cadena&#039; -&gt; convertimos la
       variable num_entero a un array de caracteres (string) */
    sprintf(cadena, &quot;%d&quot;, num_entero);

    /* visualizamos la variable &#039;cadena&#039; */
    puts(cadena);

    return EXIT_SUCCESS;
}
</pre>
<p>En el programa anterior vemos la transformación de un entero a una cadena, pero usando la función sprintf podemos convertir cualquier variable de tipo numérico (real, flotante, &#8230;) a una cadena, cambiando evidentemente el formato (%d, %f, %lf, &#8230;)</p>
<p>Descargar: <a href="http://sbcodigo.com/wp-content/uploads/2010/01/int2string.c">programa int2string</a></p>


<p>No hay posts relacionados.</p>]]></content:encoded>
			<wfw:commentRss>http://sbcodigo.com/programacion/convertir-entero-a-cadena-en-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Convertir cadena a entero en c</title>
		<link>http://sbcodigo.com/programacion/convertir-cadena-a-entero-en-c/</link>
		<comments>http://sbcodigo.com/programacion/convertir-cadena-a-entero-en-c/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 16:48:01 +0000</pubDate>
		<dc:creator>Jose</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://sbcodigo.com/?p=252</guid>
		<description><![CDATA[Es muy común convertir en número entero a una cadena en c, por ejemplo desde datos leidos en ficheros de texto o la conversión de los argumentos pasados al programa. Por suerte, c nos proporciona dos funciones para este propósito, atoi y strtol:


int atoi (const char *cadena)
long int strtol(const char *cadena, char *basura, int base)

Tanto [...]


No hay posts relacionados.]]></description>
			<content:encoded><![CDATA[<p>Es muy común convertir en número entero a una cadena en c, por ejemplo desde datos leidos en ficheros de texto o la conversión de los argumentos pasados al programa. Por suerte, c nos proporciona dos funciones para este propósito, atoi y strtol:</p>
<pre class="brush: c">

int atoi (const char *cadena)
long int strtol(const char *cadena, char *basura, int base)
</pre>
<p>Tanto atoi como strtol dada una cadena la convierten a un entero, devolviendo el número y <strong>en caso de error devuelven el número 0</strong>. A strtol hay que indicarle la base a la que queremos convertir el número, en la mayoría de los casos la base será 10.</p>
<p>Pero bien, tenemos que saber qué es una cadena errónea para esas funciones:<span id="more-252"></span></p>
<pre class="brush: c">

/* Cadenas validas: tanto atoi como strtol devuelven 528 */
char cad1[] = &quot;528&quot;;
char cad2[] = &quot;528abcdef&quot;;

/* Cadenas erroneas: tanto atoi como strtol devuelven 0 */
char cad1[] = &quot;abcd&quot;;
char cad2[] = &quot;abcdef528&quot;;
</pre>
<p>El problema viene en si al convertir una cadena de valor &#8220;0&#8243; las funciones nos devolverán su valor entero &#8216;0&#8242;, y podemos interpretarlo como un error sin serlo. La solución dependiendo del caso sería utilizar la función strtol, que en caso de encontrar caracteres que no sean numéricos los almacenará en la variable &#8216;basura&#8217;, así sabremos en todo momento si la conversión fue o no exitosa.</p>
<p>A continuación un ejemplo de atoi y strtol que espero que os sirva de ayuda:</p>
<pre class="brush: c">

/**
*  Programa:
*      Conversion cadena a numero entero
*  Descripcion:
*      Programa que convierte un numero entero (tipo int) a una cadena de
*      caracteres (tipo char *)
*  Archivo: string2int.c
*  Ejecucion: ./string2int
*  Compilar: gcc -Wall -o string2int string2int.c
*  Autor:
*      Jose Mato
* **/
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int main(int argc, char **argv)
{
char cadena_valida[] = &quot;529&quot;;
char cadena_erronea[] = &quot;abc&quot;;
long int num = 0;
// variables para strtol
char *basura = NULL;
int base = 10;

/* forma 1: convertimos la cadena usando atoi */
num = atoi(cadena_valida);
printf(&quot;atoi (cadena valida): %ld\n&quot;, num);
num = atoi(cadena_erronea);
printf(&quot;atoi (cadena erronea): %ld\n\n&quot;, num);

/* forma 2: convertimos la cadena usando strtol */
num = strtol(cadena_valida, &amp;amp;amp;amp;amp;basura, base);
printf(&quot;strtol (cadena valida): %ld\n&quot;, num);
num = strtol(cadena_erronea, &amp;amp;amp;amp;amp;basura, base);
printf(&quot;strtol (cadena erronea): %ld\n&quot;, num);
if(basura[0] != 0) {
printf(&quot;Strtol ha detectado error en la cadena: %s\n&quot;, cadena_erronea);
}

return EXIT_SUCCESS;
}
</pre>
<p>Descargar: <a href="http://sbcodigo.com/wp-content/uploads/2010/01/string2int.c">programa string2int</a></p>


<p>No hay posts relacionados.</p>]]></content:encoded>
			<wfw:commentRss>http://sbcodigo.com/programacion/convertir-cadena-a-entero-en-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arrays bidimensionales dinámicos en C</title>
		<link>http://sbcodigo.com/programacion/arrays-bidimensionales-dinamicos-en-c/</link>
		<comments>http://sbcodigo.com/programacion/arrays-bidimensionales-dinamicos-en-c/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 17:25:54 +0000</pubDate>
		<dc:creator>Jose</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://sbcodigo.com/?p=233</guid>
		<description><![CDATA[A veces nos encontramos resolviendo un problema en C, Pascal u otro lenguaje y necesitamos almacenar datos que cambian dinámicamente en cada ejecución, como un programa que se encargue de realizar operaciones con matrices, o cargar una foto en memoria para rotarla.
Si no queremos &#8220;perder&#8221; nuestro tiempo más de uno lo que hace es declarar [...]


No hay posts relacionados.]]></description>
			<content:encoded><![CDATA[<p>A veces nos encontramos resolviendo un problema en C, Pascal u otro lenguaje y necesitamos almacenar datos que cambian dinámicamente en cada ejecución, como un programa que se encargue de realizar operaciones con matrices, o cargar una foto en memoria para rotarla.<br />
Si no queremos &#8220;perder&#8221; nuestro tiempo más de uno lo que hace es declarar un array bidimensional estático lo suficientemente grande para que &#8220;funcione&#8221;, pero no es la solución. Lo adecuado es declarar un <strong>array dinámico en tiempo de ejecución</strong>, veámoslos.<br />
<span id="more-233"></span><br />
Los arrays dinámicos en C son un poco más laboriosos de entender y crear que en otros lenguajes, pero vamos a perderle el miedo a estes tipos de datos tan usados.</p>
<p>En C un array bidimensional es un array de punteros a punteros, dónde en primer lugar tenemos que saber cuántos elementos vamos a almacenar en el array. Vamos a suponer que queremos almacenar 3 elementos al que llamaremos filas:</p>
<pre class="brush: c">
int filas = 3;
int **array = (int **) malloc(filas * sizeof(int *));
</pre>
<p>En el código anterior se ha declarado memoria para tres filas de números enteros, quedando así:<br />
[0] -&gt; &#8220;columna sin declarar&#8221;<br />
[1] -&gt; &#8220;columna sin declarar&#8221;<br />
[2] -&gt; &#8220;columna sin declarar&#8221;</p>
<p>Tenemos tres punteros a enteros (filas) que apuntan a &#8220;columna sin declarar&#8221;. Por lo tanto, a continuación, reservamos memoria para cada &#8220;columna sin declarar&#8221;, teniendo en cuenta que queremos que en cada fila se almacenen dos columnas de números enteros.</p>
<pre class="brush: c">
int columnas = 2;
int i = 0;
for(i=0; i&lt;filas; i++) {
    array[i] = (int *) malloc(columnas * sizeof(int));
}
</pre>
<p>Ahora ya tendríamos el siguiente array:<br />
[0] -&gt; [0] [1]<br />
[1] -&gt; [0] [1]<br />
[2] -&gt; [0] [1]</p>
<p>En este momento ya podemos manejar el array dinámico como si fuese uno estático, por ejemplo:</p>
<pre class="brush: c">
/* inicializamos el array */
array[0][0] = 105;

/* inicializamos y visualizamos el array con un bucle for */
for(i=0; i&lt;filas; i++) {
    for(j=0; j&lt;columnas; j++) {
        array[i][j] = rand() % 150;
        printf(&quot;array[%d][%d] = %d  &quot;, i, j, array[i][j]);
    }
    printf(&quot;\n&quot;);
}
</pre>
<p>Al final del programa ES ACONSEJABLE liberar la memoria del array dinámico. Esto se hace al revés de la creación del array, primero se eliman las columnas y, una vez que ya no haya columnas, se eliminan la filas, así:</p>
<pre class="brush: php">
/* liberamos la memoria de las columnas */
for(i=0; i&amp;lt;filas; i++) {
    free(array[i]);
}

/* liberamos la memoria de las filas  */
free(array);
array = NULL;
</pre>
<p>Para terminar vamos a ver el último ejemplo, este es parecido al anterior, pero en vez de trabajar con números enteros vamos a trabajar con arrays de caracteres.<br />
El siguiente programa lo que hace es una copia de los argumentos que le pasamos al programa, visualizándolos por<br />
pantalla y eliminado la memoria previamente reservada.</p>
<pre class="brush: c">
/**
*  Programa:
*      Arrays dinamicos bidimensionales
*  Descripcion:
*      Programa que hace una copia de argv para mostrar el uso de la
*      reserva dinamica de memoria en arrays bidimensionales
*  Archivo: cargv.c
*  Ejecucion: ./cargv &quot;argumento1&quot; &quot;argumento 2&quot; &quot;argumento n&quot;
*  Compilar: gcc -o cargv cargv.c
*  Autor:
*      Jose Mato
* **/
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;

int main(int argc, char **argv)
{
    int i = 0;
    int filas = 0;
    char **array = NULL;

    /* reservamos memoria para el numero de filas*/
    filas = argc;
    array = (char **) malloc(filas * sizeof(char *));

    /*  vamos recorriendo fila a fila, y para cada una reservamos
         el numero de columnas dinamicamente.
         Almacenamos el valor del argumento
    */
    for(i=0; i&lt;filas; i++) {
        array[i] = (char *) malloc((strlen(argv[i]) + 1) * sizeof(char));
        strcpy(array[i], argv[i]);
    }

    /* mostramos los argumentos del array */
    for(i=0; i&lt;filas; i++) {
        puts(array[i]);
    }

    /* liberamos la memoria del array en orden inverso al de creacion:
        primero las columnas y despues las filas */
    for(i=0; i&lt;filas; i++) {
        free(array[i]);
        array[i] = NULL;
    }

    /* liberamos los punteros de las filas */
    free(array);
    array = NULL;

    return EXIT_SUCCESS;
}
</pre>
<p>Espero que os haya servido de ayuda y resolviese vuestras dudas. Y tú, ¿para qué los usaste?</p>
<p>Descargar: <a href="http://sbcodigo.com/wp-content/uploads/2010/01/cargv.c">programa cargv.c</a></p>


<p>No hay posts relacionados.</p>]]></content:encoded>
			<wfw:commentRss>http://sbcodigo.com/programacion/arrays-bidimensionales-dinamicos-en-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
