You are on page 1of 59

Sesin 9

Procedimientos y Funciones
Ms. Ing. CARLOS AURELIO ROMERO SHOLLANDE caromerosh@yahoo.es
UNIVERSIDAD NACIONAL DE TRUJILLO Trujillo - Per

Introduccin
Una estrategia para la solucin de problemas complejos reales con computadoras consiste en dividirlos en problemas ms pequeos, llamados subproblemas. Un subproblema puede ser, a su vez, dividido repetidamente en problemas ms pequeos, hasta que los problemas ms pequeos sean consistentes. Cada subproblema debe ser independiente de los restantes y se le denomina mdulo. La tcnica de dividir un problema en subproblemas se denomina refinamiento sucesivo, diseo descendente o diseo modular, debido a que se comienza en la parte superior de un problema principal y luego se disean soluciones especificas para sus subproblemas.

Programa Principal
El problema principal se soluciona con un programa denominado programa principal (main), tambin llamado conductor del programa. Este programa describe la solucin completa del problema y consta de llamadas a subprogramas. Las llamadas son indicaciones al procesador de que debe continuar la ejecucin en el subprograma llamado, regresando al punto de partida una vez haya concluido. El programa principal puede contener, adems, sentencias bsicas, selectivas y repetitivas, que son ejecutadas de modo inmediato por el procesador. El programa principal contendr pocas lneas, y en el se vern claramente los diferentes pasos del proceso que se han de seguir para la obtencin del resultado deseado.

Subprogramas
Los subproblemas (mdulos) se solucionan mediante declaraciones de subprogramas, ubicados en lugares distintos al del programa principal. Su estructura coincide bsicamente con la de un programa; en consecuencia, un subprograma puede tener sus propios subprogramas. El objetivo de un subprograma consiste en resolver de modo independiente una parte del problema. A veces los subprogramas se repiten varias veces en diferentes lugares del programa; en este caso el conjunto de sentencias a repetir aparecern una sola vez. Un subprograma es ejecutado slo cuando es llamado por el programa principal o por otro subprograma.

Subprogramas
Los subprogramas permiten romper un programa en unidades lgicas discretas, de forma que cada una de ellas puede ser escrita y corregida de un modo ms fcil que un programa completo (sin subprogramas), e incluso por programadores diferentes. Los subprogramas utilizados por un programa pueden ser utilizados por otros programas y se pueden crear libreras de funciones y procedimientos. Los subprogramas acortan los programas (si es que el subprograma se utiliza ms de una vez), ya que slo ser preciso escribir una sola vez las correspondientes instrucciones, y cada vez que se desea realizar una tarea, el subprograma se encargar de esa operacin

Diseo Descendente
Diseo descendente del problema programacin del programa principal
Problema Principal

principal

Programa Principal

Sub Problema 1

Sub Problema 2

Sub Problema 3

Sub Programa 3 (Mdulo 3)

Sub Programa 2 (Mdulo 2)

Sub Programa 1 (Mdulo 1)

Variables Locales
En el concepto ms amplio, las variables locales son las que se declaran dentro de un bloque de cdigo, y como un subprograma es un bloque discreto de cdigo, se puede concluir que las variables que son locales a un subprograma son simplemente un caso especial del concepto general. Las variables locales existen slo durante la ejecucin del bloque de cdigo en el que se declaran; es decir, una variable local se crea al entrar en su bloque y se destruye despus de salir. As las variables locales no son conocidas fuera de su propio bloque de cdigo y no pueden retener sus valores entre llamadas.

