Sei sulla pagina 1di 15

2unidad estructura de control y funciones2.1sentencias de control2.2procesos repetitibos con evaluacion explisitade condiciones (whille o equivalente)2.

3procesos repetitibos que inbolucran el uso de contadores y evolucion implicita de condiciones (for o equivalente)2.4funciones2.4.1prototipos de una funcion2.4.2principal y subfunciones 2.4.3paso de parametros entre funciones2.5aplicasiones de estructuras de control y funciones en la solucion de problemas de ing. Elctrica

1 Sinopsis

Las sentencias ("Statements") especifican y controlan el flujo de ejecucin del programa. Si no existen sentencias especficas de seleccin o salto, el programa se ejecuta de forma secuencial en el mismo orden en que se ha escrito el cdigo fuente (es el que podramos considerar orden "natural" de ejecucin).

En este captulo explicaremos los distintos tipos de sentencias que existen en C++, pero antes ofreceremos una descripcin formal de las mismas sealando qu se entiende por sentencia.

2 Definicin

Una expresin es una secuencia de operadores; operandos; elementos de puntuacin y palabras clave, que especifican una computacin. Tiene sentido computacional en s misma y equivale a una frase en el lenguaje normal. Entre sus caractersticas distintivas estn las de poder producir un resultado y posibles efectos laterales. Ejemplo:

extern x; y = 22; z = i++;

// No produce un valor // Produce un valor // Valor + efectos laterales

Cualquier expresin finalizada en un punto y coma ; forma una sentencia:

< expresin >;

C++ ejecuta las sentencias evaluando la expresin. Todos los efectos colaterales de la evaluacin son tenidos en cuenta antes de ejecutar la prxima sentencia. La mayora de sentencias C++ son asignaciones o llamadas a funciones.

Un caso especial es la sentencia nula; consiste en un punto y coma (;) aislado. Una sentencia nula no hace nada, pero puede ser necesaria en situaciones en que la sintaxis del lenguaje espere una sentencia pero nuestro programa no necesita hacer nada.

Nota: como la mayora de las cosas de C++, la definicin anterior tiene su excepcin. Existe un tipo especial de sentencia, las directivas de preproceso en las que el punto y coma puede omitirse. Este tipo de sentencias no ejecuta una computacin de tiempo de ejecucin sino de compilacin (realizan modificaciones sobre el fuente). Entre las que s ejecutan una computacin en runtime tambin existe una, las etiquetas directas, que no terminan en punto y coma sino en dos puntos : (ver a continuacin )

2 Clasificacin

Dada la definicin anterior, resulta evidente que pueden existir infinitas sentencias distintas, e innumerables criterios para su clasificacin. Una de las posibles, que adems coincide con la clasificacin del Estndar, distingue las siguientes clases de sentencia: De etiqueta De expresin Compuestas De seleccin De iteracin De salto De declaracin Bloques de intento

Adems de las anteriores, por sus caractersticas especiales podramos considerar las siguientes clases adicionales: Sentencias de preproceso

Sentencias ensamblador

2.1 Sentencias de etiqueta

En C++ existen tres clases de sentencias etiquetadas: las etiquetas directas ( 4.10.1a), las sentencias case ( 4.10.1b) y las default (4.10.1c), estas ltimas se utilizan en conjuncin con las sentencias switch.

2.2 Sentencias de expresin

Podramos decir que son las que no pertenecen a ninguno de los otros grupos y que, en la prctica, son las ms abundantes. Generalmente son asignaciones o invocaciones de funciones. Ejemplo:

pint = &x; foo(c);

2.3 Sentencias compuestas

Las sentencias compuestas, tambin denominadas bloques ( 1.3.1) se utilizan en aquellas situaciones en que la sintaxis espera una sentencia pero se necesita usar varias. Ejemplo:

if (first) ++x; else { --x; z = a; }

En caso de cumplirse la condicin hay que incrementar x, lo que puede hacerse en una sola sentencia, pero si la condicin resulta falsa, se precisan dos computaciones. Para que se comporten como una sola frente a else, se recurre a englobarlas en un bloque entre llaves { ... }. Las sentencias dentro del bloque se comportan como una sola y constituyen un mbito lxico. Los identificadores definidos en su interior eclipsan a los exteriores y las variables automticas creadas en l son destruidas al salir del mbito.

2.4 Sentencias de seleccin

