You are on page 1of 22

Punteros .

El uso de los punteros es fundamental en la programacin en C, debido a las


siguientes razones:
Los punteros proporcionan los medios mediante los cuales las funciones pueden
modificar sus argumentos de llamada.
Los punteros se usan para soportar las rutinas de asignacin dinmica de C.
El uso de punteros mejora el rendimiento de rutinas.
Se utilizan normalmente como soporte de estructuras de datos como listas enlazadas
y rboles binarios.

Un puntero es una variable que contiene una direccin de memoria. Esa direccin
es la posicin de otra variable. Si una variable contiene la direccin de otra variable se
dice que la primera variable apunta a la segunda.

Variables puntero.

Si una variable va a contener un puntero debe declararse:

tipo * lpnombre;

donde tipo es cualquier tipo vlido de C (el tipo base del puntero) y lpnombre es el
nombre de la variable puntero. El prefijo lp en la notacin seguida significa puntero.
Para anular un lp es necesario colocar un *.

El tipo base del puntero define el tipo de las variables a las que puede apuntar el
puntero. En teora, cualquier tipo de puntero puede apuntar a cualquier direccin de la
memoria, pero C asume que a lo que apunta un puntero es a un objeto de su tipo base.

Los operadores de punteros.

Existen dos operadores especiales de punteros: & y *.


& es un operador monario que devuelve la direccin de memoria de su operando.

int *x;
int ism, y;
x = &ism;

en una asignacin como la anterior la variable x recibe la direccin de memoria de la


variable ism.

* es el operador inverso de &. Este operador devuelve el valor de la variable localizada


en la direccin que se indica.
y = *x;
y recibe el valor existente en x, que ser el mismo de ism.

Los operadores * y & poseen mayor precedencia que los operadores aritmticos
pero igual que el monario.

Fundamentos de Programacin Tema 2 Pg. - 1/22


Aritmtica de punteros.

Existen slo dos operaciones aritmticas que se pueden realizar con punteros: la
suma y la resta. Teniendo en cuenta que la aritmtica de punteros difiere de la aritmtica
tradicional; un puntero incrementa (++) o decrementa (--) su valor en relacin con la
longitud de su tipo base. Si la variable es de tipo carcter su valor aumenta en uno, sin
embargo si se trata de un tipo entero su valor aumentara en dos.
p = p + 3;

La suma anterior realizar un desplazamiento en memoria distinto segn sea el


tipo base del puntero y lo mismo ocurra con la resta.
Adems de las operaciones anteriores slo es posible la resta de punteros que
dara lugar al nmero de elementos que se separa a los punteros; esto slo tiene sentido
si ambos punteros apuntan al mismo objeto.

Punteros y cadenas.

char snmbr[20], * lpnmbr;


lpnmbr = snmbr;

lpnmbr a recibido la direccin base de snmbr, (direccin del primer elemento de la


cadena) esto es debido a que el nombre de una cadena es la direccin del primer
elemento. Para acceder a un elemento de la cadena snmbr
snmbr[1] o *(lpnmbr+1)

En C, char *lpnmbr y char lpnmbr[] es lo mismo, y la diferencia con


snmbr[20] es que en este ltimo se ha producido una reserva de memoria para la
variable en tiempo de compilacin, mientras que en los dos primeros no, por tanto habr
que realizar la reserva de memoria en tiempo de ejecucin utilizando la funcin malloc.

Punteros a punteros.

Un puntero a puntero es una forma de indireccin mltiple, o encaminamiento


de punteros. El primer puntero contiene la direccin de del segundo puntero, que apunta
a la variable que contiene el valor deseado.

int **lplpnmr;

lplpnmr es un puntero que apunta a otro puntero que apunta a una variable.

Fundamentos de Programacin Tema 2 Pg. - 2/22


Puntero Variable
direccin valor

Indireccin simple

Puntero Puntero Variable


direccin direccin variable

Indireccin mltiple

Despus de declarar un puntero, pero antes de asignarle un valor posee un valor


desconocido. Si se intenta usar un puntero antes de asignarle un valor puede no dar
errores pero el programa se estrellar.

Fundamentos de Programacin Tema 2 Pg. - 3/22


Funciones.
Las funciones son los bloques constructores de C y el lugar donde se desarrolla
toda la actividad del programa. Se construyen fuera de main() y se han de declarar
antes.

La forma general de una funcin y su localizacin dentro de un programa C es:

especificador_de_tipo nombre_funcin (lista de parmetros);


main()
{

}
especificador_de_tipo nombre_funcin (lista de parmetros)

{
cuerpo de la funcin
}