Variables Locales
Ejemplo: void alfa() { int j; // j es variable local de alfa() j = 77; } void beta() { int j; // j es variable local de beta() j = -66; } La j se declara dos veces, una en alfa() y otra en beta(). La j en alfa() no tiene relacin con la j de beta(), ya que cada j es conocida slo por el cdigo que esta en el bloque que la declar. La ventaja de declarar un variable local en un bloque es que se asignar memoria a la variable slo si es necesario

Variables Globales
Las variables globales son las variables que se conocen a travs de todo el programa y se pueden usar en cualquier bloque de cdigo. Se pueden crear variables globales declarndolas fuera de cualquier subprograma. Un subprograma puede acceder a ellas sin tener en cuenta en que lugar este dicha expresin. Ejemplo:

Variables Globales
#include <iostream.h> int i; // Variable global a todo el programa void beta() { int i; // Variable local a beta() for(i=1; i<10; i++) cout<< . ; } void alfa() { beta(); // Llamada a beta() cout<<El contador es: <<i; } main() { i = 230; alfa(); }

Variables Globales
Aunque ni main(), ni alfa() tienen declarada la variable i, ambas se usan. Sin embargo, beta() ha declarado una variable local llamada i. Cuando se referencia i, beta() referencia slo a su variable local, no a la global. En conclusin, si una variable local y una global tienen el mismo nombre, todas las referencias a ese nombre de variable, dentro del subprograma en el que se declara como local, se referir a la local y no afectara a la variable global.

Variables Globales
Debe evitarse el uso de variables globales, por tres razones: Ocupan memoria durante toda la ejecucin del programa y no slo cuando se necesitan. El uso de una variable global en lugar de una local, restringir la generalidad de un subprograma ya que depende de una variable que debe definirse fuera de s misma. El uso de una serie grande de variables globales puede conducir a errores con efectos laterales desconocido e indeseables.

Parmetros Actuales o Reales


Los parmetros actuales son las variables de enlace definidas en el programa principal y que se usan como argumentos dentro de los parntesis que posee una llamada a un subprograma. Ejemplo:

main() { char v[20], w[20]; cout<<Nombre:; cin>>v cout<<Apellido:; cin>>w; centro(v, w); //v y w son parmetros actuales }

Parmetros Formales o Ficticios


Los parmetros formales son las variables de enlace definidas en la entrada de un subprograma, que aceptan los valores de los parmetros actuales que se usan en la llamada al subprograma y se comportan como otras variables locales. Ejemplo: void centro(char *p, char *q) { // p y q son P. Formales int r, t, x, y; r = strlen(p); x = (79 - r) / 2; t = strlen(q); y = (79 - t) / 2; gotoxy(x, 11); cout<<p: gotoxy(y, 13); cout<<q; }

Parmetros Formales o Ficticios


El subprograma centro tiene dos parmetros formales tipo cadena de caracteres (p y q), en la llamada se puede ver que tambin existen dos parmetros actuales tipo cadena de caracteres (v y w). Finalmente se observa que v corresponde a p y w corresponde a q. En conclusin, los parmetros formales, deben ser semejantes en nmero, orden y tipo con los parmetros actuales.

Mtodos para Disear Pogramas


Existen dos mtodos para disear subprogramas: procedimientos y funciones. La diferencia esencial entre un procedimiento y una funcin es que la funcin obtiene un valor que puede ser utilizado en una expresin, mientras que un procedimiento no tiene ningn valor asociado a su nombre. Una funcin puede emplearse en lugar de una variable y el usuario la puede utilizar para crear operaciones nuevas que no estn incluidas en las libreras estndar del C++. Un procedimiento normalmente se utiliza para estructurar un programa y para mejorar la claridad y generalidad.

Procedimientos
Un procedimiento es un subprograma que realiza una tarea especfica. Esta compuesto por un grupo de sentencias a las que se les asigna un nombre (identificador), y que van a ser ejecutadas como un programa cada vez que se invoca dicho nombre.

Llamada a un Procedimiento
Sintaxis : nombre_procedimiento (parmet_actuales); Propsito : Llamar desde el programa principal o desde otro procedimiento a un procedimiento requerido por su nombre. Ejemplo : leer(m, precios);

En las llamadas a procedimientos se aplica el mtodo denominado: llamada por referencia, que consiste en copiar la direccin de cada parmetro actual en un parmetro formal.

Declaracin de un Procedimiento
Sintaxis : void nombre_procedim (parm_formals) { Variables locales Lneas de cdigo de cuerpo de procedimiento } Propsito : Declarar un procedimiento indicando nombre y especificando que es un subprograma sin valores de retorno (void). As mismo, declarar la lista de parmetros formales involucrados en el procedimiento. Es decir, especificar los nombres de tipos y nombres de variables, separados por comas. Estos parmetros son los que reciben valores de los parmetros actuales en la llamada

Declaracin de un Procedimiento
Ejemplo : void reportar (int n, float lista[20]) { int i; // Definicin de variables locales for(i=1;i<=n;i++) cout<<lista[i]; // Cuerpo del procedimiento }
Los procedimientos terminan y vuelven automticamente a la siguiente lnea de la sentencia que los llam en el programa principal, cuando se encuentre con la ltima llave. Si un procedimiento carece de parmetros formales, entonces la lista de parmetros estar vaca; pero incluso en este caso se precisan de los parntesis.

Declaracin de un Procedimiento
A diferencia de las declaraciones de variables en el programa principal, en las que se pueden declarar, con un solo nombre de tipo, muchas variables separadas por comas. En la lista de declaraciones de parmetros formales, cada parmetro debe incluir tanto el tipo variable como el nombre, adquiriendo la siguiente sintaxis: void nomb_proced (tipo1 var1, tipo2 var2,,tipoN varN) El siguiente ejemplo tiene una definicin incorrecta: void humos(int s, i, n, float k, r) La definicin correcta es la siguiente: void humos(int s, int i, int n, float k, float r)

Retorno de un Procedimiento
El retorno desde un procedimiento al programa principal se produce despus que la computadora ejecuta la ltima sentencia del procedimiento y encuentra al finalizador del procedimiento (}). En el ejemplo anterior, despus de que el procedimiento reporta los valores del vector lista[i], no le queda ms que hacer, de manera que vuelve al programa principal, a la siguiente lnea de la que la llam. Dado que el procedimiento no devuelve ningn valor, se declara como si fuese void.

Retorno de un Procedimiento
// Programa Principal #include <iostream.h> #include <conio.h> main() { sentencias; calcular(); prxima sentencia1; sentencias; calcular();
prxima sentencia2; .. Sentencias; } }

Llamando y retornando de un procedimiento


// Procedimiento Calcular calcular() {
sentencias;

Funciones
Una funcin es un subprograma que recibe los valores de uno o varios argumentos y devuelve un nico resultado al programa o subprograma que lo llam. Est formado por una o ms sentencias que realizan una tarea determinada. Cuando se ejecuta la funcin el resultado es asignado al nombre de la funcin. Siempre se utiliza una llamada a una funcin en una expresin.

Llamada a una Funcin


Sintaxis : variable = nomb_funcin (parmt_actuales); Propsito : Llamar desde el programa principal o desde algn procedimiento a una funcin requerida por su nombre. Ejemplo : y = acumulativa (m, x);
En el caso de llamadas a funciones se aplica el mtodo denominado: llamada por valor, que consiste en copiar el valor de cada parmetro actual en un parmetro formal de la funcin. Por lo tanto, los cambios que se hacen a los parmetros formales no tienen efecto en los parmetros actuales. Ejemplo:

Llamada a una Funcin


main() { int k = 15; cout<<sum(k)<<k; } int sum(int z) { z = z + z; return(z); } Esta funcin copia el valor del parmetro actual k a sum(), en el parmetro formal z. Cuando tiene lugar la asignacin z = z + z, lo nico que se modifica es la variable local z. La variable k, usada para llamar a sum(), todava tendr el valor 15. La salida de la funcin ser 30.

Declaracin de una Funcin


Sintaxis : tipo nomb_funcin (parmetros_formales) { Variables locales Lneas de cdigo del cuerpo de la funcin } Propsito : Declarar una funcin indicando su nombre y especificando el tipo de valor que la funcin devolver As mismo, declarar la lista de parmetros formales involucrados en la funcin. Es decir, especificar los nombres de tipos y nombres de variables separados por comas Estos parmetros son los que recibirn los valores de los parmetros actuales cuando se llame a la funcin.

Declaracin de una Funcin


Ejemplo : float acumulativa (int n, float k[30]) int i, flota s=0; // Variables locales for(i=1; i<=n; i++) s=s+k[i]; // Cuerpo funcin return(s); } El valor de la funcin puede ser de cualquier tipo vlido; si no se especifica, se asume que por defecto la funcin devolver un valor entero. Si una funcin carece de parmetros, entonces la lista de parmetros estar vaca; pero incluso en este caso se precisan de los parntesis. En las funciones, la declaracin de parmetros formales es semejante a la que se hace en los procedimientos: tipo nomb_funcin (tipo1 var1, tipo2 var2,..., tipoN varN)

Retorno desde una Funcin


Sintaxis : return expresin; Propsito : Devolver un valor desde una funcin y provocar que el programa en su ejecucin salga de la funcin en la que est y retome de inmediato al cdigo que llam a dicha funcin. Ejemplo : return(s); Las funciones que devuelven valores son de tres tipos: Funciones que realizan especficamente operaciones sobre sus parmetros actuales y devuelven un valor basado en ese clculo. Ejemplo: las funciones de biblioteca como tan() que devuelve la tangente de un ngulo en radianes.

Retorno desde una Funcin


Funciones que manipulan informacin y devuelven un valor que indica si esta manipulacin sali bien o fall. Ejemplo: la funcin fwrite() que se usa para escribir datos sobre un archivo de disco. Si tiene xito la escritura, entonces fwrite() devolver el nmero de bytes que se pidi que escribiera, cualquier otro valor indicar que ha ocurrido un error. Funciones que no tienen un valor de retorno explcito. En esencia, la funcin es estrictamente procesal y no produce un valor. Si no se especifica una asignacin, entonces la computadora simplemente descarta el valor devuelto.

Retorno desde una Funcin


Ejemplo: main() { int h, j, k; h = 9; j = 5; k = resto(h, j); cout<<resto(h, j); resto(h, j); } int resto(int p, int q) return p % q; }

