Está en la página 1de 24

Gua de Programacin Estructuras

REPUBLICA BOLIVARIANA DE VENEZUELA


MINISTERIO PARA EL P.P DE EDUCACION UNIVERSITARIA
UNIVERSIDAD NACIONAL EXPERIMENTAL
FRANCISCO DE MIRANDA
UNIDAD CURRICULAR SISTEMA DE INFORMACIN
DOCENTE MAURY LUGO

PROGRAMACIN ESTRUCTURADA

Punto Fijo Junio del 2015

Gua de Programacin Estructuras

PROGRAMACION ESTRUCTURADA

DEFINICION
PROGRAMACIN ESTRUCTURADA
La programacin estructurada es un estilo con el cual el se busca que el
programador elabore programas sencillos y fciles de entender. Para ello, la
programacin estructurada hace uso de tres estructuras bsicas de control.
stas son:
Estructura Secuencial
Estructura Selectiva
Estructura Repetitiva ( Iterativa)
La programacin estructurada se basa un teorema fundamental, el cual afirma
que cualquier programa, no importa el tipo de trabajo que ejecute, puede ser
elaborado utilizando nicamente las tres estructuras bsicas (secuencia,
seleccin
,iteracin
).
Estructura Secuencial:
Indica que las instrucciones de un programa se ejecutan una despus de la
otra, en el mismo orden en el cual aparecen en el programa. Se representa
grficamente como una caja despus de otra, ambas con una sola entrada y
una nica salida.
a

Las cajas A y B pueden ser definidas para ejecutar desde una simple
instruccin hasta un mdulo o programa completo, siempre y cuando stos
tambin sean programas apropiados.
Estructura Selectiva
Tambin conocida como la estructura SI-VERDADERO-FALSO, plantea la
seleccin entre dos alternativas con base en el resultado de la evaluacin de
una condicin; equivale a la programacin y se representa grficamente de la
siguiente manera:
En el diagrama de flujo anterior, C es una condicin que se evala; A es la
accin que se ejecuta cuando la evaluacin de esta condicin resulta
verdadera y B es la accin ejecutada cuando el resultado de la evaluacin
indica falso. La estructura tambin tiene una sola entrada y una sola salida; y
las funciones A y B tambin pueden ser cualquier estructura bsica o conjunto
de estructuras.

Gua de Programacin Estructuras

Estructura Repetitiva (Iterativa)


Tambin llamada la estructura HACER-MIENTRAS-QUE, corresponde a la
ejecucin repetida condicin. El diagrama de flujo para esta estructura es el
siguiente:
Aqu el bloque A se ejecuta repetidamente mientras que la condicin C se
cumpla o sea cierta. Tambin tiene una sola entrada y una sola salida;
igualmente A puede ser cualquier estructura bsica o conjunto de estructuras.
Ventajas de la Programacin Estructurada
Con la programacin estructurada, elaborar programas de computadora sigue
siendo una labor que demanda esfuerzo, creatividad, habilidad y cuidado. Sin
embargo, con este nuevo estilo podemos obtener las siguientes ventajas:
1. Los programas son ms fciles de entender. Un programa estructurado
puede ser ledo en secuencia, de arriba hacia abajo, sin necesidad de estar
saltando de un sitio a otro en la lgica, lo cual es tpico de otros estilos de
programacin.
2. Se logra una reduccin del esfuerzo en las pruebas. El seguimiento de las
fallas o depuracin (debugging) se facilita debido a la lgica ms visible, de tal
forma que los errores se pueden detectar y corregir ms fcilmente.
3. Se crean programas ms sencillos y ms rpidos.
PROTOTIPOS
Un prototipo sirve para indicar al compilador los tipos de retorno y los de los
parmetros de una funcin, de modo que compruebe si son del tipo correcto
cada vez que se use esta funcin dentro del programa
TIPOS
DECLARACION
Dentro de las funciones (variables locales).
Fuera de todas las funciones (variables globales).
En la definicin de los parmetros de las funciones.
Una caracterstica de C++, es la necesidad de declarar las variables que se
usarn en un programa. Esto resulta chocante para los que se aproximan al C+
+ desde otros lenguajes de programacin en los que las variables de crean
automticamente la primera vez que se usan. Se trata, es cierto, de una
caracterstica de bajo nivel, ms cercana al ensamblador que a lenguajes de
alto nivel, pero en realidad una caracterstica muy importante y til de C++, ya
que ayuda a conseguir cdigos ms compactos y eficaces, y contribuye a
facilitar la depuracin y la deteccin y correccin de errores y a mantener un
estilo de programacin elegante.
Uno de los errores ms comunes en lenguajes en los que las variables se
crean de forma automtica se produce al cometer errores ortogrficos. Por