especificador_de_tipo especifica el tipo de valor que devuelve la funcin (puede ser


cualquier tipo vlido); nombre_funcin el nombre que va a recibir la funcin por parte
del programador y lista de parmetros indica el nombre de las variables, constantes... y
sus tipos asociados separados por comas que necesita la funcin para su correcto
funcionamiento (en la definicin de referencia anticipada de funcin nicamente
aparece el tipo de los parmetros separados por comas, pero no el nombre de las
variables).

Antes de poder usar una funcin que devuelva un tipo no entero, se debe hacer
saber su tipo al resto del programa. Si se utiliza una funcin antes de su definicin de
referencia anticipada se genera un cdigo de llamada errneo ya que asume que su valor
de vuelta ser entero. En la definicin de referencia anticipada slo se declara el tipo de
vuelta y el tipo y nmero de parmetros pero no se indica lo que la funcin realmente
hace. La definicin de funcin se realiza en algn otro lugar del programa.

Adems cuando se compila en C, cada funcin recibe un punto de entrada;


cuando se ejecuta el programa se hace una llamada a ese punto de entrada establecido
en tiempo de compilacin. Este punto de entrada se puede utilizar para devolver valores.

La sentencia return().

La sentencia return() tiene dos usos importantes:


fuerza la salida inmediata de la funcin donde se encuentra y hace que la ejecucin
del programa vuelva al cdigo que llam a la funcin.
puede devolver un valor.

Fundamentos de Programacin Tema 2 Pg. - 4/22


Terminacin de una funcin.

Hay dos formas en las que una funcin puede terminar su ejecucin:
cuando se ha ejecutado la ltima sentencia de la funcin y se encuentra la llave } de
final de funcin.
cuando se encuentran una sentencia return(), bien porque se devuelve un valor o par
simplificar el cdigo de la funcin y hacerlo ms eficiente permitiendo mltiples
puntos de salida. Una funcin puede contener varias sentencias return().

Valores devueltos por una funcin.

Todas las funciones, excepto las de tipo void, devuelven un valor. Este valor se
especifica explcitamente en la sentencia return(). Si una funcin no es especificada
como tipo void y no se especifica un valor de vuelta , entonces el valor de vuelta queda
tcnicamente indefinido, adems de los correspondientes avisos por parte del
compilador.
Todas las funciones que no han sido declaradas como void puede ser usada
como operando en cualquier expresin vlida, pero no puede ser el destino de ninguna
asignacin.

Aunque todas las funciones que no son de tipo void tienen valores de vuelta, la
mayora de las funciones sern de tres tipos:
funciones diseadas para realizar operaciones con sus argumentos y devolver un
valor basado en estos.
funciones que manipulan informacin y devuelven un valor indicando el xito o el
fracaso de la manipulacin.
funciones que no poseen un valor de vuelta explcito. La funcin es de tipo
procedimiento(existentes en otros lenguajes) y no genera un valor.

Aunque una funcin devuelva un valor este no debe ser usado necesariamente en
una sentencia de asignacin, puede ser usado por ejemplo en una sentencia printf().

Reglas de mbito de las funciones.

En C, cada funcin es un bloque de cdigo discreto. El cdigo de una funcin es


privado a esa funcin y no se puede acceder a l mediante la expresin de otra funcin,
a menos que se haga a travs de una llamada a funcin. El cdigo que comprende el
cuerpo de la funcin esta oculto al resto del programa y, a no ser que se utilicen datos o
variable globales, no puede ser afectado ni afectar a otras partes del programa.

Las variables definidas dentro de una funcin se llaman variables locales. Las
variables locales empiezan a existir cuando comienza la ejecucin de la funcin y se
destruyen al salir de ella. Las variables locales no pueden retener su valor entre
distintas llamadas a la funcin (excepto variables static)

En C todas las funciones estn al mismo nivel de mbito, no se pueden definir


unas funciones dentro de otras.

Fundamentos de Programacin Tema 2 Pg. - 5/22


Argumentos de funciones.

Si una funcin va a utilizar argumentos, se deben declarar las variables que


vayan a aceptar los valores de los argumentos. Estas variables se llaman parmetros
formales. Se comportan como otras variables locales de la funcin , crendose al entrar
en la funcin y destruyndose al salir de ella.

Estos parmetros formales se comportan como cualquier otra variable de C,


pudindose incluso realizar asignaciones (aunque esto no posea sentido).

Llamada por valor y llamada por referencia.

Para pasar argumentos a las subrutinas se pueden utilizar dos formas:


llamada por valor: copia el valor de un argumento en el parmetro formal de la
subrutina. Los cambios en los parmetros de la subrutina no implican cambios en el
valor de las variables que se utilizan en la llamada.
llamada por referencia: se copia la direccin del argumento en el parmetro . Esto
significa que los cambios realizados en los parmetros afectan a la variable usada en
la llamada a la subrutina.

C utiliza nicamente llamadas por valor, esto implica que no se puede alterar las
variables usadas para llamar a una funcin, sin embargo, se utilizan los punteros para
poder realizar una llamada por referencia.

Creacin de una llamada por referencia.

El paso de parmetros en C es la llamada por valor, se puede provocar una


llamada por referencia usando un puntero como argumento y pasando una direccin en
la llamada, de esta forma se pueden cambiar el valor de un argumento externo a la
funcin.
Los punteros se pasan a las funciones como cualquier otro valor. Slo es
necesario declarar los argumentos de tipo puntero.

#include <stdio.h>
#include <conio.h>

void cambiar (int *);


void main()
{
int j=5;
printf("%d",j);
cambiar(&j);
printf("%d",j);
getch();
}

void cambiar (int *i)


{
*i=8;
}

De esta forma se consigue cambiar el valor de una variable ajena a la funcin.

Fundamentos de Programacin Tema 2 Pg. - 6/22


Llamadas a funciones con cadenas.

Cuando se usa una cadena como argumento de una funcin, slo se pasa la
direccin de la cadena, no una copia de la cadena (se pasa un puntero al primer
elemento de la cadena) es por tanto una excepcin a la llamada por valor que utiliza C.

Devolucin de punteros.

Las funciones que devuelven punteros se manejan de la misma forma que


cualquier otro tipo de funcin; slo que aprovecha el punto de entrada de la funcin
para devolver un valor (una direccin).

char * esta(char c, char *cdn)


{
int cntdr = 0;
while (c != cdn[cntdr] && cdn[cntdr]) cntdr ++;
return(&cdn[cntdr]);
}

En el punto de entrada que el compilador asigna a la funcin esta, ser devuelta


una cadena. Esto mismo es posible realizarlo mediante un parmetro ms o incluso
aprovecha un parmetro usado en la llamada cdn-.

Funciones que no poseen parmetros.

Para indicar que una funcin que no poseen parmetros se debe utilizar la
palabra clave void como lista de parmetros (no es obligatorio pero s una buena
prctica ya que existen compiladores en los que sino se utiliza void y se realiza una
llamada a funcin con un argumento simplemente lo ignora).

Recursividad.

En C, las funciones pueden llamarse a s mismas. Si una expresin en el cuerpo


de una funcin llama a la propia funcin, se dice que la funcin es recursiva.
Cuando una funcin se llama a s misma, se asigna un espacio en la pila para las
nuevas variables locales y los parmetros, y el cdigo se ejecuta con estas nuevas
variables desde el principio. Una llamada recursiva no hace una nueva copia del cdigo.
Slo son nuevos los argumentos. Al volver de una llamada recursiva , se recuperan de la
pila las variables y parmetros antiguos y la ejecucin continua por la sentencia
siguiente que provoc la recursividad.

Las versiones recursivas de cualquier algoritmo se ejecutan generalmente algo


ms despacio que sus versiones iterativas equivalentes, y adems pueden provocar un
desbordamiento de la pila, ya que cada llamada recursiva hace que se creen nuevas
copias de variables y parmetros que hace que se agote el espacio de memoria reservado
para la pila. La nica ventaja que poseen los algoritmos recursivos es la claridad a la
hora de la codificacin.

Fundamentos de Programacin Tema 2 Pg. - 7/22


Cuando se escriben algoritmos recursivos debe de existir una sentencia if dentro
de la funcin que fuerce la vuelta sin la ejecucin de la llamada recursiva. Si no se hace
as la funcin nunca devolver el control una vez que ha sido llamada.

Argumentos de main()
Turbo C admite argumentos para main() que permiten pasar informacin al
programa C usando argumentos de la lnea de ordenes. Un argumento de la lnea de
ordenes es informacin que sigue al nombre del programa en la lnea de rdenes del
sistema operativo. Cuando se compilan programas con la versin de la lnea de rdenes
de Turbo C, se introduce algo como:
tcc nombre_programa
donde nombre programa es el programa que se quiere compilar. El nombre del
programa se pasa a Turbo C como argumento.

En la versin que utilizamos para simular la versin de lneas de rdenes se


utilizar la opcin Arguments del men Run , introduciendo nicamente la lista de los
argumentos excepto el nombre de programa que va implcito.

main() admite como argumentos argc que contiene el nmero de parmetros de