// Lnea 1 // Lnea 2 // Lnea 3 {

Retorno desde una Funcin


La lnea 1 asigna el valor devuelto por resto() a k. En la lnea 2, el valor devuelto no est realmente asignado, sino que cout lo usa. Y en la lnea 3, el valor devuelto se pierde porque no lo asigna a otra variable, ni la usa como parte de una expresin. Una funcin no puede ser objeto de una asignacin. Por ejemplo la siguiente sentencia es incorrecta: Suma(x, y) = 350;

Llamada a Subprogramas con Arreglos


Cuando se usa a un arreglo como un parmetro actual, se pasa slo la direccin del arreglo al subprograma y no se copia el arreglo completo. Es decir, que cuando se llama a un subprograma con un nombre de arreglo, la declaracin de parmetros debe ser de un tipo puntero, dirigido al primer elemento del arreglo del subprograma. Hay tres formas de declarar este tipo de parmetro:

Declarndolo como un arreglo. Especificando el parmetro como un arreglo sin tamao Declarndolo como un puntero

Llamada a Subprogramas con Arreglos


Declarndolo como un arreglo. Ejemplo: main() { int q[20], j; for(j=0; j<20; j++) q[j] = j; reporte(q); } reporte(int x[20]) { int j; for(j=0; j<20; j++) cout<<x[j]);

