miércoles, 20 de agosto de 2008

Programa 5. Ordenar un array

Después de un año de haber tenido olvidado este blog me he decidido a poner un programilla. Se trata de ordenar un array de valores enteros. El algoritmo que voy a utilizar es el llamado "método de la burbuja". Supongo que se llama "método de la burbuja" porque, al igual que una burbuja sube desde el fondo del agua hasta la superficie, así también los valores más altos suben hacia las posiciones más altas del array.

Para hacer el recorrido del vector utilizaremos una sentencia for. Es la más apropiada, ya que el recorrido tiene que ser completo (o casi completo) y no va a depender de ninguna condición que tenga que ver con los valores que pueda alojar el array, o sea, con los datos de entrada. Lo de "casi completo" lo digo porque el recorrido lo vamos a hacer de abajo hacia arriba y,luego,las comparaciones serán con los valores de las posiciones que estén más a la izquierda, por lo que el elemento array[0] no lo incluiremos en el bucle más externo (ya que no tiene elementos que estén por debajo) y comenzaremos por el segundo elemento, es decir, por array[1].

Luego, dentro de la sentencia for, cada elemento será comparado con los que estén más a su izquierda. Se comenzará con el más próximo y, si el contenido de éste es mayor que el elemento considerado, lo haremos escalar una posición hacia la derecha (o más hacia arriba, lo mismo da).Para esto habremos salvado el valor del elemento array[i] en una variable auxiliar. Así proseguiremos con todos los demás elementos del array que estén más a la izquierda que el que estemos considerando mientras se sigan cumpliendo estas dos condiciones:

1. que el siguiente (en orden decreciente) elemento del array tenga un contenido mayor que el contenido de la poscición que nos va apuntando el bucle más externo.

2. que concluya el recorrido del array.

En el momento en que una de las dos sentencias no se cumpla habrá que salir del bucle interno: el que hace el recorrido desde el elemento apuntado por el bucle externo hacia las posiciones que están a la izquierda. Esta circunstacia nos inclina por llevar a cabo este bucle interno con una sentencia while.



/*Este programa ordena un array de 10 elementos por el método de la burbuja*/

#include
#define SALTO_DE_LINEA "\n"

int array[10];
void ordenar_array[10];
void escribir_array[10];

int main(int argc,char*argv[])
{

array={2,33,87,12,64,87,8,91,55,7};
ordena_array(array);
esribir_array(array);
return 0;

}

void ordenar_vector(int a[10])
{
int i,j, auxiliar;
for (i=1;1<10;i++) j="i-1;" auxiliar="a[i];">
{
a[j+1]=v[j];
j--;
}
v[j+1]=auxiliar;
}
}

