Programación en lenguaje ANSI C

Página actualizada el 17/02/97

En esta página se muestra información de distinto tipo sobre programación en lenguaje ANSI C. Poco a poco se irá completando con nuevos ejemplos y explicaciones.

Contenido de esta página:



Ejercicios resueltos de programación en C (Curso 1994-95)

Práctica 4 Práctica 5 Práctica 6 Práctica 7
Práctica 8 Práctica 9 Práctica 11 Examen Final


Seminario sobre cadenas y reserva dinámica de memoria (13/01/1996)

En el seminario que tuvo lugar el 13 de enero de 1995 se realizó un programa que leía un número indeterminado de frases tan largas como se quisiera y las ordenaba alfabéticamente.
El programa desarrollado en este seminario se encuentra en un fichero llamado ordena3.c.


Funciones para manejo de cadenas de caracteres (Clase 16/01/1996)

En el fichero cadenas.h están incluidas las funciones cadlen(), cadcpy(), cadcat(), cadcmp() y cadcomp(), que realizan funciones análogas a las funciones de C strlen(), strcpy(), strcat(), strcmp() y strcomp(), respectivamente. La función cadcomp() tiene la particularidad de que compara cadenas de caracteres por orden alfabético sin distinguir mayúsculas de minúsculas, vocales acentuadas y no acentuadas. Para esta función, por ejemplo, las palabras ratón y RatÓn son idénticas. Es interesante ver cómo se ha programado esta función por medio de otra función llamada filtro().

El fichero cadenas.c permite realizar algunas pruebas con las funciones consideradas en el párrafo anterior. Este fichero puede ser editado con facilidad para realizar pruebas diferentes de las consideradas inicialmente


Matrices y reserva dinámica de memoria (Clase 23/01/1996)

Uno de los problemas más típicos de C es la reserva dinámica de memoria para vectores y matrices. En la clase del 23 de Enero se hicieron angunos ejemplos de cómo se puede abordar y resolver este problema.

En el fichero ma_alloc.c se define la función ma_alloc(m, n) que crea una matriz double con m filas y n columnas. Las filas no están almacenadas de modo contiguo en la memoria, lo cual impide que la matriz pueda recorrerse por columnas usando aritmética de punteros (por ejemplo, si *a[0] es el primer elemento de la primera fila *(a[0]+n) debería ser el primer elemento de la segunda fila, pero no lo es porque esta segunda fila no está almacenada a continuación de la primera).

En este programa los datos de la matriz (número de filas y de columnas, y elementos) se leen de un fichero cuyo nombre se lee desde teclado.

El fichero ma_allo2.c es similar al anterior, pero en él la reserva dinámica de memoria se ha sustituido por reserva estática. De esta forma puede comprobarse en la ventana Watch que las filas están contiguas en memoria. Con reserva estática, la memoria se reserva para el caso más grande que se puede presentar y la dimensión de la matriz es independiente del número real de filas y de columnas que tiene la matriz. Es interesante ver cómo se hace la definición y declaración de la matriz en los argumentos que se pasan a la función. Recuérdese que es necesario pasar información sobre el número de elementos de cada fila para poder direccionar la matriz correctamente.

El fichero ma_allo3.c es similar a ma_alloc.c pero se ha introducido una modificación para direccionar los elementos de la matriz de 1 a n, en vez de 0 a n-1. Esta modificación está explicada en los Ejercicios Resueltos de Programación en C.

Finalmente, el fichero ma_allo4.c contiene una nueva modificación del fichero ma_alloc.c. En este caso la reserva dinámica de memoria se hace de tal forma que todas las filas de la matriz se almacenan de forma contigua. Para ello es necesario reservar memoria en una sola llamada a la función calloc(). Después se asignan los valores adecuados a los elementos del vector de punteros.


Para comentarios o sugerencias sobre esta página, dirigirse a Javier García de Jalón (jgjalon@ceit.es). Esta página ha sido actualizada por última vez el 17/02/97.