Aunque este programa declare al parmetro x como un arreglo de veinte elementos enteros, el C++ convertir automticamente x a un puntero entero.

Llamada a Subprogramas con Arreglos


Especificando parmetro como un arreglo sin tamao. Ejemplo: reporte(int x[]) { int j; for(j=0; j<20; j++) cout<<x[j]); }

Este cdigo declara a x como un arreglo de enteros de tamao desconocido. Este mtodo de declaracin tambin define a x como un puntero entero.

Llamada a Subprogramas con Arreglos


Declarndolo como un puntero. Ejemplo:
reporte(int *x) { int j; for(j=0; j<20; j++) cout<<x[j]); }

Los tres mtodos de declaracin de un parmetro de arreglo dan el mismo resultado: un puntero. Pero la forma ms comn en los programas escritos profesionalmente, es el tercero.

Prototipos de Subprogramas
Sintaxis : tipo nombre_subprog(tipo1 par1, tipo2 par2,..., tipoN parN); Propsito : Definir el nombre de un subprograma antes de usarlo y el tipo de dato que este devuelve. Declarar nmero, tipos y orden de parmetros formales que el subprograma espera recibir. Definicin de prototipos es obligatoria cuando subprograma se declara despus del programa principal o del subprograma que lo llam. En caso contrario, esta definicin es obviada. El compilador usa prototipos de subprogramas para validar las llamadas de subprogramas. Ejemplo : int equipo(int, int, float);