la lnea de rdenes y es un entero (por lo menos siempre vale 1, ya que el nombre del
programa cuenta como un argumento) y argv es un puntero a un array de punteros a
carcter. Cada elemento del array apunta a un argumento de la lnea de ordenes. Todos
los argumentos son cadenas; cualquier nmero tendr que ser convertido por el
programa al formato correcto.

Cada argumento de la lnea de ordenes ha de estar separado por un espacio o un


tabulador. Los puntos, comas... no se consideran separadores. Si se quiere pasar una
cadena que posee espacios o tabuladores como un solo argumento se encerrar entre
comillas.

Usando los argumentos en main(), su declaracin quedara:

main( int argc, char *argv[])

los corchetes vacos indican un array de longitud indeterminada. Se puede acceder a los
argumentos de forma individual indexando argv. El nombre del programa ser argv[0];
argv[1] ser el primer argumento...

main() permite un tercer argumento env declarado char *env[] que permite al
programa acceder a la informacin de entorno del sistema operativo.

Fundamentos de Programacin Tema 2 Pg. - 8/22


Arrays.

Un array es una coleccin de elementos del mismo tipo que se referencian por
un nombre comn. A un elemento especfico del array se accede mediante un ndice. En
C todos los elementos de un array constan de posiciones de memoria contiguas. La
direccin ms baja corresponde al primer elemento y la ms alta al ltimo. Los arrays
pueden tener una o varios dimensiones.

Arrays unidimensionales.

La forma general de la declaracin de un array es:

tipo nombre_array [tamao]

En C los arrays deben declararse explcitamente para que el compilador pueda


reservar espacio en memoria (en caso contrario habr que realizar una reserva de
memoria dinmica). El tipo base del array viene indicado por tipo y el nmero de
elementos vienen indicado por tamao. Para un array unidimensional el tamao total en
byte se calcula:
bytes totales = sizeof(tipo base) * n de elementos.

Todos los arrays tienen el 0 como ndice de su primer elemento; si se declara un


array de 10 elementos, para acceder a ellos de forma individual habr que tener en
cuenta que el primero es el elemento 0 y el ltimo el elemento 9.
C no comprueba los lmites de los arrays, se pueden sobrepasar cualquier
extremo del array sin que se produzca ningn aviso y se estar escribiendo en cualquier
otra variable existente en memoria.

Si se tiene una declaracin


int mtrz[4];
su representacin en memoria sera la siguiente

mtrz[0] mtrz[1] mtrz[2] mtrz[3]

1000 1002 1004 1006


Direccin de memoria si comienza por la direccin 1000 y la representacin del
tipo int es de 2 bytes.

Paso de arrays unidimensionales a funciones.

Para pasar arrays unidimensionales a funciones, en la llamada a la funcin se


pone el nombre del array sin ndice. Esto hace que se pase la direccin del primer
elemento del array a la funcin. En C no se puede pasar un array completo como
argumento a una funcin; se pasa automticamente un puntero, (llamada por referencia)
lo que permite cambiar los valores de los elementos del array dentro de la funcin.
Si una funcin recibe como parmetro un array unidimensional, este puede ser
declarado como un puntero, como un array delimitado o como un array no delimitado.

Fundamentos de Programacin Tema 2 Pg. - 9/22