Gua de Programacin Estructuras

ejemplo, en un programa usamos una variable llamada prueba, y en un punto


determinado le asignamos un nuevo valor, pero nos equivocamos y escribimos
prubea. El compilador o interprete no detecta el error, simplemente crea una
nueva variable, y contina como si todo estuviese bien.
En C++ esto no puede pasar, ya que antes de usar cualquier variable es
necesario declararla, y si por error usamos una variable que no ha sido
declarada, se producir un error de compilacin.
Cmo se declaran las variables
^
Ya hemos visto la mecnica de la declaracin de variables, al mostrar la
sintaxis de cada tipo en el captulo 2.
El sistema es siempre el mismo, primero se especifica el tipo y a continuacin
una lista de variables y finalmente un punto y coma.
La declaracin de variables es uno de los tipos de sentencia de C++. La prueba
ms clara de esto es que la declaracin terminar con un ";". Sintaxis:
<tipo> <lista de variables>;
Tambin es posible inicializar las variables dentro de la misma declaracin. Por
ejemplo:
int a = 1234;
bool seguir = true, encontrado;
Declarara las variables a, seguir y encontrado; y adems iniciara los valores
de a y seguir con los valores 1234 y true, respectivamente.
En C++, contrariamente a lo que sucede con otros lenguajes de programacin,
las variables no inicializadas tienen un valor indeterminado (con algunas
excepciones que veremos ms tarde), y contienen lo que normalmente se
denomina "basura". Cuando se declara una variable se reserva un espacio de
memoria para almacenarla, pero no se hace nada con el contenido de esa
memoria, se deja el valor que tuviera previamente, y ese valor puede
interpretarse de distinto modo, dependiendo del tipo.
mbitos
^
Llamamos mbito a la zona desde que cierto objeto es accesible.
En C++ solemos referirnos a dos tipos de mbitos: temporal y de acceso. As,
el mbito temporal indica el intervalo de tiempo en el que un objeto existe o es
accesible. El mbito de acceso nos dice desde donde es accesible.
En este captulo hablaremos un poco sobre el mbito de las variables, pero no
entraremos en muchos detalles todava, ya que es un tema largo.
Por otra parte, las funciones (y otros objetos de los que an no hemos hablado
nada), tambin tienen distintos mbitos.
SUBRUTINAS
Funciones y subrutinas
Introduccin
En lecciones anteriores se ha descrito el concepto de diseo descendente; esta
tcnica permite desarrollar

Gua de Programacin Estructuras

algoritmos que resuelvan un problema mediante un proceso de refinamiento


progresivo, descomponiendo el problema
original en subproblemas menores hasta
suficientemente fina que permita resolver cada

obtener

una

granularidad

subproblema mediante un algoritmo sencillo.