Prototipos de Subprogramas
Los tipos de datos que estn entre parntesis le informa al compilador que el subprograma equipo espera que el invocador le devuelva dos valores enteros y uno flotante. El tipo de dato (int) a la izquierda del nombre del subprograma le informe al compilador que equipo le devuelve un resultado entero al invocador. En el caso de que uno de los parmetros formales del subprograma sea arreglo, este se puede definir de 2 formas: En forma subndicada, por ejemplo: int estrategia(int x[20], int); En forma de puntero, por ejemplo: int estrategia(int *, int);

Ejemplo 1
Ingresar el nmero de elementos de dos vectores (M y N), as como cada uno de los elementos de los vectores que definen a la variable independiente X(i) y a la variable dependiente Y(j). Usar en este caso el procedimiento Ingreso(). Si el nmero de elementos de ambos vectores son iguales, calcular la interseccin de la recta con la ordenada (A) y la pendiente (B) usando el mtodo de los mnimos cuadrados (anlisis de regresin). Ingresar el valor de un dato correspondiente a la variable independiente y determinar el pronstico respectivo. Si no, calcular la suma de los elementos de cada vector.

Ejemplo 1
Anlisis: La pendiente de la recta (B) se calcula utilizando la siguiente expresin estadstica:
B N XY X Y N X X
2 2

La interseccin con la ordenada (A) se calcula usando la siguiente expresin estadstica:

Y B X A
N N

La ecuacin del pronstico es la siguiente:

Y A BX

Ejemplo 1
Codificacin:
#include <iostream.h> // REGRESION LINEAL #include <conio.h> #define LIM 10 int x[LIM]; // Elementos del vector de variable independiente int y[LIM]; // Elementos del vector de la variable dependiente void main() void ingreso(int, int *, char *); int suma(int, int *); long int sumaxy(int, int *, int *); long int sumax2(int, int *); int m; // Tamao del vector de la variable independiente int n; // Tamao del vector de la variable dependiente int p; // Suma de elementos de la variable independiente int q; // Suma de elementos de la variable dependiente

Ejemplo 1
long int r; // Suma de producto de elementos ambos vectores long int t; // Suma de cuadrados de la variable independiente float a; // Interseccin con la ordenada float b; // Pendiente de la recta float v; // Valor de variable independiente a pronosticar float w; // Valor de pronstico de variable dependiente clrscr(); cout<<"Nmero de elementos del primer vector : "; cin>>m; cout<<"Nmero de elementos del segundo vector: "; cin>>n; ingreso(m, x, "Elementos del primer vector: "); ingreso(n, y, "Elementos del segundo vector: "); if(m==n) { p=suma(m, x); q=suma(m, y); r=sumaxy(m, x, y); t=sumax2(m, x); b=(float) (m*r-p*q)/(m*t-p*p); a=(q/m)-b*(p/m);

Ejemplo 1
clrscr(); cout<<"Lnea recta\n"; cout<<"Interseccin con la ordenada : "<<a<<endl; cout<<"Pendiente : "<<b<<endl; cout<<"Valor de variable independiente : "; cin>>v; w=a+b*v; cout<<"Pronstico : "<<w; } else { p=suma(m, x); q=suma(n, y); clrscr(); cout<<"Suma de elementos"; cout<<"Primer vector : "<<p; cout<<"Segundo vector : "<<q; } getch(); }