Las sentencias de seleccin o de control de flujo, pueden decidir entre varios cursos de accin distintos en funcin de ciertos valores. Existen dos tipos de estas sentencias de seleccin: if...else ( 4.10.2) y switch ( 4.10.2).

Ejemplos:

switch ( foo() ) { case 0: case 1: if (first) break; else ++x; case 2: ... default: break; }

2.5 Sentencias de iteracin

Las sentencias de iteracin permiten repetir un conjunto de sentencias ejecutando un bucle. En C++ existen tres formas de iteraciones: los bucles while (4.10.3), dowhile (4.10.3) y for (4.10.3).

Ejemplo:

while (first) {

...

for (int x = 1; x < y; ++x) {

...

do {

// begin second

...

...

} while (second);

// end second

...

// end for

...

// end first

2.6 Sentencias de salto

Las sentencias de salto permiten transferir el control del programa de forma incondicional. Existen cuatro de estas sentencias: break (4.10.4), continue (4.10.4), (4.10.4) y return (4.10.4).

Ejemplo:

while (foo) {

start:

if (some) break;

...

if (first) goto start;

...

if (second) continue;

...

if (! any) return;

...

Nota: en ocasiones es posible utilizar el mecanismo de excepciones C++ como mecanismo de salto multinivel ( 1.6).

2.7 Sentencias de declaracin

Este tipo de sentencias introducen uno o ms identificadores en un bloque. Ejemplo:

void foo (int x, y z) {

float f = 3.14;

char c;

int x;

...

6. Funciones Una funcin es un conjunto de declaraciones, definiciones, expresiones y sentencias que realizan una tarea especfica. El formato general de una funcin en C es

especificador_de_tipo nombre_de_funcin( lista_de_parmetros ) { variables locales cdigo de la funcin } El especificador_de_tipo indica el tipo del valor que la funcin devolver mediante el uso de return. El valor puede ser de cualquier tipo vlido. Si no se especfica un valor, entonces la computadora asume por defecto que la funcin devolver un resultado entero. No se tienen siempre que incluir parmetros en una funcin. la lista de parmetros puede estar vaca. Las funciones terminan y regresan automticamente al procedimiento que las llam cuando se encuentra la ltima llave }, o bien, se puede forzar el regreso antes usando la sentencia return. Ademas del uso sealado la funcin return se usa para devolver un valor. Se examina a continuacin un ejemplo que encuentra el promedio de dos enteros:

float encontprom(int num1, int num2) { float promedio;

promedio = (num1 + num2) / 2.0; return(promedio); }

main() { int a=7, b=10;

float resultado;

resultado = encontprom(a, b); printf("Promedio=%f\n",resultado); }

6.1 Funciones void Las funciones void dan una forma de emular, lo que en otros lenguajes se conocen como procedimientos (por ejemplo, en PASCAL). Se usan cuando no requiere regresar un valor. Se muestra un ejemplo que imprime los cuadrados de ciertos nmeros.

void cuadrados() { int contador;

for( contador=1; contador<10; contador++) printf("%d\n",contador*contador); }

main() { cuadrados(); }

En la funcin cuadrados no esta definido ningn parmetro, y por otra parte tampoco se emplea la sentencia return para regresar de la funcin.

6.2 Funciones y arreglos Cuando se usan un arreglo como un argumento a la funcin, se pasa slo la direccin del arreglo y no la copia del arreglo entero. Para fines prcticos podemos considerar el nombre del arreglo sin ningn ndice como la direccin del arreglo. Considerar el siguiente ejemplo en donde se pasa un arreglo a la funcin imp_rev, observar que no es necesario especificar la dimensin del arreglo cuando es un parmetro de la funcin.

void imp_rev(char s[]) { int t;

for( t=strlen(s)-1; t>=0; t--) printf("%c",s[t]); }

main() { char nombre[]="Facultad";

imp_rev(nombre); }

Observar que en la funcin imp_rev se usa la funcin strlen para calcular la longitud de la cadena sin incluir el terminador nulo. Por otra parte, la funcin imp_rev no usa la sentencia return ni para terminar de usar la funcin, ni para regresar algn valor. Se muestra otro ejemplo,

float enconprom(int tam, float lista[]) { int i; float suma = 0.0;

for ( i=0; i<tam; i++) suma += lista[i]; return(suma/tam); }

main() { float numeros[]={2.3, 8.0, 15.0, 20.2, 44.01, -3.0, -2.9};

printf("El promedio de la lista es %f\n", enconprom(7,numeros) ); }

Para el caso de que se tenga que pasar un arreglo con ms de una dimensin, no se indica la primera dimensin pero, el resto de las dimensiones deben sealarse. Se muestra a continuacin un ejemplo:

void imprtabla(int tamx,int tamy, float tabla[][5]) { int x,y;

for ( x=0; x<tamx; x++ )

{ for ( y=0; y<tamy; y++ ) printf("t[%d][%d]=%f",x,y,tabla[x][y]); printf("\n"); } } 6.3 Prototipos de funciones Antes de usar una funcin C debe tener conocimiento acerca del tipo de dato que regresar y el tipo de los parmetros que la funcin espera. El estndar ANSI de C introduj una nueva (mejor) forma de hacer lo anterior respecto a las versiones previas de C. La importancia de usar prototipos de funciones es la siguiente: Se hace el cdigo ms estructurado y por lo tanto, ms fcil de leer. Se permite al compilador de C revisar la sintaxis de las funciones llamadas. Lo anterior es hecho, dependiendo del alcance de la funcin. Bsicamente si una funcin ha sido definida antes de que sea usada (o llamada), entonces se puede usar la funcin sin problemas. Si no es as, entonces la funcin se debe declarar. La declaracin simplemente maneja el tipo de dato que la funcin regresa y el tipo de par^o'ametros usados por la funcin. Es una prctica usual y conveniente escribir el prototipo de todas las funciones al principio del programa, sin embargo esto no es estrictamente necesario. Para declarar un prototipo de una funcin se indicar el tipo de dato que regresar la funcin, el nombre de la funcin y entre parntesis la lista del tipo de los parmetros de acuerdo al orden que aparecen en la definicin de la funcin. Por ejemplo: int longcad(char []);

Lo anterior declara una funcin llamada longcad que regresa un valor entero y acepta una cadena como parmetro.

1.9 Definicin y prototipos de funciones Los programas sencillos, como los ejemplo planteados hasta ahora, normalmente no requieren un nivel de estructuracin elevado. Pero cuando estos crecen un poco necesitamos estructurarlos adecuadamente para mantenerlos legibles, facilitar su mantenimiento y reutilizar ciertas porciones de cdigo. El mecanismo C que nos permite esto son las funciones. Con los compiladores, los fabricantes nos proporcionan un conjunto importante de funciones de librera. A veces, nos puede interesar construir nuestras propias libreras. Ya hemos utilizado funciones, pero veamos cmo debemos definirlas. Los prototipos de funciones son una caracterstica clave de la recomendacin ANSI del C. Un prototipo es una declaracin que toma la forma:

tipo nombre ( tipo_parmetro nombre_parmetro ... );

Aqu tenemos varios ejemplos:

int fact_i ( int v ); int mayor ( int a, int b ); int cero ( double a ); long raiz ( long valor ); void final_countdown ( void ); int main ( int argc, char **argv );

Observando el prototipo de una funcin podemos decir exactamente qu tipo de parmetros necesita y qu resultado devuelve. Si una funcin tiene como argumento void, quiere decir que no tiene argumentos, al igual que si el resultado es void, no devuelve ningn valor. En la vieja definicin de Kernighan y Ritchie el tipo que devolva una funcin se declaraba nicamente si era distinto de int. Los parmetros eran declarados en el cuerpo de la funcin, en lugar de utilizar la lista de parmetros. Por ejemplo:

mayor ( a, b ) int a; int b; { ... }

Las funciones al viejo estilo se compilan correctamente en los compiladores actuales. El cuerpo de la funcin sigue encerrado entre llaves.

En un programa que est formado por distintas partes bien diferenciadas es conveniente utilizar mltiples ficheros fuente. Cada fuente agrupa las funciones semejantes, como por ejemplo en un compilador podramos tener un fuente para el anlisis lxico, otro para el sintctico y otro para la generacin de cdigo. Pero en un fuente necesitaremos funciones que se han definido en otro. Para ello, escribiremos un fichero de cabecera (header), que contendr las declaraciones que podemos necesitar en otros fuente. As, en el fuente que implementa el analizador sintctico pondremos una lnea #include "lexic.h". De esta forma al compilar el mdulo sintctico tendremos todos los prototipos de las funciones del lxico y el compilador podr detectar malas utilizaciones de las funciones all definidas.

Potrebbero piacerti anche