Generalmente, por cada nivel del diseo descendente se desarrollo un
pseudocdigo de alto nivel que hace
uso de acciones no primitivas; si se detecta que alguna de estas acciones no
primitivas aparece ms de una vez es
posible nombrarla y utilizarla de forma repetida. Tales acciones con nombre se
denominan subprogramas y pueden ser,
a su vez, funciones y subrutinas.
La utilizacin de subprogramas proporciona mltiples ventajas:
Facilitan la modularidad y estructuracin de los algoritmos.
Facilitan la lectura e inteligibilidad de los algoritmos.
Permiten una economizacin del esfuerzo del programador al poder escribir
cdigo reutilizable en muchas
partes de un mismo algoritmo.
Facilitan la depuracin y mantenimiento de los programas.
Funciones
Las funciones son subrutinas que pueden tener o no argumentos pero que
siempre devuelven un valor de
retorno. As pues, las invocaciones a funciones son expresiones de un tipo
determinado y deben emplearse igual que
cualquier expresin de su tipos; es decir, una llamada a funcin puede formar
parte de una expresin aritmtica, lgica o
de cadena en funcin de su tipo, puede constituir la parte derecha de una
sentencia de asignacin, aparecer en una
sentencia de salida o constituir un argumento para otro subprograma. Por otro
lado, las llamadas a funciones nunca
pueden formar una sentencia aislada ni constituir la parte izquierda de una
sentencia de asignacin.

Gua de Programacin Estructuras

Las invocaciones a funciones siguen, tanto en la notacin algortmica como en


FORTRAN, la siguiente sintaxis:
nombre_funcin ([argumento][,argumento]*)
Como se puede ver, es posible tener funciones con 0 o ms argumentos, las
funciones que se utilizarn en
nuestros algoritmos pueden estar definidas por el propio usuario o, en muchas
ocasiones, ser funciones estndar, esto
es, definidas por el propio compilador.
Funciones intrnsecas o estndar
FORTRAN proporciona un gran nmero de funciones intrnsecas, algunas de
ellas se corresponden con
funciones de nuestra notacin algortmica mientras que otras equivalen a
operadores de dicha notacin; a continuacin
se muestra una tabla con las funciones FORTRAN ms empleadas y su
homloga en la notacin algortmica.
FORTRAN Notacin algortmica
Operacin Funcin Tipo Tipo
argumentos Sintaxis Homlogo Tipo Tipo
argumentos Sintaxis
Raz cuadrada SQRT real real SQRT(arg1) real entero
real arg1
e
n
EXP real real EXP(arg1) e
n
real entero
real e
arg1
Logaritmo

Gua de Programacin Estructuras

neperiano LOG real real LOG(arg1) ln real entero


real ln(arg1)
Logaritmo
decimal LOG10 real real LOG1O(arg1) log real entero
real log(arg1)
Seno SIN real real SIN(arg1) sin real entero
real
sin(arg1)
Coseno COS real real COS(arg1) sin real entero
real cos(arg1)
Tangente TAN real real TAN(arg1) sin real entero
real tan(arg1)
Arco seno ASIN real real ASIN(arg1) asin real entero
real asin(arg1)
Arco coseno ACOS real real ACOS(arg1) acos real entero
real acos(arg1)
Arco tangente ATAN real real ATAN(arg1) atan real entero
real atan(arg1)
Valor absoluto ABS entero
real
entero
real
ABS(arg1) || entero
real
entero
real
|arg1|

Gua de Programacin Estructuras

Mdulo/resto MOD entero entero MOD(arg1,arg2)


arg1%arg2Leccin 5 Funciones y subrutinas

entero

entero

2
Funciones definidas por el usuario
Obviamente, resultan mucho ms interesantes para nosotros las funciones
definidas por el usuario, aquellas
cuya naturaleza es especificada por el desarrollador del algoritmo. La
invocacin o llamada de estas funciones se
realiza de forma idntica a la de las funciones intrnsecas, sin embargo, en este
caso existe adems una sintaxis
especfica para poder definir el funcionamiento de la funcin.
Para definir una funcin se dispone de la palabra reservada funcion en la
notacin algortmica y function
en FORTRAN. Es preciso sealar adems que dado que las funciones van a
ser empleadas dentro del algoritmo
principal debern ser definidas dentro del mismo; a continuacin se muestra la
zona de definicin de funciones para un
algoritmo escrito en nuestra notacin y en FORTRAN: constantes
definicin de constante1
definicin de constante2
...
definicin de constanteN
variables
declaracin de variable1
declaracin de variable2
...
declaracin de variableN
inicio
sentencia1
sentencia2