Ejemplo 1
void ingreso(int n, int x[LIM], char mensaje[15]) { int i; // ndice de variable independiente o dependiente clrscr(); cout<<mensaje<<endl; for(i=1;i<=n;i++) { cout<<"Ingrese elemento "<<i<<": "; cin>>*(x+i); } }
int suma(int k, int x[LIM]) { int i; // Indice de variable independiente o dependiente int s=0; // Suma de los elementos del vector for(i=1;i<=k;i++) s=s+*(x+i); return(s); }

Ejemplo 1
long int sumaxy(int k, int x[LIM], int y[LIM]) { int i; // ndice de variable independiente y dependiente int s=0; // Suma productos de elementos ambos vectores for(i=1;i<=k;i++) s=s+*(x+i)**(y+i); return(s); } long int sumax2(int k, int x[LIM]) { int i; // ndice de variable independiente y dependiente int s=0; // Suma de cuadrados de elementos vector Ind for(i=1;i<=k;i++) s=s+*(x+i)**(x+i); return(s); }

Tipos de Subprogramas
Existen dos tipos de subprogramas:
Subprogramas internos, son los subprogramas que figuran junto con el programa principal (en el mismo listado). Subprogramas externos, son los subprogramas que figuran fsicamente separados del programa principal, es decir, en distintos archivos fuente. Pueden ser compilados separadamente y generalmente se enlazan con el programa principal en la fase de montaje, cuando ya son mdulos objeto, es decir, traducidos a lenguaje de mquina.

Tipos de Subprogramas
Los archivos de estos subprogramas pueden ser incluidos en el encabezamiento del programa principal usando la siguiente sintaxis: #include <unidad: \ ruta \ nombre_archivo . extensin> Por ejemplo: #include <c: \ borlandc \ bin \ estadistica . h> Esta directiva incluye a todos los subprogramas que han sido salvados previamente en el archivo denominado estadistica.h que se encuentra en la ruta borlandc\bin de la unidad C:

Atributos de Identificadores de Subprogramas


En los captulos anteriores hemos utilizado identificadores para los nombres de las variables, los atributos de estos identificadores incluyen: nombre, tipo, tamao y valor.
En este capitulo tambin utilizamos identificadores como nombres de subprogramas definidos por el usuario.

De hecho, los identificadores de los subprogramas tienen otros atributos, tales como: clase de almacenamiento, alcance y enlace.

Clase de Almacenamiento
La clase de almacenamiento del identificador determina el periodo durante el cual existe en memoria dicho identificador. Algunos identificadores existen durante un periodo breve, otros se crean y destruyen repetidamente y otros existen durante toda la ejecucin del programa. Los especificadores de clase de almacenamiento pueden dividirse en:

Clase de almacenamiento automtico.


Clase de almacenamiento esttico

Clase de Almacenamiento Automtico


Sintaxis : auto tipo nombre_variable; Propsito : Declarar variables de almacenamiento automtico. Ejemplo : auto float r, t; clase de

Las variables locales y los parmetros de una funcin normalmente son de esta clase. De manera predeterminada, las variables locales son de la clase de almacenamiento automtico por lo que pocas veces se utiliza la palabra clave auto. Esta clase es un medio eficiente para conservar memoria slo cuando se necesita, ya que existen mientras el bloque est activo y se destruyen al salir de l.

Clase de Almacenamiento Automtico


Sintaxis : register tipo nombre_variable; Propsito : Sugiere al compilador que mantenga a una variable automtica en uno de los registros de hardware, que son de alta velocidad, en lugar de en memoria. Ejemplo : register int k=1; Las variables de uso intensivo (contadores), pueden mantenerse en registros de hardware, con lo cual es posible eliminar la sobrecarga La palabra clave register slo pueden utilizarse con variables y parmetros de funciones locales. Frecuentemente estas declaraciones son innecesarias.

Clase de Almacenamiento Esttico


Sintaxis : extern tipo nombre_variable; Propsito : Declarar variables y nombres de funciones globales. Las variables globales se crean poniendo declaraciones de variables fuera de todas las definiciones de funciones. Ejemplo : extern float x; Las variables y funciones de esta clase existen desde el momento en que se inicia la ejecucin del programa. Sin embargo, aunque las variables y los nombres de funcin existan desde el inicio de la ejecucin, esto no significa que puedan utilizarse en todo el programa. Generalmente se usan para declarar variables globales.

Clase de Almacenamiento Esttico


Sintaxis : static tipo nombre_variable; Propsito : Declarar variables locales que son conocidas solo en la funcin en la que se define; pero, a diferencia de las variables automticas, estas variables locales conservan sus valores al salir de la funcin. La siguiente vez que se llama a la funcin, las variables locales static contendrn valores que tenan al salir de ella la ltima vez. Ejemplo : static int w=3; Todas las variables numricas de la clase de almacenamiento esttico se inicializan a cero si el programador no las inicializa a un valor explcito.

Alcance
El alcance de un identificador es la parte del programa en la que un identificador tiene significado. Ejemplo, cuando se declara una variable local en un bloque, se puede referenciar slo en dicho bloque o en bloques anidados dentro de l. Alcance de archivo. En este tipo de alcance los identificadores son conocidos por todas las funciones desde el momento en que se declara el identificador hasta el final del archivo. Para ello, los identificadores debern ser declarados fuera de cualquier funcin. Las variables globales, las definiciones de funciones y los prototipos de funcin colocados fuera de una funcin tienen este alcance.

Alcance
Alcance de funcin. En este tipo de alcance los identificadores pueden usarse en cualquier parte de la funcin en la que aparezcan, pero no pueden referenciarse desde fuera del cuerpo de la funcin. Los nicos identificadores de este tipo son las etiquetas. Las etiquetas sirven en las estructuras switch y en las instrucciones goto. Alcance de bloque. Este tipo de alcance comienza con la declaracin del identificador dentro de un bloque y termina con la llave de terminacin del bloque ( } ). Tienen este tipo de alcance las variables locales declaradas al inicio de una funcin y los parmetros formales de funcin.

Alcance
Si un bloque es anidado y un identificador de un bloque externo tiene el mismo nombre que un identificador de un bloque interno, se oculta el identificador del bloque externo hasta que termina el bloque interno. Alcance de prototipo de funcin. Este tipo de alcance tiene como nicos identificadores a aquellos que se usan en la lista de parmetros de un prototipo de funcin. Los prototipos de funcin no requieren nombres en la lista de parmetros, slo se necesitan los tipos. Si se indica un nombre en la lista de parmetros de un prototipo de funcin, el compilador lo ignora. Los identificadores usados en los prototipos de funcin pueden reutilizarse en cualquier otra parte del programa.

Ejemplo 2
Demostrar la diferencia entre clases de almacenamiento esttico y automtico, para ello utilizar dos funciones: 1) Declarar un arreglo local como static que ser llamado dos veces. En la primera se inicializar automticamente el arreglo a cero; luego imprimir, sumar 5 a cada elemento e imprimir de nuevo el arreglo. En la 2 llamada el arreglo static deber contener valores almacenados durante la 1a llamada. 2) Declarar un arreglo local como automtico que ser llamado dos veces. En la 1a inicializar los elementos del arreglo automtico con los valores 1, 2 y 3, luego imprimir, sumar 5 a cada uno de sus elementos y volver a imprimir el arreglo. En la 2 los elementos del arreglo sern reinicializados a 1, 2 y 3.