void fncn( int * rry)
{

}
o como
void fncn( int rry[5])
{

}
o como
void fncn( int rry[])
{

El resultado de los tres mtodos de declaracin es idntico, la diferencia est en


la reserva de memoria. En el primer caso se usa un puntero y se tendr que establecer
dentro de la funcin o se habr establecido previamente antes de la llamada de la
funcin la dimensin del array y lo mismo ocurre en el ltimo caso donde se especifica
que la funcin va ha recibir un array de cierta longitud; si embargo, en el segundo caso
donde se emplea la declaracin estndar de array si se ha producido reserva de memoria
para un array de enteros de 10 elementos.

Las cadenas es el uso ms comn de los arrays unidimensionales.

Arrays bidimensionales.

Un array bidimensional es un array de arrays unidimensionales. Se declaran


utilizando la siguiente forma general:

tipo nombre_array [n filas] [n columnas]

y para acceder a un elemento concreto del array


nombre_array [fila] [columna]

Los array bidimensional se almacenan en matrices fila-columna, en las que el primer


ndice indica la fila y el segundo la columna. Esto significa que el ndice de ms a la
derecha cambia ms rpido que el de la izquierda. Una representacin en memoria de un
array bidimensional sera

Segundo ndice - columnas


0,0 0,1 0,2 0,3 0,4
1,0 1,1 1,2 1,3 1,4
2,0 2,1 2,2 2,3 2,4

Primer ndice filas

Fundamentos de Programacin Tema 2 Pg. - 10/22


donde se habra declarado el array de la siguiente forma :
int mtrz[3][5]

Cuando se utiliza un array bidimensional como argumento de una funcin,


realmente slo se pasa un puntero al primer elemento. Sin embargo, la funcin que
recibe un array bidimensional necesita saber la longitud de cada fila (nmero de
columnas) para poder indexar el array correctamente y saber donde empieza cada fila.

Arrays de cadenas.

Para crear un array de cadenas se usa un array de caracteres bidimensional. El


tamao del ndice izquierdo ser el nmero de cadenas y el tamao del ndice derecho
ser la longitud de cada una de las cadenas.

char rry_cdn [10][80]

La sentencia anterior declara un array de cadenas, formado por 10 cadenas de 79


carcter de longitud (terminador). Para acceder a una cadena de forma individual slo
hay que especificar el ndice izquierdo.

Arrays multidimensionales.

C permite la declaracin de arrays de ms de dos dimensiones. La forma general


de declararlos es:
tipo nombre_array [tamao N] ....[tamao 2] [tamao 1];

Sin embargo, este tipo de arrays rara vez son usados.

Arrays y punteros.

En C los punteros y los arrays estn muy relacionados, un nombre de un array


sin ndice es un puntero al primer elemento del array. Si se tiene la siguiente
declaracin:
int mtrz[5];

entonces mtrz y &mtrz[0] es lo mismo.


Cualquier variable puntero puede indexarse como si estuviera declarada como un array
del tipo base del puntero, siendo equivalentes las dos ltimas sentencias. En la ltima se
utiliza aritmtica de punteros y en la anterior se utiliza indexacin.
int pntr, mtrz[5];
pntr = mtrz;
pntr[1] = 5;
*(pntr + 1) = 5

Si se posee un array bidimensional para referenciar cualquier elemento del array


se puede utilizar indexacin o aritmtica de punteros siguiendo la siguiente regla:

rry[i][j] = *((*rry) + (i * longitud de fila) + j)

Fundamentos de Programacin Tema 2 Pg. - 11/22


teniendo en cuenta que para acceder a un array de forma secuencial la aritmtica de
punteros es ms rpida y para acceder a un array de forma aleatoria es ms rpida la
indexacin.

Arrays asignados dinmicamente.

A veces, es imposible calcular el tamao de un array, o tal vez se desea ocupar el


mnimo espacio de memoria. En estos casos no es aconsejable usar arrays predefinidos,
ya que en estos casos el tamao del array queda definido en tiempo de compilacin y no
pueden ser cambiadas en tiempo de ejecucin. En estos casos es mejor usar un array
dinmico cuyo tamao se define en tiempo de ejecucin y utiliza la zona de memoria
libre denominada montn y es accedido indexando un puntero a esa zona de memoria.

En C se puede asignar y liberar memoria de forma dinmica usando las rutinas


malloc() y free() respectivamente.

pntr = (tipo_puntero *)malloc(nmero_elementos * sizeof(tipo_puntero));


free(pntr);

no es necesario indicar el tipo_puntero ya que malloc devuelve un puntero a void y la


conversin al tipo del puntero se hara de forma automtica. Tampoco es necesario que
calcule el tamao del tipo del puntero, podra ser indicado de forma numrica pero de
esta manera se garantiza la portabilidad.

Inicializacin de arrays.

C permite la inicializacin de arrays locales y globales en el momento de su


declaracin. La forma de inicializarlos:

tipo nombre_array [filas][columna] = { lista de valores};

donde lista de valores es una lista de constantes separadas por comas cuyo tipo es
compatible con el tipo del array. La primera constante corresponde al primer elemento
del array, la segunda al segundo...

char cdn[tamao] = cadena;

Una sentencia como la anterior permite la inicializacin de cadenas y adems se aade


el teminador nulo al final.

Fundamentos de Programacin Tema 2 Pg. - 12/22


Estructuras, uniones y variables definidas por el usuario.
El lenguaje C proporciona cinco mtodos diferentes para permitir la creacin de
tipos de datos propios, sin embargo slo veremos los siguientes:

Estructura.

En C, una estructura (o registro) es una coleccin de variables que se referencian


bajo un nico nombre, proporcionando un medio para mantener junta informacin que
posee gran relacin entre s. Una declaracin de estructura puede usarse para declarar
variables de este tipo estructura. Las variables que componen una estructura se
denominan elementos de la estructura (campos). La declaracin de estructura tiene la
siguiente forma:

struct etiqueta{
tipo nombre_variable;
tipo nombre_variable;
.
.
};
donde etiqueta es el nombre de la estructura, no un nombre de variable y puede o no
aparecer.

Hasta este momento no se han declarado variables. Slo se han definido la forma que
van a tener los datos. Para declarar una variable de este tipo estructura se puede realizar:
colocando los nombres de las variables en separadas por comas.
utilizando una sentencia del tipo
struct etiqueta nombre_variable, nombre_variable...

Si la definicin de estructura no posee etiquete slo se podrn declarar variables


del primer tipo y si existe etiqueta se podrn declarar variables de las dos formas
anteriores.

Referencia a los elementos de una estructura.

Los elementos individuales de una estructura se referencian utilizando el


operador punto (.). El nombre de la variable seguido de un punto y del nombre del
elemento referencian un elemento individual.
nombre_estructura.nombre_elemento

Los elementos de una estructura pueden ser simples o complejos. Los elementos
complejos de una estructura pueden ser otra estructura o un array unidimensional o
multidimensional. Si el elemento complejo es un array para referenciar el array o un
elemento del array sera igual que se ha visto con los arrays pero precedido por el
nombre de la estructura. Si el elemento complejo es una estructura para referenciar un
elemento se comenzara por la estructura de nivel superior, operador punto, siguiente
estructura en orden de anidamiento operador punto...

Fundamentos de Programacin Tema 2 Pg. - 13/22


Arrays de estructuras.

Para definir un array de estructuras, se debe definir primero la estructura y


despus declarar una variable array del tipo estructura.
Para acceder a una estructura dentro del array se indexa el nombre del array
como si de un tipo bsico se tratara. Y para acceder a un elemento concreto de una
estructura
nombre_array[ndice].elemento_estructura
si el elemento de la estructura es otro array tambin se puede indexar para acceder a un
elemento concreto
nombre_array[ndice].elemento_estructura[ndice_elemento]

Paso de estructuras a funciones.

Paso de elementos de estructuras a funciones.

Cuando se pasa un elemento de una variable estructura a una funcin, se pasa


realmente el valor de ese elemento a la funcin, (paso por valor) a excepcin de las
cadenas y arrays donde se pasa la direccin de su primer elemento.
Sin embargo, si se quiere pasar la direccin de los elementos individuales de la
estructura para conseguir un paso por referencia, se colocar el operador & antes del
nombre de la estructura, salvo en cadenas y arrays donde no es necesario. El operador &
precede al nombre de la estructura no al nombre del elemento individual. Los elementos
que forman un array o una cadena se trataran como elementos simples, si se quiere pasar
su direccin se utilizar el operador &, y si no se utiliza se pasa el valor de este
elemento.

Paso de estructuras completas a funciones.

Cuando se utiliza una estructura como argumento de una funcin, se pasa la


estructura completa mediante el mtodo estndar de llamada por valor(los cambios
realizados dentro de la funcin a la estructura no afecta a la estructura usada para la
llamada a la funcin).
Lo ms importante al usar una estructura como parmetro de una funcin es que
el que su tipo debe ser idntico al parmetro de llamada de la funcin. La mejor forma
de hacerlo es definir una estructura global y despus usarla para los distintos tipos de
declaraciones.

Punteros a estructuras.

Los punteros a estructuras se declaran colocando * delante del nombre de la


variable estructura.
Para encontrar la direccin de una variable estructura, se coloca el operado &
delante del nombre de la estructura.

Fundamentos de Programacin Tema 2 Pg. - 14/22


En el uso de punteros a estructuras es importante que no se puede usar el
operador punto para acceder a un elemento de la estructura a travs del puntero a
estructura. Se debe usar el operador fecha ->.

Fundamentos de Programacin Tema 2 Pg. - 15/22


struct jmpl {

} vrbl;
void fncn(struct jmpl *);
main()
{
.
.
fncn(&vrbl);
}
void fncn(struct jmpl * pntr)
{
pntr->nombre_campo;
.
}

Uniones.

Una unin es una zona de memoria que es compartida por varias variables de
diferentes tipos. La declaracin de unin es similar a la declaracin de estructura

union etiqueta {
tipo nombre_variable;
tipo nombre_variable;
.
.
};
donde todas las variables declaradas comparten la misma posicin de memoria. El
compilador crea una variable suficientemente grande para guardar el tipo ms grande de
la variable union.

Para las uniones es vlido todo lo indicado para las estructuras, declaracin de
variables, acceso a elementos de la unin...
Es tarea del programador controlar que variables de las posibles es almacenada
en el tipo unin en ese momento y a la hora de la recuperacin controlar que variable se
est recuperando. Debe de existir por tanto una variable discriminadora de la variable
existente en cada momento en el tipo unin.

Enumeraciones.

Una enumeracin es un conjunto de constantes enteras con nombre que


especifica todos los valores vlidos que esa variable puede poseer.
Las enumeraciones se definen:

enum etiqueta {lista de enumeraciones} lista de variables;

Fundamentos de Programacin Tema 2 Pg. - 16/22


donde cada uno de los smbolos de la lista de enumeraciones le corresponde un valor
entero y el valor del primer smbolo es el 0, del segundo 1.... Se puede cambiar este
orden utilizando un inicializador siguiendo al smbolo.

En C, los smbolos que componen una inicializacin no pueden leerse y


escribirse directamente.

typedef

typedef permite definir explcitamente un nuevo nombre de tipo de dato para un


tipo ya existente. Su formato es:

typedef tipo nombre;

donde tipo es cualquier posible tipo de datos y nombre es el nuevo nombre que se le ha
asignado. El nuevo nombre se aade a los tipos existentes, no un reemplazamiento.

sizeof()

El operador monario sizeof() calcula el tamao de una variable o tipo y ayuda a


eliminar las dependencias del cdigo de la mquina que se est usando. sizeof() es un
operador de tiempo de compilacin, la informacin necesaria para calcular el tamao de
cualquier variable se conoce en tiempo de compilacin.

Fundamentos de Programacin Tema 2 Pg. - 17/22


Ordenacin.

Fundamentos de Programacin Tema 2 Pg. - 18/22


Ejercicicios.

1. Programa que calcule el rea de un tringulo. Se utilizar una funcin y el valor se


devolver utilizando return().
2. Programa que calcule el rea de un tringulo. Se utilizar una funcin y el valor se
devolver utilizando un parmetro.
3. Programa que calcule el factorial de un nmero dado. Se utilizar una funcin y el
valor se devolver utilizando return().
4. Programa que calcule el factorial de un nmero dado. Se utilizar una funcin y el
valor se devolver utilizando un parmetro.
5. Programa que lee una frase y la escribe al revs. Se utilizar una funcin para
calcular la longitud de la frase.
6. Programa que lee una frase y la escribe al revs. Se utilizar una funcin que recibe
la frase como parmetro y la devuelve invertida.
7. Programa que lee una frase y la escribe al revs. Se utilizar una funcin que recibe
la frase como parmetro y la devuelve invertida. En main() se utilizarn punteros a
cadena y se reservar espacio con malloc.
8. Programa que lee una frase y la escribe al revs. Se utilizar una funcin que recibe
la frase como parmetro y la devuelve invertida. La funcin slo posee un parmetro
(la cadena a invertir) y el valor a devolver ser un puntero a una cadena definida
dentro de la funcin puntero a funcin -.
9. Programa que lee una frase y un nmero de rotaciones y llama a una funcin que
recibe ambos datos por parmetro y devuelve la frase rotada el nmero de veces
indicada.
10. Programa que lee una frase y determina si es o no un palndromo. Se utilizar una
funcin que de la vuelta a la frase y otra para comprobar que son iguales.
11. Programa que lee una frase y determina si es o no un palndromo. La funcin
devolver 1 0 dependiendo si es o no palndromo.
12. Funcin que pase a maysculas una cadena de caracteres. Habr que tener en cuenta
la y las vocales acentuadas. La cadena se devolver por parmetro y como puntero
a funcin.
13. Programa que realice una salida de este tipo:
Hola nombre
donde nombre sea un argumento de main()
14. Programa que cuente hacia atrs a partir de un nmero introducido en la lnea de
rdenes y que produzca un pitido una vez haya llegado a 0.
15. Programa que lea 2 cadenas en la lnea de rdenes y las muestre concatenadas.
16. Programa que lea 10 nmeros mediante la lnea de rdenes y los muestre ordenados.
17. Programa que muestre todas las cadenas de entorno del sistema operativo.
18. Programa que detecte la cadena que define la bsqueda de ficheros ejecutables.
19. Programa que muestre el directorio donde se almacenan los ficheros temporales.
20. Programa que lee 31 temperaturas sobre un array unidimensional de flotantes y
utiliza tres funciones para:
leer desde teclado las temperaturas.
determinar la media del mes.
determinar la temperatura mxima y mnima.

Fundamentos de Programacin Tema 2 Pg. - 19/22


21. Programa que genere e imprima una matriz unitaria de orden 5 (matriz de 5 filas y 5
columnas con todas sus componentes de valor 0 excepto las de la diagonal principal
que valen 1).
22. Programa que genere e imprima una matriz unitaria de orden 5 (matriz de 5 filas y 5
columnas con todas sus componentes de valor 0 excepto las de la diagonal principal
que valen 1). Se utilizaran funciones genricas que puedan inicializar y mostrar
cualquier matriz cuadrada y se tratar la matriz como un puntero.
23. Programa que carga dos matrices 3x3, calcula la matriz suma y la imprime.
24. Programa que lee una matriz genrica y genera otra matriz cuyos elementos son la
potencia N (introducido por teclado) de cada uno de los elementos de la matriz
genrica.
25. Programa que lee una matriz con la temperatura media mensual de cada provincia
andaluza y calcule:
la media anual de cada provincia.
la media mensual de la comunidad.
la media anual de la comunidad.
26. Programa que lea una tabla con un nmero genrico de DNI y utilice un men para
seleccionar las siguientes funciones:
leer desde teclado la tabla.
listar el contenido de la tabla.
introducido un DNI indicar si se encuentra o no en la tabla.
27. Programa que lea una tabla con TOPE elementos con la siguiente estructura:
Cdigo de artculo 5 caracteres
Descripcin 15 caracteres
Precio entero largo
y utilice un men para seleccionar las siguientes opciones:
leer desde teclado la tabla.
listar el contenido de la tabla.
dado un cdigo determinar si se encuentra en la tabla y mostrar su contenido.
28. Programa que lea jugadas de seis nmeros de lotera primitiva y cargue en un vector
el nmero de veces que sale cada nmero. Se leern jugadas mientras el operador
desee. Se utilizaran dos funciones que:
lea de teclado las jugadas.
liste las frecuencias de cada nmero.
29. Programa que lea una tabla con TOPE elementos con la siguiente estructura:
Cdigo de artculo 5 caracteres
Descripcin 15 caracteres
Precio entero largo
Existencias entero largo
Stock entero largo
y utilice un men para seleccionar las siguientes opciones:
leer desde teclado la tabla.
listar el contenido de la tabla.
realizar una bsqueda lineal por cdigo.
realizar una bsqueda dicotmica por cdigo.
ordenar por cdigo utilizando el mtodo de la baraja.

Fundamentos de Programacin Tema 2 Pg. - 20/22


ordenar por precio utilizando el mtodo de seleccin directa.
ordenar por existencias utilizando el mtodo de la burbuja.
ordenar por stock utilizando el mtodo de la burbuja con test.

ARRAYS
30. Programa que lea una sucesin de 10 nmeros enteros, encuentre el valor mximo y
lo imprima junto con l numero de veces que aparece. Se deber utilizar como
mnimo:
Funcin lectura
Funcin mximo.
31. Programa que realice la conversin de nmeros de base decimal a base hexadecimal.
El programa tendr como entrada un numero positivo entre 0 y 32.000 (esta
entrada deber ser verificada)
La salida se efectuar mediante un array de caracteres que contenga la
equivalencia en hexadecimal del numero introducido.
Funciones:
Funcin verificacin.
Funcin clculo-hexadecimal.
32. Realiza un programa que dados dos arrays de caracteres, y utilizando al menos una
funcin devuelva verdadero si son iguales y falso en caso contrario. Se suponen que
dos cadenas son iguales si poseen el mismo numero de elementos y en el mismo
orden relativo, suponiendo que el primer elemento sigue al ltimo.
ACDFE y DFEAC son iguales.
33. Para operar con nmeros naturales de gran tamao, se puede utilizar un array cuyas
componentes sean dgitos decimales (entre 0 y 9). Elaborar un programa que sume
nmeros naturales de 20 cifras por este procedimiento.
34. Realizar un programa que lea una cadena de caracteres y muestre la frecuencia de
cada una de las letras del alfabeto (incluida la ).
35. Realiza un programa que lea un prrafo carcter a carcter y lo muestre
posteriormente. El prrafo acaba cuando encuentra un punto. (El prrafo tendr
como mucho 10 lneas)
36. Realizar un programa que posea como entradas dos cadenas A y B y como resultado
muestre una cadena de caracteres que contenga los caracteres de A que no estn en
B.
37. Realiza un programa que permita implementar el juego del ahorcado.

Fundamentos de Programacin Tema 2 Pg. - 21/22


RECURSIVIDAD
38. Programa que utilizando una funcin recursiva calcule el factorial de un nmero.
39. Programa que utilizando una funcin recursiva calcule la serie n+(n-1)+...+1
40. Programa que utilizando una funcin recursiva calcule 2 elevado a n.
41. Programa que utilizando una funcin recursiva calcule x elevado a y
42. Programa que utilizando una funcin recursiva escriba una frase al reves.

Fundamentos de Programacin Tema 2 Pg. - 22/22

You might also like