Gua de Programacin Estructuras

...
sentenciaN
DEFINICIONES DE FUNCIONES
fin
program nombre_programa
variables y constantes
sentencia1
sentencia2
...
sentenciaN
contains
DEFINICIONES DE FUNCIONES
end
Para definir una funcin es preciso, tanto en la notacin algortmica como en
FORTRAN, indicar:
El nombre de la funcin.
El tipo de la funcin.
Los argumentos de la funcin y el tipo de los mismos.
Como se ver a continuacin, las diferencias entre la notacin y FORTRAN son
fundamentalmente idnticas.
Definicin de funciones en la notacin algortmica
La sintaxis empleada para definir una funcin en la notacin algortmica es la
siguiente:
tipo funcion nombre_funcion (arg1 tipo1, arg2 tipo2, ..., argN tipoN)
inicio
sentencia1
sentencia2
...

Gua de Programacin Estructuras

sentenciaN
fin
A continuacin se muestran una serie de ejemplos:
Funcin sin argumentos que siempre retorna el valor lgico verdadero:
logico funcion siempreVerdad ()
inicio
siempreVerdad verdadero
fin
Funcin que recibe dos enteros y retorna el mayor de los dos:
entero funcion maximo (a entero, b entero)
inicio
si a>b entonces
maximo a
si no
maximo b
fin si
finLeccin 5 Funciones y subrutinas
3
As, un ejemplo de algoritmo completo que utilice las funciones anteriores sera
el que se muestra a
continuacin.
inicio
escribir siempreVerdad()
escribir maximo(4,5)
logico funcion siempreVerdad ()
inicio
siempreVerdad verdadero

Gua de Programacin Estructuras

fin
entero funcion maximo (a entero, b entero)
inicio
si a>b entonces
maximo a
si no
maximo b
fin si
fin
fin
Definicin de funciones en FORTRAN
Para definir funciones en FORTRAN la sintaxis es la siguiente:
tipo function nombre_funcion (arg1, arg2, ..., argN)
declaracin arg1
declaracin arg2
...
declaracin argN
sentencia1
sentencia2
...
sentenciaN
end
A continuacin se muestran los ejemplos anteriores codificados en FORTRAN:
Funcin sin argumentos que siempre retorna el valor lgico verdadero:
logical function siempreVerdad ()
siempreVerdad=.true.
end function

Gua de Programacin Estructuras

Funcin que recibe dos enteros y retorna el mayor de los dos:


integer function maximo (a, b)
integer a,b
if (a>b) then
maximo=a
else
maximo=b
end if
end function
El algoritmo del apartado anterior traducido a FORTRAN quedara como sigue:
program nombre_programa
print *, siempreVerdad()
print *, maximo(4,5)
contains
logical function siempreVerdad ()
siempreVerdad=.true.
end function
integer function maximo (a, b)
integer a,b
if (a>b) then
maximo=a
else
maximo=b
end if
end function
endL

Gua de Programacin Estructuras