Ejemplo 2
Codificacin:
#include <iostream.h> // Almacenamiento Esttico y Automtico #include <conio.h> void ArregloEstatico(void); void ArregloAutomatico(void); void main(void) { clrscr(); cout<<"Primera llamada a cada funcin: \n"; ArregloEstatico(); ArregloAutomatico(); cout<<"\n\nSegunda llamada a cada funcin: \n"; ArregloEstatico(); ArregloAutomatico();cout<<endl; getch(); }

Ejemplo 2
void ArregloEstatico(void) { // Arreglo esttico local static int A1[3]; // Elementos del arreglo esttico int i; // Contador del arreglo cout<<"\nValores al entrar al arreglo esttico:\n"; for(i=0; i<3; i++) cout<<"A1["<<i<<"] = "<<A1[i]<<" "; cout<<"\nValores al salir del arreglo esttico:\n"; for(i=0; i<3; i++) cout<<"A1["<<i<<"]="<<(A1[i]+=5)<<" "; } void ArregloAutomatico(void) { // Arreglo automtico local int A2[3] = {1, 2, 3}; // Elementos del arreglo automtico int i; // Contador del arreglo cout<<"\n\nValores al entrar al arreglo automtico:\n"; for(i=0; i<3; i++) cout<<"A2["<<i<<"] = "<<A2[i]<<" "; cout<<"\nValores al salir del arreglo automtico:\n"; for(i=0;i<3;i++) cout<<"A2["<<i<<"]="<<(A2[i]+=5)<<" "; }

You might also like