void escribir_array(int a[10])
{
int i;
for (i=0;i<10;i++)>

sábado, 1 de septiembre de 2007

Programa 4. La función "strcat".


En el programa anterior vimos que la función strcpy es desctructiva, pero hay otra función en la librería <string.h> que copia una cadena (fuente) en otra (destino) sin destruir ésta, es decir, que copia una cadena detrás de la otra. Vamos a hacer un ejemplo y luego vamos a implementar esta función por nuestra cuenta para ejercitarnos. Primero el ejemplo:

#include<stdio.h>
#include<string.h>

int main(int argc,char **argv)
{
char texto1[]="Mortadelo";
char texto2[]=" y ";
char texto3[]="Filemón";

printf("%s\n",texto1);
strcat(texto1,texto2);
printf("%s\n",texto1);
strcat(texto1,texto3);
printf("%s\n",texto1);
return 0;
}




De ejecución:

antonio@linex-bD2zrN:~/Curso_de_C$ cc -o ejem_strcat ejem_strcat.c
antonio@linex-bD2zrN:~/Curso_de_C$ ./ejem_strcat
Mortadelo
Mortadelo y
Mortadelo y Filemón
Violación de segmento
antonio@linex-bD2zrN:~/Curso_de_C$


Ha salido lo que queríamos.Pero también ha salido algo que no queríamos:"Violación del segmento". La verdad es que no sé muy bien porqué nos sale tal advertencia, pero debe de estar relacionado con el espacio reservado en memoria para las distintas cadenas. En el ejemplo hemos dejado el espacio sin determinar. Si lo modificamos y reservamos espacio suficiente, vemos satisfechos que la advertencia desaparece:

#include
#include

int main(int argc,char **argv)
{
char texto1[50]="Mortadelo";
char texto2[5]=" y ";
char texto3[12]="Filemón";

printf("%s\n",texto1);
strcat(texto1,texto2);
printf("%s\n",texto1);
strcat(texto1,texto3);
printf("%s\n",texto1);
return 0;
}



La ejcución ahora es totalmente limpia:

antonio@linex-bD2zrN:~/Curso_de_C$ cc -o ejem_strcat ejem_strcat.c
antonio@linex-bD2zrN:~/Curso_de_C$ ./ejem_strcat
Mortadelo
Mortadelo y
Mortadelo y Filemón
antonio@linex-bD2zrN:~/Curso_de_C$


Ahora como ejercicio vamos a implementar la función por nuestra cuenta dentro del mismo programa. La llamaremos "mistrcat". El código es el siguiente:

#include<stdio.h>

char mistrcat(char destino[],char fuente[])
{
int i=0;
int j=0;

while(destino[i])i++;

while(fuente[j])
{
destino[i]=fuente[j];
i++;
j++;
}
destino[i]='\0';

return *destino;
}

int main(int argc,char **argv)
{
char texto1[50]="Mortadelo";
char texto2[5]=" y ";
char texto3[12]="Filemón";

printf("%s\n",texto1);
mistrcat(texto1,texto2);
printf("%s\n",texto1);
mistrcat(texto1,texto3);
printf("%s\n",texto1);

return 0;
}


De ejecución:

antonio@linex-bD2zrN:~/Curso_de_C$ cc -o mistrcat mistrcat.c
antonio@linex-bD2zrN:~/Curso_de_C$ ./mistrcat
Mortadelo
Mortadelo y
Mortadelo y Filemón
antonio@linex-bD2zrN:~/Curso_de_C$


Bueno, parece que todo ha ido bien. Hasta pronto.

jueves, 30 de agosto de 2007

Programa 3. La función "strcpy"


Hoy vamos a hacer un ejemplo con la función strcpy. Luego vamos a hacer una función por nuestra cuenta que sea equivalente.
La función strcpy se encuentra en la biblioteca <string.h> y se utilza para copiar una cadena de caracteres (fuente) en el lugar que ocupaba otra (destino). Esta copia es destructiva, o sea, que todos los caracteres que estaban en la cadena destino desaparecen, aunque la cadena destino fuera más larga que la cadena fuente.La cadena destino se pone como primer argumento de la función y la cadena fuente como segundo.Vamos a verlo con un ejemplo.


#include<stdio.h>
#include<string.h>

int main(int argc,char **argv)
{
char texto1[]="corta";
char texto2[]="mediana";
char texto3[]="larguisima";

strcpy(texto2,texto1);
printf("%s\n",texto2);
strcpy(texto2,texto3);
printf("%s\n",texto2);
return 0;
}


De ejecución:


antonio@linex-bD2zrN:~/ProgramasC$ ./prueba12
corta
larguisima
antonio@linex-bD2zrN:~/ProgramasC$


Ahora vamos a construir una función por nuestra cuenta y riesgo que realice lo mismo que strcpy; la vamos a llamar mistrcpy. Veremos que los resultados son idénticos.


#include<stdio.h>

char mistrcpy(char destino[],char fuente[])
{
int i=0;
while(fuente[i])
{
destino[i]=fuente[i];
i++;
}
destino[i]='\0';
return *destino;
}

int main(int argc, char **argv9)
{
char texto1[]="corto";
char texto2[]="mediano";
char texto3[]="larguisimo";

mistrcpy(texto2,texto1);
printf("%s\n",texto2);
mistrcpy(texto2,texto3);
printf("%s\n",texto2);
return 0;
}



De ejecución:


antonio@linex-bD2zrN:~/ProgramasC$ ./prueba11
corto
larguisimo
antonio@linex-bD2zrN:~/ProgramasC$


Hasta pronto.

lunes, 27 de agosto de 2007

Programa 2. Serie de Fibonacci.

Antes que nada, tengo que decir que este blog lo hice para aprender mas que para enseñar (no sé casi nada de C). No pensaba poner nada mas en él ni darle publicidad pero, ya que matados2k me ha descubierto, no tengo mas remedio que mandar un programilla para no quedar en ridiculo. Ahí va.

Se trata de sacar por pantalla la serie de Fibonacci. Los dos primeros términos de la serie son el "0" y el "1"; los teŕminos restantes se obtienen sumando los dos anteriores.

#include<stdio.h>
#define N 39

/* Este programa saca en pantalla los 39 primeros
terminos de la serie de Fibonacci*/

int main(int argc,char **argv)
{
int columna; /*contador de columna*/
int auxiliar;
int ntermino; /*contador de terminos*/
int anterior=0; /*primer termino*/
int termino=1; /*segundo termino*/
printf("%10i%10i",anterior,termino);
columna=2;

for(ntermino=2;ntermino<=N;ntermino++)
{
auxiliar=termino;
termino+=anterior;
anterior=auxiliar;
printf("%10i",termino);
columna++;
if(columna==5)
{
printf("\n");
columna=0;
}

}


printf("\n");
return 0;
}


De ejecución:


antonio@linex-bD2zrN:~/ProgramasC$ cc -o fibonacci fibonacci.c
antonio@linex-bD2zrN:~/ProgramasC$ ./fibonacci
0 1 1 2 3
5 8 13 21 34
55 89 144 233 377
610 987 1597 2584 4181
6765 10946 17711 28657 46368
75025 121393 196418 317811 514229
832040 1346269 2178309 3524578 5702887
9227465 14930352 24157817 39088169 63245986

antonio@linex-bD2zrN:~/ProgramasC$

NOTA: Esta entrada ha sido modificada para arreglar el problema de las tabulaciones y las sangrías: ¡por fin lo he conseguido!

Que os vaya bien.

martes, 21 de agosto de 2007

Primer programa: escribir el abecedario.

Este programa es muy sencillo. Se trata de escribir el alfabeto en mayúsculas utilizando un bucle while. Lo que se quiere destacar con esto es los que ya explicó en su día matados2k: que los carateres graficos son procesados internamente cómo números (en código ASCII) y que por eso tiene sentido utilizar operadores aritméticos con variables de tipo carácter (char). Pero además yo he querido destacar que en la tabla ASCII los caracteres alfabéticos siguen el mismo orden que en el alfabeto de toda la vida. También quiero hacer notar que la letra "ñ" no aparece. Ahí va:


#include<stdio.h>

int main(int argc,char **argv)
{
char c='A';

while(c<='Z')
{
printf("%3c",c);
c++;
}

printf("\n");
return 0;
}

De ejecución:

antonio@linex-bD2zrN:~$ cd ./ProgramasC/
antonio@linex-bD2zrN:~/ProgramasC$ cc -o abc abc.c
antonio@linex-bD2zrN:~/ProgramasC$ ./abc
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
antonio@linex-bD2zrN:~/ProgramasC$

Hasta pronto.

PRESENTACIÓN

Este blog surge bajo el estímulo de la web de Luis García "La vida entre chip y chip" (www.matados2k.es). Lo que pretende este blog es ser un complemento al "Curso de programación en C desde 0" que en la citada página se está desarrollando. La forma en que voy a intentar complementar dicho curso va a ser haciendo programitas sencillos pensados para gente que esté interesada en la programación pero que no tenga conocimientos previos. A medida que avance el curso los programas se irán complicando.
La razón que me llevó a idear este blog fue no solo la pasión por la programación sino la ilusión de compartir mis conocimientos con los demás. Por lo que me gustaría que comentárais mis programas y me mandárais sugerencias y me notificárais las erratas que pudieran tener mis escritos. También me gustaría que alguien mandara sus programas.
Bueno, pues nada más, soy hombre de pocas palabras, así que manos a la obra.