REGLAS DE ALCANCE
El alcance de un identificador es la porcin del cdigo en el cual dicho
identificador puede ser visto y, por lo tanto, referenciado. Un identificador
puede ser una variable, una etiqueta, un prototipo, una definicin de funcin,
etc.
En otras palabras, las reglas de alcance definen hasta dnde un identificador
puede
ser
usado.
Existen cuatro alcances posibles para un identificador: alcance de funcin,
alcance de archivo, alcance de bloque y alcance del prototipo de funcin.
*El nico identificador que tiene alcance de funcin, o sea, slo es visible y
referenciable
dentro
de
una
funcin,
son
las
etiquetas.
*En tanto, aquellos identificadores declarados fuera de cualquier funcin tienen
alcance de archivo, o sea, esos identificadores son conocidos desde la lnea
que son declarados hasta el fin del cdigo. Por ejemplo, las variables globales,
las definiciones de funciones y los prototipos de funciones que son colocados
fuera de una funcin, pueden ser referenciados desde el punto donde son
definidos
en
adelante.
*Los identificadores que son declarados dentro de un bloque (como puede
serlo una funcin), slo tienen alcance de bloque, por lo tanto slo son visibles
dentro de ese bloque y sus bloques anidados (si es que los hay). Por ejemplo,
las variables locales declaradas dentro de una funcin slo son visibles dentro
de esa funcin. Lo mismo para los parmetros de dicha funcin, que son
tratados
como
variables
locales.
Si en un bloque se define una variable con el mismo nombre de una variable
declarada en un bloque que lo anida (llamada variable externa), la variable
externa permanece oculta y no altera la variable local.
Los nicos identificadores con alcance de prototipo de funcin son aquellos que
se utilizan en la lista de parmetros del prototipo de una funcin.
PASO DE ARGUMENTOS A UNA FUNCION
Existen cinco formas de pasar un argumento a una funcin (subrutina) o
procedimiento: por valor, por referencia, por resultado, por valor-resultado y por
nombre.
Paso por valor

Gua de Programacin Estructuras

El paso de parmetros por valor consiste en copiar el contenido de la variable


que queremos pasar en otra dentro del mbito local de la subrutina, consiste
pues en copiar el contenido de la memoria del argumento que se quiere pasar
a otra direccin de memoria, correspondiente al argumento dentro del mbito
de dicha subrutina. Se tendrn dos valores duplicados e independientes, con lo
que la modificacin de uno no afecta al otro.
Paso por referencia
El paso de parmetros por referencia consiste en proporcionar a la subrutina a
la que se le quiere pasar el argumento la direccin de memoria del dato. En
este caso se tiene un nico valor referenciado (o apuntado) desde dos puntos
diferentes, el programa principal y la subrutina a la que se le pasa el
argumento, por lo que cualquier accin sobre el parmetro se realiza sobre la
misma posicin de memoria.
Paso por valor resultado
Es un tipo poco usado en los lenguajes de programacin actuales. Se basa en
que dentro de la funcin se trabaja como si los argumentos hubieran sido
pasados por valor pero al acabar la funcin los valores que tengan los
argumentos sern copiados a las variables que pertenecan.
Este tipo puede ser simulado en cualquier lenguaje que permita el paso de
valores por referencia de la siguiente forma:
void EjemploValorRes(int a1, int a2, int a3) {
int aux1 = a1, aux2 = a2, aux3 = a3;
// cdigo trabajando con aux1, aux2 y aux3
a1 = aux1; a2 = aux2; a3 = aux3; // Dependiendo del compilador la copia se
realiza en un sentido o en el otro
}
RECURSIVIDAD
La recursividad es una tcnica de programacin que se utiliza para realizar una
llamada a una
funcin desde ella misma, de all su nombre. El ejemplo ms utilizado por su
fcil comprensin es
el clculo de nmeros factoriales. El factorial de 0 es, por definicin, 1. Los
factoriales de nmeros
mayores se calculan mediante la multiplicacin de 1 * 2 * ..., incrementando el
nmero de 1 en 1
hasta llegar al nmero para el que se est calculando el factorial.
Un algoritmo recursivo es un algoritmo que expresa la solucin de un problema
en trminos de

Gua de Programacin Estructuras

una llamada a s mismo. La llamada a s mismo se conoce como llamada


