Programación de Computadores 4 Iteraciones y Decisiones Prof. Javier Cañas Universidad Técnica Federico Santa María Departamento de Informática Contenido 1 Introducción 2 Operadores Relacionales y Lógicos 3 Decisiones 4 Iteraciones 5 La Asignación como Operador Javier Cañas 2000 2 1 1 Introducción • En este capítulo usaremos el lenguaje C++ para transformar los algoritmos estudiados en el Capítulo 2 en programas que funcionen en computadores reales • Profundizaremos dos aspectos claves de un algoritmo: decisiones e iteraciones. A lo visto en capítulos anteriores, agregaremos nuevas sentencias y expresiones que facilitan la programación • Se espera al final poder escribir programas correctos en C++ que utilicen tipos de datos simples Javier Cañas 2000 3 2 Operadores Relacionales y Lógicos • Tanto las decisiones como iteraciones involucran el uso de operadores relacionales y lógicos • Expresiones condicionales involucran operadores relacionales y conectivos lógicos • Es necesario tener gran claridad en el manejo de estas expresiones para programar la lógica correcta en un programa Javier Cañas 2000 4 2 Operadores Relacionales: Repaso Los Operadores Relacionales son: >, <, ==, !=, >=, <= Ejemplos: Si a=44; b=12; False True False False True ¡Sólo 0 (cero) es falso! (a == b) (b <= 12) (b != 12) (0) (-7) Javier Cañas 2000 5 Operadores Lógicos: repaso && || ! AND OR NOT Ejemplo de expresiones condicionales: if( !(edad==18) && (sexo == ‘f’)) ......................................... Javier Cañas 2000 6 3 Precedencia de Operadores: repaso ! ++ -- * / % + < > <= >= == != && || ? : = += -= *= /= Javier Cañas 2000 %= 7 3 Decisiones • C++ provee un poderoso conjunto de operadores y sentencias que permiten dar un mayor poder expresivo a los programas. • Comenzaremos resolviendo un problema de interpretación cuando se tienen muchos if anidados Javier Cañas 2000 8 4 La Construcción else if • Existe problemas potenciales en el anidamiento de if... else • Ejemplo if(a== b) if ( b==c) cout << “ son iguales”; else cout << “ b y c diferentes” ¿qué pasa si a!=b? Javier Cañas 2000 9 La Construcción else if • Regla: Un else se aparea con el último if que no tiene su propio else Indentando : if ( a== b) if (b== c) cout << “son iguales”; else cout << “b y c diferentes”; Javier Cañas 2000 10 5 Una forma más simple de interpretar es con else if Ejemplo: if ( dir == ‘n’) y-- ; else if ( dir == ‘s’) j++ ; else if ( dir == ‘e’) x++ ; else if ( dir = ‘o’) x-- ; Javier Cañas 2000 11 El Switch • El código anterior refleja una situación que es muy frecuente en un programa: dependiendo de una expresión se pueden tomar muchas decisiones. • La construcción if.......else se puede generalizar mediante el switch Javier Cañas 2000 12 6 El Switch Un if sólo tiene dos opciones Un switch tiene múltiples opciones Javier Cañas 2000 13 La sentencia switch switch (n) // n puede ser int o char { case 1 : sentencia; break; case 2: sentencia; break; ................ default : sentencia; } break permite la salida del switch Javier Cañas 2000 14 7 Ejemplo de switch dir= getche( ) ; // ingrese carácter switch (dir) { case ‘n’ : y--; break; case ‘s’ : j++; break; case ‘e’ : x++; break; case ‘o’: x--; break; case ‘x’ : cout << “\n salir” ; break; default : cout << “ \n try again”; } Javier Cañas 2000 15 break y continue La sentencia break junto con la sentencia continue, permite alterar el funcionamiento de un loop break continue Javier Cañas 2000 16 8 El Operador Condicional • Consideremos el siguiente segmento de código: if ( x> 7) y=y+30; else y=y*50; • Como este tipo de código es frecuente, C++ posee un operador llamado operador condicional que permite simplificar estas situaciones. • La anterior quedaría y= x > 7? y+30: y*50; Javier Cañas 2000 17 El Operador Condicional Si la condición es verdadera Si la condición es falsa (condición) ? expresión 1 : expresión 2 Hay que tener en cuenta que este operador no es una sentencia. Al ser operador puede foramar parte de cualquier expresión válida Javier Cañas 2000 18 9 Ejemplo Ejemplo calcular el valor absoluto de un número: int n; cin>> n; int valor_absoluto = n<0 ? -n : n; Javier Cañas 2000 19 4 Iteraciones • La posibilidad de realizar acciones repetitivas es lo que en definitiva le da a un algoritmo la posibilidad de resolver problemas complejos. • Además del while y del do vistos en capítulos anteriores, C y C++ proveen la sentencia for que tiene una notación más compacta • Repasaremos el while y do e incorporaremos el for junto con ejemplos ilustrativos de uso Javier Cañas 2000 20 10 El While while (n! = 0) sentencia; Diagrama de flujo while( v2 < 45 ) { sentencia; ....... sentencia; } no hay “;” F test V Bloque del loop Javier Cañas 2000 21 Ejemplo include <iostream.h> void main ( ) { int n = 99 ; // asegurar n! =0 while ( n! = 0) cin >> n ; } Javier Cañas 2000 22 11 Ejercicio 1 • Usando while escribir un programa que genere en la salida: 1 1 2 16 3 81 4 256 ................. Javier Cañas 2000 23 Solución Ejercicio 1 #include < iostream.h> #include < iomanip.h> void main ( ) { int pow = 1 ; int numb =1 while ( pow < 9999) { cout << setw (2) << numb ; cout << setw (5) << pow << endl ; ++numb ; pow = numb * numb * numb * numb;} } Javier Cañas 2000 24 12 Ejercicio 2 • Contar el número de palabras y número de caracteres de una frase • Usar la función getche( ) : Devuelve cada carácter ingresado sin esperar retorno Javier Cañas 2000 25 Solución Ejercicio 2 # include <iostream.h> # include <conio.h> // getche( ) void main ( ) { int chcount =0 , wdcount =1; char ch = ‘a’ ; //asegurar que no es ‘\r’ while (ch != ‘\r’ ) { ch = getche ( ); if ( ch == ‘ ‘ ) wdcount++; else chcount++; } cout << “\n Palabras =” << wdcount <<endl << “ Letras =” << (chcount –1) << endl ;} Javier Cañas 2000 26 13 El do do sentencia ; while (ch != ‘n’); Diagrama de flujo do {sentencia ; . . sentencia; }while (numb <96); Cuerpo del loop Javier Cañas 2000 F test v 27 Ejemplo #include < iostream.h> void main ( ) {long dividendo, divisor; char ch; do {cout << “Ingrese dividendo :” ; cin >> dividendo ; cout<<“Ingrese divisor:” ;cin>> divisor; cout << “cuociente es” << dividendo /divisor; cout << “\n otro? (s/n) :” ;cin >>ch ; } while (ch != ‘n’ ); } Javier Cañas 2000 28 14 El for • Muchos algoritmos requieren iterar un número fijo y conocido de pasos. Por ejemplo el cálculo de: 1000 ∑ xi i =1 • Si bien el cálculo se puede hacer con while o do, resulta más cómodo tal como se verá, utilizar la sentencia for Javier Cañas 2000 29 ...El for • Presentaremos el for vía ejemplos: a) for(j=0; j <15; j++) sentencia; b) for (j=0; j <15; j++) { sentencia; sentencia; ............. } no hay “;” Javier Cañas 2000 30 15 Diagrama de flujo del for Inicio F Test V Bloque del loop Expr. de incremento o decremento Javier Cañas 2000 31 Ejercicio Escribir un programa que genere la siguiente salida 1 2 3 4 5 6 7 8 9 10 1 8 27 64 125 216 343 512 729 1000 Javier Cañas 2000 32 16 Solución # include < iostream.h > #include <iomanip.h > void main ( ) { int numb; for ( numb = 1 ; numb < = 10 ; numb ++ ) { cout << setw (4) << numb ; // 1ª columna int cubo = numb * numb * numb ; cout << setw (6) << cubo << endl ; } } int cubo sólo se conoce dentro del bloque {......} Javier Cañas 2000 33 Observación 1: variables definidas en el for for ( int j = 1 ; j < = 10 ; j ++ ) { .......................... } Se observa que se puede definir una nueva variable dentro del for. Esto significa que es visible a partir de este punto, dentro y fuera del bloque Javier Cañas 2000 34 17 Observación 2: múltiples inicializaciones for (j = 1, k=100 ; j < = 10 ; j++, k-- ) { se usan j y k dentro de este loop } En general puede existir una lista de variables, pero la condición de fin del loop involucra sólo un test Javier Cañas 2000 35 5 La Asignación como un operador • En C++, la asignación es un operador y por lo tanto es posible de encontrar más de una vez en una expresión • Por ejemplo X = Y = Z = 0 ; es una expresión válida y se puede utilizar en vez de: X=0; Y=0; Z=0; • Como operador, tiene menor precedencia que los operadores relacionales Javier Cañas 2000 36 18 Ejemplo de asignación como un operador El código: while (ch != ‘\r’ ) { ch = getche( ); ....................................... Es posible compactar el código anterior while (( ch =getche( ))!=‘\r’) {loop hasta que se ingresa ENTER } ¿ Qué pasa: while (ch = getche ( ) ! = ‘r’)? ¿Cómo funcionan las precedencias? Javier Cañas 2000 37 FIN Iteraciones y Decisiones 19