recursiva o recurrente.
#include <iostream>
#include <cstdlib>
using namespace std;
int Factorial(int n);
int main(){
int valor;
system("clear");
cout << "Introduzca numero a calcular: ";
cin >> valor;
cout << "\nEl Factorial de " << valor << " es: " << Factorial(valor) << endl;
return 0;
}
int Factorial(int n){
if (n < 0){
cout << No existe el factorial de un numero negativo.\n;
}else if(n < 2){
return 1;
}else
return n * Factorial(n-1);
}
Generalmente, si la primera llamada al subprograma se plantea sobre un
problema de tamao u
orden N, cada nueva ejecucin recurrente del mismo se plantear sobre
problemas, de igual
naturaleza que el original, pero de un tamao menor que N. De esta forma, al ir
reduciendo
progresivamente la complejidad del problema a resolver, llegar un momento
en que su resolucin
sea ms o menos trivial (o, al menos, suficientemente manejable como para
resolverlo de forma no
recursiva). En esa situacin diremos que estamos ante un caso base de la
recursividad.
Es frecuente que los algoritmos recurrentes sean ms ineficientes en tiempo
que los iterativos
aunque suelen ser mucho ms breves en espacio.
Recursividad directa vs indirecta.
Cuando en una subrutina hay llamadas a ella misma se habla de recur
APUNTADORES
Los apuntadores son una parte fundamental de C. Si usted no puede usar los
apuntadores apropiadamente entonces esta perdiendo la potencia y la
flexibilidad que C ofrece bsicamente. El secreto para C esta en el uso de
apuntadores.
C usa los apuntadores en forma extensiva. Porqu?
Es la nica forma de expresar algunos clculos.

Gua de Programacin Estructuras

Se genera cdigo compacto y eficiente.


Es una herramienta muy poderosa.
C usa apuntadores explcitamente con:
Es la nica forma de expresar algunos clculos.
Se genera cdigo compacto y eficiente.
Es una herramienta muy poderosa.
C usa apuntadores explcitamente con:

Definicin de un apuntador
Un apuntador es una variable que contiene la direccin en memoria de otra
variable. Se pueden tener apuntadores a cualquier tipo de variable.
El operador unario o mondico & devuelve la direccin de memoria de una
variable.
El operador de indireccin o dereferencia * devuelve el ``contenido de un objeto
apuntado por un apuntador''.
Para declarar un apuntador para una variable entera hacer:
int *apuntador;
Se debe asociar a cada apuntador un tipo particular. Por ejemplo, no se puede
asignar la direccin de un short int a un long int.
Para tener una mejor idea, considerar el siguiente cdigo:
main()
{
int x = 1, y = 2;
int *ap;
ap = &x;
y = *ap;
x = ap;
*ap = 3;
}

Gua de Programacin Estructuras

Cuando se compile el cdigo se mostrar el siguiente mensaje:


warning: assignment makes integer from pointer without a cast.

Con el objetivo de entender el comportamiento del cdigo supongamos que la


variable x esta en la localidad de la memoria 100, y en 200 y ap en 1000. Nota:
un apuntador es una variable, por lo tanto, sus valores necesitan ser guardados
en algn lado.

int x = 1, y = 2;
int *ap;
ap = &x;
100

200

1000

ap

100

Las variables x e y son declaradas e inicializadas con 1 y 2 respectivamente,


ap es declarado como un apuntador a entero y se le asigna la direccin de x
(&x). Por lo que ap se carga con el valor 100.

y = *ap;
100

200

1000

ap

100

Despus y obtiene el contenido de ap. En el ejemplo ap apunta a la localidad


de memoria 100 -- la localidad de x. Por lo tanto, y obtiene el valor de x -- el
cual es 1.

x = ap;
100

200

1000

100

ap

100

Como se ha visto C no es muy estricto en la asignacin de valores de diferente


tipo (apuntador a entero). As que es perfectamente legal (aunque el
compilador genera un aviso de cuidado) asigna el valor actual de ap a la
variable x. El valor de ap en ese momento es 100.

Gua de Programacin Estructuras

*ap = 3;
100

200

1000

ap

100

Finalmente se asigna un valor al contenido de un apuntador (*ap).

Importante: Cuando un apuntador es declarado apunta a algn lado. Se debe


inicializar el apuntador antes de usarlo. Por lo que:

main()
{
int *ap;
*ap = 100;
}
puede generar un error en tiempo de ejecucin o presentar un comportamiento
errtico.
El uso correcto ser:
main()
{
int *ap;
int x;

ap = &x;
*ap = 100;
}
Con los apuntadores se puede realizar tambin aritmtica entera, por ejemplo:

Gua de Programacin Estructuras

main()
{
float *flp, *flq;
*flp = *flp + 10;
++*flp;
(*flp)++;
flq = flp;
}
NOTA: Un apuntador a cualquier tipo de variables es una direccin en memoria
-- la cual es una direccin entera, pero un apuntador NO es un entero.

La razn por la cual se asocia un apuntador a un tipo de dato, es por que se


debe conocer en cuantos bytes esta guardado el dato. De tal forma, que
cuando se incrementa un apuntador, se incrementa el apuntador por un
``bloque'' de memoria, en donde el bloque esta en funcin del tamao del dato.

Por lo tanto para un apuntador a un char, se agrega un byte a la direccin y


para un apuntador a entero o a flotante se agregan 4 bytes. De esta forma si a
un apuntador a flotante se le suman 2, el apuntador entonces se mueve dos
posiciones float que equivalen a 8 bytes.

Apuntadores y Funciones
Cuando C pasa argumentos a funciones, los pasa por valor, es decir, si el
parmetro es modificado dentro de la funcin, una vez que termina la funcin el
valor pasado de la variable permanece inalterado.
Hay muchos casos que se quiere alterar el argumento pasado a la funcin y
recibir el nuevo valor una vez que la funcin ha terminado. Para hacer lo
anterior se debe usar una llamada por referencia, en C se puede simular

Gua de Programacin Estructuras

pasando un puntero al argumento. Con esto se provoca que la computadora


pase la direccin del argumento a la funcin.

Para entender mejor lo anterior consideremos la funcin swap() que


intercambia el valor de dos argumentos enteros:

void swap(int *px, int *py);


main()
{
int x, y;
x = 10;
y = 20;
printf("x=%d\ty=%d\n",x,y);
swap(&x, &y);
printf("x=%d\ty=%d\n",x,y);
}

void swap(int *px, int *py)


{
int temp;
temp = *px; /* guarda el valor de la direccion x */
*px = *py;

/* pone y en x */

*py = temp; /* pone x en y */


}
Apuntadores y arreglos
Existe una relacin estrecha entre los punteros y los arreglos. En C, un nombre
de un arreglo es un ndice a la direccin de comienzo del arreglo. En esencia,
el nombre de un arreglo es un puntero al arreglo. Considerar lo siguiente:
int a[10], x;

Gua de Programacin Estructuras

int *ap;

ap = &a[0];
x = *ap;

/* ap apunta a la direccion de a[0] */


/* A x se le asigna el contenido de ap (a[0] en este caso) */

*(ap + 1) = 100; /* Se asigna al segundo elemento de 'a' el valor 100 usando


ap*/
Como se puede observar en el ejemplo la sentencia a[t] es idntica a ap+t. Se
debe tener cuidado ya que C no hace una revisin de los lmites del arreglo,
por lo que se puede ir fcilmente ms alla del arreglo en memoria y
sobreescribir otras cosas.
C sin embargo es mucho ms stil en su relacin entre arreglos y apuntadores.
Por ejemplo se puede teclear solamente:
ap = a; en vez de ap = &a[0]; y tambin *(a + i) en vez de a[i], esto es, &a[i] es
equivalente con a+i.
Y como se ve en el ejemplo, el direccionamiento de apuntadores se puede
expresar como:
a[i] que es equivalente a *(ap + i)
Sin embargo los apuntadores y los arreglos son diferentes:
Un apuntador es una variable. Se puede hacer ap = a y ap++.
Un arreglo NO ES una variable. Hacer a = ap y a++ ES ILEGAL.
Este parte es muy importante, asegrese haberla entendido.
Con lo comentado se puede entender como los arreglos son pasados a las
funciones. Cuando un arreglo es pasado a una funcin lo que en realidad se le
esta pasando es la localidad de su elemento inicial en memoria.
Por lo tanto:
strlen(s) es equivalente a strlen(&s[0])
Esta es la razn por la cual se declara la funcin como:
int strlen(char s[]); y una declaracin equivalente es int strlen(char *s);
ya que char s[] es igual que char *s.

Gua de Programacin Estructuras

La funcin strlen() es una funcin de la biblioteca estndar que regresa la


longitud de una cadena. Se muestra enseguida la versin de esta funcin que
podra escribirse:

int strlen(char *s)


{
char *p = s;
while ( *p != '\0' )
p++;
return p - s;
}
Se muestra enseguida una funcin para copiar una cadena en otra. Al igual que
en el ejercicio anterior existe en la biblioteca estndar una funcin que hace lo
mismo.

void strcpy(char *s, char *t)


{
while ( (*s++ = *t++) != '\0' );
}
En los dos ltimos ejemplos se emplean apuntadores y asignacin por valor.
Nota: Se emplea el uso del caracter nulo con la sentencia while para encontrar
el fin de la cadena.
ASIGNACION DINAMICA DE MEMORIA VENTAJAS Y DESVENTAJAS
Hasta ahora, en nuestros programas, tenemos tanta memoria como pedimos
en las declaraciones de variables, arreglos y otros objetos que incluimos,
teniendo el tamao de todos ellos fijo antes de la ejecucin del programa. Pero,
que tal si necesitamos una cantidad variable de memoria que slo puede ser
determinada durante la ejecucin del programa (runtime), por ejemplo, en caso
de que necesitemos una entrada del usuario para determinar la cantidad de
espacio necesaria?

Gua de Programacin Estructuras

La respuesta es memoria dinmica, para la cual C++ integra los operadores


new y delete.
Operadores new y delete son exclusivos de C++. Ms adelante en esta seccin
se muestran los equivalentes en C para estos operadores.
Operadores new y new
Para solicitar memoria dinmica, existe el operador new. new es seguido por un
tipo de dato y opcionalmente el nmero de elementos requeridos entre
corchetes []. Retorna un apuntador al comienzo del nuevo bloque de memoria
asignada. Su forma es:
pointer = new type
o
pointer = new type [elementos]
La primera expresin es usada para asignar memoria para contener un solo
elemento detipo type. La segunda se usa para asignar un bloque (un arreglo)
de elementos de tipo type.
Por ejemplo:
int * bobby;
bobby = new int [5];
En este caso, el sistema operativo ha asignado espacio para 5 elementos de
tipo int en un heap y ha retornado un apuntador a su comienzo que ha sido
asignado a bobby. Por lo tanto, ahora, bobby apunta a un bloque de memoria
vlido con espacio para 5 elementos int.

Podra preguntarse cual es la diferencia entre declarar un arreglo normal y


asignar memoria a un apuntador como hemos hecho. La ms importante es
que el tamao de un arreglo debe ser un valor constante, el cual limita su
tamao a lo que decidamos al momento de designar el programa antes de su
ejecucin, mientras que la asignacin dinmica de memoria permite asignar
memoria durante la ejecucin del programa usando cualquier variable,
constante o combinacin de ambas como tamao.
La memoria dinmica es generalmente administrada por el sistema operativo, y
en interfaces multitarea puede ser compartida entre varias aplicaciones, por lo
que existe la posibilidad de que la memoria se acabe. Si esto ocurre y el
sistema operativo no puede asignar la memoria que solicitamos con el
operador new, se retorna un apuntador nulo. Por esta razn se recomienda

Gua de Programacin Estructuras

siempre chequear si el apuntador retornado es nulo, luego de una llamada a


new.

int * bobby;
bobby = new int [5];
if (bobby == NULL) {
// error asignando memoria. Tome medidas.
};
Operador delete
Ya que la necesidad de memoria dinmica est limitada a momentos concretos
dentro de un programa, una vez que no se necesita ms debera ser liberada
para que se convierta en disponible para futuras solicitudes de memoria
dinmica. Para este propsito existe el operador delete, cuya forma es:
delete pointer;
o
delete [] pointer